Есть ли способ автоматически определять зависимости при настройке файла управления dpkg?

большинство полей в файле управления dpkg (Debian) являются простыми. Сложнее всего определить список зависимостей (Depends:). Я надеялся, что 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 ответов


после некоторого копания, вдохновленного ответом Титона, и много проб и ошибок, я, наконец, нашел решение своей проблемы. Оказывается, 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 и т. д. чтобы настроить ownerships, как вам нравится, с последней строкой dpkg-deb -b debian/tmp . (которая строит .deb пакет, ниже пример). Запустите его через fakeroot, другой инструмент Debian, например:fakeroot ./fix_ownerships_and_build.sh. Fakeroot позволяет программам вести себя так, как будто они были root, фактически не меняя вещи, как это сделал бы root. Он был создан именно для этого сценария.

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

существует два вида 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.

еще не было в файле changelog. Это файл для хранения истории выпусков пакета со значительными изменениями, номерами версий, датами и ответственными лицами. Я обычно поддерживаю такую вещь в своем собственном формате, который я тщательно преобразовал в требовательный формат журнала изменений 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)

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


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