Makefiles - 如何使用 ifndef/ifdef 的 eval'd 变量?

Makefiles - How do I use an eval'd variables with ifndef/ifdef?

我正在尝试弄清楚如何获取已评估的变量(使用 shell 的输出)以通过 ifndef 或 ifdef 等条件检查。我需要使用 shell 因为我实际上使用的是 returns 一些输出的脚本。

foo::
        $(eval var := $(shell echo 'hello'))
ifndef var
        @printf 'ifndef is true. var is ${var}'
else
        @printf 'ifndef is false. var is ${var}'
endif

运行 "make foo" 将输出以下内容:

'ifndef is true. var is hello'

如您所见,ifndef 在 var 中找不到任何内容,即使 printf 显示 var 包含字符串 "hello".

我在这里错过了什么?

你不能这样做,因为 ifdef 等。阿尔。在 中读取 makefile 时被解析 (请注意,它们不以 TAB 字符开头,因此它们不是配方的一部分),以及配方(包括 $(eval ...) ) 直到很久以后 make 想要构建目标时才被解析 foo.

而且,你不能把 ifdef 等。阿尔。到配方中,因为如果你在它们前面加上 TAB,那么它们就会被传递给 shell,而不是被 make 解析。一般来说,如果你想在菜谱中使用条件语句,你必须使用 shell 条件语句,而不是创建条件语句,因为菜谱是一个 shell 脚本。

您可以使用$(if ...)函数:

foo::
        $(eval var := $(shell echo 'hello'))
        @printf 'ifndef is $(if $(var),true,false). var is ${var}'

但对我来说这看起来像是一个错误,您可能会在更基本的层面上重新考虑您正在尝试做的事情。