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

Ссылки по теме

- Стандарты создания пакетов для Arch
- Пользовательский репозиторий Arch
- Создание пакетов
- Сборка ядра через ABS
- makepkg (Русский)
- Официальные репозитории
- pacman (Русский)
- PKGBUILD (Русский)
- Patching in ABS

Состояние перевода: На этой странице представлен перевод статьи Arch Build System. Дата последней синхронизации: 6 сентября 2015. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

В этой статье представлен обзор системы сборки Arch (сокращенно ABS) и пошаговое руководство для начинающих. Это не исчерпывающее руководство. Если вам нужна дополнительная информация, обратитесь к man страницам.

Примечание: Дерево ABS синхронизируется один раз в день, поэтому оно может не содержать то, что уже доступно в репозиториях.

## Что такое Arch Build System?

Arch Build System — это система наподобие портов для сборки и пакетирования программ из исходного кода. Pacman является специализированным инструментом в Arch для управления бинарными пакетами (включая пакеты, собираемые с помощью ABS), а ABS — это набор инструментов для компиляции исходников в пакеты `.pkg.tar.xz`, которые уже можно устанавливать.

### Что такое система наподобие портов?

Порты — это система используемая в *BSD для автоматизации процесса сборки программ из исходного кода. Система использует порт для загрузки, распаковки, исправления, компиляции и установки нужной программы. Порт — это всего лишь небольшой каталог на компьютере пользователя, название которого соответствует устанавливаемой программе. Этот каталог содержит несколько файлов, которые содержат инструкции по сборке и установке программ из исходных кодов. Таким образом для установки программы всего лишь нужно выполнить `make` или `make install clean` находясь в каталоге порта.

### ABS имеет такую же концепцию

ABS состоит из дерева каталогов (дерева ABS), которое находится в `/var/abs`. Это дерево содержит множество подкаталогов, распределённых по названиям репозиториев и названых в соответствии с названием пакета. Это дерево представляет собой (но не содержит) все официальные программы Arch, получаемые через систему SVN. Вы можете воспринимать каждый такой подкаталог как 'ABS', хотя большинство называют их 'портами'. Эти ABS (или подкаталоги) не содержат ни пакета с программой, ни исходных кодов, а только файл PKGBUILD (и иногда другие файлы). PKGBUILD — это просто Bash скрипт для сборки — текстовый файл, содержащий инструкции по компиляции и упаковке пакета, а также URL соответствующего tarball архива с исходниками, который нужно скачать. (Самым главным компонентом ABS являются PKGBUILDы.) Выполнив команду makepkg в ABS каталоге, программа сначала компилируется, а затем упаковывается внутри каталога сборки. Теперь вы можете воспользоваться pacman (пакетным менеджером Arch Linux), для установки, обновления или удаления вашего нового пакета.

### Обзор ABS

'ABS' можно использовать в качестве обобщающего термина, поскольку она неразрывно связана с некоторыми другими компонентами. Несмотря на то, что это технически неверно, под 'ABS' может подразумеваться набор следующих компонентов:

Дерево ABS
  Структура каталогов ABS. Каталоги синхронизируется с SVN и расположены в `/var/abs/` на вашем (локальном) компьютере. Дерево содержит много подкаталогов, названных в соответствии со всеми доступными официальными программами Arch Linux из репозиториев, которые прописаны в `/etc/abs.conf`, но не сами пакеты. Дерево создаётся после установки пакета abs с помощью pacman и последующего выполнения скрипта `abs`.

Примечание: Сами пакеты находятся в svn и git репозиториях, а скрипт `abs` скачивает их с помощью rsync.

PKGBUILD
  Bash скрипт, который содержит URL исходного кода и инструкции по компиляции и упаковыванию пакета.

makepkg
  Шелл команда, которая читает PKGBUILDы, автоматически скачивает и компилирует исходники и создаёт `.pkg.tar*` в зависимости от массива `PKGEXT` в `makepkg.conf`. Вы также можете использовать makepkg, чтобы собирать ваши собственные пакеты из AUR или других источников. Для дополнительной информации смотрите Создание пакетов.

pacman
  pacman — это совершенно независимая программа. Он всегда используется либо программой makepkg либо вручную для установки и удаления собранных пакетов и для просмотра зависимостей.

AUR
  Пользовательский репозиторий Arch — это не имеющие отношение к ABS PKGBUILDы (неподдерживаемые), которые используются программой makepkg для компиляции и упаковки программ. В отличие от дерева ABS, которое расположено на вашем локальном компьютере, AUR представлен в виде веб сайта. AUR содержит тысячи PKGBUILDов, созданных пользователями для программ, которые недоступны в качестве официальных пакетов Arch. Если вам нужно собрать пакет, которого нет в официальном дереве Arch, то вероятнее всего вы найдёте его в AUR.

## Зачем мне использовать ABS?

Система сборки Arch используется для:

