Makefile中的条件表达式

aar*_*man 10 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
Run Code Online (Sandbox Code Playgroud)

有没有办法像可能的三元类型运算符那样进行条件替换.

(condition?$(CC):$(CC2)) -o foo $(objects) $(libs_for_gcc)  
Run Code Online (Sandbox Code Playgroud)

如果没有什么是最惯用的方式来实现这个例子

我添加了c ++标签,因为这个问题只有7个视图,我认为使用c ++的人可能会知道答案,我知道这不是一个严格的c ++问题(虽然我打算用它编译c ++)

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

Mad*_*ist 11

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

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

通常,filterfilter-out函数用于此.不幸的是,最简单的方法就是以这种方式使用它们,以获得"不相等"的结果; 换句话说,使用这些功能是更简单准确地生成一个非空字符串(真)如果字符串是不是 gcc和一个空字符串(假)如果值 gcc.例如:

$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 5

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

ifeq (condition)
    MYCC=$(CC2)
    LIBS=$(LIBS_FOR_CC2)
else
    MYCC=$(CC)
    LIBS=$(LIBS_FOR_CC)
endif
Run Code Online (Sandbox Code Playgroud)

然后在后面的规则编译使用

$(MYCC) -o foo $(objects) $(LIBS)
Run Code Online (Sandbox Code Playgroud)

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

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