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