Евгений Ратников aka nonstop
2008-06-04
Только для того чтобы сделать tgz-пакет. Множество программ можно установить из исходных текстов, а вот корректно удалить уже сложнее. Для управления tgz-пакетом может быть использован менеджер пакетов Slackware. С ним установка/удаление гораздо легче и приятнее.
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 можно взять здесь.