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}'
但对我来说这看起来像是一个错误,您可能会在更基本的层面上重新考虑您正在尝试做的事情。
我正在尝试弄清楚如何获取已评估的变量(使用 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}'
但对我来说这看起来像是一个错误,您可能会在更基本的层面上重新考虑您正在尝试做的事情。