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

Makefiles-如何使用eval';带ifndef/ifdef的d变量?,makefile,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}' e

我试图弄清楚如何获取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”


我错过了什么

您不能这样做,因为读入makefile时会解析
ifdef
等(请注意,它们不是以制表符开头的,因此它们不是配方的一部分),并且配方(包括
$(eval…
)直到make要构建目标
foo
时才会解析

而且,您不能将
ifdef
等放入配方中,因为如果您在它们前面加上TAB,那么它们将被传递到shell,而不是make解析。一般来说,如果你想在一个菜谱中包含一个条件,你必须使用shell条件,而不是make条件,因为菜谱是一个shell脚本

您可以使用
$(如果…
功能:

foo::
        $(eval var := $(shell echo 'hello'))
        @printf 'ifndef is $(if $(var),true,false). var is ${var}'
但对我来说,这似乎是一个错误,你可能会在更基本的层面上重新考虑你要做的事情