Содержание
Далее приводится подсказки и ссылки при сложных случаяхпакетирования. Настоятельно рекомендуется прочитать все предлагаемые материалы.
Перед пакетированием общих библиотек прочтите следующие основные документы:
Вот упрощённое представление, для начала.
Общие библиотеки — это объектные файлы в формате ELF, в которых содержится скомпилированный код.
Общие библиотеки распространяются в виде файлов *.so
(не в файлах *.a
или *.la
).
Главным образом, общие библиотеки нужны для совместного использования общего кода в исполняемых файлах посредством механизма ld.
Иногда общие библиотеки используются в качестве подключаемых модулей исполняемых файлов посредством механизма dlopen.
Общие библиотеки экспортируют символы — скомпилированные объекты: переменные, функции и классы; и разрешают к ним доступ из скомпонованных исполняемых файлов.
SONAME общей библиотеки
lib
.foo
.so1
:
objdump -p
lib
[89]
foo
.so.1
| grep
SONAME
SONAME общей библиотеки обычно совпадает с именем файла библиотеки (но не всегда).
SONAME общих библиотек, которые скомпонованы с
:
/usr/bin/foo
objdump -p
[90]
/usr/bin/foo
| grep
NEEDED
lib
:
библиотечный пакет общей библиотеки
foo
1
lib
с ABI-версией SONAME, равной foo
.so.1
1
.[91]
Пакетные сценарии сопровождающего для библиотеки должны вызывать ldconfig для создания необходимых символьных ссылок для SONAME при определённых условиях.[92]
lib
:
пакет с отладочными символами, который содержит символы для отладки пакета с
общей библиотекой foo
1
-dbglib
.
foo
1
lib
: пакет для
разработчика, который содержит заголовочные файлы и т .д. общей библиотек
foo
-devlib
.[93]
foo
.so.1
Обычно, в пакете Debian не должно быть файлов архива Libtool
*.la
.[94]
Обычно, в пакете Debian не должен использоваться RPATH.[95]
Несмотря на некоторое устаревание и статус вторичности, следующая ссылка тоже может быть полезна Debian Library Packaging Guide.
Если пакет содержит общую библиотеку, то вы должны создать файл
debian/
, в
котором отражена минимальная версия каждого символа обратно совместимых
изменений ABI с единым SONAME библиотеки и единым именем пакета с
библиотекой.[96] Подробная информация
приведена в следующих документах:
пакет
.symbols
Смотрите руководство по политике Debian, раздел 8.6.3 «Система символов»[97]
dh_makeshlibs(1)
dpkg-gensymbols(1)
dpkg-shlibdeps(1)
deb-symbols(5)
Вот примерный план создания пакета libfoo1
для авторской версии
1.3
с подходящим файлом
debian/libfoo1.symbols
.
Подготовьте основу исходного дерева из авторского файла
libfoo-1.3.tar.gz
.
Если упаковка libfoo1
производится
впервые, создайте пустой файл debian/libfoo1.symbols
.
Если была упакована предыдущая авторская версия 1.2
в
пакет libfoo1
с соответствующим
файлом debian/libfoo1.symbols
в пакете с исходным
кодом, то используйте его и сейчас.
Если предыдущая авторская версия 1.2
не была упакована с
debian/libfoo1.symbols
, создайте его как файл
symbols
из всех доступных двоичных пакетов с единым
именем пакета общей библиотеки, содержащих одинаковый SONAME библиотеки,
например версии 1.1-1
и 1.2-1
.
[98]
$ dpkg-deb -x libfoo1_1.1-1.deb libfoo1_1.1-1 $ dpkg-deb -x libfoo1_1.2-1.deb libfoo1_1.2-1 $ : > symbols $ dpkg-gensymbols -v1.1 -plibfoo1 -Plibfoo1_1.1-1 -Osymbols $ dpkg-gensymbols -v1.2 -plibfoo1 -Plibfoo1_1.2-1 -Osymbols
Попробуйте выполнить сборку в исходном дереве с помощью таких инструментов
как debuild и pdebuild (если возникли
ошибки из-за отсутствующих символов и т. д., то это указывает на обратно
несовместимые изменения ABI, для которых требуется изменить имя пакета общей
библиотеки на что-нибудь вроде libfoo1a
и повторить сборку).
$ cd libfoo-1.3 $ debuild ... dpkg-gensymbols: warning: some new symbols appeared in the symbols file: ... see diff output below --- debian/libfoo1.symbols (libfoo1_1.3-1_amd64) +++ dpkg-gensymbolsFE5gzx 2012-11-11 02:24:53.609667389 +0900 @@ -127,6 +127,7 @@ foo_get_name@Base 1.1 foo_get_longname@Base 1.2 foo_get_type@Base 1.1 + foo_get_longtype@Base 1.3-1 foo_get_symbol@Base 1.1 foo_get_rank@Base 1.1 foo_new@Base 1.1 ...
Если вы видите различие, выдаваемое dpkg-gensymbols, как
показано выше, то извлеките обновлённый правильный файл
symbols
из сгенерированного двоичного пакета общей
библиотеки. [99]
$ cd .. $ dpkg-deb -R libfoo1_1.3_amd64.deb libfoo1-tmp $ sed -e 's/1\.3-1/1\.3/' libfoo1-tmp/DEBIAN/symbols \ >libfoo-1.3/debian/libfoo1.symbols
Соберите выпускаемые пакеты с помощью таких инструментов как debuild и pdebuild.
$ cd libfoo-1.3 $ debuild clean $ debuild ...
В дополнение к вышеупомянутым примерам мы должны проверить дальнейшую совместимость ABI и, если понадобится, увеличить версии некоторых символов вручную. [100]
Несмотря на статус вторичности, вики Debian UsingSymbolsFiles и содержащиеся на ней ссылки могут быть полезными.
Свойство мультиархитектурности, появившееся в Debian wheezy, встраивает
поддержку кросс-платформенной установки двоичных пакетов (а именно
i386
<->amd64
, но есть и другие
комбинации) в dpkg
и apt
. Подробная информация приведена в следующих
документах:
вики Ubuntu MultiarchSpec (авторский документ)
вики Debian Multiarch/Implementation (ситуация в Debian)
При установке общих библиотек в путях используются триплеты, например
i386-linux-gnu
и
x86_64-linux-gnu
. Актуальный триплет динамически задаётся
в переменной $(DEB_HOST_MULTIARCH)
с помощью
dpkg-architecture(1) при каждой сборке. Например, путь
установки мультиархитектурных библиотек изменяется следующим
образом:[101]
Старый путь | мультиархитектурный путь для i386 | мультиархитектурный путь для amd64 |
---|---|---|
/lib/
|
/lib/i386-linux-gnu/
|
/lib/x86_64-linux-gnu/
|
/usr/lib/
|
/usr/lib/i386-linux-gnu/
|
/usr/lib/x86_64-linux-gnu/
|
Вот несколько примеров разделения типично мультиархитектурных пакетов:
библиотека с исходным кодом
lib
foo
-1.tar.gz
инструмент с исходным кодом
, написанный на
компилируемом языке
bar
-1.tar.gz
инструмент с исходным кодом
, написанный на
интерпретируемом языке
baz
-1.tar.gz
Пакет | Архитектура: | Мультиархитектурность: | Содержимое пакета |
---|---|---|---|
lib
|
любая | такая же | общая библиотека, одновременная установка |
lib
|
любая | такая же | отладочные символы общей библиотеки, одновременная установка |
lib
|
любая | такая же | заголовочные файлы общей библиотеки, одновременная установка |
lib
|
любая | сторонняя | программы поддержки времени выполнения, не одновременная установка |
lib
|
все | сторонняя | файлы документации общей библиотеки |
|
любая | сторонняя | скомпилированные файлы программы, одновременная установка |
|
все | сторонняя | файлы документации программы |
|
все | сторонняя | интерпретируемые файлы программы |
Заметим, что пакет для разработчика должен содержать символьную ссылку на
соответствующую общую библиотеку без номера
версии. Пример:
/usr/lib/x86_64-linux-gnu/libfoo.so
->
libfoo.so.1
Вы можете собрать пакет Debian с библиотекой, включающий поддержку мультиархитектурности с помощью команды dh(1):
Обновите debian/control
.
Добавьте Build-Depends: debhelper (>=9)
в раздел
исходного кода пакета.
Добавьте Pre-Depends: ${misc:Pre-Depends}
для каждого
двоичного пакета с общей библиотекой.
Добавьте строку Multi-Arch:
в раздел каждого двоичного
пакета.
Установите debian/compat
равным «9».
Измените путь с обычного /usr/lib/
на мультиархитектурный
/usr/lib/$(DEB_HOST_MULTIARCH)/
во всех сценариях пакета.
Во-первых, вызовите DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture
-qDEB_HOST_MULTIARCH)
в debian/rules
для
настройки переменной DEB_HOST_MULTIARCH
.
Замените /usr/lib/
на
/usr/lib/$(DEB_HOST_MULTIARCH)/
в
debian/rules
.
Если ./configure
используется в части цели
override_dh_auto_configure
в
debian/rules
, замените её на dh_auto_configure
--
. [102]
Замените все появления /usr/lib/
на
/usr/lib/*/
в файлах
debian/
.
foo
.install
Сгенерируйте такие файлы как
debian/
и
foo
.linksdebian/
динамически, добавив сценарий в
цельfoo
.links.inoverride_dh_auto_configure
в
debian/rules
.
override_dh_auto_configure: dh_auto_configure sed 's/@DEB_HOST_MULTIARCH@/$(DEB_HOST_MULTIARCH)/g' \ debian/foo
.links.in > debian/foo
.links
Проверьте, что пакет с общей библиотекой содержит только ожидаемые файлы и что ваши пакеты -dev ещё работают.
Все файлы, устанавливаемые одновременно из мультиархитектурного пакета по одному пути, должны иметь одинаковое содержимое. Внимательно следите за различиями при генерации данных с другим порядком байт и алгоритмом сжатия.
[89]
Либо: readelf -d
lib
foo
.so.1
| grep
SONAME
[90]
Либо: readelf -d
lib
foo
.so.1
| grep
NEEDED
[93] Смотрите руководство по политике Debian, раздел 8.3 «Статические библиотеки» и руководство по политике Debian, раздел 8.4 «Файлы для разработки».
[94] Смотрите Debian wiki ReleaseGoals/LAFileRemoval.
[95] Смотрите вики Debian RpathIssue.
[96] При обратно несовместимых изменениях ABI обычно требуется обновить SONAME библиотеки и поменять имя пакета общей библиотеки на новое.
[97] Вместо указанного для библиотек C++ и в других случаях, где слежение за отдельными символами слишком сложно, прочтите руководство по политике Debian, раздел 8.6.4 «Система shlibs».
[98]
Все предыдущие версии пакетов Debian доступны по http://snapshot.debian.org/. Для облегчения
переноса пакета в старые выпуски часть, отвечающая за версию Debian,
отбрасывается: 1.1
<<
1.1-1~bpo70+1
<< 1.1-1
и
1.2
<< 1.2-1~bpo70+1
<<
1.2-1
[99]
Для облегчения переноса пакета в старые выпуски часть, отвечающая за версию
Debian, отбрасывается: 1.3
<<
1.3-1~bpo70+1
<< 1.3-1
[101] Старые пути к библиотекам, служащие для этих целей, такие как
/lib32/
и /lib64/
, больше не
используются.
[102]
Или же вы можете добавить параметры
--libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
и
--libexecdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
в
./configure
. Заметим, что в
--libexecdir
задаётся путь по умолчанию для установки
исполняемых программ, запускаемых другими программами, а не
пользователями. Значение Autotools по умолчанию равно
/usr/libexec/
, но значение Debian по умолчанию равно
/usr/lib/
.