Заметки на память

Slackware packages

Наверно вы не раз сталкивались с ситуацией, когда необходимое вам приложение доступно в виде исходников, а пакетов для Slackware нет. Конечно, как правило, не сложно установить и из исходников, но при этом вы получаете неудобство в виде невозможности корректного удаления этого приложения при помощи removepkg. В связи с этим мне стало интересно, а как же эти пакеты готовить самому. На сайте linuxpackages.net я нашёл достаточно подробные инструкции по созданию правильных пакетов. Вот ссылки на статьи, касающиеся этого процесса:

Для тех кто с английским не очень дружит (я имею ввиду себя 🙂 ) я написал краткий конспект по этой теме.

Итак, первое что нам нужно это исходник приложения, пакет которого мы хотим создать. Я буду писать на примере приложения 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
Реклама

4 комментария »

  1. Очень содержательно, и мне помогло. Спасибо!

    комментарий от EuGen — Январь 30, 2008 @ 18:38:53

  2. Отличный конспект, мне очень понравилось! Неплохо бы в таком же духе про сборку библиотек итп.

    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

  3. Неплохая заметка, спасибо. Осталось только попробовать собрать свои пакеты )

    комментарий от QoSyS — Май 14, 2008 @ 22:54:59

  4. О да! Оч. хор. но pkgtools не отслеживает зависимости хоть ты тресни…

    комментарий от Hz — Июнь 9, 2008 @ 14:59:19


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: