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,您需要使用一个函数,当它不是时将返回一个空值,而当它是一个非空值时.
通常,filter和filter-out函数用于此.不幸的是,最简单的方法就是以这种方式使用它们,以获得"不相等"的结果; 换句话说,使用这些功能是更简单准确地生成一个非空字符串(真)如果字符串是不是 gcc和一个空字符串(假)如果值是 gcc.例如:
$(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))
Run Code Online (Sandbox Code Playgroud)
如果您试图实现的唯一效果是使用一个或另一个编译器,我认为最好的方法是为该特殊编译步骤使用一个变量,并根据您的条件进行设置。
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?)。
| 归档时间: |
|
| 查看次数: |
4295 次 |
| 最近记录: |