Makefile Can';t覆盖目标特定变量

Makefile Can';t覆盖目标特定变量,makefile,gnu-make,Makefile,Gnu Make,我有这样的Makefile: print: var1=inside print: @echo $(var1) 当我运行var1=outermake-e print时。我希望看到: outside : 命令行上提供的变量(如果'-e'选项有效,则在环境中提供)将优先 但我得到: inside 这是正确的输出吗?这是预期的;我想这是否正确取决于你问谁 -e选项对makefiles中的“全局”变量有效,但特定于目标的变量优先于全局范围的变量 我个人认为-e是一个错误,不应该存在。但是,

我有这样的Makefile:

print: var1=inside

print:
    @echo $(var1)
当我运行
var1=outermake-e print
时。我希望看到:

outside
:

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

但我得到:

inside

这是正确的输出吗?

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

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

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


哦,也许这不是预料到的。也许是个虫子。你从哪里得到你提供的报价?只有225页文件中的那句话很难说。。。一个链接或至少一个节名会很有帮助。

特定于目标的变量与任何其他makefile变量具有相同的优先级。那么,这肯定是一个bug。无论是手册中的错误还是代码中的错误(对我来说)都不清楚。我仍然建议你避免使用
-e
。你说得对
-e
非常糟糕,因为它会导致环境中的任何变量优先于makefile中的任何变量。您可能不知道在任何给定的时间环境中有哪些变量,也可能不知道makefile中的所有变量。这使得它完全不可预测。因此,您不应该使用
-e
。相反,您在命令行上指定的每个变量都会覆盖makefile中该变量的几乎每个实例,并且由于您明确地将其放在命令行上,因此您确切地知道哪些变量正在被覆盖,哪些变量没有被覆盖。但是,在这种情况下不应使用
-e
选项,因此上面的示例命令行在这种情况下是错误的。它应该是
make var=value…
您可以阅读更多关于这一点的信息:并非所有版本都支持特定于目标的变量。您应该打印
.FEATURES
变量并查找特定于目标的