Arch Build System (Русский)

Tango-preferences-desktop-locale.png

Tango-preferences-desktop-locale.png

Эта страница нуждается в сопроводителе

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Вступление

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: