Makefile - 如何在ifndef / ifdef中使用eval< d变量?

时间:2015-02-12 19:36:50

标签: makefile

我正在试图弄清楚如何获得一个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”。

我在这里缺少什么?

1 个答案:

答案 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}'

但对我而言,这看起来像是一个错误,你可能会重新考虑你在更基础的层面上所做的事情。