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

автор: Евгений Ратников
последнее обнвление: 28.05.2008


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

Только для того чтобы сделать 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