SlackBuild: пакеты своими руками

Евгений Ратников aka nonstop

2008-06-04

Зачем это нужно

Только для того чтобы сделать tgz-пакет. Множество программ можно установить из исходных текстов, а вот корректно удалить уже сложнее. Для управления tgz-пакетом может быть использован менеджер пакетов Slackware. С ним установка/удаление гораздо легче и приятнее.

Что такое SlackBuild

SlackBuild - скрипт для автоматической сборки пакета из исходных текстов. Обычное название такого скрипта имя_программы.SlackBuild.

Почему именно SlackBuild

Действительно, почему именно SlackBuild? Автоматическая сборка пакетов! Автоматическая - главное, для меня по крайней мере.

Долгое время для сборки собственных пакетов я пользовался checkinstall. При всех плюсах у этого подхода были и недостатки. Достаточно сложно автоматизировать его работу. Каждый раз приходилось вспоминать какие опции программы и флаги сборки я использовал в прошлый раз. В результате появилось несколько скриптов для сборки, т.е. несмотря на checkinstall скрипты все-равно оказывались удобнее.

Еще один недостаток checkinstall - проблематично создать пакет для программ без цели сборки install (например курсоры или темы).

К этому стоит добавить и ненадежную работу начиная с 12 версии Slackware.

Наконец именно с помощью SlackBuild-скриптов собирается дистрибутив Slackware. Достаточно взглянуть на директорию source с установочного диска.

Пример скрипта

Рассмотрим написание своего SlackBuild на небольшом примере. Для меня до сих пор загадка почему Патрик включает и ctags и vim в один пакет. Я предпочитаю разделить эти программы на два пакета.

Итак vim.SlackBuild с подробными комментариями

#!/bin/sh
    # SlackBuild-скрипт для vim-gvim

#  Объявляем переменные
    #  Я стараюсь во всех скриптах давать одинаковые имена переменным,
    #  такие же как в большинстве скриптов из дистрибутива, 
    #  так как привыкнув один раз читать скрипты становиться просто
    PRGNAM=vim                  #  название
    VERSION=7.1                 #  версия
    SRCDIR=vim71                #  директория с исходным кодом (далеко не всегда это нужно)
    ARCH=${ARCH:-i486}          #  архитектура
    BUILD=${BUILD:-1}           #  номер сборки
    TAG=${TAG:-_evgeny}         #  автор
    CWD=$(pwd)                  #  текущая директория - отсюда будем брать исходники, патчи и т.п.
    TMP=${TMP:-/tmp/$TAG}       #  сюда распаковываем архив с исходниками
    PKG=$TMP/package-$PRGNAM    #  сюда будем устанавливать собранную программу 
                                #  (предварительная установка во временную директорию нужна для последующей сборки пакета)
    OUTPUT=${OUTPUT:-/tmp}      #  сюда сохраним полученный пакет

#  Выбираем оптимизирующие флаги компиляции
    if [ "$ARCH" = "i486" ]; then
      SLKCFLAGS="-O2 -march=i486 -mtune=i686"
    elif [ "$ARCH" = "i686" ]; then
      SLKCFLAGS="-O2 -march=i686 -mtune=i686"
    elif [ "$ARCH" = "x86_64" ]; then
      SLKCFLAGS="-O2 -fPIC"
    fi

#  принудительный выход если какая либо из следующих команд вернула значение, отличное от 0
    set -e

rm -rf $PKG                                 
#  очищаем директорию от предыдущей установки
    mkdir -p $TMP $PKG $OUTPUT                  
#  создаем директории для установки, сборки и сохранения пакета
    cd $TMP
    rm -rf $PRGNAM-$VERSION                     
#  очищаем директорию от предыдущей сборки

#  распаковываем архивы с исходными текстами
    tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2 
    tar xvf $CWD/$PRGNAM-$VERSION-extra.tar.gz
    tar xvf $CWD/$PRGNAM-$VERSION-lang.tar.gz

# зачастую архивы распаковываются в $PRGNAM-$VERSION, однако vim распаковывается в vim71 - $SRCDIR # переходим к исходникам и исправляем права доступа cd $SRCDIR find . \ \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ -exec chmod 755 {} \; -o \ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ -exec chmod 644 {} \;

# конфигурация сборки CFLAGS="$SLKCFLAGS" \ ./configure \ --prefix=/usr \ --mandir=/usr/man \ --build=$ARCH-slackware-linux \ --host=$ARCH-slackware-linux \ --with-x \ --enable-multibyte \ --enable-fontset \ --enable-gui=gtk2 \ --enable-pythoninterp \ --enable-tclinterp \ --disable-netbeans # сборка make # установка # DESTDIR - переменная среды, добавляется перед префиксом - # таким образом можно "установить" программу в локальную директорию для последующей сборки пакета # Аналогичная переменная есть для многих систем сборки, например для qmake это INSTALL_ROOT, # для cmake - тоже DESTDIR, для python setuptools надо указывать --root и т.п. make install DESTDIR=$PKG # сжимаем man-страницы ( cd $PKG/usr/man rm -rf cat* find . -type f -exec gzip -9 {} \; for i in $(find . -type l) ; do ln -s $(readlink $i).gz $i.gz ; rm $i ; done ) # добавляем документацию, а вместе с ней и пару SlackBuild, slack-desc mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION cp -a README* $PKG/usr/doc/$PRGNAM-$VERSION cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild cat $CWD/$PRGNAM.slack-desc > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.slack-desc # install - служебная директория, из файла slack-desc берется описание пакета mkdir -p $PKG/install cat $CWD/$PRGNAM.slack-desc > $PKG/install/slack-desc # Иногда бывает нужно выполнить некоторые действия после установки. # В этом случае в директорию install добавляется файл doinst.sh # Нам это не требуется # до этого места можно было работать под обычным пользователем # меняем владельца всех устанавливаемых файлов на root chown -R root:root $PKG # создаем пакет cd $PKG /sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.tgz

Вот что получилось:

vim-7.1-i486-1_evgeny.tgz

Название - vim, версия - 7.1, архитектура - i486, сборка - 1, автор сборки - evgeny (указывать необязательно, но я указываю, т.к. в таком случае всегда видно какие именно пакеты собрал я сам).

vim.SlackBuild и vim.slack-desc можно взять здесь.

Ссылки

Slackware Package Management (перевод)

SlackBuilds.org

Building a Slackware Package

The perfect package