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)
,然后解析为空白。下一部分是,我不确定定义中if
ifneq
的用法。您可以使用
$(如果)

----编辑------

事实上,这是缺少的空间和@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)
,然后解析为空白。下一部分是,我不确定定义中if
ifneq
的用法。您可以使用
$(如果)

----编辑------

事实上,这是缺少的空间和@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
删除一个层吗?