Arch Build System (Русский)
Contents
Вступление
Arch Build System ("Система Сборки для Arch", сокращенно ABS) используется для:
- Создания новых пакетов программ, которых нет в Arch Linux
- Пересборки существующих пакетов (включение или выключение опций сборки)
- Перестройки всей системы с использованием новых флагов компиляции "a la freebsd" (и получение работающих модулей с Вашим новым ядром)
ABS полезна, но не является необходимой для использования Arch Linux.
Это описание - краткий обзор ABS и пакетов Arch Linux, а не полное руководство. Если Вы хотите узнать больше, обратитесь к man-страницам.
Установка пакетов
Для использования ABS Вы должны выполнить:
pacman -S abs
Или, если Вы уже имеете скачанные пакеты в каталоге 'foo' (например):
cd foo pacman -U abs-*.pkg.tar.gz
Что такое пакет?
Обычно пакет — это файл вида foo.pkg.tar.gz.
Это просто архив tar.gz, который содержит:
- Файлы для инсталляции
- .PKGINFO : содержит все метаданные, необходимые для pacman, зависимости и т.п.
- .INSTALL : содержит команды, запускаемые после инсталляции/обновления/деинсталляции. (Этот файл создается только если указан в PKGBUILD)
Что за файл PKGBUILD и что он содержит?
Как упоминалось раньше, PKGBUILD содержит метаданные для пакета. Это простой текстовый файл, например:
# $Id: PKGBUILD,v 1.12 2003/11/06 08:26:13 dorphell Exp $ # Maintainer: judd <jvinet@zeroflux.org> # Contributor: Judd Vinet <jvinet@zeroflux.org> pkgname=foo pkgver=0.99 # note: if the pkgver had been '0.99-10' then use an underscore. like '0.99_10' pkgrel=1 pkgdesc="short description of foo" arch=(i686 x86_64) url="http://www.foo.org" license="GPL" groups= provides= depends=('qt' 'python') makedepends=('guile') conflicts=('yafoo') replaces=('mffoo') backup=('etc/foo/foo.conf') install=('foo.install') source=(http://www.foo.org/download/$pkgname-$pkgver.tar.gz) md5sums=('2c0cca3ef6330a187c6ef4fe41ecaa4d35175bee593a7cc7d6205584a94d8625') build() { cd $startdir/src/$pkgname-$pkgver ./configure --prefix=/usr make || return 1 make prefix=$startdir/pkg/usr install }
Итак, давайте рассмотрим каждое поле:
- # text : комментарий
- # $Id: PKGBUILD,v ... : cvs-tag для этого пакета (из archlinux-cvs)
- # Maintainer : тот, кто в данный момент сопровождает пакет
- # Contributor : все те, кто ранее сопровождали данный пакет
- pkgname : название пакета
- pkgver : версия пакета
- pkgrel : номер релиза пакета. Он отличается от версии пакета тем, что он увеличивается при изменениях в PKGBUILD. Для этого есть несколько причин, например, Вы изменили какие-нибудь опции компиляции.
- pkgdesc : короткое описание пакета. Его можно увидеть при просмотре базы пакетов
- arch : указывает, на каких архитектурах работает этот пакет. См. Arch64 ЧаВо для детальной информации
- url : домашняя страница пакета (которая откроется, когда Вы кликните по имени пакета в базе пакетов)
- license : лицензия, по которой распространяется программа
- groups : используется для группы пакетов: например, когда Вы попробуете установить kde, будут установлены все пакеты, входящие в группу kde
- provides : используется, если пакет обеспечивает другой пакет, например, kernel-scsi обеспечивает kernel
- depends : список run-time зависимостей, необходимых для работы пакета
- makedepends : зависимости, нужные только для сборки пакета
- conflicts : список пакетов, которые не могут существовать в системе одновременно с "нашим" пакетом
- replaces : "наш" пакет заменяет указанный
- backup : список файлов, которые необходимо сохранить (в виде file.pacsave) когда пакет будет деинсталлирован
- install : указывает на специальный скрипт, который будет включен в пакет (должен быть в том же каталоге, где и PKGBUILD)
- source : список адресов с исходниками пакета. Это могут быть и локальные файлы, и адреса в интернете. Чтобы каждый раз, при изменении версии, не изменять адрес в - именах можно использовать pkgver
- md5sums : список контрольных сумм для исходников
Теперь рассмотрим функции:
- build : все действия, необходимые для сборки пакета (более подробно будет рассмотрено позже)
Итак, Вы видите, что PKGBUILD содержит всю информацию, необходимую для менеджера пакетов. Это сердце pacman и abs.
Есть еще файлы install. Наш PKGBUILD указывает на 'foo.install' как на инсталляционный скрипт. Вот пример такого файла:
post_install() { /bin/true } post_upgrade() { /bin/true } pre_remove() { /bin/true } op=$1 shift $op "$@"
Назначения функций:
- post_install : этот скрипт будет выполнен сразу после инсталляции файлов, он принимает один аргумент :
- версия пакета
- post_upgrade : этот скрипт будет выполнен после обновления всех файлов, он получает два параметра :
- новая версия пакета
- старая версия пакета
- pre_remove : этот скрипт будет выполнен перед удалением файлов (например, остановка демонов), он принимает один аргумент :
- версия пакета
Три строки в конце файла необходимы для правильной работы.
Функция build
Если Вы не знакомы со сборкой пакетов - будет полезно знать, что большинство пакетов (но не все) могут быть собраны следующим образом:
- распаковка исходных файлов :
tar -xzf foo-0.99.tar.gz tar -xjf foo-0.99.tar.bz2
- переход в каталог
cd foo-0.99
- конфигурирование: в общем случае, это небольшой скрипт
configure
в каталоге исходников, который используется для конфигурирования пакета (добавить или убрать возможности, изменить путь инсталляции и т.п.) и проверки, что в Вашей системе установлены все необходимые программы. Он может быть запущен так:
./configure [[option]]
Вы можете сначала почитать подсказку:
./configure --help
- компиляция программы :
make
- инсталляция
make install
Вы должны всегда читать файл INSTALL
, чтобы знать, как надо собирать пакет. Не все пакеты используют систему configure; make; make install
!
Итак, взглянем на стандартное содержимое функции build:
build() { cd $startdir/src/$pkgname-$pkgver ./configure --prefix=/usr make || return 1 make prefix=$startdir/pkg/usr install }
Что мы делаем:
- переходим в каталог, куда были распакованы исходники:
cd $startdir/src/$pkgname-$pkgver
Когда Вы попробуете собирать свой пакет, удостоверьтесь, что это правильный каталог, иногда исходники распаковываются в другой каталог:
tar -xzf foo-0.99.tar.gz
и ls
может выдать:
. .. foo-0.99.tar.gz foo/
а не:
. .. foo-0.99.tar.gz foo-0.99/
- конфигурируем пакет и указываем, что он будет установлен в каталог
/usr
:
./configure --prefix=/usr
- компилируем
make || return 1
- инсталлируем программу, но не в
/usr
, а в$startdir/pkg/usr
, чтобы pacman мог управлять файлами.
make prefix=$startdir/pkg/usr install
Здесь мы заставляем make
устанавливать файлы пакета не в указанный при конфигурировании каталог /usr
, а в специальный каталог $startdir/pkg/usr
. Теперь, makepkg
может увидеть все устанавливаемые файлы и собрать их в пакет.
NOTE: Не всегда prefix
используется в Makefile
; часто вместо этого используется DESTDIR
. Если пакет создавался с помощью autoconf/automake, используйте DESTDIR
, это указано в документации. Проверьте генерируемый файл filelist
. Если он пуст, попробуйте make DESTDIR=$startdir/pkg install
. Если это не работает, то надо смотреть, как работает "make <...> install=
".
Дерево ABS
Когда Вы запускаете abs впервые
# abs
он, используя систему cvs, синхронизирует то, что может быть названо "Дерево ABS" с сервером arch.
Что же такое дерево ABS? Оно находится в каталоге /var/abs
и выглядит примерно так:
|- | -- base/ |- | ||-- autoconf/ |- | ||-- automake/ |- | ||-- ... |- | -- devel/ |- | -- ... |- | -- extra/ |- | || -- daemons/ |- | || || -- acpid/ |- | || || || -- PKGBUILD ... ... ... ...
Дерево ABS имеет ту же структуру, что и база пакетов:
- Первый уровень каталогов - категории
- Второй уровень каталогов - пакеты
- PKGBUILD содержит всю информацию о пакете
Исключение — один специальный каталог local. Это „ваш“ каталог, в нем вы можете делать что угодно. Остальные каталоги изменять нельзя.
Примечание: Первая загрузка дерева будет происходить долго, затем будут только обновления. Но не пугайтесь, если у вас только модемное соединение - передается только текст, который сжимается при передаче.
Теперь, когда мы знаем, что такое дерево ABS, как мы можем использовать его?
Первое использование ABS: изменение пакета
Эта ситуация может возникнуть, когда Вы считаете, что официальные пакеты собраны с определенным количеством --enable
или --disable
опций и это не то, что выбрали бы Вы.
Для примера возьмем пакет foo. foo собран без поддержки arts. Допустим, мы хотим включить arts.
Вот что мы будем делать:
- находим, где расположен пакет foo. Это можно сделать так:
искать foo на [1] использовать find:
find /var/abs -name "foo"
использовать slocate:
slocate foo | grep ^/var/abs
В любом случае, мы должны обнаружить, что foo находится в extra
и multimedia
- копируем foo файл
PKGBUILD
в/var/abs/local/foo
mkdir /var/abs/local/foo cp /var/abs/extra/multimedia/foo/* /var/abs/local/foo cd /var/abs/local/foo
- изменяем
PKGBUILD
: добавляем поддержку arts:
build() { cd $startdir/src/$pkgname-$pkgver ./configure --prefix=/usr make || return 1 make prefix=$startdir/pkg/usr install }
изменяем на:
build() { cd $startdir/src/$pkgname-$pkgver ./configure --enable-arts --prefix=/usr make || return 1 make prefix=$startdir/pkg/usr install }
- запускаем
makepkg
:
makepkg
- устанавливаем новый пакет используя команду
-U
pacman -U foo-*.pkg.tar.gz
Флаги компиляции и настройка makepkg
Настроечный файл для makepkg
— /etc/makepkg.conf
. Здесь Вы можете установить переменные окружения для gcc
, make
и непосредственно makepkg
.
Это пример файла /etc/makepkg.conf
:
# Программа, с помощью которой makepkg будет скачивать исходники export FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3" # Информация для gcc о типе компьютера export CARCH="i686" export CHOST="i686-pc-linux-gnu" # Флаги компиляции для gcc export CFLAGS "-march athlon-tbird -O2 -pipe" export CXXFLAGS "-march athlon-tbird -02 -pipe" # Флаги для make export MAKEFLAGS="-j 2" # Расцветка вывода export USE_COLOR="y" # Оставшиеся переменные служат для настройки makepkg # Включить fakeroot для сборки пакетов непривилегированным пользователем. # 'man fakeroot' для информации export USE_FAKEROOT="y" # Каталог, куда будут сваливаться собранные пакеты (default is ./) export PKGDEST=/home/packages # Корень ABS дерева (default is /var/abs) export ABSROOT=/var/abs # Имя, которое будет фигурировать в Ваших пакетах export PACKAGER="John Doe <nowhere@microsoft.com>"
Пара предостережений: пользователи должны быть уверены, что изменение переменных CFLAGS
, CXXFLAGS
, и MAKEFLAGS
не приведет к неработоспособности собираемых пакетов. Также, обычному пользователю Arch Linux, не обязательно изменять значения переменных CARCH
, CHOST
и USE_FAKEROOT
.
Ссылки на флаги gcc и make:
Дополнительно о ABS
Пара ссылок на wiki страницы, которые помогут лучше понять ABS: