是否可以使用 GNU Make 顯示規則以外的變數?

是否可以使用 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)

答案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<<<

相關內容