Slackware packages
Наверно вы не раз сталкивались с ситуацией, когда необходимое вам приложение доступно в виде исходников, а пакетов для Slackware нет. Конечно, как правило, не сложно установить и из исходников, но при этом вы получаете неудобство в виде невозможности корректного удаления этого приложения при помощи removepkg. В связи с этим мне стало интересно, а как же эти пакеты готовить самому. На сайте linuxpackages.net я нашёл достаточно подробные инструкции по созданию правильных пакетов. Вот ссылки на статьи, касающиеся этого процесса:
- Building a Slackware Package
- The perfect package
- Format for the slack-desc file
- Slackware doinst File
Для тех кто с английским не очень дружит (я имею ввиду себя
) я написал краткий конспект по этой теме.
Итак, первое что нам нужно это исходник приложения, пакет которого мы хотим создать. Я буду писать на примере приложения Qalculate! - достаточно мощного GUI калькулятора. На домашней странице есть версии для KDE и GTK+. KDE мне роднее, так что беру её: Qalculate! (KDE). На сайте также написано, что нужна библиотека libqalculate, и библиотека CLN - забираем и их тоже. Остальные зависимости можно удовлетворить посредством дистрибутива Slackware. Ну и для компиляции нам конечно понадобится установленный gcc.
Пакеты мы будем собирать под правами root-а. Для создания пакетов рекомендуется создать отдельную рабочую область, например в /work. В ней создаём подкаталоги scripts и builds:
$ su пароль # mkdir /work # cd /work # mkdir scripts # mkdir builds
Сборку пакетов начнём с CLN. Распаковываем наш исходник:
# tar xfj cln-1.1.13.tar.bz2 # cd cln-1.1.13
Теперь перейдём к компиляции и “псевдоустановке” (сам придумал
). Обычно этот процесс происходит с помощью последовательности ./configure; make; make install. В любом случае, предварительно читаем INSTALL, или README, или любой другой файл описывающий установку. В нашем случае всё без особенностей.
Для начала надо посмотреть: как указать конфигуратору какие каталоги и для чего использовать. В Slackware обычно для приложений используется каталог /usr, для системных настроек - /etc и для файлов создаваемых приложением (например, логов) - /var. Смотрим так:
# ./configure --help
Типичный вариант (в том числе и для нашего случая) указания этих каталогов:
# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
После успешного завершения компилируем:
# make
Теперь можно отдохнуть - перекусить, например
- процесс компиляции не быстрый: на моём гигагерцовом Атлоне занял 37 минут (всё пора апгрейдиться!
). По информации из INSTALL теперь надо сделать make check и уж потом make install. Чтож, последуем совету:
# make check
Теперь предлагается сделать установку, но нам это не нужно: мы ведь делаем пакет. Нам нужно сделать “псевдоустановку” в наш специально приготовленный каталог /work/builds. Для того, чтобы узнать как это сделать, нужно посмотреть Makefile, найти команды выполняемые для цели install и посмотреть какая переменная используется для задания корневого каталога установки. Это может быть, например, DESTDIR, или ROOT, или prefix. Для библиотеки CLN это переменная DESTDIR. Её и меняем указывая в качестве параметра:
# make install DESTDIR=/work/builds
На всякий случай нужно проверить: не попало ли в результате этой команды что-нибудь мимо /work/builds. Если попало - переносим в соответствующий каталог внутри /work/builds.
Все полезные текстовые файлы (в том числе и лицензию), а также примеры конфигов и прочее копируем в /work/builds/usr/doc/имяпакета-версия:
# mkdir /work/builds/usr/doc/cln-1.1.13 # cp COPYING /work/builds/usr/doc/cln-1.1.13 # cp ChangeLog /work/builds/usr/doc/cln-1.1.13 # cp NEWS /work/builds/usr/doc/cln-1.1.13 # cp README /work/builds/usr/doc/cln-1.1.13 # cp TODO* /work/builds/usr/doc/cln-1.1.13 ...
Если необходимо выполнить какие-либо действия после установки, то создаём файл с командами doinst.sh и кладём его /work/builds/install (описание файла и примеры можно посмотреть здесь: Slackware doinst File). Туда же необходимо положить файл sack-desc. Его описание читаем тут: Format for the slack-desc file, а удобный механизм создания файлов здесь: Slack Description Creator. Вот пример того, что получилось у меня:
cln: cln 1.1.13 Library for efficient computations cln: cln: Class Library for Numbers (CLN) is a library for efficient cln: computations with all kinds of numbers in arbitrary cln: precision. Features: cln: - rich set of number classes; cln: - elementary, logical, transcendental functions; cln: - C++ as implementation language; cln: - memory efficiency; speed efficiency; interoperability. cln: cln: Package Created By: Vadim Kapustin
Ещё в install можно положить файлы характеризующие зависимости нашего пакета: slack-required, slack-conflicts и slack-suggests. Файлы slack-required и slack-conflicts содержат строки вида:
имя_приложения условие версия
Например: man >= 1.5-i386-1. А файл slack-suggests состоит из строк содержащих только имена опциональных пакетов. В нашем пакете мы не будем создавать эти файлы.
Прежде чем создать пакет, необходимо проверить права доступа к файлам в будущем пакете. Обобщённо правила выглядят так: все файлы принадлежат пользователю root, и группе root (в Slackware 10.2 файлы в каталогах bin принадлежат группе bin). Исполняемые файлы и каталоги должны иметь права доступа 0755, остальные файлы - права 0644. В основном все проблемы прав доступа решаются так:
# cd /work/builds
# chown -R root.root .
# find . -perm 777 -exec chmod 755 {} \\;
# find . -perm 555 -exec chmod 755 {} \\;
# find . -perm 444 -exec chmod 644 {} \\;
# find . -perm 666 -exec chmod 644 {} \\;
# find . -perm 664 -exec chmod 644 {} \\;
Но на всякий случай просмотрите их после этого ещё раз. (связка ls -lR и grep вам в помощь). Теперь мы готовы создать пакет, но прежде немного об именовании пакетов. Имя пакета имеет следующий формат: name-version-arch-buildname.tgz
где:
name - имя приложения (например cln);
version - версия приложения (например 1.1.13);
arch - архитектура под которую компилировалось приложение. Возможные варианты: i386, i486, i586, i686, x86_64, noarch, ppc. Для Slackware 11.0 стандартной платформой является i486, но возможно вы захотите откомпилировать с оптимизацией под более современные платформы, только учитывайте при этом, что часть возможных пользователей пакета не сможет им воспользоваться;
buildname - состоит из номера сборки пакета (не путать со сборками приложения) и абревиатуры создателя пакета (например так: 1vak);
Итак, создаём пакет:
# makepkg cln-1.1.13-i386-1vak.tgz
Нас спросят хотим ли мы заменить ссылки в пакете на команды их создания в постинсталляционном скрипте (doinst.sh) - лучше ответить да. После этого будет вопрос о приведении прав доступа в соответствии с вышеуказанными правилами - лучше сказать да. И вот наконец наш пакет готов! Ура
Ещё раз проверяем состав пакета и права доступа:
# tar tzvf cln-1.1.13-i386-1vak.tgz
Ну и то, ради чего всё это затевалось:
# installpkg cln-1.1.13-i386-1vak.tgz
Теперь можно зарегистрироваться на LinuxPackages.net и предложить для всеобщего пользования своё творение (в скором времени собираюсь это попробовать - будут проблемы - расскажу). Больше пакетов хороших и разных!
Ну вот вобщем то и всё. Для закрепления материала приведу процесс создания libqalculate и qalculate:
Предполагаю, что вы уже в /work и там же лежат архивы с исходниками, а содержимое /work/builds очищено и/или перенесено куда нужно. Поехали:
# tar xfz libqalculate-0.9.4.tar.gz # cd libqalculate-0.9.4 # ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var # make # make check # make install DESTDIR=/work/builds
Создаём и наполняем каталог /work/builds/usr/doc/libqalculate-0.9.4. Создаём файл /work/builds/install/slack-desc:
libqalculate: libqalculate 0.9.4 Math libary for expression evaluation libqalculate: libqalculate: libqalculate is math libary for expression evaluation with libqalculate: units, variables and functions support and CAS functionality libqalculate: libqalculate: libqalculate: libqalculate: libqalculate: libqalculate: libqalculate: Package Created By: Vadim Kapustin
Команды задания правильных прав доступа я поместил в файл /work/setperm.sh:
#!/bin/sh
cd /work/builds
chown -R root.root .
find . -perm 777 -exec chmod 755 {} \\;
find . -perm 555 -exec chmod 755 {} \\;
find . -perm 444 -exec chmod 644 {} \\;
find . -perm 666 -exec chmod 644 {} \\;
find . -perm 664 -exec chmod 644 {} \\;
Продолжаем создание пакета:
# /work/setperm.sh # cd /work/builds # makepkg libqalculate-0.9.4-i386-1vak.tgz y y # tar tzvf libqalculate-0.9.4-i386-1vak.tgz
Пакет готов. Устанавливаем его:
# installpkg libqalculate-0.9.4-i386-1vak.tgz
И наконец создание пакета qalculate (версия для KDE):
# tar xfz qalculate-kde-0.9.4.tar.gz # cd qalculate-kde-0.9.4 # ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var # make # make check # make install DESTDIR=/work/builds
Как обычно, создаём и наполняем каталог /work/builds/usr/doc/qalculatekde-0.9.4 и создаём файлы:
/work/builds/install/slack-desc :
qalculatekde: qalculatekde 0.9.4 Multi-purpose desktop calculator (KDE edition) qalculatekde: qalculatekde: Qalculate! is a multi-purpose desktop calculator for qalculatekde: GNU/Linux. It is small and simple to use but with much power qalculatekde: and versatility underneath. Features include customizable qalculatekde: functions, units, arbitrary precision, plotting, and qalculatekde: a user-friendly interface (KDE or GTK+) qalculatekde: qalculatekde: qalculatekde: qalculatekde: Package Created By: Vadim Kapustin
/work/builds/install/slack-required :
cln >= 1.1.0 libqalculate >= 0.9.4
Продолжаем создание пакета:
# /work/setperm.sh # cd /work/builds # makepkg qalculatekde-0.9.4-i386-1vak.tgz y y # tar tzvf qalculatekde-0.9.4-i386-1vak.tgz
Устанавливаем:
# installpkg qalculatekde-0.9.4-i386-1vak.tgz
И вот он долгожданный момент!
Запускаем:
$ qalculate
Очень содержательно, и мне помогло. Спасибо!
Комментарий от EuGen — Январь 30, 2008 @ 18:38:53
Отличный конспект, мне очень понравилось! Неплохо бы в таком же духе про сборку библиотек итп.
P. S. Не мешало бы исправить маленькую ошибку
find . -perm 777 -exec chmod 755 {} \\;
find . -perm 555 -exec chmod 755 {} \\;
find . -perm 444 -exec chmod 644 {} \\;
find . -perm 666 -exec chmod 644 {} \\;
find . -perm 664 -exec chmod 644 {} \\;
здесь лишний обратный слеш, нужно так: \;
Комментарий от khelshazar — Март 24, 2008 @ 19:04:53
Неплохая заметка, спасибо. Осталось только попробовать собрать свои пакеты )
Комментарий от QoSyS — Май 14, 2008 @ 22:54:59
О да! Оч. хор. но pkgtools не отслеживает зависимости хоть ты тресни…
Комментарий от Hz — Июнь 9, 2008 @ 14:59:19