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

相关内容