arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
209 lines (143 loc) • 19.5 kB
Markdown
## Contents
* [1 Стандарты для создания пакетов Arch](#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D1.8B_.D0.B4.D0.BB.D1.8F_.D1.81.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2_Arch)
* [1.1 Шаблон PKGBUILD](#.D0.A8.D0.B0.D0.B1.D0.BB.D0.BE.D0.BD_PKGBUILD)
* [1.2 Железные правила создания пакетов](#.D0.96.D0.B5.D0.BB.D0.B5.D0.B7.D0.BD.D1.8B.D0.B5_.D0.BF.D1.80.D0.B0.D0.B2.D0.B8.D0.BB.D0.B0_.D1.81.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2)
* [2 Названия пакетов](#.D0.9D.D0.B0.D0.B7.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2)
* [2.1 Каталоги](#.D0.9A.D0.B0.D1.82.D0.B0.D0.BB.D0.BE.D0.B3.D0.B8)
* [2.2 Обязанности makepkg](#.D0.9E.D0.B1.D1.8F.D0.B7.D0.B0.D0.BD.D0.BD.D0.BE.D1.81.D1.82.D0.B8_makepkg)
* [2.3 Лицензия](#.D0.9B.D0.B8.D1.86.D0.B5.D0.BD.D0.B7.D0.B8.D1.8F)
* [2.4 Загрузка пакетов](#.D0.97.D0.B0.D0.B3.D1.80.D1.83.D0.B7.D0.BA.D0.B0_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2)
* [3 Дополнительные руководства](#.D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.80.D1.83.D0.BA.D0.BE.D0.B2.D0.BE.D0.B4.D1.81.D1.82.D0.B2.D0.B0)
## Стандарты для создания пакетов Arch
Когда создаете пакет для Arch Linux, вы **должны придерживаться стандарта по созданию пакетов Arch**, который приведен ниже. Особенно если вы хотите **добавить** ваш пакет в Arch Linux.
### Шаблон PKGBUILD
```
# Contributor: Ваше Имя <email собака domain точка com>
pkgname=NAME
pkgver=VERSION
pkgrel=1
pkgdesc=""
arch=('i686' 'x86_64')
url="http://ADDRESS/"
license=('GPL')
groups=()
depends=()
makedepends=()
optdepends=()
provides=()
conflicts=()
replaces=()
backup=()
options=()
install=
source=($pkgname-$pkgver.tar.gz)
noextract=()
md5sums=() #generate with 'makepkg -g'
build() {
cd $srcdir/$pkgname-$pkgver
./configure --prefix=/usr
make || return 1
make DESTDIR=$pkgdir install || return 1
}
```
### Железные правила создания пакетов
* Пакет никогда не должен инсталироваться в /usr/local
* **Не добавляйте своих переменных** в ваши сборочные скрипты, возможны **конфликты** с переменными, используемыми в makepkg. Если невозможно этого не делать, **используйте подчёркивание как префикс** (`_`). Пример: `_customvariable=`
AUR не может определить использование ваших переменных и поэтому не может их использовать в заменах. Это часто можно наблюдать в ссылках на исходные тексты. Пример:
`http://downloads.sourceforge.net/sourceforge/directxwine/$patchname.$patchver.diff.bz2`
Этот недостаток сильно снижает функциональность AUR.
* **Избегайте** использования `/usr/libexec/`. Используйте вместо этого `/usr/lib/${pkgname}/`
* Поле `packager` из метафайла может быть **изменено** сборщиком с помощью соответствующей опции в файле `/etc/makepkg.conf`. Другой вариант - экспортировать переменную `PACKAGER` перед сборкой пакета с помощью `makepkg`:
`# export PACKAGER="John Doe@your.email"`
* Все важные сообщения должны печататься в течении инсталяции. Для этого используется **файл .install**. Например, если пакету нужна дополнительная настройка, инструкции должны быть в этом файле.
* Любые **опциональные зависимости**, которые не нужны для использования основной функциональности пакета не должны включаться в массив depends, но должны быть в массиве optdepends. В этом случае они будут напечатаны при инсталяции. Например:
```
optdepends=('cups: printing support'
'sane: scanners support'
'libgphoto2: digital cameras support'
'alsa-lib: sound support'
'giflib: GIF images support'
'libjpeg: JPEG images support'
'libpng: PNG images support')
```
* Не пишите **в описании пакета** имя самого пакета. Например, вместо "Nedit - это текстовый редактор для X11" лучше написать "Текстовый редактор для X11". Также постарайтесь, чтобы описание не было длинее ~80 символов.
* Постарайтесь, чтобы **длина строки** в PKGBUILD не превышала ~100 символов.
* **Не делайте пустых строк** в `PKGBUILD`
* Общая практика - **сохранять порядок следования полей** в `PKGBUILD`, как показано выше. Однако, это не требование, только рекомендация в контексте **корректного синтаксиса bash**.
* Не используйте в PKGBUILD символов национальных алфавитов. **Только ASCII** (Латинские буквы, цифры и знаки препинания)
## Названия пакетов
* Имя пакета должно состоять **только из латинских букв и цифр**; все буквы должны быть **в нижнем регистре**.
* Версия пакета **должна совпадать с версией автора**. Версии могут включать латинские буквы если это необходимо (например версия пакета nmap = 2.54BETA32). **Версия не должна содержать знак переноса!** Только латинские буквы, цифры и точку.
* Релиз пакета **специфичен для пакетов Arch**. Он позволяет пользователю отличать старую сборку пакета от более новой, даже если версия пакета одна и таже. Когда обновляется версия пакета, **релиз пакета нужно сделать равным 1**. Затем по мере улучшения/исправления пакета, очередная сборка пакета **выкладывается со значением релиза, увеличенным на единицу**. Когда выходит новая версия, счетчик релизов сбрасывается в единицу. Релиз пакета должен соответствовать **тем же правилам, что и версия пакета**.
### Каталоги
* **Файлы конфигурации** должны размещаться в каталоге `/etc`. Если таких файлов более одного можно **использовать подкаталог** чтобы не забивать `/etc`. Используйте имя `/etc/{pkgname}/` для подкаталога, где `{pkgname}` это имя вашего пакета (или разумная альтернатива, т.е. пакет apache использует `/etc/httpd/`).
* Файлы пакета должны соответствовать требованиям, приведенным ниже.
**Общие правила для каталогов**:
| `/etc` | **Общесистемные** файлы настроек |
| `/usr/bin` | Исполняемые файлы |
| `/usr/sbin` | Исполняемые файлы для пользователя root |
| `/usr/lib` | Библиотеки |
| `/usr/include` | Заголовочные файлы для програм на C |
| `/usr/lib/{pkg}` | Модули, плагины, расширения и т.д. |
| `/usr/share/man` | man-страницы |
| `/usr/share/{pkg}` | Архитектурнонезависимые данные приложения |
| `/etc/{pkg}` | Файлы настроек пакета `{pkg}` |
| `/opt` | Огромные приложения "замкнутые в себе", такие как KDE, Mozilla, Gnome и т.д. |
* Пакет не должен содержать нижепреведенных директорий:
* /dev
* /home
* /media
* /mnt
* /proc
* /root
* /selinux
* /sys
* /tmp
* /var/tmp
### Обязанности makepkg
Когда вы запускаете команду makepkg для сборки пакета, она делает следующие вещи автоматически:
1. Проверяет установлены ли **зависимости**
2. **Скачивает** исходные файлы из Интернета
3. **Распаковывает** те архивы, которые может (tar.gz, tar.bz2, zip...)
4. Вносит необходимые **исправления**
5. **Собирает** программу и устанавливает ее в fake root
6. **Удаляет** `/usr/doc`, `/usr/info`, `/usr/share/doc`, и `/usr/share/info` из пакета
7. *Удаляет'* все символы из исполняемых файлов
8. *Удаляет'* отладочные символы из библиотек
9. Создает **метафайлы** пакета, которые впоследствии будут в него включены
10. **Упаковывает** содержимое fake root в пакет
11. **Сохраняет** пакет в указанном каталоге (по умолчанию в текущем каталоге)
### Лицензия
Пакет с лицензиями есть в репозитории current. Вы можете его использовать следующим образом:
* Пакет current/licenses содержит некоторое количество частоиспользуемых лицензий в директории /usr/share/licenses/common. Например, /usr/share/licenses/common/GPL. Если ваш пакет имеет одну из этих лицензий, переменная licenses должна быть установлена в PKGBUILD, например, license=("GPL")
* Если подходящей лицензии нет, можно сделать несколько вещей:
1. Добавить в пакет директорию /usr/share/licenses/$pkgname/ с лицензией. Например /usr/share/licenses/dibfoo/COPYING.
2. Если исходные тексты не содержат лицензии, скопируйте ее в сайта автора.
3. Присвойте значение 'custom' переменной license. Также можно вместо 'custom' написать 'custom:"имя-лицензии"'.
* Если лицензия используется более чем одним пакетом из официальных репозитариев и [community], она добавляется в папку common.
* Лицензии MIT, BSD и Python - отдельный случай. Они не могут быть включены в пакет с общими лицензиями. Для переменной license - это выглядит как общие лицензии (license=("BSD"), license=("MIT") или license=("Python")), но со стороны файловой системы это custom лицензия, потому что каждый пакет имеет свою собственную строку с копирайтом. Каждый пакет с лицензиями MIT, BSD или Python должен содержать свою копию лицензии в /usr/share/licenses/$pkgname/.
* Некоторые пакеты не могут использовать одну лицензию. В таких случаях переменная license содержит массив, т.е. license=("GPL" "custom:some commercial license"). Для большинства пакетов эти лицензии применяются в разных случаях использования пакета. Когда pacman получит возможность фильтровать пакеты по лицензии (т.е. вы сможете сказать "Я хочу использовать только программы, лицензированные под GPL или BSD") две и более лицензии скорее всего будут обрабатываться используя операцию ИЛИ, а не операцию И, т.е. pacman будет рассматривать приведенный пример как ПО под GPL, а не под какой-то другой лицензией.
### Загрузка пакетов
Перед загрузкой пакетов убедитесь, что:
* Присутствует корректное поле `md5sum`, которое может быть сгенерировано при помощи `makepkg -g`.
* Добавлен коментарий в первой строке `PKGBUILD` в таком формате:
`# Contributor: Ваше Имя <ваш.e-mail>`
* Все **зависимости** поставлены корректно (например, запустите `ldd` на выполняемых файлах чтобы узнать от чего они зависят...).
Команда доверенных пользователей настоятельно рекомендует использовать программу `namcap`, написанную [Jason Chu](https://www.archlinux.org/fellows/#jason), для проверки ваших пакетов. `namcap` расскажет вам о неверных правах доступа, зависимостях и других общих ошибках. Вы можете установить `namcap` с помощью `pacman`.
Помните, что `namcap` может проверять не только собраные пакеты pkg.tar.gz, но и PKGBUILD'ы.
* **Зависимости** - наиболее общая ошибка. Namcap может помочь в исправлении, но не всегда корректно. Проверьте зависимости еще раз, глядя в исходные тексты, документацию и на сайт автора.
* **Не используйте <tt>replaces</tt>** в вашем PKGBUILD если только вы не хотите переименовать пакет. Например *Ethereal* переименовался в *Wireshark*. Если вы просто сделали альтернативную версию уже существующего пакета, используйте <tt>conflicts</tt> (и <tt>provides</tt> если этот пакет используется в зависимостях других пакетов). Главное отличие в том, что после синхронизации (-Sy) pacman заменить установленные пакеты, 'предлагая' пакеты с подходящими полями <tt>replaces</tt> во всех репозиториях; <tt>conflicts</tt> напротив, обрабатывается только непосредственно при установке пакета.
* Все файлы загружаемые в AUR должны быть упакованы в **tar.gz**, который содержит каталог в **`PKGBUILD`** и **дополнительные файлы для сборки** (патчи, .install-файл, ...).
```
foo/PKGBUILD
foo/foo.install
foo/foo_bar.diff
foo/foo.rc.conf
```
Имя архива должно совпадать с именем пакета т.е. foo.tar.gz
Архив **не должен** содержать ни бинарный пакет, созданный makepkg, ни список файлов (filelist)
## Дополнительные руководства
Убедитесь, что прочитали это руководство. Важные моменты упомянутые здесь не будут повторены на нижеследующих страницах. Эти специальные стандарты разработаны как дополнение к этому документу.
**[Указания по созданию пакетов](/index.php/Creating_packages_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Creating packages (Русский)")**
* * *
[CLR](/index.php/CLR_package_guidelines "CLR package guidelines") – [Cross](/index.php/Cross-compiling_tools_package_guidelines "Cross-compiling tools package guidelines") – [Eclipse](/index.php/Eclipse_plugin_package_guidelines "Eclipse plugin package guidelines") – [Free Pascal](/index.php/Free_Pascal_package_guidelines "Free Pascal package guidelines") – [GNOME](/index.php/GNOME_package_guidelines "GNOME package guidelines") – [Go](/index.php/Go_package_guidelines "Go package guidelines") – [Haskell](/index.php/Haskell_package_guidelines "Haskell package guidelines") – [Java](/index.php/Java_package_guidelines "Java package guidelines") – [KDE](/index.php/KDE_package_guidelines "KDE package guidelines") – [Kernel](/index.php/Kernel_module_package_guidelines "Kernel module package guidelines") – [Lisp](/index.php/Lisp_package_guidelines "Lisp package guidelines") – [MinGW](/index.php/MinGW_package_guidelines "MinGW package guidelines") – [Nonfree](/index.php/Nonfree_applications_package_guidelines "Nonfree applications package guidelines") – [OCaml](/index.php/OCaml_package_guidelines "OCaml package guidelines") – [Perl](/index.php/Perl_package_guidelines "Perl package guidelines") – [PHP](/index.php/PHP_package_guidelines "PHP package guidelines") – [Python](/index.php/Python_package_guidelines "Python package guidelines") – [Ruby](/index.php/Ruby_Gem_package_guidelines "Ruby Gem package guidelines") – [VCS](/index.php/VCS_package_guidelines "VCS package guidelines") – [Web](/index.php/Web_application_package_guidelines "Web application package guidelines") – [Wine](/index.php/Wine_package_guidelines_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Wine package guidelines (Русский)")