命令行变量-在makefile中-扩展为奇怪的值

命令行变量-在makefile中-扩展为奇怪的值,makefile,gnu-make,Makefile,Gnu Make,从: 特定于目标的变量与任何其他变量具有相同的优先级 makefile变量。命令行上提供的变量(以及 如果'-e'选项有效,则以环境为准。 指定“override”指令将允许特定于目标的 首选可变值 因此,一个简单的makefile,如: #特定于模式的变量赋值。 %:foo+=文件 全部:x; #目标是一个不带依赖项的双冒号,因此Make将始终运行其命令。 x:: @回显“$(foo)” 运行时,我们得到: #使用命令行赋值重写makefile级别的变量。 $make foo=cmd 命令

从:

特定于目标的变量与任何其他变量具有相同的优先级 makefile变量。命令行上提供的变量(以及 如果'-e'选项有效,则以环境为准。 指定“override”指令将允许特定于目标的 首选可变值

因此,一个简单的makefile,如:

#特定于模式的变量赋值。
%:foo+=文件
全部:x;
#目标是一个不带依赖项的双冒号,因此Make将始终运行其命令。
x::
@回显“$(foo)”
运行时,我们得到:

#使用命令行赋值重写makefile级别的变量。
$make foo=cmd
命令
#在环境中设置该值,并告诉Make优先于任何makefile级别的定义。
$foo=env make——环境覆盖
环境文件
现在返回上面的引用,来自文档:

命令行上提供的变量(如果'-e'选项有效,则在环境中提供)将优先

似乎,使用以下任一方法:

  • 命令行分配
  • 环境设置变量,并使用
    -e
    -Environment overrides
  • 同时具有相同的效果,即覆盖文件级别(makefile)变量

    但是,结果差别很大。请记住,命令行中给出的值是:
    cmd
    ,环境中给出的值是:
    env

    现在,比较为命令行替代和环境替代提供的值:

  • cmd
    (用于命令行覆盖)
  • env文件
    (用于环境覆盖)
  • 因此,对于命令行,Make重复相同的值,即
    cmd
    三次,而对于环境覆盖,情况则不同。也就是说,Make将“重复”环境级值:
    env
    1时间,然后重复(不是其他)被覆盖的文件级值:
    文件

    现在,不仅命令行的“覆盖”与环境的“覆盖”情况完全不同(这本身就很奇怪),这里的问题更大

    既然制定规则为命令行(或环境)值赋予“优先级”,为什么它坚持附加“其他”值(如在环境覆盖的情况下,Make附加“file file”),或者在命令行覆盖的情况下(Make重复相同的值***3次*)。真的吗


    这有什么意义?这些不一致和奇怪的结果的理由是什么?

    我相信这里的答案与问题的答案有关。(可能还有环境覆盖版本中的错误。)

    全局变量和目标特定变量是不同的变量

    cmd cmd
    结果是因为当您写入
    %时:foo+=file
    make将其存储为变量
    foo
    的当前值和变量
    foo
    的目标特定值(即
    file
    )的相加

    但是,当您在命令行上设置
    foo
    时,make会将目标特定变量
    foo
    的值覆盖为
    cmd
    ,而不是
    file
    。因此,当make concats变量每次获得
    cmd

    我认为这个解释应该会让你明白,我不知道为什么它不会。这可能是一个bug,也可能是关于env覆盖变量和目标特定变量值如何工作的其他细节。我不确定


    (检查这两种情况下
    make-p
    的输出,以了解我对目标特定变量值的含义。)

    我对
    env file
    结果很有意义;
    cmd
    结果毫无意义。我不得不猜测为什么在基本的
    foo
    宏中也添加了两个(而不是一个)。我会注意到,如果目录中碰巧有一个文件
    x
    ,则不会执行echo命令。添加两个文件的原因是,一个来自
    all
    目标,另一个来自
    x
    目标,因为两者都匹配
    %
    。你就是那个发布了所有那些格式奇怪的关于make a while的投诉清单的人,不是吗?如果您有bug,您希望向make开发人员报告,那么就这样做。这不是一个合适的论坛。如果你真的对潜在正确但奇怪的行为的诊断感兴趣,那么我建议你放松一下语气。我看不出
    cmd
    是如何“潜在正确的”。
    cmd
    是一个简单的例子<代码>环境文件是奇数。回答。