Creating packages (Українська)
Ця стаття має на меті допомогти користувачам створити власні пакети, використовуючи "портоподібну" Arch Linux систему збірки, також для надсилання в AUR. Він охоплює створення PKGBUILD (Українська) - файлу опису збірки пакета, породженого makepkg
для створення бінарного пакету з початкового коду. Якщо у вас вже є PKGBUILD
, див. makepkg (Українська). Інструкції щодо існуючих правил та способів поліпшення якості пакування див. Вказівки щодо Arch пакетів.
Огляд
Пакети в Arch Linux складаються за допомогою утиліти makepkg та інформації, що зберігається у файлі PKGBUILD. Коли makepkg
запускається, він шукає PKGBUILD
у поточному каталозі та виконує вказівки в ньому для отримання необхідних файлів та/або компілювання їх для упаковки у файл пакету (pkgname.pkg.tar.xz
). Отриманий пакет містить бінарні файли та інструкції з установки, готові до встановлення pacman-ом.
Пакет Arch - це не більше ніж архів tar, або 'tarball', стиснений за допомогою xz(1), який містить такі файли, що згенеровані makepkg:
- Бінарні файли для встановлення.
-
.PKGINFO
: містить усі метадані, необхідні pacman для роботи з пакетами, залежностями тощо. -
.BUILDINFO
: містить інформацію, необхідну для відтворюваних збірок. Цей файл присутній лише в тому випадку, якщо пакет створений з pacman 5.1 або новішою версією. -
.MTREE
: містить хеші та часові позначки файлів, які входять у локальну базу даних, щоб pacman міг перевірити цілісність пакету. -
.INSTALL
: необов'язковий файл, який використовується для виконання команд після етапу встановлення/оновлення/видалення. (Цей файл присутній лише в тому випадку, якщо вказано вPKGBUILD
.) -
.Changelog
: необов'язковий файл, що зберігається утримувачем пакета, що документує зміни пакету. (Він присутній не у всіх пакунках.)
Підготовка
Необхідне програмне забезпечення
По-перше, переконайтеся, що необхідні інструменти є встановити ed: група пакетів base-devel має бути достатньою, вона включає make
та додаткові інструменти, необхідні для компіляції з джерела.
Ключовим інструментом для створення пакетів є makepkg (надається pacman), який виконує наступні дії:
- Перевіряє, чи встановлено залежність пакета.
- Завантажує вихідні файли (файли) з вказаного сервера.
- Розпаковує вихідний файл (и).
- Складає програмне забезпечення та встановлює його під фальшивим середовищем.
- Смуги символів із бінарних файлів та бібліотек.
- Генерує мета-файл пакунка, який входить до кожного пакету.
- Стискає середовище підроблених файлів у файл пакету.
- Зберігає файл пакунків у налаштованому каталозі призначення, який за замовчуванням є поточним робочим каталогом.
Завантажте та протестуйте інсталяцію
Завантажте вихідний тарбол програмного забезпечення, яке ви хочете упакувати, витягніть його та виконайте кроки автора для встановлення програми. Запишіть усі команди та / або кроки, необхідні для його складання та встановлення. Ви будете повторювати ті самі команди у файлі PKGBUILD
.
Більшість авторів програмного забезпечення дотримуються тришагового циклу збірки:
./configure make make install
Це хороший час, щоб переконатися, що програма працює правильно.
Створення PKGBUILD
Коли makepkg
запускається, він шукає файл PKGBUILD
у поточному робочому каталозі. Якщо він знайде його, він завантажує вихідний код програмного забезпечення та компілює його відповідно до інструкцій, визначених у файлі PKGBUILD
. Інструкції повинні бути повністю інтерпретовані оболонкою Bash. Після успішного завершення отримані бінарні файли та метадані пакета, тобто версія пакета та залежності, упаковуються у файл pkgname.pkg.tar.xz
. Новостворений пакет можна встановити, просто скориставшись makepkg --install
, який викличе pacman у фоновому режимі, або безпосередньо за допомогою pacman -U pkgname.pkg.tar.xz
.
Щоб розпочати створення нового пакета, спершу створіть нову директорію для цього пакета та змініть поточний каталог у цей. Тоді потрібно створити файл PKGBUILD
: прототип PKGBUILD, знайдений у / usr / share / pacman /
, може бути використаний, або ви можете почати з PKGBUILD
з іншого пакету. Останнє може бути хорошим вибором, якщо подібний пакет вже існує.
Визначення змінних PKGBUILD
Приклад PKGBUILD розташований у / usr / share / pacman /
. Пояснення можливих змінних PKGBUILD
можна знайти в статті PKGBUILD.
makepkg визначає дві змінні, які слід використовувати у складі процесу збирання та встановлення:
srcdir
- Це вказує на каталог, де makepkg витягує або символізує всі файли у вихідному масиві.
pkgdir
- Це вказує на каталог, де makepkg поєднує встановлений пакет, який стає кореневою каталогом вашого вбудованого пакета.
Вони містять "абсолютні" шляхи, це означає, що вам не доведеться турбуватися про свою робочу директорію, якщо ви правильно використовуєте ці змінні.
build ()
та package ()
призначені для неінтерактивних. Інтерактивні утиліти або сценарії, викликані в цих функціях, можуть порушити makepkg , особливо якщо на нього ввімкнено активований журнал збирання ( --log
). (Див. 13214 FS# 13214.)PKGBUILD функції
Створюючи пакет, makepkg
буде викликати наступні п'ять функцій, якщо вони були визначені в PKGBUILD. Функція package ()
необхідна в кожному PKGBUILD і завжди буде викликана. Якщо будь-яка з інших функцій не визначена, makepkg
просто пропустить виклик цієї функції.
Під час збирання функції викликаються в тому порядку, в якому вони перераховані тут.
prepare ()
За допомогою цієї функції запускаються команди, які використовуються для підготовки джерел для побудови, наприклад патч. Ця функція запускається відразу після вилучення пакета, перед pkgver () та функцією збирання. Якщо видобуток пропущено ( makepkg - noextract
), то prep ()
не запускається.
bash -e
, тобто будь-яка команда, яка виходить із ненульовим статусом, призведе до виходу функції. pkgver ()
pkgver ()
працює після отримання джерел, вилучення та виконання #prepare (). Таким чином, ви можете оновити змінну pkgver під час етапу makepkg.
Це особливо корисно, якщо ви виготовлення git / svn / hg / тощо). пакети, де процес збирання може залишатися колишнім, але джерело може оновлюватися щодня, навіть щогодини. Старий спосіб цього полягав у тому, щоб ввести дату в поле pkgver, яке, якщо програмне забезпечення не буде оновлено, makepkg все одно відновить його, думаючи, що версія змінилася. Деякі корисні команди для цього є git description
, hg Identi -ni
тощо. Будь ласка, протестуйте їх перед тим, як подати PKGBUILD, як збій у pkgver ()
Функція може зупинити збірку на своїх треках.
-
). Використання sed для виправлення цього є загальним явищем.build ()
Тепер вам потрібно реалізувати функцію build()
у файлі PKGBUILD
. Ця функція використовує загальні команди оболонки в синтаксисі Bash для автоматичного компілювання програмного забезпечення та створення каталогу під назвою pkg
для встановлення програмного забезпечення. Це дозволяє makepkg пакувати файли без просіювання вашої файлової системи.
Перший крок у функції build()
- це перейти в каталог, створений розтисканням вихідної тарілки. makepkg змінить поточний каталог на $srcdir
перед виконанням функції build()
. Тому в більшості випадків, як запропоновано в /usr/share/pacman/PKGBUILD.proto
, перша команда буде виглядати так:
cd "$pkgname-$pkgver"
Тепер вам потрібно перерахувати ті самі команди, які використовувались при ручному компілюванні програмного забезпечення. Функція build ()
по суті автоматизує все, що ви зробили вручну, і компілює програмне забезпечення у середовищі підробленої збірки. Якщо програмне забезпечення, яке ви упаковуєте, використовує сценарій налаштування, то для створення пакетів для Pacman добре використовувати практику - префікс = / usr
. Багато програмного забезпечення встановлює файли відносно каталогу / usr / local
, що слід робити лише в тому випадку, якщо ви створюєте вручну з джерела. Усі пакети Arch Linux повинні використовувати каталог / usr
. Як видно з файлу /usr/share/pacman/PKGBUILD.proto
, наступні два рядки часто виглядають так:
./configure --prefix=/usr make
build()
. Функція build()
не потрібна, але функція package()
є.check()
Місце для дзвінків до зробити перевірку
та подібних процедур тестування. Настійно рекомендується мати check ()
, оскільки це допомагає переконатися, що програмне забезпечення було побудовано правильно та справно працює зі своїми залежностями.
Користувачі, які цього не потребують (а іноді і ті, хто не може виправити пакет для передачі цього пакета), можуть відключити його за допомогою BUILDENV+=('!check')
в PKGBUILD/makepkg.conf або зателефонувати makepkg
із прапором --nocheck
.
package()
Останній крок - помістити скомпільовані файли в каталог, де makepkg може отримати їх для створення пакету. Це за замовчуванням каталог pkg
- просте середовище підробки. Каталог pkg
копіює ієрархію кореневої файлової системи шляхів інсталяції програмного забезпечення. Якщо вам потрібно вручну розмістити файли під коренем вашої файлової системи, слід встановити їх у каталог pkg
під тією ж структурою каталогу. Наприклад, якщо ви хочете встановити файл у /usr/bin
, його замість цього слід розмістити під $pkgdir/usr/bin
. Дуже мало процедур встановлення вимагає від користувача копіювання десятків файлів вручну. Натомість для більшості програмного забезпечення виклик make install
зробить це. Фінальний рядок повинен виглядати наступним чином, щоб правильно встановити програмне забезпечення у каталозі pkg
:
make DESTDIR="$pkgdir/" install
DESTDIR
is not used in the Makefile
; you may need to use prefix
instead. If the package is built with autoconf / automake, use DESTDIR
; this is what is documented in the manuals. If DESTDIR
does not work, try building with make prefix="$pkgdir/usr/" install
. If that does not work, you will have to look further into the install commands that are executed by "make <...> install
".makepkg --repackage
runs only the package()
function, so it creates a package without building. This may save time e.g. if you have changed just the depends
variable of the package.
Тестування PKGBUILD і пакета
Коли ви пишете функцію build ()
, ви хочете часто перевіряти свої зміни, щоб уникнути помилок. Це можна зробити за допомогою команди makepkg
в каталозі, що містить файл PKGBUILD
. При правильному форматі PKGBUILD
makepkg створить пакет; зі зламаною або незавершеною PKGBUILD
, це призведе до помилки.
Якщо makepkg завершиться успішно, він розмістить файл з ім'ям pkgname-pkgver.pkg.tar.xz
у вашому робочому каталозі. Цей пакет можна встановити за допомогою команди pacman -U
. Однак, лише тому, що створений файл пакету, не випливає, що він є повністю функціональним. Можливо, він може містити лише каталог і жодних файлів, якщо, наприклад, префікс був вказаний неправильно. Ви можете використовувати функції запиту pacman для відображення списку файлів, що містяться в пакеті, і залежностей, які він вимагає, для pacman -Qlp [file file]
та pacman -Qip [file file]
відповідно .
Якщо пакет виглядає здоровим, то ви готові! Однак, якщо ви плануєте випустити файл PKGBUILD
, обов'язково потрібно перевірити та повторно перевірити вміст масиву зависи
.
Також переконайтесь, що двійкові файли пакетів справді працюють бездоганно! Дратівливо випускати пакет, який містить усі необхідні файли, але виходить з ладу через деякий незрозумілий варіант конфігурації, який не дуже добре працює з рештою системи. Якщо ви збираєтеся лише збирати пакети для вашої власної системи, вам не потрібно надто турбуватися про цей крок забезпечення якості, адже ви єдина людина, яка страждає від помилок.
Перевірка розумності пакета
Після тестування функціональності пакета перевірте його на наявність помилок за допомогою namcap:
$ namcap PKGBUILD $ namcap <package file name>.pkg.tar.xz
Namcap буде робити наступне:
- Перевірте вміст PKGBUILD на наявність поширених помилок та ієрархію файлів пакунків на наявність зайвих / неправильних файлів
- Сканувати всі файли ELF в пакеті за допомогою
ldd
, автоматично повідомляючи про те, які пакети з необхідними спільними бібліотеками відсутні відзалежить
, а які можна пропустити як перехідні залежності - Евристично шукати відсутні і залежні залежності
та багато іншого.
Увійдіть у звичку перевіряти ваші пакунки за допомогою namcap, щоб уникнути необхідності виправляти найпростіші помилки після подання пакету.
Подання пакетів AUR
Будь ласка, прочитайте Архівний користувальницький архів # Пакети подання для детального опису процесу подання.
Підсумок
- Завантажте вихідний тарбол програмного забезпечення в пакет.
- Спробуйте скласти пакунок та встановити його у довільну каталог.
- Скопіюйте прототип
/usr/share/pacman/PKGBUILD.proto
та перейменуйте його наPKGBUILD
у тимчасовому робочому каталозі. - Відредагуйте
PKGBUILD
відповідно до потреб вашого пакету. - Запустіть
makepkg
і перевірте, чи правильно складено пакет. - Якщо ні, повторіть попередні два кроки.
Попередження
- Перш ніж ви зможете автоматизувати процес складання пакету, ви повинні зробити це вручну хоча б один раз, якщо ви не знаєте "" точно "" що ви робите "" заздалегідь ", і в цьому випадку ви б не читали цього в першому місце. На жаль, хоча велика кількість авторів програми дотримуються 3-ступінкового циклу збірки "
./configure
;make
;make install
", це не так завжди так, і все може стати справді некрасивим, якщо вам доведеться застосовувати патчі, щоб все взагалі працювало. Правило: Якщо ви не можете отримати програму для компіляції з вихідного tarball і змусити її встановити себе у визначений тимчасовий підкаталог, вам навіть не потрібно намагатися упакувати її. Уmakepkg
немає жодної чарівної пилі пиксі, яка б усувала проблеми з джерелом. - У кількох випадках пакети навіть недоступні як джерело, і вам доведеться використовувати щось на зразок
sh installer.run
, щоб змусити його працювати. Вам доведеться провести досить небагато досліджень (прочитати README, INSTALL інструкції, керівництво сторінок, можливо, побудувати у Gentoo чи інших інсталяторів пакетів, можливо, навіть MAKEFILE або вихідний код), щоб працювати. У деяких дійсно поганих випадках вам доведеться редагувати вихідні файли, щоб вони взагалі працювали. Однакmakepkg
повинен бути повністю автономним, без введення користувача. Тому якщо вам потрібно відредагувати файли, можливо, вам доведеться зв’язати спеціальний патч ізPKGBUILD
та встановити його всередині функціїprep ()
, або, можливо, доведеться випустити деякіsed
команди зсередини функціїprep ()
.
Детальніші вказівки
32-bit – CLR – CMake – Cross – DKMS – Eclipse – Electron – Font – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – Meson – MinGW – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust – Shell – VCS – Web – Wine
генератори PKGBUILD
PKGBUILD для деяких пакетів можна генерувати автоматично.
- Go: go-makepkg
- Haskell: cblrepo
- Node.js: nodejs-npm2archAUR npm2arch
- Python: pipman-gitAUR, pip2arch-gitAUR, python-pypi2pkgbuildAUR
- Ruby: gem2archAUR, pacgemAUR
- Rust: cargo-pkgbuildAUR