我知道您可以在 makefile 中使用如下 if 语句:
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
有没有办法像三元类型运算符那样进行条件替换。
(condition?$(CC):$(CC2)) -o foo $(objects) $(libs_for_gcc)
如果没有什么是实现该示例的最惯用的方法
我添加了 c++ 标签,因为这个问题只有 7 个 View ,我认为使用 c++ 的人可能知道答案,我知道这不是一个严格的 c++ 问题(尽管我打算用它编译 c++ )
编辑: 看起来有一个使用此语法的 if 函数
$(if condition,then-part[,else-part])
不过,我对它的工作原理还是有点困惑
最佳答案
正如您所发现的,$(if ...)
函数可以用作三元运算符。真正的问题是,条件(真与假)在 GNU make 中是如何工作的?在 GNU make 中,任何需要条件( bool 表达式)的地方,空字符串都被认为是 false,任何其他值都被认为是 true。
因此,要测试 $(CC)
是否是字符串 gcc
,您需要使用一个函数,当它不是时返回一个空值, 和一个非空值。
通常 filter
和 filter-out
函数用于此。不幸的是,最容易以得到“不相等”结果的方式使用它们;换句话说,如果字符串是 not gcc
,则使用这些函数可以更简单地准确生成非空字符串 (true),如果是,则生成空字符串 (false)值是 gcc
。例如:
$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))
关于c++ - Makefile 中的条件表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17979926/