我有一个带有复杂Makefile结构的大型源目录(很多包含等)
我想抓住gcc将在你运行时提供的预处理器定义
gcc -E -dM。但是,我也希望构建源代码。当我检查make / build日志时,我想查看make运行的所有命令,以及来自源中传递给编译器和/或覆盖的所有文件的#defines。
我不知道该怎么做。
例如
如果文件foo.c只有这一行
#define PI 3.14
运行gcc -E -dM foo.c将打印出stdout的所有预处理定义,以及foo.c中的define。
但它没有编译。如何组合命令,以便发生这两件事?
答案 0 :(得分:3)
您需要在两次传递中执行此操作,但您可以设置一个makefile规则来执行此操作,例如:用于编译C代码:
%.o: %.c
$(CC) $(CFLAGS) -dM -E $< > $<.dump # dump all preprocessor symbols to .dump file
$(CC) $(CFLAGS) -c $< -o $@ # compile to .o as normal
或者,如果要分离构建和预处理,则可以有两个规则,例如
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@ # compile to .o as normal
%.dump: %.c
$(CC) $(CFLAGS) -dM -E $< > $<.dump # dump all preprocessor symbols to .dump file
您还需要一个假目标来确保所有.c文件生成.dump文件。