当我更新 Gentoo 系统时,Portage 是否会获取新的源代码,提取它们并从头开始重新编译所有内容,或者将其提取到现有源代码并仅编译更改的文件?
答案1
虽然make(1)
许多构建系统(例如 autotools)确实支持增量编译,但带有 Portage 的 Gentoo 并没有利用它。包编译并安装后,工作目录将被丢弃。
使用增量编译的实际困难在于以这种方式可靠地构建包。如果您始终进行干净的构建,则更容易确保构建成功、正确且可重现。如果 Gentoo 试图支持增量重建,许多构建系统会微妙地崩溃。而且,在许多情况下,必须重新运行./configure
(或其等效项),这可能会在生成的s 中创建新的config.h
或更新环境变量,例如CFLAGS
和(或等效项,如果使用其他构建系统)。触摸将需要重建大多数源。如果发生变化,如果包不使用,则可能会通过via传递所有源CPPFLAGS
Makefile
config.h
PACKAGE_VERSION
Makefile
CPPFLAGS
config.h
应该重新构建以查看新值 - 除非您可以以某种方式认为某些源文件不需要重新编译,因为它们不引用特定的 C 预处理器宏。
因此,最终,即使 Gentoo 开发人员竭尽全力尝试支持软件包版本更新之间的增量编译,许多软件包要么需要完全重新编译或者make(1)
最终会完全重新编译它们(例如 ifconfig.h
的时间戳发生变化)。因此,这将是一项高成本的工作,但只能获得非常边际的收益,甚至可能会引入很多的微妙的错误,以我的最佳理解。因此,我不希望引入这样的功能。
我的答案主要是指 autotools/simpleMakefile
类型的软件包,但并非所有内容都以这种方式构建,因此确切的原因可能会有所不同,具体取决于所讨论的确切软件包。
答案2
Portage 编译上游交付的新软件包的完整源代码(有时 gentoo 团队会自己修补源代码,但这是另一个故事了)。
旧包的二进制文件通常会被删除,尽管一些旧库可能会保留,如果删除它们会损害其他包。要删除旧源,您需要eclean -d distfiles
自己运行。