Приложение A. Углублённое пакетирование

Содержание

A.1. Общие библиотеки
A.2. Управление debian/пакет.symbols
A.3. Мультиархитектурность
A.4. Сборка пакета с общей библиотекой

Далее приводится подсказки и ссылки при сложных случаяхпакетирования. Настоятельно рекомендуется прочитать все предлагаемые материалы.

A.1. Общие библиотеки

Перед пакетированием общих библиотек прочтите следующие основные документы:

Вот упрощённое представление, для начала.

  • Общие библиотеки — это объектные файлы в формате ELF, в которых содержится скомпилированный код.

  • Общие библиотеки распространяются в виде файлов *.so (не в файлах *.a или *.la).

  • Главным образом, общие библиотеки нужны для совместного использования общего кода в исполняемых файлах посредством механизма ld.

  • Иногда общие библиотеки используются в качестве подключаемых модулей исполняемых файлов посредством механизма dlopen.

  • Общие библиотеки экспортируют символы — скомпилированные объекты: переменные, функции и классы; и разрешают к ним доступ из скомпонованных исполняемых файлов.

  • SONAME общей библиотеки libfoo.so.1: objdump -p libfoo.so.1 | grep SONAME [89]

  • SONAME общей библиотеки обычно совпадает с именем файла библиотеки (но не всегда).

  • SONAME общих библиотек, которые скомпонованы с /usr/bin/foo: objdump -p /usr/bin/foo | grep NEEDED [90]

  • libfoo1: библиотечный пакет общей библиотеки libfoo.so.1 с ABI-версией SONAME, равной 1.[91]

  • Пакетные сценарии сопровождающего для библиотеки должны вызывать ldconfig для создания необходимых символьных ссылок для SONAME при определённых условиях.[92]

  • libfoo1-dbg: пакет с отладочными символами, который содержит символы для отладки пакета с общей библиотекой libfoo1.

  • libfoo-dev: пакет для разработчика, который содержит заголовочные файлы и т .д. общей библиотек libfoo.so.1.[93]

  • Обычно, в пакете Debian не должно быть файлов архива Libtool *.la.[94]

  • Обычно, в пакете Debian не должен использоваться RPATH.[95]

  • Несмотря на некоторое устаревание и статус вторичности, следующая ссылка тоже может быть полезна Debian Library Packaging Guide.

A.2. Управление debian/пакет.symbols

Если пакет содержит общую библиотеку, то вы должны создать файл debian/пакет.symbols, в котором отражена минимальная версия каждого символа обратно совместимых изменений ABI с единым SONAME библиотеки и единым именем пакета с библиотекой.[96] Подробная информация приведена в следующих документах:

Вот примерный план создания пакета 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 и содержащиеся на ней ссылки могут быть полезными.

A.3. Мультиархитектурность

Свойство мультиархитектурности, появившееся в Debian wheezy, встраивает поддержку кросс-платформенной установки двоичных пакетов (а именно i386<->amd64, но есть и другие комбинации) в dpkg и apt. Подробная информация приведена в следующих документах:

При установке общих библиотек в путях используются триплеты, например 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/

Вот несколько примеров разделения типично мультиархитектурных пакетов:

  • библиотека с исходным кодом libfoo-1.tar.gz

  • инструмент с исходным кодом bar-1.tar.gz, написанный на компилируемом языке

  • инструмент с исходным кодом baz-1.tar.gz, написанный на интерпретируемом языке

ПакетАрхитектура:Мультиархитектурность:Содержимое пакета
libfoo1любаятакая же общая библиотека, одновременная установка
libfoo1-dbgлюбаятакая же отладочные символы общей библиотеки, одновременная установка
libfoo-devлюбаятакая же заголовочные файлы общей библиотеки, одновременная установка
libfoo-toolsлюбаясторонняя программы поддержки времени выполнения, не одновременная установка
libfoo-docвсесторонняя файлы документации общей библиотеки
barлюбаясторонняя скомпилированные файлы программы, одновременная установка
bar-docвсесторонняя файлы документации программы
bazвсесторонняя интерпретируемые файлы программы

Заметим, что пакет для разработчика должен содержать символьную ссылку на соответствующую общую библиотеку без номера версии. Пример: /usr/lib/x86_64-linux-gnu/libfoo.so -> libfoo.so.1

A.4. Сборка пакета с общей библиотекой

Вы можете собрать пакет 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.links и debian/foo.links.in динамически, добавив сценарий в цельoverride_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 libfoo.so.1 | grep SONAME

[90] Либо: readelf -d libfoo.so.1 | grep NEEDED

[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/.