- Компиляции или перекомпиляции пакета по какой-либо причине
- Сборки и установки новых пакетов из исходных кодов для программ, для которых ещё нет пакетов (смотрите Создание пакетов)
- Изменения существующих пакетов под ваши нужды (включение или отключение опций, наложение патчей)
- Перестройки всей системы с использованием новых флагов компиляции "à la FreeBSD" (например с pacbuilder)
- Чистой сборки и установки вашего собственного ядра (смотрите Компиляция ядра)
- Получения работающих модулей ядра для вашего собственного ядра
- Легкой компиляции и установки новой/старой/бета или девел версии Arch пакета, с помощью редактирования номера версии в PKGBUILD

ABS не является необходимой для использования в Arch Linux, но она удобна для автоматизации некоторых задач при компиляции из исходников.

## Как использовать ABS

Сборка пакетов с помощью abs состоит из следующих шагов:

1. Установка пакета abs с помощью pacman.
2. Запуск команды `abs` с правами root для создания дерева ABS, синхронизированного с сервером Arch Linux.
3. Копирование файлов для сборки (обычно расположенных в `/var/abs/<репозиторий>/<название_пакета>`) в каталог сборки.
4. Переход в этот каталог, редактирование PKGBUILD (если это необходимо) и выполнение команды makepkg.
5. В соответствии с инструкциями в PKGBUILD, makepkg скачает нужный tarball архив с исходным кодом, распакует его, наложит патч (если необходимо), скомпилирует в соответствии с флагами `CFLAGS`, заданными в `makepkg.conf` и наконец сожмёт собранные файлы в пакет с расширением `.pkg.tar.gz` или `.pkg.tar.xz`.
6. Установка, заключающаяся в выполнении команды `pacman -U <файл .pkg.tar.xz>`. Удаление пакета также осуществляется с помощью pacman.

### Установка инструментов

Чтобы использовать ABS, вы должны установить пакет abs.

Этот пакет включает в себя скрипты синхронизации abs, некоторые скрипты сборки и rsync (в качестве зависимости, если он у вас ещё не установлен).

Однако, перед тем как вы сможете что-то собрать, вам также понадобятся основные инструменты сборки. Они уже подготовлены для вас в группе пакетов base-devel. Эту группу можно установить с помощью pacman.

### /etc/abs.conf

Отредактируйте файл `/etc/abs.conf`, чтобы он включал в себя нужные вам репозитории.

Уберите `!` перед соответствующими репозиториями. Например:

    REPOS=(core extra community !testing)

### Дерево ABS

Дерево ABS — это иерархия каталогов, синхронизируемая с SVN, расположенная в `/var/abs` и выглядит оно примерно так:

    | -- core/
    |     || -- acl/
    |     ||     || -- PKGBUILD
    |     || -- attr/
    |     ||     || -- PKGBUILD
    |     || -- abs/
    |     ||     || -- PKGBUILD
    |     || -- autoconf/
    |     ||     || -- PKGBUILD
    |     || -- ...
    | -- extra/
    |     || -- acpid/
    |     ||     || -- PKGBUILD
    |     || -- apache/
    |     ||     || -- PKGBUILD
    |     || -- ...
    | -- community/
    |     || -- ...

Дерево ABS имеет в точности такую же структуру, как и база данных пакетов:

- Первый уровень вложенности: Название репозитория
- Второй уровень вложенности: Каталоги, названные именами пакетов
- Третий уровень вложенности: PKGBUILD (содержит информацию, необходимую для сборки пакета) и другие необходимые файлы (патчи и иные файлы, необходимые для сборки пакета)

Исходные код для пакетов не представлен в ABS каталоге. Вместо этого `PKGBUILD` содержит URL, с которого будет произведена загрузка исходных кодов когда пакет будет собираться. Поэтому размер дерева abs довольно мал.

#### Загрузка дерева ABS

Выполните:

    # abs

Теперь ваше дерево ABS находится в каталоге `/var/abs`. Обратите внимание, что ветви дерева ABS были созданы в соответствии с заданными вами репозиториями в `/etc/abs.conf`.

Команду abs нужно выполнять периодически, чтобы ваше дерево было синхронизировано с официальными репозиториями. Файлы конкретного ABS пакета можно также закачать командой:

    # abs <репозиторий>/<пакет>

В этом случае вам не нужно обновлять всё дерево только для того, чтобы собрать один пакет.

### /etc/makepkg.conf

Эта статья или раздел является кандидатом на объединение с makepkg (Русский).

