【问题标题】:make: Using target specific variables in prerequisitesmake:在先决条件中使用目标特定变量
【发布时间】:2012-03-07 21:04:57
【问题描述】:

我正在尝试编写一个 Makefile,其中使用目标特定变量的先决条件

version=

target1: override version=1
target1: package

target2: override version=2
target2: package

package: dir=package-${version}\
package: source

source: src/${version}.c

当我运行 make 时,版本变量在目标包中,源为空。

我做错了什么?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    使用Secondary Expansion:

    .SECONDEXPANSION:
    
    package: dir=package-$${version}
    package: source
    
    source: src/$${version}.c
    

    更新。

    这个答案是错误的,由于answer 中对类似问题解释的原因,建议的代码将不起作用。

    TL;DR:目标特定变量根据 make 当前构建的目标生效 [1]。反过来,第二次扩展发生在读入阶段结束时 [2],然后再构建任何东西。

    感谢@koniiiik指出。

    【讨论】:

    • 很遗憾,这不起作用;即使二次扩展,上述Makefile中source的前提条件是src/.c,原因在stackoverflow.com/q/22679137/687488和那里的答案中解释...
    • @koniiiik 你的那个例子不起作用,因为DEP 变量的目标特定性。试着把它改成普通的,一切都会好起来的。这个特定的答案确实有效,因为version 变量不是特定于目标的。
    • 嗯,这对我来说当然不起作用——我从上面复制粘贴了代码,当我使用 GNU Make 4.1 运行 make target1 时,我得到的输出是 make: *** No rule to make target 'src/.c', needed by 'source'. Stop.
    • @koniiiik 看来,您是对的,而且确实对我也不起作用。我必须在发布之前检查过代码。 version 变量 is 也是特定于目标的。感谢您的评论,很抱歉造成混乱,我会修复答案。
    • 没问题,很抱歉,除了复制 Makefile 的部分内容之外,似乎没有其他方法可以完成这项工作……
    猜你喜欢
    • 2014-05-05
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2012-12-13
    相关资源
    最近更新 更多