ABS - The Arch Build System (Russian)

From ArchWiki

Jump to: navigation, search
i18n
Česky
English
繁體中文
Русский

Contents

Вступление

Arch Build System ("Система Сборки для Arch", сокращенно ABS) используется для:

  • Создания новых пакетов программ, которых нет в Arch Linux
  • Пересборки существующих пакетов (включение или выключение опций сборки)
  • Перестройки всей системы с использованием новых флагов компиляции "a la freebsd" (и получение работающих модулей с Вашим новым ядром)

ABS полезна, но не является необходимой для использования Arch Linux.

Это описание - краткий обзор ABS и пакетов Arch Linux, а не полное руководство. Если Вы хотите узнать больше, обратитесь к man-страницам.


Установка пакетов

Для использования ABS Вы должны выполнить:

pacman -Sy 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_FAQ для детальной информации
  • 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


он синхронизирует то, что может быть названо "Дерево ABS", с arch сервером используя систему cvs.

Что же такое дерево 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


  • устанавливаем новый пакет используя одну из следующий команд: (-A для установки нового или -U для обновления уже установленного пакета):
  pacman -A foo-*.pkg.tar.gz
  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:

Personal tools