我正在编写一个需要定义一些环境变量的 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 ...)
function 不会像 makefile 代码一样评估函数的结果,所以你不能像 ifdef
这样的东西那里。
发生的事情是check-var-defined
的内容被扩展,因为它不能识别 ifdef
操作,它只是继续扩展$(error ...)
每次都发挥作用。
如果您想使用 ifdef
您必须使用 $(eval ...)
与 $(call ...)
它将评估结果,就好像它是一个 makefile。
更简单的是使用 $(if ...)
函数,像这样:
check-var-defined = $(if $(1),,$(error $(1) is not defined))
请注意,如果变量为空,这将失败,这与未定义不完全相同;它可以被定义为空(如
VAR1=
)。但就是这样ifdef
工作也很困惑。
关于makefile - 使用 GNU-make 函数检查是否定义了变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389064/