После некоторых копаний, вдохновленных ответом Титона, и множества проб и ошибок, я наконец нашел решение своей проблемы. Оказывается, что 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)
Вот и все. Надеюсь, этот ответ поможет другим добиться прогресса быстрее, чем я.