Причина: пожалуйста, используйте второй аргумент шаблона для указания причины. (обсуждение: Talk:Arch Build System (Русский)#)

Файл `/etc/makepkg.conf` программы makepkg определяет глобальные переменные окружения и флаги компиляции, которые вы можете захотеть отредактировать если вы используете SMP систему или задать другие необходимые оптимизации. Настройки по умолчанию оптимизированы для i686 и x86_64, которые будут работать нормально для этих архитектур на однопроцессорных системах. (Умолчания будут работать на SMP компьютерах, но будут использовать только одно ядро/CPU при компиляции. Смотрите makepkg для дополнительной информации.)

#### Задание переменной PACKAGER в /etc/makepkg.conf

Настройка переменной `PACKAGER` в файле `/etc/makepkg.conf` является необязательным, но настоятельно рекомендуемым шагом. Это позволяет сделать "пометку", чтобы быстро определить, какие пакеты были собраны и/или установлены ВАМИ, а не официальным сопроводителем! Это можно легко сделать с помощью expac:

##### Отобразить все пакеты (включая пакеты из AUR)

    $ grep myname /etc/makepkg.conf

    PACKAGER="myname <myemail@myserver.com>"

    $ expac "%n %p" | grep "myname" | column -t

    archey3 myname
    binutils myname
    gcc myname
    gcc-libs myname
    glibc myname
    tar myname

##### Отобразить только пакеты из репозиториев

В этом примере отобразятся только те пакеты, которые находятся в репозиториях, заданных в `/etc/pacman.conf`:

    $ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)

    binutils
    gcc
    gcc-libs
    glibc
    tar

### Создание каталога для сборки

Рекомендуется создать каталог, в котором непосредственно будет производиться компиляция; вы никогда не должны изменять дерево ABS, производя сборку в его каталогах, поскольку данные будут потеряны (перезаписаны) при каждом обновлении ABS. Хорошей практикой является использование вашего домашнего каталога, хотя некоторые пользователи Arch предпочитают создавать каталог 'local' в `/var/abs/`, которым владеет обычный пользователь.

Создайте ваш каталог для сборки, например:

    $ mkdir -p $HOME/abs

Скопируйте ABS из дерева (`/var/abs/<репозиторий>/<имя_пакета>`) в ваш каталог сборки.

### Сборка пакета

В данном примере мы будем собирать пакет slim.

Скопируйте slim ABS из дерева ABS в каталог сборки:

    $ cp -r /var/abs/extra/slim/ ~/abs

Перейдите в каталог сборки:

    $ cd ~/abs/slim

Измените PKGBUILD под ваши нужды, затем выполните makepkg (с флагом `-s` для того, чтобы автоматически обрабатывать зависимости, необходимые на время сборки):

    $ makepkg -s

Примечание: Прежде чем жаловаться на недостающие зависимости (во время make), не забудьте проверить, что группа base-devel установлена, поскольку это подразумевается при сборке пакетов с помощью makepkg. Смотрите #Установка инструментов.

Установите с правами супер пользователя:

    # pacman -U slim-1.3.0-2-i686.pkg.tar.xz

Вот и всё. Вы только что собрали slim из исходных кодов и правильно установили его в вашу систему с помощью pacman. Удаление пакета также осуществляется с помощью pacman командой `pacman -R slim`.

Метод установки программ с использованием ABS предоставляет удобство, сохраняя при этом полную прозрачность и контроль над build и install функциями, включёнными в PKGBUILD.

#### fakeroot

По сути, такие же самые шаги предпринимаются при традиционном способе установки (обычно включающем шаги `./configure, make, make install`), но программа устанавливается в fake root окружение. (fake root — это просто подкаталог внутри каталога сборки, который функционирует и ведёт себя как корневой каталог системы. С помощью программы fakeroot, makepkg создаёт ненастоящий корневой каталог и устанавливает скомпилированные бинарники и необходимые файлы в него, в качестве владельца выставляя root.) Затем fake root, т.е. дерево подкаталогов, содержащее скомпилированную программу, сжимается в архив с расширением `.pkg.tar.xz`, т.е. в пакет. Затем, когда запускается pacman, он извлекает пакет (устанавливает его) в настоящий системный корневой каталог (`/`).

### Оставлять модифицированные пакеты

При обновлении системы, pacman затрёт изменённый вами пакет из ABS на пакет, который имеет такое же имя в официальных репозиториях. Следуйте инструкции ниже для того, чтобы этого избежать.

Впишите массив групп в PKGBUILD и добавьте пакет в группу под названием `modified`.

    PKGBUILD

    groups=('modified')

Добавьте эту группу в секцию `IgnoreGroup` в `/etc/pacman.conf`.

    /etc/pacman.conf

    IgnoreGroup = modified

Если в официальных репозиториях появится новая версия, то во время обновления системы pacman напечатает замечание, что он пропускает обновление этого пакета, поскольку он находится в секции IgnoreGroup. С этого момента изменённый пакет должен быть пересобран из ABS во избежание частичных обновлений.

## Другие инструменты

- pbget - получение PKGBUILDов для конкретных пакетов прямо из веб интерфейса. Также работает для AUR.
- asp - инструмент для управления сборкой из исходных кодов, использующийся для создания Arch Linux пакетов. Использует git интерфейс, что предоставляет более свежие исходные коды.

Categories:

- Русский
- About Arch (Русский)
- Package development (Русский)
- Package management (Русский)