代码之家  ›  专栏  ›  技术社区  ›  Armen Michaeli

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

  •  8
  • Armen Michaeli  · 技术社区  · 14 年前

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

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

    我认为这是最好的一个,因为坦率地说,我甚至认为这是一个潜在的危险标志,我没有调试软件那么多,当我需要时,我可以根据需要重新编译一个特定的部分,包括调试信息和所有内容。否则,我喜欢在不调试铃声和哨声的情况下使用发布软件,特别是如果这个包不是我写的。所以我想我在这里特别要问的是:为什么make不自动地倾向于环境变量而不是makefile自己的环境变量?毕竟,环境最清楚什么是什么,如果作者真的需要自己的方式,那么就有“override”语法,对吗?

    2 回复  |  直到 11 年前
        1
  •  5
  •   Franci Penov    11 年前

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

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

    哦,等等,你在问环境和制造。正确的。

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

    更新: 在我的答案中有一个我最初忽略的论点——可预测性。唯一的要求应该是标准化工具集的存在(GCC的相同版本,相同的libs),并且考虑到正确编写的make文件应该总是产生相同的结果,不管环境是什么,或者存在什么其他工具。

        2
  •  18
  •   Zan Lynx    14 年前

    制作 如果将变量放在make命令行上,则重写这些变量。

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

    一句警告。大多数makefile不希望覆盖变量。这意味着,如果makefile使用cflags为include文件指定-i、-o2优化或其他标志,则必须将它们添加到cflags覆盖中,否则make可能会失败。