Linux 在目标内设置make变量

Linux 在目标内设置make变量,linux,compilation,gnu-make,Linux,Compilation,Gnu Make,假设GNU为3.81 下面的makefile all: echo before TEST=1 echo after 在“TEST=1”行中产生“在第一个目标之前开始命令。停止” 从另一侧开始,在测试中添加“覆盖”,如下所示: all: echo before override TEST=1 echo after 运行良好(打印前和打印后) 问题: 为什么“测试=1”不正常,而“覆盖测试=1”正常 为什么目标命令中的“覆盖测试=1

假设GNU为3.81

下面的makefile

all:
        echo before
TEST=1
        echo after
在“TEST=1”行中产生“在第一个目标之前开始命令。停止”

从另一侧开始,在测试中添加“覆盖”,如下所示:

all:
        echo before
override TEST=1
        echo after
运行良好(打印前和打印后)

问题:

  • 为什么“测试=1”不正常,而“覆盖测试=1”正常

  • 为什么目标命令中的“覆盖测试=1”是正确的?普罗巴

  • 我猜是这样

    override TEST=1
    
    被解释为:

    override: TEST=1
    
    。。。这在GNU make中完全有效

    您只需命名目标,然后在make文件的global部分中设置变量,即可修改每个目标的变量,如下所示:

    <target>: <variable>:=<value>
    <target>: <variable>=<value>
    <target>: <variable>+=<value>
    
    ::=
    : =
    : +=
    
    通过这种方式,通常只为单个对象文件添加或修改
    CFLAGS

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

    我猜是这样的

    override TEST=1
    
    被解释为:

    override: TEST=1
    
    。。。这在GNU make中完全有效

    您只需命名目标,然后在make文件的global部分中设置变量,即可修改每个目标的变量,如下所示:

    <target>: <variable>:=<value>
    <target>: <variable>=<value>
    <target>: <variable>+=<value>
    
    ::=
    : =
    : +=
    
    通过这种方式,通常只为单个对象文件添加或修改
    CFLAGS


    注意:然而,在尝试时在目标的命令块中进行变量赋值是错误的语法。

    类似于@dmckee规则的先决条件部分中定义的特定于目标的变量,而测试变量在规则的命令部分的某处。这是我的注释没有说“重复”的原因。类似于。@dmckee在规则的先决条件部分中定义了特定于目标的变量,而测试变量在规则的命令部分中。我的注释没有说“重复”是有原因的。
    Target:a:=1
    肯定不起作用(在
    /bin/sh:1:a:=:找不到时失败)当与
    $(A)
    @KarlRichter:
    target:A:=1
    一起使用时,会导致
    A
    为空。我不知道
    /bin/sh
    将如何或为什么参与其中。毕竟,这不是一个食谱。而
    target A=1
    仍然需要在
    target
    后面加一个冒号(
    ),因为这样做的目的是将变量赋值限制到单个目标(可以是文件或虚假目标)。是的,这确实有效。你真的读过我答案末尾的便条了吗?!因为你的评论强烈表明你正陷入与问题OP相同的谬误中。
    target:A:=1
    肯定不起作用(与
    /bin/sh:1:A:=:not found
    )和
    target A=1
    一起使用时会导致
    A
    为空(A)
    @KarlRichter:
    目标:A:=1
    是GNU特定的。我不知道
    /bin/sh
    将如何或为什么参与其中。毕竟,这不是一个食谱。而
    target A=1
    仍然需要在
    target
    后面加一个冒号(
    ),因为这样做的目的是将变量赋值限制到单个目标(可以是文件或虚假目标)。是的,这确实有效。你真的读过我答案末尾的便条了吗?!因为你的评论强烈地表明,你正沦为与问题的主旨相同的谬误的牺牲品。