为什么环境变量默认不覆盖makefile中设置的变量?

时间:2010-07-02 21:08:54

标签: makefile environment

我正在编译软件包,我看到Makefile作者经常在makefile中写入set CFLAGS,有这样的选项。另一方面,我想尝试一些编译器优化,并希望传播编译器开关以尽可能少地解决问题。但这并不总是可行的。例如,当makefile指定CFLAGS并且我希望所有C编译器调用都使用-fomit-frame-pointer时,如果不必显式写出CFLAGS=-fomit-frame-pointer make之类的内容,那么我的选择是什么并不是hackish。从我可以看到的是上面的内容,然后有相同但不同的make "CFLAGS=-fomit-frame-pointer"我也可以做我认为最好的解决方案和这个问题的原因:

export CFLAGS=-fomit-frame-pointer
make -e

我认为这是最好的一个,因为坦率地甚至认为有潜在危险的标志,我不会调试那么多软件,当我需要时我可以根据需要重新编译一个特定的部分,调试信息和所有。否则我喜欢使用发布软件而不需要调试铃声和口哨,特别是如果包不是由我编写的。所以我想我具体要问的是:为什么make不会自动更喜欢makefile自己的环境变量?毕竟环境知道什么是最好的,如果作者确实需要他们的方式有'覆盖'语法,对吧?

2 个答案:

答案 0 :(得分:19)

如果将变量放在make命令行上,覆盖变量。

试试这个: make CFLAGS=-fomit-frame-pointer

一句警告。大多数Makefile都不希望它们的变量被覆盖。这意味着如果Makefile使用CFLAGS为包含文件指定-I,为优化指定-O2或其他标志,则必须将它们添加到CFLAGS覆盖中,否则make可能会失败。

答案 1 :(得分:5)

这是有争议的:“毕竟环境最清楚什么是什么”

就像对一个成年的孩子说“妈妈最了解”并阻止他们去学习法律,因为你想看看他们是什么样的水管工。这是他们的生活。放手让他们自己做出选择。

等等,你在问环境和制作。右。

嗯,make是一个在您修改环境后开始的新流程,在一般情况下,环境不知道make目标是什么以及它是如何工作的。因此,无论是明确设置应该胜过环境中可能发生的任何事情。

更新:我的回答中最初错过了一个论点 - 可预测性。唯一的要求应该是标准化的工具集(相同版本的GCC,相同的库)的存在,并且假定正确编写的make文件应该总是产生相同的结果,无论环境是什么,或者存在什么其他工具