воскресенье, 22 августа 2010 г.

Как просто собрать deb пакет

Иногда появляется необходимость быстро сделать deb пакет для вашей Debian системы. Тут есть четыре выхода:
  • попросить это сделать специалиста;
  • собрать через checkinstall;
  • самому написать инфраструктуру для сборки пакета;
  • использовать dpkg-deb;
Итак, обращаться  к специалисту может быть слишком долго. Вариант с checkinstall хорош, но он иногда добавляет в пакет лишние файлы, после чего пакет либо не установится, либо перезапишет некоторые системные исполняемые файлы (возможно, это уже исправили). Самому писать инфраструктуру для сборки пакета требует определённого набора знаний, это занятие не такое уж и простое. Мы остановимся на последнем - соберём свой пакет по-простому через dpkg-deb.

Итак, компилируем нужный нам пакет способом, указанным его автором. Обычно это делается через configure скрипт и утилиту make:

./configure
make

Если в системе установлены все необходимые зависимости для компиляции данного пакета, он отконфигурируется и откомпилируется нормально. Теперь нужно установить нашу программу в локальный подкаталог. Обычно это делается через make install с заданием переменной DESTDIR:

mkdir B
make install DESTDIR="$PWD/B" 

Переменная DESTDIR указывает утилите make, куда надо копировать файлы. Без неё make будет пытаться копировать файлы в корень системы. Некоторые системы сборки не поддерживают переменную DESTDIR, но поддерживают что-то аналогичное, например INSTALL_DIR:

mkdir B
make install INSTALL_DIR="$PWD/B" 

Программы, собранные через qmake, устанавливаются через переменную INSTALL_ROOT:

mkdir B
make install INSTALL_ROOT="$PWD/B" 

Некоторые системы сборки вообще не поддерживают такие переменные окружения, в этом случае файлы придётся копировать самому. Помните, что в подкаталоге B должны располагаться зеркальная иерархия корня системы, то есть так, как эти файлы должны лежать в системе со всеми подкаталогами. Например:

$ find B
B
B/usr
B/usr/local
B/usr/local/bin
B/usr/local/bin/logon
B/usr/local/share
B/usr/local/share/logon
B/usr/local/share/logon/pixmap.png

Теперь надо создать специальный каталог для утилиты dpkg-deb и задать ему права доступа (если они не равны 0755 по-умолчанию):

mkdir B/DEBIAN
chmod 0755 B/DEBIAN

В этом каталоге будут располагаться специальные файлы, которые необходимы для сборки deb пакета. Как минимум должен присутствовать файл control, в котором описывается имя пакета, его размер и т.д:

$ cat B/DEBIAN/control
Package: logon
Version: 1.0-1
Architecture: i386
Maintainer: Me 
Installed-Size: 10132
Depends: libx11-6, libqt4-core, libqt4-gui, libqt4-dbus
Section: x11
Priority: optional
Description: My small logon application

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

В этом же каталоге DEBIAN могут лежать скрипты, которые используются пакетным менеджером во время установки пакета - preinst, postinst, prerm, postrm. Они нужны, если вы хотите выполнять какие-то действия до установки пакета, после установки, до удаления и после удаления, о чём говорят названия скриптов. Все они являются необязательными.

Наконец, собираем пакет:

dpkg-deb -b B logon_1.0-1_i386.deb

Имя файла пакета обычно включает имя пакета (logon), версию (1.0-1), архитектуру (i386). Теперь можете установить свой пакет через dpkg:

sudo dpkg -i logon_1.0-1_i386.deb

Ссылки:

5 комментариев:

Анонимный комментирует...

Спасибо. Доходчиво и без воды

Анонимный комментирует...

Спасибо. Работает.

Анонимный комментирует...

В убунте нет переменной окружения INSTALL_DIR

Можно обойти это, задав префикс при конфигурировании
./configure --prefix="$PWD/B"
make
make install

Dmitry комментирует...

>>В убунте нет переменной окружения INSTALL_DIR

INSTALL_DIR - это не переменная окружения, это переменная внутри Makefile. Разные тулкиты генерируют разные переменные такого назначения в своих Makefile-ах. Qmake использует INSTALL_ROOT, autoconf - DESTDIR и т.д.

Вы должны знать, какую именно переменную использует ваш Makefile чтобы правильно установить программу через make install.

Использование --prefix крайне не рекомендуется, потому что многие программы используют заданный вами префикс для поиска своих ресурсов, например, картинок. И на чужой системе, куда вы поставили deb пакет, будут по-прежнему искать свои ресурсы по пути, заданному вами в --prefix.

Анонимный комментирует...

Дмитрий, спасибо за ценное пояснение!