У меня есть два пакета одной и той же библиотеки, но с очень разными API. Каждая версия этой библиотеки должна иметь свой собственный пакет, например. lib1.deb и lib2.deb. Я не хочу переименовывать все библиотеки и заголовки, чтобы сделать их сосуществующими, но тогда некоторые библиотеки/заголовки будут иметь один и тот же путь/перезаписывать друг друга. В «контрольном» файле, когда f.i. создание пакета с помощью debuild, могу ли я как-то указать пакет, который не должен устанавливаться одновременно с установкой моего другого пакета? Было бы неплохо, если бы при попытке установить package2 apt автоматически захотел удалить package1. Кажется, я уже видел что-то подобное при установке пакетов.
Могу ли я добавить что-то вроде антизависимости в пакет Debian?
Ответы (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 oflibfoo
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 aDepends
on the correctlibfooX
, using an exact version specifier.
У вас может быть установлена только одна версия libfoo-dev
(поскольку apt
запрещает установку одного пакета несколько раз). Однако вы можете установить и libfoo3
, и libfoo7
параллельно (что важно для использующих их приложений).
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