---
category: ru
type: paper
hastr: false
layout: paper
tags: archlinux
title: Немного об Arch User Repository
short: about-aur
---
Статья посвященная работе с пользовательским репозиторием Archlinux. Постарался
сделать акцент на сопровождении пакетов. Данная статья, в большей степени,
представляет собой компиляцию нескольких англоязычных статей Wiki и немного
личного опыта. Поэтому не уверен, что в данной статье на английском языке будет
толк.
## AUR
Итак, [Arch User Repository](//aur.archlinux.org/ "AUR") (AUR или АУР) - это
репозиторий, поддерживаемый и развиваемый практически исключительно сообществом
Archlinux. Есть еще отдельные люди, называемые [доверенными
пользователями](//www.archlinux.org/trustedusers/ "Доверенные пользователи")
(TU), на плечах которых лежит своеобразная "модерация" этого репозитория. На мой
скромный взгляд, едва ли не единственное отличие Archlinux от других
дистрибутивов - это наличие AUR'а. Отличие этого репозитория от обычных прежде
всего в том, что он **не содержит** архивов с исходниками или собранных пакетов
- только скрипт сборки (PKGBUILD) и, возможно, дополнительные текстовые файлы.
Конечно, вручную скачивать архив с сайта AUR'а, а также проверять обновления, не
совсем удобно, поэтому существует [набор
хелперов](//wiki.archlinux.org/index.php/AUR_Helpers "ArchWiki"). Большинство
хелперов представляет собой обертку над pacman. Я выделю только два -
[packer](//aur.archlinux.org/packages/packer/ "AUR") - минималистичный, удобный,
быстрый - и [yaourt](//aur.archlinux.org/packages/yaourt/ "AUR") - на шелле, но
зато более функциональный. По не особо понятным мне причинам, в русскоязычном
сегменте большее распространение получил yaourt, зарубежом - packer.
Помимо хелперов, существуют также консольные клиенты для работы с AUR. Я выделю,
пожалуй, только один - [python-aur](//aur.archlinux.org/packages/python3-aur/
"AUR"). Иногда удобная альтернатива веб-интерфейсу.
Другая особенность данного репозитория - и не менее важная - **все действия с
ним осуществляются на свой страх и риск**. Опасные и некорректные пакеты,
конечно же, удаляются, но вполне могут быть и ошибки при сборке и еще все, что
сможете придумать. Дык вот - работа с ним на вашей совести, и никто вам ничем не
обязан, если что-то сломается. По этой же причине, ни один хелпер в обозримом
будущем не будет перенесен в официальные репозитории.
У пакетов в AUR есть несколько характеристик, которых нет у пакетов в
официальных репозиториях:
* группа - скорее для удобства поиска, сортировки. Немного помогает доверенным
пользователям.
* автор, мейнтейнер, последний приславший - люди, кто, соответственно, первый
раз прислал данный пакет, сопровождает его в настоящий момент, и последний
прислал.
* голоса - когда кому-либо понравился этот пакет или он находит его полезным, он
голосует. Теоретически, пакеты, имеющие больше 10 голосов могут попасть в
официальные репозитории (если найдется желающий среди доверенных пользователей).
Другой путь в официальные репозитории - попасть в [список часто
используемых](//www.archlinux.de/?page=PackageStatistics "Статистика"), но вы же
не пользуетесь [pkgstats](//www.archlinux.org/packages/pkgstats "Пакет
Archlinux").
## Установка с AUR
Для работы с AUR требуется установить группу пакетов
[base-devel](//www.archlinux.org/groups/x86_64/base-devel/ "Группа пакетов
Archlinux"). Пакеты с этой группы, как правило, **не включены** в зависимости.
Рекомендуемая установка пакетов с AUR выглядит примерно так:
```bash
# скачать архив с PKGBUILD'ом c AUR
curl -L -O //aur.archlinux.org/packages/fo/foo/foo.tar.gz
cd foo
# отредактировать / проверить PKGBUILD
vi PKGBUILD
# собрать пакет. Флаг -c удалить директорию сборки,
# -s установить недостающие зависимости,
# -r удалить их после установки,
# -f перезаписать существующий пакет, если он есть
makepkg -csrf
# установить его
pacman -U foo-0.1-1-i686.pkg.tar.xz
```
## Загрузка пакета в AUR
**Никаких** `makepkg -S`. С недавних пор данный метод считается устаревшим. Но
обо всем по-порядку
Нам нужно загрузить архив на сайт. В этом архиве **должны быть** PKGBUILD и
.AURINFO. По поводу первого я расскажу еще чуть ниже, второй генерируется
автоматически. Также, там могут быть установочные скрипты (\*.install), патчи,
файлы лицензии (если не предоставляются апстримом с исходниками), сервисы
systemd, скрипты запуска - это то, что обычно включено. **Никаких исходников**.
И тем более **никаких бинарников**. (Шутки-шутками, а я помню пакет, в котором
исходный код записывался с помощью `cat << EOF` прямо в тексте PKGBUILD'а.)
Все файлы кладем в одну директорию. Убедились, что install файл, если он есть,
указан в переменной install, все другие исходные файлы указаны в массиве source,
а хэш-суммы правильные (их легко можно сгенерировать, набрав `makepkg -g`).
Далее из этой директории запустить команду `mkaurball` (пакет
[pkgbuild-introspection](//www.archlinux.org/packages/pkgbuild-introspection
"Пакет Archlinux")) - и архив готов.
Несколько правил загрузки пакета в AUR:
* Если такой пакет существует в официальном репозитории (любой версии), то **не
нужно** заливать новый пакет. Если репозиторный пакет устарел, просто пометьте
его, как устаревший. Исключение из этого правила составляют пакеты из системы
контрля версий (VCS), о них чуть ниже.
* Проверьте AUR. Если такой пакет уже существует и у него есть мейнтейнер, вы
**не сможете залить** свой пакет. Если у него нет мейнтейнера, то вы
автоматически будете его сопровождающим после обновления. Еще может быть такой
же пакет, но с другим названием, будьте внимательны.
* PKGBUILD должен следовать (более-менее) стандартам и должен быть более-менее
аккуратным. В противном случае, пакет может быть удален без предупреждения.
* Пакет должен быть полезен еще кому-либо кроме Вас =)
* Рекомендуется проверить **собранный пакет и PKGBUILD** с помощью
[namcap](//www.archlinux.org/packages/namcap "Пакет Archlinux"). Это не даст
100% гарантии, но на основные ошибки укажет.
## Сопровождение пакетов
Если вы сопровождаете пакет и хотите его обновить, просто загрузите обновленный
пакет еще раз. Читайте - и, по возможности, отвечайте - комментарии к вашему
пакету, там иногда могут быть очень полезные замечания или дельные предложения.
Если вы не хотите сопровождать больше ваш пакет (или нет времени), то,
пожалуйста, нажмите на кнопку справа (бросить/disown), чтобы те, кто в нем
заинтересован, смогли поддерживать его. Если есть пакет, который не имеет
сопровождающего, и вы хотели бы им стать, вы также можете нажать на
соответствующую кнопку справа в веб-интерфейсе =)
## Список рассылки AUR
По любому вопросу, связанному с работой AUR вы всегда можете обратиться в
[список рассылки](//mailman.archlinux.org/mailman/listinfo/aur-general "Список
рассылки") [aur-general (at) archlinux (dot)
org](mailto:aur-general@archlinux.org "email"). На ваш вопрос ответят, вероятно,
достаточно быстро; причем, ответить могут не только обычные пользователи, но и
доверенные пользователи. Также, если вы вдруг неуверены в своем PKGBUILD'е, вы
тоже можете всегда обратиться в список рассылки и показать свой PKGBUILD.
Существует также отдельный список [рассылки для
запросов](//mailman.archlinux.org/mailman/listinfo/aur-requests "Список
рассылки") [aur-requests (at) archlinux (dot)
org](mailto:aur-requests@archlinux.org "email"). На текущий момент (AUR 3.2.0)
общение через данный список рассылки напрямую не рекомендуется - все обычные
запросы должны отсылаться с использованием веб-интерфейса
([подробности](//mailman.archlinux.org/pipermail/aur-general/2014-July/029045.html
"Тред")). Запросы, которые вы можете послать:
* **Удаление пакета**. Запрос должен включать **краткое описание причины**,
почему вы его хотите удалить. Обычные причины - специальный патч, который больше
не нужен; пакет уныл и более не поддерживается апстримом; переименование;
функциональность предоставляется другим пакетом.
* **"Бросить пакет"**. Лишить текущего мейнтейнера права сопровождать данный
пакет. Официальное требование - вы должны связаться до этого с мейнтейнером по
e-mail и **ожидать от него ответа в течение двух недель** (теперь это делается
автоматически при отправке запроса через веб-интерфейс). Однако, если мейнтейнер
неактивен в течение длительного времени, или пакет помечен, как устаревший, в
течение длительного времени, то можно сделать исключение из этого правила.
(Например, если пакет отмечен устаревшим более шести месяцев, то запрос
удовлетворяется автоматически.)
* **Объединение пакетов**. Если пакет подлежит удалению, но имеет голоса (или
важные комментарии), то его можно объединить с другим, который предоставляет то
же самое. Частный случай - это аналогично переименованию пакета из одного в
другой.
Пожалуйста, пишите письма в список рассылки аккуратно. И, желательно, вежливо (а
то потом будете генерировать что-то вроде
[такого](//linux.sytes.net/post/2014/05/aur-driven-by-idiots/ "Блог")) (мы все
знаем, что мы арче-школьники, не надо нас еще раз этим тыкать, мы обидимся).
Также старайтесь избегать избыточного цитирования. И - это практически
требование - предоставляйте ссылки на пакеты. Хороший вариант - составление
списка ссылок в конце письма, а в теле ссылаться на них таким образом `[1]`.
Если не уверены в корректности запроса - посмотрите [архив списка
рассылки](//mailman.archlinux.org/pipermail/aur-requests/ "Список рассылки").
## PKGBUILD
PKGBUILD - это, де-факто, сценарий шелла, указывающий как и почему (в смысле,
зачем) собираться пакету. Он имеет 4 части:
* **Объявление основных переменных**. Об этом я расскажу чуть ниже.
* **Подготовка исходников**. Этот пункт необязательный. Включает в себя
копирование (если вдруг нужно), применение патчей, sed и прочие мелочи. Функция
обозначается, как **prepare()**.
* **Сборка**. Также необязательный пункт. Здесь - и только здесь - должна
проводиться компиляция. Функция обозначается, как **build()**.
* **Установка**. Обязательный пункт. Здесь происходит копирование нужных файлов
в указанный корень (`$pkgdir`). Функция обозначается, как **package()** (для
совмещенных пакетов таких функций несколько и они называются примерно так:
**package_$pkgname()**).
### Переменные PKGBUILD
Основные переменные следующие:
* **pkgbase** - группа пакетов. Например, пакеты `python-pyqt4` и
`python2-pyqt4` имеют одну группу `pyqt4`.
* **pkgname** - имя (или массив имен для совмещенных пакетов) пакета;
обязательная переменная.
* **pkgver** - версия пакета, указанная в апстриме, **pkgrel** -
арче-специфичный релиз пакета.
* **pkgdesc** - краткое описание пакета.
* **arch** - массив архитектур. Как правило, `arch=('i686' 'x86_64')` для
бинарных пакетов (очень-очень редко бывают пакеты, которые предоставляются
только для одной архитектуры) и `arch=('any')` для пакетов, не содержащих
бинарные файлы.
* **url** - адрес апстрима.
* **license** - лицензия. Если лицензия отлична от обычных (распространенные
типы MIT, BSD и custom) - смотри пакет
[core/licenses](//www.archlinux.org/packages/core/any/licenses/ "Пакет
Archlinux") - то ее надо установить вместе с пакетом по пути
`/usr/share/licenses/$pkgname/LICENSE`).
* **depends** - массив зависимостей, **необходимых для работы** пакета.
**optdepends** - это **дополнительные зависимости**, которые не необходимы для
работы, но предоставляют дополнительную функциональность. **makedepends** - это
зависимости, которые не включены в **depends**, но **необходимы при сборке**
пакета. Лучший способ проверить, правильно ли указаны зависимости сборки
(зачастую, это самое важное) - попробуйте собрать пакет в чистом окружении (то
есть совсем совсем чистом). И да, зависимости из группы
[base-devel](//www.archlinux.org/groups/x86_64/base-devel/ "Группа пакетов
Archlinux") указывать не надо.
* Следующие три переменные необязательны. **provides** - список пакетов,
функциональность которых предоставляет данный пакет. **replaces** - список
пакетов, которые данный пакет замещает (обычно используется для решения проблем
с переименованием пакетов при обновлении). **conflicts** - список пакетов, с
которым конфликтует данный пакет (имеет такие же файлы). Пример различия
**provides** и **replaces** - [gvim](//www.archlinux.org/packages/gvim/ "Пакет
Archlinux") предоставляет [vim](//www.archlinux.org/packages/vim/ "Пакет
Archlinux"), а [wireshark-gtk](//www.archlinux.org/packages/wireshark-gtk/
"Пакет Archlinux") замещает wireshark.
* **install** - файл, содержащий сценарии, запускающиеся после
установки/удаления/обновления (смотрите файл `/usr/share/pacman/proto.install`).
* **source** - где брать исходники, файлы предоставляемые вместе с пакетом
указываются только по имени, к данному массиму также прилагается массив хэш сумм
(md5sums/sha1sums/sha256sums/sha384sums/sha512sums).
Все перечисленные выше переменные указываются в заголовке PKGBUILD. К ним также
можно обращаться внутри PKGBUILD'а. Дополнительно стоит упомянуть переменные
**startdir** - директория, откуда запускается makepkg, **srcdir** - директория с
исходниками (`$startdir/src` по умолчанию), **pkgdir** - директория с собранным
пакетом (`$startdir/pkg/$pkgname` по умолчанию). **Не используйте** переменную
**startdir** без крайней необходимости.
### Некоторые особенности PKGBUILD'ов
К PKGBUILD применимы все правила программирования на шелле. Например, "смешная
шутка":
```bash
pkgdir="/usr pkg"
rm -rf $pkgdir
```
кому-то может показаться не очень смешной, увы. Поэтому все пути (да и вообще
переменные - там где надо, конечно) лучше обрамлять в двойные кавычки
(исключение - условия в двойных квадратных скобках `[[ ... ]]`). Если вы вводите
какие-либо свои переменные, то настоятельно рекоммендуется добавить в начале
подчеркивание `_` во избежание перекрытия переменными makepkg.
В русскоязычном сегменте до сих пор зачастую встречаются строки типа `make ||
return 1`. Дык вот, `return 1` теперь уже давно как не нужен.
Еще можно работать с рядом других переменных, определенных makepkg. Их список
можно глянуть в `/etc/makepkg.conf`. Самые ходовые - флаги компиляции и `CARCH`.
Так, например, если вы собираете пакет, исходники к которому предоставляются в
бинарном виде (проприетарный драйвер, например), то кусок PKGBUILD может
выглядеть так:
```bash
if [ "${CARCH}" == "x86_64" ]; then
_filearch=amd64
md5sums=('1f58521c2ddb9195a26a0bb3713a52a6')
else
_filearch=i386
md5sums=('ef5a8809b6bff8c9bcf5a28e860a606b')
fi
source=(${pkgname}-${pkgver}.tar.gz:://istodo.ru/distribs/${pkgname}-linux-${pkgver}-${_filearch}.tar.gz)
```
**pkgbase** вообще удобная штука. Например, для создания пакетов одновременно
для двух версий Python PKGBUILD может выглядеть [примерно так]
(//projects.archlinux.org/svntogit/community.git/tree/trunk/PKGBUILD?h=packages/python-biopython
"Archlinux svn"). Или, в общем случае, [как-то так]
(//aur.archlinux.org/packages/ne/netctl-gui/PKGBUILD "AUR").
Вообще говоря, для стандартных случаев существуют прототипы PKGBUILD'ов. Их
можно найти в `/usr/share/pacman/`, хотя местами они могли немного устареть
(больше года как). Так, прототипы для пакетов из системы контроля версий
(git/svn/hg/bzr) однозначно устарели - сейчас используется другой, куда более
аккуратный, формат. Настоятельно рекомендую ознакомиться на эту тему [с данной
статьей](//wiki.archlinux.org/index.php/VCS_PKGBUILD_Guidelines "ArchWiki").
Например, для пакета **qmmp-qsmmp-git** кусок PKGBUILD'а выглядит так:
```bash
pkgname=qmmp-qsmmp-git
_gitname=qsmmp
pkgver=0.5.34.gcd1ca1a
# еще какие-то строки
makedepends=('git')
source=(${_gitname}::git+//gitorious.org/qsmmp/qsmmp.git#branch=qmmp-9999)
md5sums=('SKIP')
pkgver() {
cd "${_gitname}"
local ver=`git describe --long`
printf "%s" "${${ver//-/.}//qmmp./}"
}
```
А для пакета **kdeplasma-applets-stdin-svn** так:
```bash
pkgname=kdeplasma-applets-stdin-svn
pkgver=57
pkgrel=1
_pkgname=plasmoidstdin
_pkgver=0.2
# еще какие-то строки
makedepends=('automoc4' 'cmake' 'subversion')
source=(${_pkgname}::svn+//plasmoidstdin.svn.sourceforge.net/svnroot/${_pkgname}/${_pkgver}/trunk)
md5sums=('SKIP')
pkgver() {
cd "${srcdir}/${_pkgname}"
local ver=`svnversion`
printf "%s" "${ver//[[:alpha:]]}"
}
```
Также, я отмечу, что некоторые пакеты имеют свой устоявшийся формат, поэтому,
зачастую, полезно поискать что-то похожее в AUR и сделать свой PKGBUILD по
образу и подобию.
## Дополнительные ссылки
* [Зеркало (git)](//pkgbuild.com/git/aur-mirror.git/ "Зеркало")
* [ArchWiki про AUR](//wiki.archlinux.org/index.php/AUR "ArchWiki")
* [ArchWiki про PKGBUILD](//wiki.archlinux.org/index.php/PKGBUILD "ArchWiki")
* [ArchWiki про makepkg](//wiki.archlinux.org/index.php/Makepkg "ArchWiki")
* [ArchWiki немного про
стандарты](//wiki.archlinux.org/index.php/Arch_packaging_standards "ArchWiki")
(внизу есть весьма полезные ссылки на гайды для конкретных типов пакетов)