【问题标题】:Setting make variable inside target在目标内设置 make 变量
【发布时间】:2011-11-21 15:35:52
【问题描述】:

给定 GNU Make 3.81。

下面的makefile

all:
        echo before
TEST=1
        echo after

产生“命令在第一个目标之前开始。停止。”在“TEST=1”行。

从另一侧将“覆盖”添加到 TEST,如下所示:

all:
        echo before
override TEST=1
        echo after

运行良好(之前和“之后”都是“打印”的)。

问题:

  1. 为什么“TEST=1”不行,而“override TEST=1”可以?

  2. 为什么在目标的命令中“覆盖 TEST=1”没问题?概率

【问题讨论】:

标签: linux compilation gnu-make


【解决方案1】:

我猜是这样的

override TEST=1

被解释为:

override: TEST=1

... 这在 GNU make 中完全有效。

您可以简单地通过命名目标来修改每个目标的变量,然后像在 make 文件的全局部分中那样设置变量,例如:

<target>: <variable>:=<value>
<target>: <variable>=<value>
<target>: <variable>+=<value>

通过这种方式,为单个对象文件附加或修改 CFLAGS 是很常见的...

注意: 但是,在您尝试的目标命令块内进行变量赋值是错误的语法。

【讨论】:

  • target: A:=1 绝对不起作用(与/bin/sh: 1: A:=: not found 一起失败)和target A=1 导致A 在与$(A) 一起使用时为空。
  • @KarlRichter:target: A:=1 是 GNU 特定的。我知道/bin/sh 将如何或为什么会参与其中。毕竟,这不是在食谱中。并且target A=1target 后面仍然需要一个冒号(:),因为其目的是将变量分配限制为单个目标(可以是文件或虚假目标)。是的,这绝对有效。您是否真的阅读了我答案末尾的NOTE?!因为您的评论强烈表明您正在成为与问题的 OP 相同的谬误的牺牲品。
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 2017-04-19
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多