我认为 Ubuntu 尊重“修改软件的自由”,但是应该如何在不破坏系统的情况下修改 Ubuntu 软件包的源代码?通过破坏它,我的意思是例如创建无法解决的依赖关系或阻止未来的apt update
更新,尤其是安全更新。
有没有办法保存修改的“补丁”并将其应用于任何未来的适当更新?我宁愿避免完全“分叉”一个包。
这是“适当固定”的目的吗?或者 Ubuntu 的“稳定性模型”(我不确定这是不是正确的术语)只是不支持用户修改?如果其他发行版以不同方式处理它(Arch/Gentoo),我将不胜感激。
这通常是如何工作的,发行版的包维护者从官方来源(GitHub、SourceForge 等;上游代码)获取原始来源,这些原始来源通常以 tarball(压缩的 tar 存档)形式出现。那些保持原样;原汁原味,因为它被称为。
但通常需要进行一些调整,以便一切都与整体分布一起工作。因此,包维护者将这些原始源解压缩到一个工作目录中,并根据需要更改源;然后使用
diff
命令生成变更集,即原始版本和现在修改(“修补”)版本之间真正发生变化的少数地方。此更改集称为diff或patch。对于每个包,可以有一个,也可以有多个;通常它们是按主题组织的;即一个用于目标分布上不同的路径,另一个用于解决该软件调用的另一个程序的怪癖等;你明白了。
然后将原始 tarball 和差异/补丁放入另一个存档(源包),但保持足够的独立性,因此一切都保持透明。
现在构建包时,这意味着首先解压缩原始 tarball,然后应用第一个补丁(使用
patch
程序),然后是第二个等等;当修补阶段完成时,编译过程才真正开始(调用make
和make install
其他任何必要的)。我所知道的所有 Linux 发行版都是这样做的;Ubuntu、Debian、SUSE、Red Hat,应有尽有。可能对所有人都一样,可能对 BSD 变体也是如此。
所以,有源码包;这就是您的切入点。没有什么能阻止您获取源代码包并在其上添加一两个补丁;并以此为基础生成你自己的源码包。
需要注意的是,现在您必须自己重建包;并确保在发布新版本时将补丁添加到新版本的源包中,即每次更新包时。
这可以做到,但是很乏味。很有可能你一直没有动力去做这件事;取决于包真正改变的频率。
一种减轻痛苦的工具是openSUSE 构建系统(OBS),它支持至少部分自动化。但是你仍然需要注意重新导入源包和添加你自己的补丁。它可以在网络上免费获得,并且可以为各种发行版构建软件包,不仅包括 openSUSE,还包括 Ubuntu、Debian 和其他发行版。
因此,如果您有一个普遍感兴趣的更改,如果他们不想将您的更改包含在他们的源包中,您可能想要联系您的发行版的包维护者。或者,如果上游作者(最初编写该软件的人)不想为所有人发布您的更改,您可以联系他们。
如果它对您的用例来说是非常具体的,那显然是行不通的。在这种情况下,请考虑不同的策略。