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 

当我在没有参数的情况下运行 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/

相关文章:

c++ - g++ : can't link with a main executable file

git - Makefile中子模块的自动初始化和更新

linux - 在 makefile 中指定文件名

c - "make target"在 "make clean"之后不工作

c - 通过命令行附加到 GNU make 变量

makefile - make echo 在生成的文件中包含引号

makefile - Atmel Studio 中的外部 makefile 无法构建。 Windows 错误 0xc0000142

linux - 在 bash 脚本中连接两条指令

unix - AIX Makefile 中的条件部分

制作或制作。我需要两者吗?