我正在编写一个需要定义一些环境变量的 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,并且在执行此操作时需要正确设置变量)。
该$(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令人困惑的运作方式。
| 归档时间: |
|
| 查看次数: |
6086 次 |
| 最近记录: |