Есть ли способ автоматически определять зависимости при настройке файла управления dpkg? - PullRequest
7 голосов
/ 04 ноября 2011

Большинство полей в управляющем файле dpkg (Debian) просты. Сложнее всего определить список зависимостей (Зависит :). Я надеялся, что dpkg-gencontrol сможет сделать это для меня, посмотрев на вывод ldd для исполняемых файлов в каталоге пакета. Возможно, может, но я не могу заставить его работать.

Если это то, для чего dpkg-gencontrol, я получаю ошибку:

dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source field.

Для справки: dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian. Файл control_template содержит это:

Package: my-package
Maintainer: Joe Coder <joe@coder.com>
Description: The my-package system
 A longer description that runs to the end of one line and then 
 extends to another line.
Priority: optional

Если это не то, для чего dpkg-gencontrol, кто-нибудь есть какие-либо предложения относительно того, что я могу сделать, или советы о том, как настроить список зависимостей, в идеале автоматически?

По общему признанию, вывод зависимостей в общем случае, вероятно, является очень трудной проблемой, особенно если вы расширяете поиск по сценариям и другим программам. Я надеюсь, что существуют некоторые инструменты, которые работают большую часть времени.

Обратите внимание, что это только для внутреннего распространения. Я не собираю пакет для включения в дистрибутив Linux или даже для его загрузки широкой публикой, поэтому я рад, если необходимо, изменить / нарушить стандартные правила.

Ответы [ 2 ]

10 голосов
/ 10 ноября 2011

После некоторых копаний, вдохновленных ответом Титона, и множества проб и ошибок, я наконец нашел решение своей проблемы. Оказывается, что dpkg-gencontrol не является инструментом для определения зависимостей пакетов от исполняемых файлов, dpkg-shlibdeps - это. Тем не менее, необходимо тщательно настроить обе программы, чтобы создать пакет. Продолжайте читать ....

Запуск dpkg-shlibdeps -O <executable> приводит к выводу списка пакетов и версий, которые необходимо установить для запуска этого исполняемого файла. Отлично. Почти. В идеале dpkg-gencontrol мог бы использовать это в своей обработке, которую, как он утверждает, он может сделать с помощью функции подстановки переменных.

Чтобы все прошло гладко, мне нужно было создать структуру каталогов, соответствующую ожиданиям инструментов упаковки Debian. В основном это выглядит так:

my_project_directory/
  main.c (or other source code, etc.)
  debian/
    changelog    (created by hand; see below)
    control      (this is basically a template, created by hand; see below)
    files        (created by dpkg-gencontrol)
    substvars    (created by dpkg-shlibdeps and used by dpkg-gencontrol)
    tmp/         (tmp is the root of the target system's filesystem)
      path/
        to/
          my/
            project/
              executable_1  (this will be installed at /path/to/my/project)
              executable_2  (this, too)
      var/
        www/
          index.php  (this will be installed at /var/www on target systems)
      DEBIAN/        (create this by hand)
        control      (created by dpkg-gencontrol and used in the final package)

Обратите внимание, что инструменты упаковки Debian сохраняют владельца и группу всех файлов в каталоге debian / tmp /. Таким образом, если вы хотите, чтобы файлы, принадлежащие пользователю root или другому пользователю при установке, оказались сложными. Один из вариантов - подготовить дерево каталогов Debian в качестве пользователя root и установить владельцев по своему усмотрению. Если вы предпочитаете не запускаться от имени пользователя root или не имеете права, есть другой способ.

Создайте скрипт, который вызывает chown и т. Д., Чтобы настроить владельца по своему усмотрению, с последней строкой dpkg-deb -b debian/tmp . (которая создает пакет .deb, см. Пример ниже). Запустите его через fakeroot, другой инструмент Debian, например: fakeroot ./fix_ownerships_and_build.sh. Fakeroot позволяет программам вести себя так, как если бы они были пользователем root, фактически не меняя то, что делал бы root. Он был создан именно для этого сценария.

Я изучил, почему dpkg-gencontrol генерировал ошибку «в первом блоке отсутствует поле источника», даже до того, что читал исходный код Perl. Как это часто бывает, код ошибки является точным без предоставления достаточного контекста, чтобы знать, что делать: управляющему файлу действительно нужно поле с именем «source» в его первых (из двух) блоках.

Существует два вида пакетов Debian: исходный и двоичный. Я думал, что мне нужен двоичный файл, так как я просто хочу поместить в него скомпилированные исполняемые файлы, но я не мог заставить это работать. Я попробовал пакет с исходным кодом и добавил поле источника в мой контрольный файл. Это избавило от ошибки «в первом блоке отсутствует поле источника», но привело к другому. Внимательно прочитав документацию, я понял, что исходным пакетам нужны два "абзаца" в их управляющих файлах. Как только я изменил свой контрольный файл, чтобы он выглядел так, он начал работать (почти):

Source: my-package
Maintainer: Joe Coder <joe@coder.com>

Package: my-package
Priority: optional
Architecture: amd64
Depends: ${shlibs:Depends}, apache2, php5
Description: The My-Package System
 A longer description that runs to the end of one line and then
 extends to another line.

Чего не хватало, так это файла журнала изменений. Это файл для хранения истории выпусков пакета со значительными изменениями, номерами версий, датами и ответственными лицами. Обычно я поддерживаю такую ​​вещь в своем собственном формате, который я тщательно преобразовал в точный формат журнала изменений Debian. По какой-то причине журнал изменений был исключен из окончательного пакета, поэтому я оставил свой файл истории в одиночестве и вместо него использовал заполнитель, который выглядит следующим образом:

my-package (1.0) unstable; urgency=low
  * placeholder changelog to satisfy dpkg-gencontrol
 -- Joe Coder <joe@coder.com>  Thu, 3 Nov 2011 16:49:00 -0700

Необходимы два начальных пробела в строке с *, равно как и один начальный пробел в строке с -, как и два пробела между адресом электронной почты и датой. И да, дата должна быть такой точной, часовой пояс и все такое, даже если она не должна быть точной.

Собрав все вместе, с деревом каталогов debian, настроенным, как описано выше, последовательность команд, необходимых для сборки пакета, следующая:

dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \
               debian/tmp/path/to/my/project/executable_2
dpkg-gencontrol -v1.1  (or whatever version you are building)
fakeroot ./fix_ownerships_and_build.sh

где fix_ownerships_and_build.sh выглядит так:

chown -R root:root debian/tmp/path  (or whatever user is appropriate)
chown -R www-data:www-data debian/tmp/var/www/*  (same goes here)
dpkg-deb -b debian/tmp .  (this leads to a nice my-package_1.1_amd64.deb file)

Вот и все. Надеюсь, этот ответ поможет другим добиться прогресса быстрее, чем я.

1 голос
/ 06 ноября 2011

На самом деле, просмотр списка включенных библиотек довольно распространен для программ на C и только для работы помощника shlibs (dpkg-shlibdeps).Обратитесь к его справочной странице за помощью, но в основном она сводится к использованию ${shlibs:Depends} в вашей строке зависимостей.

...