Как заставить библиотеки хорошо работать с упаковкой Linux?

Я являюсь автором библиотеки C++, которая распространяется в нескольких дистрибутивах Linux. Библиотека включает в себя заголовки и источник; Пакеты Linux распространяют его как заголовки + разделяемая библиотека (.so).

Я ищу рекомендации, которые облегчили бы жизнь разработчикам пакетов Linux.

Вещи, которые меня интересуют, включают в себя:

  • Совместимость API (например, изменение сигнатур функций). Очевидно, что поддержание совместимости между второстепенными выпусками имеет решающее значение. Как насчет основных изменений версии?

  • Двоичная совместимость (например, изменение размеров видимых извне структур данных). Насколько важно быть ABI-совместимым в небольших версиях? Есть ли проблемы с нарушением этого в основных релизах?

  • Советы по созданию версий. В настоящее время я использую CMake - какие-либо конкретные настройки, которые я должен установить, чтобы максимизировать вероятность того, что разработчики пакетов могут просто использовать мой CMakeLists.txt?

Если есть что-то еще, что я скучаю, я был бы рад услышать об этом.

2 ответа

Решение

Как сопровождающий Linux, я могу сказать, что для нас очень важна как обратная двоичная (ABI), так и исходная (API) совместимость вашей библиотеки.

Изменения API могут нарушить перестройку некоторых приложений (или других библиотек) в дистрибутиве, которые зависят от вашей библиотеки. Это может нарушить массовое восстановление дистрибутива.

Изменения ABI могут нарушать определенные двоичные обновления. Нам необходимо проверить изменения ABI в обновленных библиотеках и перестроить все зависимые приложения, если обнаружены некоторые опасные изменения. В этом случае пользователь должен загрузить пакет обновления для библиотеки и для всех зависимых приложений. Если библиотека имеет обратный API и ABI стабильны, то мы можем только обновить пакет библиотеки.

Если вы нарушаете ABI, пожалуйста, измените SONAME вашей библиотеки (Bump версия). И, пожалуйста, не вводите изменения API/ABI в выпуски микро / патчей.

Я рекомендую вам использовать инструмент проверки соответствия abi, чтобы проверить вашу библиотеку на предмет обратной совместимости API/ABI. Смотрите примеры отчетов инструмента для библиотеки Qt: http://abi-laboratory.pro/tracker/timeline/qt/

Вам нужно скомпилировать отладочную версию вашей библиотеки с дополнением -g -Og опции и дамп ABI вашей библиотеки с помощью инструмента abi-dumper. Затем сравните два дампов ABI разных версий, чтобы сгенерировать отчет об изменениях ABI.

введите описание изображения здесь

Позвольте мне заняться частью 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

Другие вопросы по тегам