如何使库与Linux打包配合良好?

3
我是一款C++库的作者,该库已经被多个Linux包装发行版分发。该库包括头文件和源代码,Linux包将其作为头文件 + 共享库(.so)分发。
我正在寻找指南,以使Linux软件包维护者的工作更轻松。
我感兴趣的内容包括:
- API兼容性(例如更改函数签名)。显然,保持跨较小版本的兼容性至关重要。对于主要版本更改,有什么考虑吗? - 二进制兼容性(例如更改外部可见数据结构的大小)。在较小的版本发布中,保持ABI兼容性有多重要?在主要发布版本中打破它是否有任何问题? - 构建版本控制建议。我目前使用的是CMake - 我应该设置哪些特定的设置来最大化软件包维护者可以使用我的CMakeLists.txt的机会?
如果还有其他需要注意的事项,请告诉我。

这是免费软件吗?如果是,您可以将打包的负担留给发行版打包人员... - Basile Starynkevitch
您打算如何打包它?例如Debian、RedHat和Slackware使用不同的软件包机制(不兼容)? - Luis Colorado
@BasileStarynkevitch 它是MIT许可证。我自己不打包它 - 但我的问题正是关于这个的 - 如何使分发打包者的生活更轻松。 - zeuxcg
@LuisColorado 我自己没有打包它 - 不同的人为不同的发行版打包它。 - zeuxcg
2个回答

2
作为 Linux 维护者,我可以说你的库的向后二进制(ABI)和源代码(API)兼容性对我们来说都非常重要。
API 的变化可能会破坏某些依赖于你的库的应用程序(或其他库)在分发中的重建。这可能会破坏分发的大规模重建。
ABI 的变化可能会破坏特定的二进制更新。如果检测到一些危险的变化,我们需要验证已更新的库中的 ABI 变化并重新构建所有依赖的应用程序。在这种情况下,用户应下载库和所有依赖应用程序的更新包。如果库是向后 API 和 ABI 稳定的,则只需更新库包。
如果您打破了 ABI,请更改库的 SONAME(增加版本号)。请不要在微型/补丁发布中引入 API/ABI 更改。
我建议您使用 abi-compliance-checker 工具验证您的库是否符合 API/ABI 向后兼容性。请参阅该工具对 Qt 库的示例报告:http://abi-laboratory.pro/tracker/timeline/qt/ 你需要添加 -g -Og 选项来编译调试版本的库,并使用 abi-dumper 工具转储库的 ABI。然后,比较不同版本的两个 ABI 转储,生成 ABI 变更报告。

enter image description here


2
让我来解决ABI部分。这在很大程度上取决于您是否提供可以在任何地方使用的预构建二进制文件,或者是否依赖于经销商为您构建它。
考虑Debian:一旦软件包进入Debian,构建主机会在每个支持的平台上重新编译每个更新。 C ABI很少更改,但C++ ABI需要特别注意(如2005年发给Debian开发人员的此消息中所述:http://lwn.net/Articles/139810/
我认为提供一个可以在任何地方使用的C++软件包是不合理的。 ABI太具体化了:https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

库以头文件+源代码的形式分发;软件包维护者构建它。我更多地是指由库控制的ABI部分 - 例如更改类的大小。 - zeuxcg
关于Debian的信息很有趣!因此,对于Debian来说,只有源代码兼容性才是重要的,而在库级别上打破ABI没有负担? - zeuxcg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接