是否可以使用 GNU Make 顯示規則以外的變數?
考慮以下 Makefile:
x = foo bar baz
ifdef x
@echo $(x)
endif
這導致Makefile:4: *** commands commence before first target. Stop.
但是,如果我添加一條規則,它就會起作用:
x = foo bar baz
ifdef x
t:
@echo $(x)
endif
是否真的需要添加輸出變數的規則以進行調試等?
獎金:
為什麼刪除會ifdef
導致Makefile:3: *** missing separator. Stop.
?
x = foo bar baz
@echo $(x)
答案1
嗯,可能,但沒用。
您必須了解 Makefile 與 shell 腳本不同。 Makefile 指定目標以及建立這些目標必須執行的操作。如果您牢記這一點,那麼在 Makefile 中執行虛假命令就會成為概念問題。該指令什麼時候執行?沒有目標會觸發該指令。
你可以:
MY_VAR := $(shell ls)
all:
@echo MY_VAR IS $(MY_VAR)
請注意,我假設是 GNU make
。這將為ls
您執行並將輸出放入MY_VAR
.但這是應該避免的駭客行為。
您也可以嘗試額外的目標
extra:
@echo $(x)
並將其添加為所有其他目標的先決條件。
至於好處:這是因為該行@echo $(x)
沒有分隔符號。此時,在文件中,make
預計會有一個帶有 a 的目標:
,但該行上沒有:
。 (當然還有其他可能性,例如新的變數賦值等)
答案2
GNU make
有一個功能可以做到這一點,它被稱為$(info ....)
.
您可以將以下行放在 a 之外rule
,GNU make 將執行它:
$(info variable x = $x))
如果您發現自己重複執行此類任務,您可以將其抽象化為 amacro
並在需要時呼叫它:
make -f - <<\eof
dumpvar = $(info variable `$1' value is >>>$($1)<<<)
ssl_enable = NO
$(call dumpvar,ssl_enable)
.PHONY: all
all:;@:
eof
它將在 stout 上顯示以下內容:
variable `ssl_enable' value is >>>NO<<<