在 gentoo 系统上升级 gcc 后要重建的软件包

在 gentoo 系统上升级 gcc 后要重建的软件包

gcc在 gentoo 系统上升级后应该重建哪些软件包?跑起来够用吗

# emerge -a --oneshot `equery depends gcc |awk '{print " ="$1}'`

正如所建议的类似对于此常见问题解答中的 perl

答案1

长话短说

作为 Gentoo 用户,我对此有不同的看法。虽然我同意彼得夫的“让系统决定”的方法,但我不同意ABI更新。 ABI 更新有时是行为的重大转变。以 GCC 4.7 为例,ABI 更改是采用新的 C++11 标准,peterph 也指出了这一点。

这就是我写这个答案的原因。我是一个标准迷。我刚进入网络世界时,大约有 4 种不同的浏览器,并且 HTML 中的大量标签仅受某些浏览器支持。当时,所有这些标签都增加了混乱,IMO 也让工作变得更加困难。出于同样的原因,C++ 已被标准化,简而言之,以便你可以编译我写的代码,我也可以编译你写的代码。如果我们选择不遵循标准,我们就会失去分享的自由。

C++98 已被批准为标准 13 年。 C++11于2011年获得ISO委员会批准,并完全集成到GCC 4.7中。请参阅当前 ISO 状态,以及新的ISO标准


为什么我们应该感到作为 Gentoo 用户的特权

作为基于源代码的发行版的用户,我们有独特的机会来塑造包的未来行为,因为我们在使用它之前对其进行编译。因此,为了准备这个机会,我认为在更新到新编译器时应该运行以下命令:

emerge -ev system
gcc-config -l && gcc-config *new compiler name*
env-update && source /etc/profile
emerge -1v libtool
emerge -ev system

第一次通过系统构建新编译器及其与旧编译器的依赖项。第二次通过系统重建新编译器及其与新编译器的依赖关系。具体来说,我们希望这样做,以便我们的建链利用新编译器的新功能,如果构建链包也已更新...有些人用世界集替换第二个传递系统,尽管我认为这是矫枉过正,因为我们不知道哪些软件包已经支持新标准,但我们确实希望我们的构建链能够正常运行。

至少对系统集执行此操作,让我们准备好测试根据新标准编译的每个包,因为我们使用滚动版本。通过这种方式,在更新构建链后添加-std=c++11允许CXXFLAGS我们测试损坏情况,并能够将错误直接提交给我们的 bugzilla 或上游的实际开发人员,原因很简单:

嘿,你的包等等破坏了新的 C++ 标准,我已经附上了我的构建日志。

我认为这是对开发人员的礼貌,因为随着标准被更广泛地采用,并且旧标准被逐步淘汰,他们现在有时间进行准备。想象一下,如果开发人员收到数百个错误,因为他或她一直等到标准被淘汰,他或她会感到多么的骚动……

据我所知,没有其他发行版可以使用此方法,因为在相应的用户社区可以使用补丁或更新之前,实际的软件包维护者作为中间人存在。我们确实有维护者,但我们也有能力使用本地 portage 树。


关于赏金请求中发布的富有洞察力的想法

我不知道发布赏金是否是因为你们都喜欢我富有洞察力、深思熟虑的答案,但为了获得赏金,我将尝试回答你们富有洞察力、深思熟虑的赏金提议。首先,让我回应一下,作为基于源的发行版的用户,我坚信连接点的就是您在赏金请求中要求的所有内容。有些人可能是一名出色的程序员,但对软件的关心却很糟糕。同样,有些人虽然是蹩脚的程序员,但却非常关心软件。

在我来到这里之前,我是一名狂热的海报爱好者,在Gentoo 论坛。当我开始来到这里时,我终于意识到每个人都有一定程度的可以利用的才能。正是他们选择用它做什么才产生了贡献的差异。我们中的一些人是伟大的作家(不是我),所以如果您想为某个项目做出贡献,但您不会或不能编写代码或修复错误,请记住,伟大的作家可以编写出色的文档或出色的 Wiki 文章。

该标准的存在还有另一个原因:在社区中,其成员需要遵守某些规则。这里也遵循该声明。如果我提交修复、补丁、增强等并且没有标准,则该补丁只会在我认为重要的情况下起作用,即如果我使用whizbang编译器2.0,并且该补丁是针对whizbang编译器1.0构建的,它将失败。由于这项工作是为了社区,社区希望一切都能在大多数情况下工作,因此我可以在标准中规定,而不是强迫所有用户升级到编译器 2:

该软件包选择允许向后兼容 Whizbang Compiler 1.0

这样,作为一名开发人员,无论编码员是否蹩脚,我都知道我必须使用或至少针对编译器版本 1.0 进行测试。另一方面,作为用户,我可以选择我想做的事情。如果我不满意,我可以通过提交错误来请求补丁,或者采取另一个极端“这个软件是个垃圾!”,什么也不做。无论如何,用户和开发人员都理解该标准,因为它是已经编写的。

弥合差距需要用户采取某种形式的行动,这需要你要求我和其他人评论的所有事情,我们必须依靠用户社区和他们各种形式的才能来弥合这一差距。如果您选择成为贡献用户之一,我为您鼓掌。对于那些选择不活跃的人,请记住,如果您想要修复某些问题,那么活跃的人需要您的意见。所以我告诉你,不要羞于提交错误,或者告诉我们我们需要更新文档,如果我们粗鲁地告诉我们,或者找其他人,直到你找到你的专业领域。


与此主题相关的其他有趣阅读

  1. C++11 中最大的变化(以及为什么您应该关心)
  2. GCC 中的 C++0x/C++11 支持
  3. 有关标准 C++ 的新闻、状态和讨论

答案2

这在很大程度上取决于您进行了何种类型的编译器升级。如果它是实质性的,那么一切都应该是重新编译*)因为编译器可能会更改 ABI。在许多情况下,这不是必需的,但如果您的包依赖于 C++11 之类的东西,那么您可能会遇到问题 - 请参阅例如Gentoo 关于 GCC 4.7 中 ABI 更改的新闻或者GCC bugzilla

*)请注意对“重新编译”的强调 - 因为更改了 C 编译器而重新编译(读取重建)Python 或 Perl 应用程序绝对没有多大意义。除非它也有一个本机组件(很可能)。

相关内容