Makefile ifeq 逻辑与

45

我想在GNU make文件的if循环中检查多个条件。以下是一个示例:

ifeq ($(TEST_FLAG),TRUE && ($(DEBUG_FLAG),FALSE))
true statement 
else 
false statement
endif

怎么做是正确的方式?


2
在更新的GNU make版本中,有一个名为$(and ...)的函数可以提供帮助。 - MadScientist
3个回答

42
尽管 Hasturkun 的解决方案可行,但我认为惯用的写法是:
ifeq ($(TEST_FLAG),TRUE)
ifeq ($(DEBUG_FLAG),FALSE)
# Stuff
endif
endif

你应该使用else部分,这样错误的语句才会执行。 - Dror Cohen
当ifeq有else时,我遇到了麻烦,例如:ifeq() ... ifeq()...endif else ... ifeq()...endif ... endif。我收到了“extraneous 'else'”错误。 - NickSoft
3
如果我想要使用或操作符("or")怎么办? - Ankur Gautam
6
“false statement”(在“else”部分)需要被复制。 - Ioanna

36

你可以使用ifeq与您的值的连接,例如:

ifeq ($(TEST_FLAG)$(DEBUG_FLAG),TRUEFALSE)
   do something
endif

也可以使用条件函数,这些函数在循环中更有用(因为 ifeq 在循环中可能不会按照预期执行,它只会测试一次)。


1
我认为在TRUEFALSE之前的前导空格会_破坏_检查,因为ifeq对于前导空格非常敏感,所以它永远不会起作用。你能否检查一下,如果我是正确的,请编辑你的答案? - Peter VARGA
1
这将会产生误报:make TEST_FLAG=TR DEBUG_FLAG=UEFALSEmake DEBUG_FLAG=TRUEFALSE - xtofl
@xtofl:它会生效,但假设这些值要么是“TRUE”,要么是“FALSE”,而不是两者混合。 - Hasturkun

0
你可以在两个endif之后放置错误的陈述。
ifeq ($(TEST_FLAG),TRUE)
ifeq ($(DEBUG_FLAG),FALSE)
true statement 
endif
endif
false statement

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接