【问题标题】:Why don't environment variables override variables set in makefiles by default?为什么环境变量默认不覆盖makefile中设置的变量?
【发布时间】:2013-07-28 03:00:35
【问题描述】:

我正在编译包,我看到 Makefile 作者经常在 makefile 中编写集合 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自己的?毕竟环境最清楚什么是什么,如果让作者真的需要他们的方式有'覆盖'语法,对吧?

【问题讨论】:

  • 有一个参数要制作:--environment-overrides 可以按照您的描述进行操作,我认为,因此您可以通过使用调用 real 的脚本“包装”make 将其设为默认值使用 --environment-overrides FWIW 制作

标签: makefile environment


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 那么我们应该如何覆盖由 make 构建的软件的编译器开关呢?我的意思是环保的方式? :-) 肯定有人想要控制优化?你不能对此做出决定。如果有的话,一个硬编码 CFLAGS/CXXFLAGS/CPPFLAGS 并且不允许任何人更改这些的 makefile 是不是设计得很好?
    • 您要么更改makefile,要么在调用make 时通过将适当的标志作为命令行参数传递来覆盖它们。在这种情况下覆盖这些是用户的 explicit 操作。获取环境中发生的任何事情可能会导致不可预知的结果,因为用户甚至可能不知道他使用的先前程序对环境进行了哪些修改
    • 这就是我的全部论点——环境最清楚。或者至少应该使用正确设计的 Makefile。因此暗示,如果 Makefile 在环境集变量上中断,那就不好了。如果作者真的需要他的'-g'编译器开关,并且担心makefile用户可能会为了别的东西而放弃它,他们也许应该使用“覆盖”语法,或者第二阶段赋值“:=”?当您构建一整套软件包时,传递命令行标志并不是一个好的选择......
    • 但是环境不知道更好。环境不是一个主动实体,它是任何其他进程或用户可能转储到其中的任何垃圾的被动存储。
    • 我接受了你的回答,因为它是有道理的。但我绝对不同意你所说的一切。例如,我不明白应该如何指责环境“垃圾”造成错误。首先,如果环境不干净,那么它就是不干净的——在这样的环境中编译包无论如何都是一件危险的事情。如果它是干净的,并且出错了,这意味着 makefile 写得不好。
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2015-02-01
    • 2016-04-28
    • 2013-10-28
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多