Makefiles-如何使用eval';带ifndef/ifdef的d变量?
我试图弄清楚如何获取eval'd变量(使用shell的输出)以通过条件检查,如ifndef或ifdef。我需要使用shell,因为我实际上使用的是一个返回一些输出的脚本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
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}'
但对我来说,这似乎是一个错误,你可能会在更基本的层面上重新考虑你要做的事情