Makefile 如何在GNU Make中的define中使用ifeq?

Makefile 如何在GNU Make中的define中使用ifeq?,makefile,Makefile,我试图在Makefile中的define中执行ifeq,但我似乎遇到了一些错误,我想知道我是否遗漏了什么。我有以下生成文件: $(info ---- start ----) ifeq ("X","Y") $(info DOES not appear_1) endif define TESTDEF ifeq ("X","Y") $(info SHOULD not appear) # $(error DEFINITELY SHOULD not error...) endif endef $(ev

我试图在Makefile中的define中执行ifeq,但我似乎遇到了一些错误,我想知道我是否遗漏了什么。我有以下生成文件:

$(info ---- start ----)
ifeq ("X","Y")
$(info DOES not appear_1)
endif

define TESTDEF
ifeq ("X","Y")
$(info SHOULD not appear)
# $(error DEFINITELY SHOULD not error...)
endif
endef

$(eval $(call TESTDEF, 1,2,3))
我得到以下错误:

---- start ----
SHOULD not appear
Makefile:14: *** DEFINITELY SHOULD not error....  Stop.

有什么我错过的把戏吗?有可能做ifeq的内部定义吗?(注意:在我的本机GNU 3.81 make和我的mips uclibc交叉编译器上都会发生这种情况)

当您调用此函数时,make会使用您提供的任何参数来计算定义(在本例中不相关)。因此,如果定义包含类似于
$(info…
$(error…
)的内容,即使在注释中,Make也会对其进行评估,您将看到结果(请参阅;我已经在GNUMake 3.81中对其进行了测试)

要获得您想要的行为,请添加几个美元符号:

define TESTDEF
ifeq ("X","Y")
$$(info SHALL not appear)
# $$(info DEFINITELY SHALL not error...)
endif
endef

$(eval $(call TESTDEF))

此外,
ifeq
在第一次通过时进行评估。如果
ifeq
引用调用了
$(1)
等变量,则在
TESTDEF
的初始求值过程中,当它们不存在时,会展开它们。改用
$(如果…
)。让我的一天变得简单而精确@克雷格·格林格,看看这个。如果在宏内部执行
ifeq($1,)
,则在展开
$(call
)之前,
$1
不会展开,因此在define内部使用
ifeq
是有效的(尽管我不建议这样做)。。。