我知道你可以在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])
我仍然对它如何运作感到困惑
答案 0 :(得分:10)
正如您所发现的,$(if ...)
函数可以作为三元运算符。真正的问题是,条件语(真与假)如何在GNU make中工作?在GNU中任何需要条件(布尔表达式)的地方,空字符串被视为false,任何其他值都被视为true。
因此,要测试$(CC)
是否为字符串gcc
,您需要使用一个函数,当它不是时返回一个空值,当它是非空值时是
通常会使用filter
和filter-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?)。