четверг, августа 16, 2007

Сборка из исходников в Debian.

По сабжу надеюсь всем интересующимся известно про "apt-get -b source" и "apt-build". Кому неизвестно - см. документацию ;)
Но оба этих механизма берут исходники из репозитариев debian. Хорошо это или плохо - зависит от ситуации. В том случае, если мы пересобираем пакет с тем, чтобы улучшить оптимизацию или включить какую-то возможность - это хорошо. А в случае, если нам нужна последняя версия программы (вплоть до svn), это плохо - в репозиториях оказываются только более-менее протестированные версии.
Итак, задача - собрать программу из исходников, полученных прямо с оф.сайта (или даже из svn). Скачали, распаковали. По логике, сейчас надо делать ./configure, make, make install. Только обновлять или удалять потом все файлы этой программы - будет целая история. Не говоря уж о том, чтоб быстро и просто перенести скомпиленное на другой комп. Отсюда возникает идея сделать некую обёртку над make install, которая будет сразу собирать deb-пакет и устанавливать его в систему.
Идея эта не нова, такие обертки уже есть. Самой известной является checkinstall. Она отслеживает, куда какие файлы пытается копировать make install, и все их записывает потом в deb-пакет. Я долго пользовался checkinstall, но это как оказалось не универсально и тем более не гибко. Так что я решил изобрести очередной велосипед ;) Правда, этот мой велосипед работает только для программ, которые понимают переменную DESTDIR (она должна указывать make install-у, куда копировать файлы) или другую с тем же смыслом. Но, насколько я понимаю, к этому классу относится большинство программ, использующих autotools. Зато он с точки зрения устанавливаемой программы выглядит "более естественно", и не требует рутовых привелегий вплоть до установки пакета (используется sudo).

Итак, вот обертка над make install (у меня называется /usr/local/bin/debinstall):

#!/bin/bash

# Установить пакет из исходников.
# Управляющие переменные:
# $DSTVAR - имя переменной, используемой make install в качестве префикса;
# по умолчанию - DESTDIR.
# $INSTALL - команда, устанавливающая программу; по умолчанию - make install.

set -e

DDIR=${DSTVAR:-DESTDIR}
INSTALL=${INSTALL:-make install}

IDIR=install_dir

if [ -d $IDIR ]
then mv $IDIR/DEBIAN .DEBIAN
rm -rf $IDIR
mkdir $IDIR
mv .DEBIAN $IDIR/DEBIAN
else mkdir $IDIR
fi
$INSTALL $DDIR=$(pwd)/$IDIR
mkdir -p $IDIR/DEBIAN
if [ -e $IDIR/DEBIAN/control ]
then :
else cp ~/.control.template $IDIR/DEBIAN/control
fi
${EDITOR:-vim} $IDIR/DEBIAN/control
cd $IDIR
echo -n "Enter the name of .deb package: "
read NAME
dpkg-deb -b . ../$NAME
sudo dpkg -i ../$NAME

Ну и тогда уж пусть будет обертка над всем заклинанием "configure; make; make install" (у меня называется /usr/local/bin/debuild):

#!/bin/bash

# Скомпилировать и установить программу из исходников.
# Управляющие переменные:
# $OPTIONS - опции сборки, передаваемые ./configure;
# Если существует файл build-options, дефолтные опции берутся из него.
# $CFLAGS, $CPPFLAGS, etc - как обычно, параметры компилятора
# Также см. описание в скрипте debinstall.

set -e

if [ -e build-options ]
then OPTIONS="$(cat build-options) $OPTIONS"
fi

if [ -x configure ]
then ./configure --prefix=/usr $OPTIONS
else if [ -x autogen.sh ]
then ./autogen.sh
./configure --prefix=/usr $OPTIONS
fi
fi

make
debinstall

Т.о. , обновление некоторых программ у меня теперь выглядит так:

cd ~/src/../
svn update
debuild

8 комментариев:

  1. Большое спасибо за пост, как всегда - информативно, лаконично и по делу.
    Попробую на досуге, т.к. нужно собрать одну небольшую утилиту.

    ОтветитьУдалить
  2. Действительно, очень полезный и интересный способ. Надо будет попробовать.

    Я обычно ограничиваюсь checkinstall или же использую stow (в этом случае пакеты не создаются, а происходит установка идёт с префиксом вроде /usr/local/stow/appname, а stow автоматически ставит или убирает в /usr/local символические ссылки, таким образом всё приложение лежит в одном каталоге и может быть легко удалено и если нужно можно установить другую версию в /usr/local/stow/appname2 и автоматически перенаправить символические ссылки)

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Анонимный11/16/2007 4:55 ДП

    Случайный коммент в случайные заметки (((:

    dh_make/dpkg-buildpackage ?

    ОтветитьУдалить
  5. checkinstall не работает с последними coreutils. Переделал этот скрипт под slackware - жить стало легче. =)

    ОтветитьУдалить
  6. Спасибо огромное!
    Ваш блог вообще находка. С удовольствием на днях перечитал его :)

    ОтветитьУдалить
  7. А если при сборке запускается только make, а make install выдаёт ошибку, что делать?

    ОтветитьУдалить
  8. Анонимный2/04/2010 9:47 ДП

    Вот всего три года линуксоид, а первым делом надо сказать "читайте мануал". Это у вас мантра что-ли такая, у труъ-линуксоидов? Про Windows никто никого ничего читать не посылает, отвечают в меру сил на вопрос. Или вам кажется, что по Windows нечего почитать? Вы глубоко заблуждаетесь. Культурнее надо быть, меня тошнит уже от этих линуксоидов с мануалами, которые достигли просветления, но никому просто ничего не скажут. Как же, они читали мануал, а вы хотите все на халяву узнать.

    ОтветитьУдалить