Мога ли да добавя нещо като анти-зависимост към пакет на debian?

Имам два пакета от една и съща библиотека, но с много различни API. Всяка от тези библиотечни версии трябва да има свой собствен пакет, напр. lib1.deb и lib2.deb. Не искам да преименувам всички библиотеки и заглавки, за да ги направя съвместно съществуващи, но тогава някои библиотеки/заглавки ще имат един и същ път/презаписват взаимно. В "контролен" файл, когато f.i. генериране на пакет с debuild, мога ли по някакъв начин да укажа пакет, който не трябва да се инсталира едновременно с инсталирането на другия ми пакет? Би било хубаво, ако когато се опитвате да инсталирате package2, този apt автоматично иска да премахне package1. Мисля, че вече видях нещо подобно при инсталиране на пакети.


person Magnus Lutz    schedule 29.01.2018    source източник


Отговори (2)


Все пак трябва да обмислите възможността за съвместно инсталиране на тези пакети (само си представете, трябва да инсталирате графична програма и apt иска да премахне целия ви мрежов стек, само защото някой "умен" поддържащ пакети е решил, че е много по-лесно да постави Conflicts отколкото за разрешаване на проблема).

Обикновено не е толкова трудно:

  • поставете всички заглавни файлове в специфични за библиотеката поддиректории, напр. /usr/include/lib1/ респ. /usr/include/lib2/ (всяка добре написана библиотека трябва да предоставя pkg-config файл, който така или иначе трябва да се актуализира).

  • обикновено библиотечните файлове са малко, предимно 3 (libfoo.so.x.y, libfoo.so.x, libfoo.x). преименуването им поотделно трябва да е достатъчно лесно. (и отново актуализирайте вашия pkg-config файл, за да отразите промяната на името).

И накрая: „два пакета от една и съща библиотека, но с много различни API“ звучи като много лоша идея като цяло. защо те са същата библиотека, ако нямат същия API/ABI?

О, и ако става въпрос само за (несъвместими) версии, това обикновено се третира като:

  • libfoo3 е пакетът от libfoo с ABI-версия 3, напр. той предоставя /usr/lib/libfoo.so.3.14 и /usr/lib/libfoo.so.3, което е символна връзка към първото
  • libfoo7 is the package of libfoo with ABI-version 7 e.g. it provides /usr/lib/libfoo.so.7.42 and /usr/lib/libfoo.so.7 which is a symlink to the former)
    • libfoo-dev is the development package, which provides the headers and a symlink /usr/lib/libfoo.so to the correct ABI soname (/usr/lib/libfoo.so.3 resp /usr/lib/libfoo.so.7). this package has a Depends on the correct libfooX, using an exact version specifier.

Можете да имате инсталирана само една версия на libfoo-dev (тъй като apt забранява един пакет да бъде инсталиран многократно). Можете обаче да имате едновременно инсталирани libfoo3 и libfoo7 (което е важно за приложенията, които го използват).

person umläute    schedule 29.01.2018
comment
би ли било добре да има пакети libfoo3-dev и тогава или това е лоша практика? И включващата директория ще бъде /usr/include/foo3 вместо /usr/include/libfoo3 според конвенцията, нали? - person Magnus Lutz; 30.01.2018
comment
ако искате пакетите за разработчици (lib*-dev) на двете версии да могат да се инсталират съвместно, можете, разбира се, libfoo3-dev. има редица пакети, които правят това (apt-cache search lib*[0-9]-dev), но това не е много често срещан модел. що се отнася до включващите пътища, съществуват и двете конвенции (просто проверете вашия /usr/include път - например тук намирам и /usr/include/harfbuzz, и /usr/include/libsoup-2.4/). ако суфиксът на номер на версията е специфичен за вашия пакет, мисля, че е обичайно да се използва тире: /usr/include/foo-3 - person umläute; 30.01.2018

Хм, намерих публикация в stackexchange, обхващаща това https://unix.stackexchange.com/a/393243

има ключови думи "Прекъсвания" и "Конфликти", изглеждащи https://www.debian.org/doc/debian-policy/#conflicting-binary-packages-conflicts

person Magnus Lutz    schedule 29.01.2018