【问题标题】:Command-line variables - in makefile - expand to weird values命令行变量 - 在 makefile 中 - 扩展为奇怪的值
【发布时间】: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”选项有效,则在环境中)将优先。

看来,使用任一:

  1. 命令行分配。
  2. 环境设置变量,并使用-e (--environment-overrides)。

具有both 相同效果,即覆盖文件级(makefile)变量。

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

现在,比较命令行覆盖与环境覆盖的值:

  1. cmd cmd cmd(用于命令行覆盖)。
  2. env file file(用于环境覆盖)。

因此,对于命令行,Make 重复 same 值,即 cmd3 次,对于环境覆盖,情况是 不同。也就是说,Make 将“重复”环境级值:env1 次,然后重复 - 仅此而已 - 比 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 是奇数。回答。

标签: makefile gnu-make


【解决方案1】:

我相信这里的答案与this other question of yours的答案有关。 (并且可能是 env 覆盖版本中的错误。)

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

cmd cmd cmd 结果是因为当您编写 %: foo += file 时,make 会将其存储为变量 foo 的目标特定值 file 的变量 foo 的当前值的补充。

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

我认为那个解释应该让你env env env 然后我不确定为什么它没有。这可能是一个错误,也可能是有关 env 覆盖变量和目标特定变量值如何工作的其他细节。我不确定。

(检查make -p 的输出对于这两种情况,看看我对目标特定变量的值的意思。)

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多