首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GNU-make函数检查是否定义了变量

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

Stack Overflow用户
提问于 2013-12-05 08:30:13
回答 3查看 4.5K关注 0票数 4

我正在编写一个makefile,它需要定义一些环境变量。我正在尝试使用类似这样的东西来获取以下内容:

代码语言:javascript
复制
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时,我得到的结果是:

代码语言:javascript
复制
$ make
Makefile:7: *** VAR1 is not defined. Stop.

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

代码语言:javascript
复制
$ make VAR1=hello
Makefile:7: *** VAR1 is not defined. Stop.

你知道为什么这个不起作用吗?我能做些什么来让它工作呢?提前谢谢。

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

EN

回答 3

Stack Overflow用户

发布于 2013-12-05 08:37:15

$(call ...)函数不会计算函数的结果,就好像它是makefile代码一样,所以您不能在那里执行ifdef之类的操作。

发生的情况是,check-var-defined的内容被扩展,因为它不能识别ifdef操作,所以它每次都会继续扩展$(error ...)函数。

如果你想使用ifdef,你必须使用带有$(call ...)$(eval ...),它会像makefile一样评估结果。

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

代码语言:javascript
复制
check-var-defined = $(if $(1),,$(error $(1) is not defined))

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

票数 3
EN

Stack Overflow用户

发布于 2014-03-21 01:18:19

第一个答案中的宏很棒,但实际上并没有报告'empty‘变量的名称。下面是对example/test的一个小小的改进:

代码语言:javascript
复制
# -*- 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“。停止。

票数 2
EN

Stack Overflow用户

发布于 2019-03-19 03:56:21

代码语言:javascript
复制
defined = $(strip $(filter-out undefined,$(flavor $1)))

ensure-defined = \
  $(eval .ensure-defined :=) \
  $(foreach V,$(sort $1), \
    $(if $(call defined,$V),,$(eval .ensure-defined += $V)) \
   ) \
  $(if $(strip ${.ensure-defined}), \
    $(foreach V,${.ensure-defined}, \
      $(info NOT DEFINED: $$$V) \
     ) \
    $(error Required variables not defined) \
   )

ifFOO = $(if $(call defined,FOO), \
          $(info FOO is defined: '${FOO}'), \
          $(info FOO not defined) \
         )

$(ifFOO)

FOO := foo

$(ifFOO)

$(call ensure-defined,FOO BAR)

all: ; @:

输出:

代码语言:javascript
复制
$ make -f foo.mk
FOO not defined
FOO is defined: 'foo'
NOT DEFINED: $BAR
foo.mk:25: *** Required variables not defined.  Stop.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20389064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档