使用 GNU-make 函数检查变量是否已定义

Ale*_*key 6 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 
Run Code Online (Sandbox Code Playgroud)

当我运行不带参数的 make 时,我得到:

$ make
Makefile:7: *** VAR1 is not defined. Stop.
Run Code Online (Sandbox Code Playgroud)

但是当我使用指定的 VAR1 运行它时,我得到了同样的错误。

$ make VAR1=hello
Makefile:7: *** VAR1 is not defined. Stop.
Run Code Online (Sandbox Code Playgroud)

有什么想法为什么这行不通吗?我该怎么做才能使这项工作成功?提前致谢。

(请注意,我需要检查运行 makefile 时是否实际定义了变量,因为我需要进一步包含另一个 makefle,并且在执行此操作时需要正确设置变量)。

Mad*_*ist 4

$(call ...)函数不会makefile 代码一样评估函数的结果,因此您不能执行类似的操作ifdef

所发生的情况是, 的内容check-var-defined被扩展,并且由于它无法识别该操作,因此每次ifdef都会继续扩展该函数。$(error ...)

如果你想使用,ifdef你必须使用$(eval ...)with$(call ...)来评估结果,就像它是一个 makefile 一样。

更简单的是使用该$(if ...)函数,如下所示:

check-var-defined = $(if $(1),,$(error $(1) is not defined))
Run Code Online (Sandbox Code Playgroud)

请注意,如果变量为空,这将失败,这与未定义并不完全相同;它可以被定义为空(如VAR1=)。但这也是一种ifdef令人困惑的运作方式。