Arch Build System (Русский)
Система сборки Arch (Arch Build System, ABS) предназначена для сборки пакетов в Arch Linux. Она представляет собой набор инструметов, целью которого является преобразование исходного кода программы в устанавливаемый двоичный .pkg.tar.xz пакет. С помощью инструментов ABS можно собирать пакеты из официальных репозиториев, AUR, а также модифицированные пакеты, создаваемые пользователями под собственные нужды.
Обзор ABS
Система сборки Arch устроена таким образом, чтобы максимально упростить сборку пакетов, сведя данный процесс к выполнению нескольких команд в командной строке. К основным элементам ABS относятся:
- Репозиторий SVN
- Хранилище под управлением системы контроля версий SVN, в котором содержатся файлы PKGBUILD, необходимые для установки пакетов из официальных репозиториев Arch. Ни файлов с исходными кодами программ, ни самих пакетов в этом хранилище нет. Доступ к SVN можно получить только посредством специальной утилиты командной строки, но репозиторий SVN имеет также клонированную git-версию, для которой предусмотрен веб-интерфейс. Подробнее об устройстве репозитория SVN в разделе #Репозиторий SVN.
- PKGBUILD
- Текстовый файл, содержащий Bash-скрипт, в котором находится URL для скачивания файлов с исходным кодом, а также инструкции по их компиляции в двоичный код и упаковке.
- makepkg
- Утилита, которая читает PKGBUILD, автоматически скачивает файлы с исходным кодом, компилирует их и создает пакет с расширением
.pkg.tar.xz
, который позже можно будет установить посредством pacman.
Также некоторое отношение к системе сборки Arch имеют следующие инструменты:
- pacman
- Штатный пакетный менеджер Arch, который проверяет зависимости и производит установку/обновление пакетов, собранных посредством
makepkg
. Вызывается либо во время работы makepkg путем предварительной установки соответствующих опций (например,-s
или-i
), либо вручную.
- AUR
- Пользовательский репозиторий Arch (Arch User Repository, AUR) - отдельное от ABS хранилище файлов PKGBUILD для программ, не вошедших в официальные репозитории. В нём находятся тысячи предложенных пользователями файлов PKGBUILD, которые тоже можно использовать посредством
makepkg
для компиляции и упаковки программного обеспечения. Если вам нужен пакет, которого нет в официальных репозиториях, стоит поискать его в AUR.
Репозиторий SVN
Пять официальных репозиториев содержат пакеты поддерживаемых разработчиками Arch Linux программ. Файлы PKGBUILD для этих пакетов хранятся в репозитории SVN, который фактически состоит из двух репозиториев. В SVN-репозитории packages хранятся файлы PKGBUILD пакетов из официальных репозиториев core, extra и testing, а в SVN-репозитории community - файлы из community и multilib.
В SVN-репозитории для каждого пакета выделен отдельный каталог, в котором находятся подкаталоги repos
и trunk
. В repos
в свою очередь есть еще один каталог, имя которого состоит из названия официального репозитория пакета (например, core) и архитектуры. Файлы PKGBUILD, которые находятся в repos
, используются в качестве официальной сборки. Файлы в trunk
используются разработчиками до перемещения в repos
.
Например, дерево каталогов для acl выглядит следующим образом:
acl acl/repos acl/repos/core-x86_64 acl/repos/core-x86_64/PKGBUILD acl/trunk acl/trunk/PKGBUILD
Исходного кода пакета в SVN-репозитории нет. Вместо этого файл PKGBUILD содержит URL официального репозитория, из которого исходный код будет загружен во время сборки пакета.
Зачем использовать ABS?
Если возникает необходимость установить актуальный пакет программы из официального репозитория со всеми необходимыми зависимостями, то это производится посредством команды pacman -S имя-пакета
. Детали скачивания, комплиляции, сборки и установки при этом остаются за кадром. Однако иногда перед пользователем встает задача создания своего уникального пакета, который отсутствует в официальных репозиториях. Для этих целей используется ABS. Например:
- Компиляция или перекомпиляция пакета по какой-либо причине
- Сборка и установка новых пакетов из исходных кодов программ, для которых ещё нет пакетов (смотрите Создание пакетов)
- Изменение существующих пакетов под свои нужды (включение или отключение опций, внесение исправлений)
- Перестройка всей системы с использованием новых флагов компиляции "à la FreeBSD"
- Чистая сборка и установка собственного ядра (смотрите Компиляция ядра)
- Получение работающих модулей ядра для вашего собственного ядра
- Легкая компиляции и установка новой/старой/бета или девел версии Arch пакета, с помощью редактирования номера версии в PKGBUILD
ABS не является необходимой для использования в Arch Linux, но она удобна для автоматизации некоторых задач при компиляции из исходников.
Использование ABS
Перед началом создания пакета необходимо убедиться, что на локальном компьютере установлены пакеты из группы base-devel. Они потребуются для работы утилиты makepkg. Установить недостающие пакеты можно командой
# pacman -S base-devel --needed
Получение PKGBUILD
Для того, чтобы получить файл PKGBUILD пакета, находящегося в официальном репозитории, существует два способа: через SVN и посредством Git. Ниже описаны оба подхода.
Получение PKGBUILD посредством SVN
Предварительно установите пакет subversion.
Для синхронизации официальных репозиториев core, extra и testing:
$ svn checkout --depth=empty svn://svn.archlinux.org/packages
Для репозиториев community или multilib:
$ svn checkout --depth=empty svn://svn.archlinux.org/community
В обоих случаях результатом будет создание пустого каталога, но синхронизация при этом произойдет.
Перейдя в созданный каталог, packages или community, выполните:
$ svn update имя-пакета
Эта команда синхронизирует запрошенный пакет. С этого момента, каждый раз при выполнении svn update
будет происходить синхронизация этого пакета.
Если запрошенный пакет не существует, svn не выдаст предупреждение. В терминале появится только что-то вроде "At revision 358704" без создания каких-либо файлов. Если это произошло:
- проверьте правильность имени пакета
- проверьте не был ли пакет перемещен в другой репозиторий (например, из community в packages)
- проверьте https://www.archlinux.org/packages чтобы убедиться, что ваш пакет не собирается на основе другого пакета (например, python-tensorflow собирается по
PKGBUILD
пакета tensorflow)
Все синхронизированные пакеты можно периодически обновлять, если вы желаете пересобирать актуальные версии пакетов из репозиториев. Для этого выполните
$ svn update
Получение PKGBUILD посредством Git
Предварительно установите пакет asp.
Чтобы клонировать пакет из репозитория выполните
$ asp checkout имя-пакета
Пакет будет клонирован в каталог, имя которого совпадает с названием пакета. Для обновления клонированного git-репозитория необходимо выполнить asp update
и git pull
в каталоге репозитория.
Кроме того, другие команды git могут использоваться для синхронизации более старых версий пакета и отслеживания изменений. Информация об использовании git находится на соответствующей странице.
Если необходимо просто получить копию снимка (snapshot) текущего PKGBUILD для конкретного пакета, выполните
$ asp export имя-пакета
Сборка пакета
Для сборки пакет необходимо переместиться в каталог с PKGBUILD
и выполнить
$ makepkg
Могут оказаться полезными флаги --nodeps
(не проверять зависимости) и --skippgpcheck
(не проверять PGP-сигнатуры пакета).
Установка пакета
Установка пакета может производиться двумя способами.
Если сборка пакета еще не была произведена (см. #Сборка пакета), то нужно переместиться в каталог с PKGBUILD
и выполнить
$ makepkg -si
Эта команда произведет сборку пакета, а затем автоматически вызовет pacman чтобы произвести проверку и установку зависимостей (опция -s
) и установку самого пакета (опция -i
).
Если же сборка пакета уже произошла и завершилась успешно, то нужно найти в каталоге с PKGBUILD
файл .pkg.tar.xz
-архива, название которого состоит из имени пакета, версии и архитектуры, и выполнить:
# pacman -U название-пакета.pkg.tar.xz
Дальнейшие манипуляции с установленным пакетом (в том числе и его удаление) можно будет осуществлять посредством pacman.
Советы и рекомендации
Оставлять модифицированные пакеты
При обновлении системы pacman затрёт изменённый вами пакет из ABS на пакет, который имеет такое же имя в официальных репозиториях. Следуйте инструкции ниже для того, чтобы этого избежать.
Впишите массив групп в PKGBUILD и добавьте пакет в группу под названием modified
.
PKGBUILD
groups=('modified')
Добавьте эту группу в секцию IgnoreGroup
в /etc/pacman.conf
.
/etc/pacman.conf
IgnoreGroup = modified
Если в официальных репозиториях появится новая версия, то во время обновления системы pacman напечатает замечание, что он пропускает обновление этого пакета, поскольку он находится в секции IgnoreGroup
. С этого момента изменённый пакет должен быть пересобран из ABS во избежание частичных обновлений.
Синхронизация устаревшей версии пакета
Находясь в синхронизированном svn-репозитории (т.е. packages или community, как описано в #Получение PKGBUILD посредством SVN), сначала изучите лог:
$ svn log имя-пакета
Найдите ревизию, которая вам нужна, и укажите её номер в команде синхронизации. Например, чтобы синхронизировать ревизию r1729
выполните:
$ svn update -r1729 имя-пакета
Выбранный пакет обновится до нужной версии.
Вместо номера ревизии можно указать дату. Если на эту дату нет ревизии, то svn найдет ближайшую ревизию перед ней. Пример:
$ svn update -r'{20090303}' имя-пакета
Это дает возможность синхронизации пакетов к последним версиям до перемещения в другой репозиторий. Необходимо лишь найти в логах дату перемещения или же последний номер ревизии.