为什么不';默认情况下,t环境变量覆盖makefiles中设置的变量?

为什么不';默认情况下,t环境变量覆盖makefiles中设置的变量?,makefile,environment,Makefile,Environment,我正在编译包,我看到Makefile的作者经常在Makefile中编写set CFLAGS,使用这样或那样的选项。一、 另一方面,我想尝试一些编译器优化,并希望传播编译器开关,以尽可能少的麻烦。但这并不总是可行的。例如,当一个makefile指定了CFLAGS,我希望所有的C编译器调用都使用-fomit frame pointer,而不必显式地编写类似于CFLAGS=-fomit frame pointer make,我的选项中有哪些是不太老套的。从上面我可以看到的是,上面有相同但不同的:“cF

我正在编译包,我看到Makefile的作者经常在Makefile中编写set CFLAGS,使用这样或那样的选项。一、 另一方面,我想尝试一些编译器优化,并希望传播编译器开关,以尽可能少的麻烦。但这并不总是可行的。例如,当一个makefile指定了CFLAGS,我希望所有的C编译器调用都使用-fomit frame pointer,而不必显式地编写类似于
CFLAGS=-fomit frame pointer make
,我的选项中有哪些是不太老套的。从上面我可以看到的是,上面有相同但不同的<代码>:“cFLAGS = fft框架指针”<代码>,我也可以做我认为是最好的解决方案和这个问题的原因:

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

我认为这是最好的,因为坦白地说,甚至认为潜在的危险标志,我不调试软件那么多,当我需要的时候,我可以重新编译一个特定的点播,调试信息和所有。否则,我喜欢使用发布软件,而不需要调试任何东西,尤其是如果包不是我自己编写的。所以我想我在这里特别要问的是:为什么make不会自动选择环境变量而不是makefile自己的?毕竟,环境最清楚什么是什么,如果让作者真的需要按照自己的方式做一些事情的话,有“覆盖”语法,对吗?

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

这就像对一个已经长大成人的孩子说“妈妈最懂”,阻止他们去学法律,因为你想知道他们会成为什么样的水管工。这是他们的生活。放手,让他们自己做出选择

哦,等等,你问的是环境和制造。对

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

更新:我最初在回答中遗漏了一个论点——可预测性。唯一的要求应该是有一套标准化的工具(相同版本的GCC,相同的LIB),并且考虑到正确编写的make文件应该始终产生相同的结果,无论环境是什么,或者存在什么其他工具。

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

试试这个:
make CFLAGS=-fomit帧指针


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

那么,我们应该如何覆盖make生成的软件的编译器开关?我的意思是以环保的方式?:-)肯定有人想要控制优化?你不能让我决定。如果有什么问题的话,那么硬编码CFLAGS/cxflags/cppfags并且不允许更改这些标记的makefile设计得不好?您可以更改makefile,或者在调用make时通过将适当的标记作为命令行参数传递来覆盖它们。在这种情况下,覆盖这些是用户的显式操作。获取环境中发生的任何东西都可能导致不可预测的结果,因为用户甚至可能不知道他使用的上一个程序对环境做了哪些修改。迪德威尔这就是我的全部论点——环境最清楚。或者至少应该使用一个正确设计的Makefile。因此,这意味着如果Makefile在一个环境集变量上中断,那么它是不好的。如果作者真的需要使用'-g'编译器开关,并且担心makefile用户可能会将其用于其他用途,那么他们可能应该使用“override”语法,或者使用第二阶段赋值“=”?在构建一整套包时,传递要生成的命令行标志不是一个好的选择……但是环境并不清楚。环境不是一个主动实体,它是一个被动存储任何其他进程或用户可能在其中转储的垃圾。我接受了你的答案,因为它是有意义的。但我绝对不同意你所说的一切。例如,我不认为环境“垃圾”应该如何被指责为制造错误。首先,若环境不干净,那个么它就不干净——在这样的环境中编译包无论如何都是一件危险的事情。如果它是干净的,并且出现错误,这意味着makefile写得不好。有一个参数需要生成:--我认为环境覆盖符合您的描述,所以您可以通过使用调用real make with--环境覆盖FWIW的脚本“包装”make将其设为默认值