如何在GNU Make中定义ifeq?

Joh*_*ohn 6 makefile

我正在尝试在Makefile中的一个定义内部执行ifeq,但我似乎遇到了一些错误,我想知道我是否遗漏了一些东西.我有以下Makefile:

$(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))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

---- start ----
SHOULD not appear
Makefile:14: *** DEFINATELY SHOULD not error....  Stop.
Run Code Online (Sandbox Code Playgroud)

有一些我不知道的伎俩吗?有可能做ifeq的内部定义吗?(注意:这发生在我的本机GNU 3.81 make和我的mips uclibc交叉编译器上)

Bet*_*eta 11

当您使用call此函数时,Make会使用您提供的任何参数来评估定义(在本例中不相关).因此,如果定义包括像$(info ...)或者$(error ...),即使是在一个注释,让会评估它,你会看到的结果(见文档 ;我在gnumake的3.81测试过).

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

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

$(eval $(call TESTDEF))
Run Code Online (Sandbox Code Playgroud)

  • 此外,在第一次传递期间评估“ifeq”。如果 `ifeq` 引用调用像 `$(1)` 这样的变量,它们会在 `TESTDEF` 的初始评估期间扩展,当它们不存在时。改用`$(if ...)`。http://www.gnu.org/software/make/manual/make.html#Conditional-Functions (3认同)