【问题标题】:Can't override target-specific variable无法覆盖特定于目标的变量
【发布时间】:2020-05-29 23:12:10
【问题描述】:

我有这样的 Makefile:

print: var1=inside

print:
    @echo $(var1)

当我运行var1=outside make -e print。我希望看到:

outside

Because of:

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

但我明白了:

inside

输出正确吗?

【问题讨论】:

标签: makefile gnu-make


【解决方案1】:

这是预期的;我猜它是否正确取决于你问的是谁。

-e 选项对 makefile 中的“全局”变量有效,但特定于目标的变量优先于全局范围的变量。

我个人认为-e 是一个错误,不应该存在。但是,你知道,POSIX 等等。即使它存在,我也建议避免它。以令人困惑和令人惊讶的方式完全搞砸你的构建太容易了。

ETA 好吧,也许这不是预期的。也许这是一个错误。你从哪里得到你提供的报价?仅凭 225 页文档中的那句话,很难说……一个链接或至少一个章节名称会很有帮助。

【讨论】:

  • gnu.org/software/make/manual/html_node/Target_002dspecific.html 目标特定变量与任何其他 makefile 变量具有相同的优先级。
  • 好吧,那肯定是一个错误。无论是手册中的错误还是代码中的错误都不清楚(对我来说)。我仍然建议您避免使用-e
  • 你做对了。 -e 很糟糕,因为它会导致环境中的 any 变量优先于 makefile 中的任何变量。您可能在任何给定时间都不知道您的环境中有哪些变量,并且您可能不知道 makefile 中的所有变量。这使得它完全不可预测。所以你不应该使用-e
  • 相比之下,您在命令行上分配的每个变量几乎都会覆盖 makefile 中 that 变量的每个实例,并且由于您明确地将它放在命令行上,因此您完全知道哪些变量被覆盖,哪些没有。但是,在这种情况下,您不应使用 -e 选项,因此您上面的示例命令行在这种情况下是错误的。它应该只是make var=value ...
  • 您可以阅读更多相关信息:gnu.org/software/make/manual/html_node/Overriding.html
猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 2011-12-23
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
相关资源
最近更新 更多