【问题标题】:Conditional expression in MakefileMakefile 中的条件表达式
【发布时间】:2013-08-01 13:00:30
【问题描述】:

我知道你可以在 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])
我仍然对它的工作原理有点困惑

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 无意冒犯,但如果答案基本上告诉我我想要什么是不可能的并且提供的新信息很少,我希望你用某种文章支持它,或者它来自某人谁在make 拥有很高的代表,而不是今天加入该网站的用户
    • 澄清一下,如果你能支持你的答案,我很乐意接受它
    • 我建议你运行 'info make "Conditional Syntax"' 和 'info make "Conditional Functions"' 并阅读手册。对于您的问题,我不确定您要达到的目标。如果您正在努力在 makefile 中使用更规范的样式,我仍然会推荐我的第一个建议。
    【解决方案2】:

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

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

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

    $(if $(filter-out gcc,$(CC)),$(info is not gcc),$(info is gcc))
    

    【讨论】:

    • 我想有一种方法可以实现我想要的,这在编写 makefile 时是否被认为是惯用的,我也会投票但我必须等待 42 分钟,用完投票
    • 我认为实际上 Chris 是正确的:这种事情很少在 makefile 中完成。通常使用其他方法,例如递归变量命名(类似gcc_LIBS = $(libs_for_gcc),然后在规则中使用$($(CC)_LIBS),或者包含不同的makefile来为不同的编译器设置变量等。所以我不会真的称之为惯用语。但并非闻所未闻。
    • 好的,我不喜欢 Chris 的回答的唯一原因是它没有提供任何我不知道的东西。我现在已经对他进行了紫外线处理
    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2021-06-12
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多