首页 > 解决方案 > Makefile:gcc 行不显示

问题描述

如果我运行该行make target_name

$(CC) $(CFLAGS) $(OPTS) $(TARGET) &> gcc_log_file

我在 gcc_log_file 中得到以下结果:没什么奇怪的,因为如果我键入 make -n target_name,则该行会很好地扩展。

我可以在 gcc 中添加“-v”,但这会非常难看,我只想扩展 GCC 行...

我尝试了以下解决方法

@echo "$(OBJ) $$($(CC) $(CFLAGS) $(OPTS) $(TARGET))" &> gcc_log_file

@printf "$(OBJ) %s\n" $$($(CC) $(CFLAGS) $(OPTS) $(TARGET)) &> gcc_log_file

执行 CC 行,扩展 $(OBJ) 但不扩展 CC 行...

我应该明确指出我想在 makefile 中执行此操作,因为我不想登录不是由 gcc 生成的 gcc_log_file 行……我的 makefile 非常复杂。

任何提示?

请注意,我的 gcc 是基于 gcc 5.2 的特殊 gcc,但我认为这种行为是相同的。

标签: gccmakefile

解决方案


你看到的很正常。不管COMMAND是什么,COMMAND &> FILE执行COMMAND并将其标准和错误输出重定向到 file FILE。但在您的情况下COMMAND是一个编译命令,如果没有错误或警告,您的编译器不会在 stdout 或 stderr 上打印任何内容。因此,重定向到您的日志文件的内容根本不是什么。

你可以很容易地检查这个:

$ echo 'int main(void) { return 0; }' > foo.c
$ gcc -o foo foo.c
$

看?没有可以发送到日志文件的任何类型的输出。

而如果你make -n是 make (不是你的编译器),它会在没有 -n 选项的情况下回显它会传递给 shell 的配方。如果您想记录您的配方,您必须自己在另一个配方中回显它们,例如,echo将其外壳扩展参数发送到标准输出的命令:

target: prerequisites
    @echo "COMMAND" >> log_file
    COMMAND

例子:

foo: foo.c
    @echo '$(CC) $(CFLAGS) -o $@ $<' >> log_file
    $(CC) $(CFLAGS) -o $@ $<

如果您不想两次键入相同的命令,您可以声明一个 make 变量:

COMPILATION = $(CC) $(CFLAGS) -o $@ $<

foo: foo.c
    @echo '$(COMPILATION)' >> log_file
    $(COMPILATION)

或者,一次全部:

COMPILATION = $(CC) $(CFLAGS) -o $@ $<
ECHOCOMPILE = echo '$(COMPILATION)' >> log_file; $(COMPILATION)

foo: foo.c
    @$(ECHOCOMPILE)

@(如果您想在将配方传递给外壳时回显配方,请删除前导)。

注意变量赋值运算符 ( =)。不要使用简单的赋值运算符 ( :=),因为超出此问题范围的原因,它不起作用。

请注意,默认情况下, make 会回显配方(如果您不预先添加 a @)。所以,你也可以重定向 make 的输出:

$ cat Makefile
foo: foo.c
    $(CC) $(CFLAGS) -o $@ $<
$ make &> log_file
$ cat log_file
gcc -o foo foo.c

推荐阅读