18

我知道您可以在 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 个视图,并且我认为使用 c++ 的人可能知道答案,我知道这不是严格意义上的 c++ 问题(尽管我打算用它编译 c++)

编辑:看起来有一个使用这种语法的 if 函数
$(if condition,then-part[,else-part])
我仍然对它的工作原理有点困惑

4

2 回答 2

22

正如您所发现的,该$(if ...)函数可以用作三元运算符。真正的问题是,条件句(真与假)在 GNU make 中是如何工作的?在 GNU 中,任何需要条件(布尔表达式)的地方,空字符串都被认为是假的,任何其他值都被认为是真。

因此,要测试是否$(CC)是 string gcc,您需要使用一个函数,该函数在不是时返回一个空值,在它是时返回一个非空值。

通常使用filterandfilter-out函数。不幸的是,以这样一种方式使用它们是最简单的,你会得到“不相等”的结果;换句话说,如果字符串不是,使用这些函数可以更简单地准确生成非空字符串 (true),如果值为 , gcc准确生成空字符串 (false) 。例如: gcc

$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))
于 2013-07-31T22:33:48.800 回答
5

如果您尝试实现的唯一效果是使用一个或另一个编译器,我认为最好的方法是为该特殊编译步骤使用一个变量并根据您的条件进行设置。

ifeq (condition)
    MYCC=$(CC2)
    LIBS=$(LIBS_FOR_CC2)
else
    MYCC=$(CC)
    LIBS=$(LIBS_FOR_CC)
endif

然后在规则后面编译使用

$(MYCC) -o foo $(objects) $(LIBS)

至少这是我记得将 makefile 构建为 a) 配置和 b) 规则集的方式。

抱歉,如果这不能回答您的问题,但我不知道 GNU make 的 ternay 运算符(我假设您指的是 GNU make?)。

于 2013-07-31T21:41:40.750 回答