Bash
是否可以使用 GNU Make 顯示規則之外的變數?
是否可以使用 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)
GNU make
有一個功能可以做到這一點,它被稱為$(info ....)
.您可以將以下行放在 a 之外
rule
,GNU make 將執行它:$(info variable x = $x))
如果您發現自己重複執行此類任務,您可以將其抽象為 a
macro
並在需要的地方呼叫它: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<<<
嗯,可能,但沒用。
您必須了解 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 的目標,:
並且該行上沒有:
。(當然還有其他可能性,比如新的變數賦值等)