我正在编写一个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,并且在执行此操作之前需要正确设置变量)。
发布于 2013-12-05 08:37:15
$(call ...)函数不会计算函数的结果,就好像它是makefile代码一样,所以您不能在那里执行ifdef之类的操作。
发生的情况是,check-var-defined的内容被扩展,因为它不能识别ifdef操作,所以它每次都会继续扩展$(error ...)函数。
如果你想使用ifdef,你必须使用带有$(call ...)的$(eval ...),它会像makefile一样评估结果。
更简单的方法是使用$(if ...)函数,如下所示:
check-var-defined = $(if $(1),,$(error $(1) is not defined))请注意,如果变量为空,这将失败,这与未定义并不完全相同;它可以被定义为空(如VAR1=)。但这也是ifdef的工作方式,令人困惑。
发布于 2014-03-21 01:18:19
第一个答案中的宏很棒,但实际上并没有报告'empty‘变量的名称。下面是对example/test的一个小小的改进:
# -*- 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“。停止。
发布于 2019-03-19 03:56:21
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: ; @:输出:
$ make -f foo.mk
FOO not defined
FOO is defined: 'foo'
NOT DEFINED: $BAR
foo.mk:25: *** Required variables not defined. Stop.https://stackoverflow.com/questions/20389064
复制相似问题