[英]Makefile: gcc line does not show up
如果我使用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,基於 gcc 5.2,但我認為這種行為是相同的。
你看到的是正常的。 無論COMMAND
是什么, COMMAND &> FILE
執行COMMAND
並將其標准和錯誤輸出重定向到文件FILE
。 但是在您的情況下COMMAND
是一個編譯命令,如果沒有錯誤或警告,您的編譯器不會在 stdout 或 stderr 上打印任何內容。 因此,重定向到您的日志文件的內容根本就沒有。
你可以很容易地檢查這個:
$ echo 'int main(void) { return 0; }' > foo.c
$ gcc -o foo foo.c
$
看? 沒有任何類型的輸出可以發送到日志文件。
而如果你make -n
它是 make (不是你的編譯器)回顯它會在沒有 -n 選項的情況下傳遞給 shell 的配方。 如果你想記錄你的配方,你必須自己在另一個配方中回顯它們,例如,將其 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)
(如果要在將配方傳遞給 shell 時回顯配方,請刪除前導@
)。
注意變量賦值運算符 ( =
)。 不要使用簡單的賦值運算符 ( :=
),由於超出此問題范圍的原因,它不起作用。
請注意,默認情況下, make 會回顯配方(如果您沒有添加@
)。 因此,您也可以重定向 make 的輸出:
$ cat Makefile
foo: foo.c
$(CC) $(CFLAGS) -o $@ $<
$ make &> log_file
$ cat log_file
gcc -o foo foo.c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.