Начальное руководство по написание ebuild-файлов в Gentoo
Это руководство о том, как начать писать ebuild -файлы , чтобы использовать возможности Portage для установки и управления ещё большим количеством программного обеспечения.
Вы можете написать ebuild-файл для установки какого-либо программного обеспечения в Gentoo, если нет подходящих существующих ebuild-файлов. Это относительно простая задача, и это единственный способ чисто и аккуратно установить большинство "сторонних" программ в системе. ebuild-файл позволяет менеджеру пакетов отслеживать каждый файл, установленный в систему, чтобы обеспечить корректное обновление и удаление.
Из статьи ebuild : ebuild -файл — это текстовый файл, обычно хранящийся в репозитории , который определяет конкретный программный пакет и указывает менеджеру пакетов Gentoo, как с ним работать. Ebuild-файлы используют bash -подобный стиль синтаксиса и стандартизированы путём Package Manager Specification , придерживаясь определённой версии EAPI .
Ebuild-файлы содержат информацию о каждой версии доступного программного обеспечения (название, версию, лицензию, домашнюю страницу...), информацию о зависимостях (как во время сборки, так и во время выполнения), а также инструкции по сборке и установке программного обеспечения (конфигурирование, компиляция, сборка, установка, тестирование...).
После того, как ebuild-файл заработал, им можно поделиться, отправив его в запросе на слияние , или в отдельный репозиторий ebuild-файлов и сделав его общедоступным. С небольшими усилиями можно добавлять и сопровождать ebuild-файлы в GURU репозитории.
Полную справочную документацию смотрите в Руководстве разработчика по написанию ebuild-файлов . Более подробные примеры написания ebuild-файлов смотрите в Кратком руководстве по написанию ebuild-файлов . См. статью ebuild для объяснения самих ebuild-файлов, статью Репозиторий ebuild-файлов о том, что такое репозиторий ebuild-файлов, и статью Создание репозитория ebuild-файлов о том, как его создать.
Репозитории ebuild-файлов
Чтобы ebuild-файлы были видны Portage , они помещаются в репозиторий ebuild-файлов , который настроен для Portage через /etc/portage/repos.conf (общую информацию о работе с репозиториями ebuild-файлов см. в разделе Управление репозиторием ).
Создайте репозиторий ebuild-файлов для экспериментов, следуя этому руководству. В данной статье будет использоваться пример репозитория в /var/db/repos/example_repository .
eselect repository упрощает создание репозитория:
root
#
emerge -a app-eselect/eselect-repository
root
#
eselect repository create example_repository
Ebuild-файлы можно установить с помощью команды ebuild , однако это не рекомендуется — эта команда предназначена только для целей разработки. В этой статье будет использоваться команда ebuild с ebuild-файлом для тестирования во время разработки, но в других случаях обязательно используйте команду emerge с ebuild-файлом в репозитории.
Как создать ebuild-файл
Если кратко, ebuild-файлы — это просто текстовые файлы. Всё, что нужно, чтобы начать писать ebuild-файлы — это текстовый редактор , чтобы предоставить возможность устанавливать пакеты программ для Gentoo.
В этом разделе {CATEGORY }, {PN } и {P } означают категория пакета , имя пакета и имя пакета с версией соответственно, и являются стандартными переменными, используемыми в ebuild-файлах . Эти переменные вместе составляют спецификатор версии .
Некоторые редакторы имеют опциональную функцию создания ebuild-файлов, в этом случае переходите к соответствующему разделу. В противном случае для более быстрого начала работы можно использовать каркас ("шаблон").
Начните с каркаса
Если в редакторе нет встроенного функционала для начала работы с ebuild-файлами, то существует каркас ebuild-файла ( skel.ebuild ), расположенный в Gentoo репозитории ebuild-файлов . Чтобы начать работу с этим файлом, просто скопируйте его в соответствующее место (в качестве текстового редактора в данном примере используется nano ):
user
$
mkdir --parents /var/db/repos/example_repository/{CATEGORY}/{PN}
user
$
cp /var/db/repos/gentoo/skel.ebuild /var/db/repos/example_repository/{CATEGORY}/{PN}
user
$
cd /var/db/repos/example_repository/{CATEGORY}/{PN}
user
$
nano {P}.ebuild
Vim
Для vim существует плагин, который автоматически добавит каркас при создании пустого ebuild-файла.
После установки app-vim/gentoo-syntax , создайте подходящий каталог для ebuild-файла, а затем запустите vim с файлом "{P}.ebuild", чтобы он добавил каркас, который можно изменить и сохранить:
user
$
mkdir --parents /var/db/repos/example_repository/{CATEGORY}/{PN}
user
$
cd /var/db/repos/example_repository/{CATEGORY}/{PN}
user
$
vim {P}.ebuild
Emacs
Для пользователей Emacs существует похожий инструмент, предоставляемый пакетом app-emacs/ebuild-mode или app-xemacs/ebuild-mode , в зависимости от дистрибутива Emacs.
Поддержка LSP
LSP-сервер для Gentoo ebuild-файлов можно найти в этом репозитории .
Демонстрация на примере
В этом примере взята программа scrub , версии 2.6.1, чтобы показать типичный процесс написания ebuild-файла (если он ещё не существует).
Создайте каталог, который будет содержать ebuild-файл, в репозитории ebuild-файлов , созданном ранее:
user
$
mkdir -p /var/db/repos/example_repository/app-misc/scrub
Измените текущий рабочий каталог оболочки (shell working directory) на новый путь:
user
$
cd /var/db/repos/example_repository/app-misc/scrub
Некоторые оболочки, такие как Bash, сохраняют последний параметр предыдущей команды в переменную "$_". Это можно использовать, чтобы получить вновь созданный каталог, не указывая путь в командной строке, в последующей команде.
user
$
cd $_
В этом примере для создания ebuild-файла и добавления каркаса используется Vim, но можно использовать любой редактор (см. предыдущий раздел про Emacs, или шаблонный файл):
user
$
vim ./scrub-2.6.1.ebuild
Добавьте важную информацию о новом пакете путём выставления переменных ebuild-файлов : DESCRIPTION, HOMEPAGE , SRC_URI , LICENSE . Лицензии наподобии BSD-clause-3 (BSD с 3-мя пунктами), которых нет в репозитории , могут находиться в файле с метаданными :
scrub-2.6.1.ebuild
Редактирование нового файла в vim с шаблона
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DESCRIPTION="Some words here"
HOMEPAGE="https://github.com/chaos/scrub"
SRC_URI="https://github.com/chaos/scrub/releases/download/2.6.1/scrub-2.6.1.tar.gz"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""
DEPEND=""
RDEPEND="${DEPEND}"
BDEPEND=""
Этой информации (строки с
=""
можно пропустить) достаточно для начала работы. Ebuild-файлам, наследующим от определённых eclass-ов может понадобиться другой минимум информации, напр.
ant-jsch-1.10.9.ebuild
. Сохраните файл и вуаля — получился базовый ebuild-файл, всё просто!
Использование переменной
${PN}
внутри
SRC_URI
разрешено, это
не всегда является оптимальным вариантом
. Хоть оно и быстрее пишется, есть некоторые
определённые причины не использовать её
, которые надо иметь ввиду.
SRC_URI="https://github.com/gentoo/${PN}/releases/download/${PV}/${P}.tar.gz"
# Читается хуже, чем, к примеру, этот вариант
SRC_URI="https://github.com/gentoo/gentoo/releases/download/${PV}/${P}.tar.gz"
См. страницу правил форматирования ebuild-файлов , чтобы получить больше рекомендаций.
Для тестирования загрузки и распаковки кода от upstream (авторов проекта) в новом ebuild-файле можно воспользоваться командой ebuild :
user
$
GENTOO_MIRRORS="" ebuild ./scrub-2.6.1.ebuild manifest clean unpack
Appending /var/db/repos/customrepo to PORTDIR_OVERLAY... >>> Downloading 'https://github.com/chaos/scrub/releases/download/2.6.1/scrub-2.6.1.tar.gz' --2023-03-03 23:35:13-- https://github.com/chaos/scrub/releases/download/2.6.1/scrub-2.6.1.tar.gz Resolving github.com... 140.82.121.4 Connecting to github.com|140.82.121.4|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/23157201/405a65b8-2d4d-11e4-8f82-3e3a9951b650?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230303%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230303T223513Z&X-Amz-Expires=300&X-Amz-Signature=7d7d925ff8392ee2ba12028c73c8d8c3b3a7086b5aec11bbfae335222a4f2eb0&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=23157201&response-content-disposition=attachment%3B%20filename%3Dscrub-2.6.1.tar.gz&response-content-type=application%2Foctet-stream [following] --2023-03-03 23:35:13-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/23157201/405a65b8-2d4d-11e4-8f82-3e3a9951b650?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230303%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230303T223513Z&X-Amz-Expires=300&X-Amz-Signature=7d7d925ff8392ee2ba12028c73c8d8c3b3a7086b5aec11bbfae335222a4f2eb0&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=23157201&response-content-disposition=attachment%3B%20filename%3Dscrub-2.6.1.tar.gz&response-content-type=application%2Foctet-stream Resolving objects.githubusercontent.com... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to objects.githubusercontent.com|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 362536 (354K) [application/octet-stream] Saving to: '/var/cache/distfiles/scrub-2.6.1.tar.gz.__download__' /var/cache/distfiles/scrub-2.6.1. 100%[============================================================>] 354.04K --.-KB/s in 0.08s 2023-03-03 23:35:13 (4.31 MB/s) - '/var/cache/distfiles/scrub-2.6.1.tar.gz.__download__' saved [362536/362536] * scrub-2.6.1.tar.gz BLAKE2B SHA512 size ;-) ... [ ok ] >>> Unpacking source... >>> Unpacking scrub-2.6.1.tar.gz to /var/tmp/portage/app-misc/scrub-2.6.1/work >>> Source unpacked in /var/tmp/portage/app-misc/scrub-2.6.1/work
Команда должна загрузить и распаковывать архив с исходным кодом без ошибок, а вывод должен совпадать с примером.
Для таких простых пакетов, как этот, можно не дополнять ebuild-файл патчами или другими продвинутыми вещами — он и так будет работать.
На этом этапе рекомендуется запустить наборы тестов, особенно в начале работы:
root
#
ebuild scrub-2.6.1.ebuild clean test install
Чтобы установить новый ebuild-файл в систему, запустите:
root
#
ebuild scrub-2.6.1.ebuild clean install merge
Добавления патча для исходного кода в ebuild-файл
Патч может быть создан из распакованного исходного кода, как показано в статье Создание патча . Патчи должны быть размещены в каталоге files и перечислены в массиве PATCHES , как показано в руководстве разработчика :
PATCHES=(
"${FILESDIR}"/${P}-foo.patch
"${FILESDIR}"/${P}-bar.patch
)
src_prepare() {
default
...
}
Тестирование контроля качества (QA testing)
Для проверки на ошибки контроля качества (QA errors) в ebuild-файле можно использовать pkgcheck ( dev-util/pkgcheck ):
user
$
pkgcheck scan
Смотрите также
- GitHub Pull Requests — how to contribute to Gentoo by creating pull requests on GitHub .
-
java-ebuilder
— an experimental package being developed by Gentoo Java developers to generate initial ebuilds from
Maven
pom.xmlfiles. - Notes on ebuilds with GUI
- Project:GURU — an official repository of new Gentoo packages that are maintained collaboratively by Gentoo users
- Project:Proxy_Maintainers/User_Guide/Style_Guide
- Project:Python — страницы проекта Python содержат информацию про создание ebuild-файлов для пакетов, написанных на Python
- Project:X11/Ebuild_maintenance
- Proxied Maintainer FAQ
- Test environment
- Writing go Ebuilds — a short reference, intended to be read alongside Basic guide to write Gentoo Ebuilds and the go-module.eclass documentation
- Ebuild_guidance_for_ecosystems
Внешние ресурсы
- Gentoo Policy Guide
- Quickstart Ebuild Guide
- Gentoo Development guide
- Michał Górny: Category: Ebuild writing
- Michał Górny: The ultimate guide to EAPI 7
- Michał Górny: The ultimate guide to EAPI 8
- man 1 ebuild — The ebuild command's man page.
- man 5 ebuild — The ebuild file format man page.
- The skel.ebuild
- Adding new packages via proxy-maint project