Gentoo Ebuild 執筆基本ガイド
この記事は、Portage の力を活用してより多くのソフトウェアのインストール・管理するために、ebuild の作成を始めるためのガイドです。
Gentoo にソフトウェアをインストールするために、それに適した ebuild がまだ存在しないときは、ebuild を書いてください。これは比較的素直なタスクで、ほとんどの「サードパーティ」のソフトウェアをシステム全体にきれいにインストールするための唯一の方法です。ebuild があることで、パッケージマネージャはシステムにインストールされるすべてのファイルを追跡し、更新と削除をきれいに行うことができます。
ebuild 記事より: ebuild ファイルは通常はリポジトリに保管されるテキストファイルで、個々のソフトウェアパッケージを識別し、Gentoo パッケージマネージャがソフトウェアパッケージをどのように扱えばよいかを指示します。ebuild は bash 風の文法を使用して記述され、特定の EAPI バージョンに従うことで、パッケージマネージャ仕様を利用して標準化されます。
ebuild は、利用可能なソフトウェアの各バージョンについてのメタデータ(名前、バージョン番号、ライセンス、ホームページアドレス……)や、依存パッケージ情報(ビルド時および実行時)や、そのソフトウェアをどのようにビルドしインストールするかの指示(構成、コンパイル、ビルド、インストール、テスト、……)を含んでいます。
ebuild を機能させることができたら、プルリクエストに含めて送信するか、個別のebuild リポジトリに入れてパブリックにアクセスできるようにすることで、共有することができます。多少の労力を払えば、ebuild を GURU リポジトリに提案して保守することもできます。
完全なリファレンスは ebuildの書き方のマニュアル を参照してください。ebuildの書き方の具体例は ebuildの書き方のクイックスタート を参照してください。ebuild自体の説明についてはebuildの記事を、ebuildリポジトリについては、ebuildリポジトリを作る 記事を参照してください。
ebuild リポジトリ
ebuildをPortageで利用するためには、/etc/portage/repos.confを介してPortageに構成されたebuildリポジトリに置く必要があります(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 ファイルに対して使用しますが、それ以外の場合はリポジトリの ebuild に対して emerge コマンドを使用するようにしてください。
ebuild の作り方
ebuild は、基本的には単なるテキストファイルです。Gentoo にインストール可能なソフトウェアパッケージを提供する ebuild を書き始めるために必要なものは、テキストエディタだけです。
{CATEGORY}、{PN}、そして {P} は、この節ではそれぞれ パッケージカテゴリ、パッケージ名、そしてパッケージ名とバージョンを表しており、また標準的な ebuild で使用される変数 でもあります。これらの変数を合わせるとバージョン識別子を表すことができます。
いくつかのエディタには ebuild に関するオプション機能があります。その場合は適切な節まで読み飛ばしてください。そうした機能がない場合には、ひな形("テンプレート")を使うことで素早く作業を始めることができます。
ひな形から始める
エディタが ebuild の作成開始を支援する統合機能を備えていない場合は、Gentoo ebuild リポジトリにひな形となる ebuild ファイル (skel.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
空の ebuild ファイルを作成したときに、自動的にひな形から開始することができる vim プラグインがあります。
app-vim/gentoo-syntax をインストールしたら、ebuild のための適切なディレクトリを作成して、コマンドライン上で "{P}.ebuild" という新しいファイル名とともに vim を起動することで、自動的に基本的なひな形から開始でき、これを修正して保存することができます:
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 のユーザも利用可能で、Emacs のディストリビューションに応じて app-emacs/ebuild-mode または app-xemacs/ebuild-mode によって提供されます。
言語サーバ
gentoo ebuild のための言語サーバが存在します。
具体例を使ったデモ
この例では、典型的なプロセスがどのように進むかを示すために、scrub バージョン 2.6.1 のための ebuild を (それがまだ存在しないとして) 作成します。
先ほど作成した ebuild リポジトリ内に、ebuild を格納するためのディレクトリを作成します:
user $
mkdir -p /var/db/repos/example_repository/app-misc/scrub
シェルの作業ディレクトリを新しいパスに変更します:
user $
cd /var/db/repos/example_repository/app-misc/scrub
Bash などのいくつかのシェルは、直前のコマンドの最後の引数を "$_" 変数で提供します。これを使って、作成の次のコマンドであれば、コマンドラインでパスを指定しなくても、新しく作成したディレクトリを呼び出すことができます。
user $
cd $_
この例では、ebuild ファイルを作成し、ebuild を書く基礎とするひな形を準備するために Vim を使用しますが、お好みのエディタを使用してください(Emacs やひな形ファイルの使用については、前の節を参照してください):
user $
vim ./scrub-2.6.1.ebuild
ebuild 定義変数 (DESCRIPTION、 HOMEPAGE、SRC_URI、LICENSE) を設定して、新しいパッケージについての重要な情報を追加してください。BSD-clause-3 などのツリーに無いライセンスは、metadata でマップすることができます:
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
DESCRIPTION="ここに説明を書く"
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=""
これらは — =""
を含む行を除いて — 動作するために最低限必要な情報です。ant-jsch-1.10.9.ebuild のように、特定の eclass を継承している ebuild については、最低限の情報が異なることがあります。
ファイルを保存してください - もっとも基本的な形の ebuild の出来上がりです、とても簡単です!
${PN}
変数を SRC_URI
の中で使用することは可能ですが、これは必ずしもベストプラクティスであるとは言えません。タイプ量は短くなりますが、いくつかの考慮に値する使用すべきでない理由があります。
SRC_URI="https://github.com/gentoo/${PN}/releases/download/${PV}/${P}.tar.gz"
# Reads better as, e.g.
SRC_URI="https://github.com/gentoo/gentoo/releases/download/${PV}/${P}.tar.gz"
さらなる推奨事項については、この ebuild file format policy guide page を参照してください。
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 で上流ソースに対するパッチを適用する
Creating a patch の記事で説明されている通り、展開されたソースコードからパッチを作成することができます。作成したパッチは devmanual で説明されている通り、files ディレクトリ内に配置し、PATCHES と呼ばれる配列に列挙する必要があります:
PATCHES=(
"${FILESDIR}"/${P}-foo.patch
"${FILESDIR}"/${P}-bar.patch
)
src_prepare() {
default
...
}
QA テスト
ebuild の QA エラーをチェックするには、 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.xml
files. - 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 — the Python project pages have information on creating ebuilds for packages written in 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 — ebuild コマンドの man ページ。
- man 5 ebuild — ebuild ファイルフォーマットの man ページ。
- skel.ebuild
- Adding new packages via proxy-maint project