如何使库与 Linux 打包一起工作?
How to make libraries work well with Linux packaging?
我是一个 C++ 库的作者,该库分布在多个 Linux 打包发行版中。
该库包括 headers 和源代码; Linux 包将其分发为 headers + 共享库 (.so)。
我正在寻找可以让 Linux 包维护人员的生活更轻松的指南。
我感兴趣的事情包括:
API 兼容性(例如更改函数签名)。显然,保持次要版本的兼容性至关重要。主要版本更改如何?
二进制兼容性(例如改变外部可见数据结构的大小)。 ABI-compatible 跨次要版本有多重要?在主要版本中打破它有什么问题吗?
构建版本控制建议。我目前正在使用 CMake - 我应该设置任何特定设置以最大限度地提高包维护者可以使用我的 CMakeLists.txt?
的机会
如果还有什么我想念的,我也很乐意听到。
让我来解决 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
作为 Linux 维护者,我可以说您的库的后向二进制 (ABI) 和源代码 (API) 兼容性对我们来说非常重要。
API 更改可能会破坏依赖于您的库的发行版中某些应用程序(或其他库)的重建。这可能会破坏发行版的大规模重建。
ABI 更改可能会破坏特定的二进制更新。我们需要验证更新库中的 ABI 更改,如果检测到一些危险的更改,则重建所有依赖的应用程序。在这种情况下,用户应该下载库和所有相关应用程序的更新包。如果库落后 API 并且 ABI 稳定,那么我们只能更新库包。
如果您破坏了 ABI,请更改 SONAME
您的库(bump 版本)。并且请不要在 micro/patch 版本中引入 API/ABI 更改。
我推荐你使用abi-compliance-checker tool to verify your library for API/ABI backward compatibility. See sample reports of the tool for the Qt library: http://abi-laboratory.pro/tracker/timeline/qt/
您需要使用附加 -g -Og
选项编译库的调试版本,并在 abi-dumper 工具的帮助下转储库的 ABI。然后比较不同版本的两个 ABI 转储以生成 ABI 更改报告。
我是一个 C++ 库的作者,该库分布在多个 Linux 打包发行版中。 该库包括 headers 和源代码; Linux 包将其分发为 headers + 共享库 (.so)。
我正在寻找可以让 Linux 包维护人员的生活更轻松的指南。
我感兴趣的事情包括:
API 兼容性(例如更改函数签名)。显然,保持次要版本的兼容性至关重要。主要版本更改如何?
二进制兼容性(例如改变外部可见数据结构的大小)。 ABI-compatible 跨次要版本有多重要?在主要版本中打破它有什么问题吗?
构建版本控制建议。我目前正在使用 CMake - 我应该设置任何特定设置以最大限度地提高包维护者可以使用我的 CMakeLists.txt?
的机会
如果还有什么我想念的,我也很乐意听到。
让我来解决 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
作为 Linux 维护者,我可以说您的库的后向二进制 (ABI) 和源代码 (API) 兼容性对我们来说非常重要。
API 更改可能会破坏依赖于您的库的发行版中某些应用程序(或其他库)的重建。这可能会破坏发行版的大规模重建。
ABI 更改可能会破坏特定的二进制更新。我们需要验证更新库中的 ABI 更改,如果检测到一些危险的更改,则重建所有依赖的应用程序。在这种情况下,用户应该下载库和所有相关应用程序的更新包。如果库落后 API 并且 ABI 稳定,那么我们只能更新库包。
如果您破坏了 ABI,请更改 SONAME
您的库(bump 版本)。并且请不要在 micro/patch 版本中引入 API/ABI 更改。
我推荐你使用abi-compliance-checker tool to verify your library for API/ABI backward compatibility. See sample reports of the tool for the Qt library: http://abi-laboratory.pro/tracker/timeline/qt/
您需要使用附加 -g -Og
选项编译库的调试版本,并在 abi-dumper 工具的帮助下转储库的 ABI。然后比较不同版本的两个 ABI 转储以生成 ABI 更改报告。