Makefile 使用GNU make函数检查是否定义了变量
我正在编写一个makefile,它需要定义一些环境变量。我试图用这样的方法来实现:Makefile 使用GNU make函数检查是否定义了变量,makefile,gnu-make,Makefile,Gnu Make,我正在编写一个makefile,它需要定义一些环境变量。我试图用这样的方法来实现: define check-var-defined ifndef $(1) $(error $(1) is not defined) endif endef $(call check-var-defined,VAR1) $(call check-var-defined,VAR2) $(call check-var-defined,VAR3) rule1: #stuff 当我在没有参数
define check-var-defined
ifndef $(1)
$(error $(1) is not defined)
endif
endef
$(call check-var-defined,VAR1)
$(call check-var-defined,VAR2)
$(call check-var-defined,VAR3)
rule1:
#stuff
当我在没有参数的情况下运行make时,我得到以下结果:
$ make
Makefile:7: *** VAR1 is not defined. Stop.
但是当我使用指定的VAR1运行它时,我得到了相同的错误
$ make VAR1=hello
Makefile:7: *** VAR1 is not defined. Stop.
你知道为什么这样不行吗?我能做些什么来让它工作?提前谢谢
(请注意,我需要检查在运行makefile时是否实际定义了变量,因为我需要进一步包含另一个makefle,并且在执行此操作时需要正确设置变量) 函数$(call…
不会像评估makefile代码一样评估函数的结果,因此不能在那里执行类似ifdef
的操作
所发生的情况是,check var defined
的内容被展开,并且由于它不识别ifdef
操作,因此每次它都只继续展开$(error…
函数
如果要使用ifdef
,则必须将$(eval…
与$(call…)
一起使用,这将像评估生成文件一样评估结果
更简单的方法是使用$(if…
函数,如下所示:
check-var-defined = $(if $(1),,$(error $(1) is not defined))
请注意,如果变量为空,则此操作将失败,这与未定义并不完全相同;它可以被定义为空(如
VAR1=
)。但这也是ifdef的工作方式,令人困惑。第一个答案中的宏很好,但实际上没有报告“empty”变量的名称。下面是示例/测试的一个轻微改进:
# -*- mode: makefile -*-
check-var-defined = $(if $(strip $($1)),,$(error "$1" is not defined))
my_def1:=hello
my_def3:=bye
$(call check-var-defined,my_def1)
$(call check-var-defined,my_def2)
$(call check-var-defined,my_def3)
结果是:
Makefile:10:*未定义“my_def2”。停下来
输出:
$ make -f foo.mk
FOO not defined
FOO is defined: 'foo'
NOT DEFINED: $BAR
foo.mk:25: *** Required variables not defined. Stop.
$ make -f foo.mk
FOO not defined
FOO is defined: 'foo'
NOT DEFINED: $BAR
foo.mk:25: *** Required variables not defined. Stop.