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: