Makefile 使用GNU make函数检查是否定义了变量

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 当我在没有参数

我正在编写一个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 
当我在没有参数的情况下运行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.