Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Arch build system. Дата последней синхронизации: 21 мая 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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

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

Система сборки Arch (Arch build system, ABS) — схожая с портами система сборки программных пакетов из исходного кода. В отличие от pacman, который является инструментом управления двоичными пакетами, система сборки Arch — набор утилит для компилирования исходников в устанавливаемые .pkg.tar.zst пакеты.

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

Концепция системы сборки Arch во многом похожа. Она включает в себя коллекцию git-репозиториев для каждого пакета, доступного в Arch Linux. Каждый репозиторий содержит файл PKGBUILD (и иногда некоторые другие файлы), но в них нет ни исходников, ни двоичных файлов программ. При выполнении команды makepkg внутри каталога исходники программы загружаются и компилируются в двоичные файлы, которые затем упаковываются в пакет. После этого можно воспользоваться pacman, чтобы установить данный пакет в систему.

## Инструменты

Система сборки Arch опирается на несколько компонентов и инструментов, которые используются в процессе создания пакетов:

Репозиторий
  Набор каталогов, в которых хранятся необходимые для сборки всех официальных пакетов файлы — но не сами пакеты и не файлы с исходным кодом программ. Он доступен в виде git-репозиториев на Gitlab. Подробнее в разделе #Структура репозитория.

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

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

pacman
  pacman является полностью отдельным проектом, но он вызывается (утилитой makepkg или вручную) каждый раз при установке или удалении собранных пакетов, а также для установки зависимостей.

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

Важно: Официальные файлы PKGBUILD разрабатываются исходя из предположения, что пакеты будут собираться в чистом chroot-окружении. Грязная cборка может привести к непредсказуемому поведению программы во время исполнения. Это связано с тем, что при сборке зависимости определяются динамически, и итоговый список зависит от того, какие пакеты были доступны на машине в момент сборки.

### Структура репозитория

Файлы PKGBUILD для пакетов из официальных репозиториев core, extra, core-testing и extra-testing хранятся на Arch Linux Gitlab.

Каждый пакет находится в отдельном git-репозитории в пространстве имён `archlinux/packaging/packages`. В каждом репозитории есть файл PKGBUILD и файлы, используемые в официальных сборках. Также там можно найти некоторые файлы, которые используются разработчиками для процесса сборки.

Например, дерево каталогов для acl выглядит следующим образом:

    acl
    ├── keys
    │   └── pgp
    │       ├── 259B3792B3D6D319212CC4DCD5BF9FEB0313653A.asc
    │       ├── 600CD204FBCEA418BD2CA74F154343260542DF34.asc
    │       └── B902B5271325F892AC251AD441633B9FE837F581.asc
    └── PKGBUILD

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

## Способы применения

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

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

## Использование

### Получение PKGBUILD

Для получения файла PKGBUILD можно использовать инструмент `pkgctl` или напрямую Git.

#### С помощью pkgctl

Установите пакет devtools, который предоставляет команду `pkgctl` — инструмент для работы с исходными файлами пакетов Arch Linux с использованием Git.

Чтобы склонировать git-репозиторий с актуальными исходными файлами пакета с помощью `pkgctl`, выполните:

    $ pkgctl repo clone название-пакета

Фраза «исходные файлы пакета» означает файл PKGBUILD и, возможно, некоторые другие необходимые для сборки файлы, такие как ключи. То есть это основные файлы, которые требуются для системы сборки Arch. Исходники оригинальной программы, например файлы C или Python, сюда не относятся.

Можно получить не только актуальные исходные файлы пакета, но и их предыдущие версии. Кроме того, вы можете использовать любые команды git для получения более старой версии пакета или для отслеживания пользовательских изменений.

Для получения определённой версии пакета можно использовать примерно такую команду:

    $ pkgctl repo clone --switch="2:1.19.5-1" go

Смотрите pkgctl-repo-clone(1) для более подробной информации.

#### С помощью git напрямую

Используйте такую команду:

    $ git clone https://gitlab.archlinux.org/archlinux/packaging/packages/название-пакета.git

Например, для получения исходных файлов пакета apache:

    $ git clone https://gitlab.archlinux.org/archlinux/packaging/packages/apache.git

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

Перед сборкой пакета из файла PKGBUILD настройте makepkg в соответствии с указаниями из раздела makepkg#Настройка.

Скопируйте каталог с файлом PKGBUILD в другое место, отредактируйте его, если необходимо, после чего соберите пакет и установите его в систему, как описано в разделе makepkg#Использование.

## Советы и рекомендации

### Сохранение изменённых пакетов

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

Добавьте параметр `groups` в PKGBUILD пакета и укажите в нём группу `modified`.

    PKGBUILD

    groups=('modified')

Добавьте эту группу в раздел `IgnoreGroup` файла `/etc/pacman.conf`.

    /etc/pacman.conf

    IgnoreGroup = modified

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

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

- pbget — получение файлов PKGBUILD для конкретных пакетов прямо из веб-интерфейса. Также работает для AUR.

Categories:

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