Makefile:define中的条件
我试图检查变量值是否为Makefile:define中的条件,makefile,gnu-make,Makefile,Gnu Make,我试图检查变量值是否为yes或no,但以下操作总是失败: FLAG1 ?= no FLAG2 ?= yes define check_ ifneq ($(filter $(2),$($(1))),$($(1))) $(error Bad $(1) argument) endif endef $(call check_,FLAG1,yes no) $(call check_,FLAG2,yes no) 我做错了什么?您不能对多行宏使用普通的调用。如果调用函数的
yes
或no
,但以下操作总是失败:
FLAG1 ?= no
FLAG2 ?= yes
define check_
ifneq ($(filter $(2),$($(1))),$($(1)))
$(error Bad $(1) argument)
endif
endef
$(call check_,FLAG1,yes no)
$(call check_,FLAG2,yes no)
我做错了什么?您不能对多行宏使用普通的
调用。如果调用
函数的结果包含多行makefile内容,则必须使用$(eval$(call…)
您可以使用以下选项:
define check_
ifneq ($$(filter $(2),$$($(1))),$$($(1)))
$$(error Bad $(1) argument)
endif
endef
基本上,任何您想被eval
解释的内容都需要转义,以便call
看不到它。您不能将普通call
与多行宏一起使用。如果调用
函数的结果包含多行makefile内容,则必须使用$(eval$(call…)
FLAG1 ?= no
FLAG2 ?= yes
define check_
$(if $(filter $($(1)),$(2)),,$(error BAD $(1) argument))
endef
$(call check_,FLAG1,yes no)
$(call check_,FLAG2,yes no)
您可以使用以下选项:
define check_
ifneq ($$(filter $(2),$$($(1))),$$($(1)))
$$(error Bad $(1) argument)
endif
endef
基本上,任何您希望由eval
解释的内容都需要转义,以便call
看不到它
FLAG1 ?= no
FLAG2 ?= yes
define check_
$(if $(filter $($(1)),$(2)),,$(error BAD $(1) argument))
endef
$(call check_,FLAG1,yes no)
$(call check_,FLAG2,yes no)
请注意,您在FLAG1
之前添加了一个空格,这意味着$$(1)
解析为$(FLAG1)
,然后解析为空白。下一部分是,我不确定定义中ififneq
的用法。您可以使用$(如果)
----编辑------
事实上,这是缺少的空间和@MadScientists答案的组合。。。以下方法也有效:
define check_
ifneq ($(filter $($(1)),$(2)),$($(1)))
$$(error Bad $(1) argument [$($(1))] / [$(filter $($(1)),$(2))])
endif
endef
$(eval $(call check_,FLAG1,yes no))
因此,ifneq
可以在宏内部使用。。。(正如@MadScientist所指出的,您必须避开$前面的$
(错误)
,以防止调用扩展它…)
请注意,您在FLAG1
之前添加了一个空格,这意味着$$(1)
解析为$(FLAG1)
,然后解析为空白。下一部分是,我不确定定义中ififneq
的用法。您可以使用$(如果)
----编辑------
事实上,这是缺少的空间和@MadScientists答案的组合。。。以下方法也有效:
define check_
ifneq ($(filter $($(1)),$(2)),$($(1)))
$$(error Bad $(1) argument [$($(1))] / [$(filter $($(1)),$(2))])
endif
endef
$(eval $(call check_,FLAG1,yes no))
因此,ifneq
可以在宏内部使用。。。(正如@MadScientist所指出的,您必须避开$(错误)
前面的$
,以防止它被调用扩展…)$(eval$(调用…)没有帮助。看起来像是内部的检查
它将$$(1)
转换为$1
,而不是$(FLAG1)
如果使用eval,则需要额外的转义级别。我将更新答案。$(eval$(call…)没有帮助。看起来像是内部的检查
它将$$(1)
转换为$1
,而不是$(FLAG1)
如果使用eval,则需要额外的转义级别。我会更新答案。首先,你给第一个参数加了一个空格……首先,你给第一个参数加了一个空格……空格是一个拼写错误,没有空格也不行。显然,ifeq
/ifneq
在define
内部不起作用,正如您所说。filter
功能的唯一问题是make FLAG1=“yes no”
通过了测试。有一个简单的解决方法吗?你必须对$(单词)
做一些像这样的把戏:$(如果$(过滤掉$(2),$(过滤掉$(1))$(过滤掉1,$(单词$(1)),$(错误等等))
。对于任何包含多个单词的FLAG1,这将失败。我提出了以下建议:$(filter$(addsuffix s,$(addprefix p,$(2)),p$($(1))
为什么不需要在filter前面和$(1)前面加倍$呢:ifneq($(filter$$($(1)),$(2)),$($(1))
?除了它插入的$(1)$(2)等之外,调用<代码>调用<代码>是否删除一个层?空格是一个输入错误,没有空格也无法工作。显然,ifeq
/ifneq
在define
内部不起作用,正如您所说。filter
功能的唯一问题是make FLAG1=“yes no”
通过了测试。有一个简单的解决方法吗?你必须对$(单词)
做一些像这样的把戏:$(如果$(过滤掉$(2),$(过滤掉$(1))$(过滤掉1,$(单词$(1)),$(错误等等))
。对于任何包含多个单词的FLAG1,这将失败。我提出了以下建议:$(filter$(addsuffix s,$(addprefix p,$(2)),p$($(1))
为什么不需要在filter前面和$(1)前面加倍$呢:ifneq($(filter$$($(1)),$(2)),$($(1))
?除了它插入的$(1)$(2)等,难道不call
删除一个层吗?