Bash

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

  • June 13, 2021

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

如果您發現自己重複執行此類任務,您可以將其抽象為 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<<<

嗯,可能,但沒用。

您必須了解 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 的目標,:並且該行上沒有:。(當然還有其他可能性,比如新的變數賦值等)

引用自:https://unix.stackexchange.com/questions/653819