命令行变量-在makefile中-扩展为奇怪的值
从: 特定于目标的变量与任何其他变量具有相同的优先级 makefile变量。命令行上提供的变量(以及 如果'-e'选项有效,则以环境为准。 指定“override”指令将允许特定于目标的 首选可变值 因此,一个简单的makefile,如:命令行变量-在makefile中-扩展为奇怪的值,makefile,gnu-make,Makefile,Gnu Make,从: 特定于目标的变量与任何其他变量具有相同的优先级 makefile变量。命令行上提供的变量(以及 如果'-e'选项有效,则以环境为准。 指定“override”指令将允许特定于目标的 首选可变值 因此,一个简单的makefile,如: #特定于模式的变量赋值。 %:foo+=文件 全部:x; #目标是一个不带依赖项的双冒号,因此Make将始终运行其命令。 x:: @回显“$(foo)” 运行时,我们得到: #使用命令行赋值重写makefile级别的变量。 $make foo=cmd 命令
#特定于模式的变量赋值。
%:foo+=文件
全部:x;
#目标是一个不带依赖项的双冒号,因此Make将始终运行其命令。
x::
@回显“$(foo)”
运行时,我们得到:
#使用命令行赋值重写makefile级别的变量。
$make foo=cmd
命令
#在环境中设置该值,并告诉Make优先于任何makefile级别的定义。
$foo=env make——环境覆盖
环境文件
现在返回上面的引用,来自文档:
命令行上提供的变量(如果'-e'选项有效,则在环境中提供)将优先
似乎,使用以下任一方法:
-e
(-Environment overrides
)cmd
,环境中给出的值是:env
现在,比较为命令行替代和环境替代提供的值:
cmd
(用于命令行覆盖)env文件
(用于环境覆盖)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
是一个简单的例子<代码>环境文件是奇数。回答。