【发布时间】:2015-08-19 05:22:09
【问题描述】:
来自docs:
目标特定变量与其他任何变量具有相同的优先级 生成文件变量。命令行上提供的变量(以及 '-e' 选项生效时的环境)将优先。 指定“覆盖”指令将允许特定于目标 变量值是首选。
所以,一个简单的makefile,比如:
# A pattern-specific variable assignment.
% : foo += file
all : x ;
# Target is a double-colon w/o dependencies, so Make will ALWAYS run its commands.
x ::
@echo '$(foo)'
运行,我们得到:
# Override makefile-level variables, with a command-line assignment.
$ make foo=cmd
cmd cmd cmd
# Set the value in the environment, And tell Make to prefer it over any makefile-level definitions.
$ foo=env make --environment-overrides
env file file
现在回到上面的引用,来自文档:
命令行上提供的变量(如果“-e”选项有效,则在环境中)将优先。
看来,使用任一:
- 命令行分配。
- 环境设置变量,并使用
-e(--environment-overrides)。
具有both 相同效果,即覆盖文件级(makefile)变量。
但是,结果差别很大。请记住,命令行中给出的值是:cmd,而环境中给出的值是:env。
现在,比较命令行覆盖与环境覆盖的值:
-
cmd cmd cmd(用于命令行覆盖)。 -
env file file(用于环境覆盖)。
因此,对于命令行,Make 重复 same 值,即 cmd,3 次,对于环境覆盖,情况是 不同。也就是说,Make 将“重复”环境级值:env 仅 1 次,然后重复 - 仅此而已 - 比 overridden 文件级值: file.
现在,命令行的“覆盖”与环境的“覆盖”的情况完全不同,这本身就很奇怪,这里的问题要大得多。
既然,Make 规则为命令行(或环境)值赋予“优先级”,为什么它坚持附加“其他”值(如环境覆盖,其中 Make 附加“文件文件” ),或者在命令行覆盖的情况下(其中 Make 重复相同的值 ***3* 次)。认真的吗?
这到底有什么意义?这些不一致和奇怪结果的理由是什么?
【问题讨论】:
-
env file file结果对我来说很有意义;cmd cmd cmd结果毫无意义。我不得不猜测为什么基本的foo宏也有两个添加(而不仅仅是一个)。我会观察到,如果您的目录中恰好有一个文件x,则不会执行 echo 命令。 -
添加两个的原因是一个来自
all目标,一个来自x目标,因为两者都匹配%。 -
你就是那个发布所有那些格式奇怪的关于前一段时间的抱怨的子弹列表的人,不是吗?如果您希望向 make 开发人员报告错误,请执行此操作。这不是一个合适的论坛。如果您真正对诊断可能正确但奇怪的行为感兴趣,那么我建议您放松一下语气。
-
我看不出
cmd cmd cmd是如何“可能正确”的。 -
cmd cmd cmd是最简单的情况。env file file是奇数。回答。