我正在试图弄清楚如何获得一个eval'd变量(使用shell的输出)来传递ifndef或ifdef等条件检查。我需要使用shell,因为我实际上使用的是返回一些输出的脚本。
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”。
我在这里缺少什么?
答案 0 :(得分:3)
你不能这样做是因为ifdef
et。人。在中读取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}'
但对我而言,这看起来像是一个错误,你可能会重新考虑你在更基础的层面上所做的事情。