Пишу я shared библиотеку. Кажется другие люди начинают её потихоньку использовать да ещё добавлять в дистрибутивы, поэтому решил заморочиться стабилизацией API и правильным версионированием, чтобы при обновлении библиотеки ни у кого не возникало проблем. Напомню что библиотека устанавливается в виде libfoo.so.X.Y.Z, на неё ставятся симлинки libfoo.so и libfoo.so.X, в SONAME прописывается libfoo.so.X
Вопросы:
- Когда нужно увеличивать X - только при поломке обратной совместимости ABI или даже при обратно совместимых изменениях? Если второе, почему и при каких условиях тогда изменяется Y?
- Что делать с Y.Z? Почитал, понял что их трактуют кто во что горазд - кто как в semantic versioning (Y - обратно совместимые изменения ABI, Z - изменения не влияющие на ABI), кто (libtool) вообще странно, Z у него это некий age, который показывает сколько мажорных версий назад от X поддерживает библиотека (т.е. типа 5.0.2 поддерживает 5, 4, 3). Вроде бы про Y разночтений нет, поэтому думаю использовать его для совместимых изменений ABI, а Z всегда ставить в 0
- А не стоит ли тогда вообще выкинуть Z?
- Как часто имеет смысл обновлять версию? С релизом, или на каждый коммит, изменяющий ABI?
- Чисто ради интереса, есть практичиская разница между вариантами когда .so ссылается на .so.X (так делает cmake) или на .so.X.Y.Z (так делают autotools)?