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

#### Вступление

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_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

он, используя систему 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

- устанавливаем новый пакет используя одну из следующий команд: (`-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:

- Safe_Cflags
- [2]
- chapter/make9.html#SEC102

#### Дополнительно о ABS

Пара ссылок на wiki страницы, которые помогут лучше понять ABS:

- Creating packages
- Custom local repository with ABS and gensync

Categories:

- Русский
- Package management (Русский)
- Tutorials (Русский)