Makefile中的条件表达式

时间:2013-07-31 20:08:01

标签: c++ if-statement makefile conditional-expressions

我知道你可以在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])
我仍然对它如何运作感到困惑

2 个答案:

答案 0 :(得分:10)

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

因此,要测试$(CC)是否为字符串gcc,您需要使用一个函数,当它不是时返回一个空值,当它是非空值时是

通常会使用filterfilter-out函数。不幸的是,最简单的方法就是以这种方式使用它们,以获得“不相等”的结果;换句话说,使用这些函数,如果字符串 gcc,则准确生成非空字符串(true)要简单得多,如果值< gcc则为空字符串(false) em>是 $(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc)) 。例如:

{{1}}

答案 1 :(得分:3)

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

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?)。