Arch build system

提供: ArchWiki
2022年10月27日 (木) 22:10時点におけるAshMyzk (トーク | 投稿記録)による版 (TranslationStatus)
ナビゲーションに移動 検索に移動

関連記事

Arch Build System とは、ports ライクなシステムで、ソースコートからソフトウェアをビルドしたりパッケージングしたりするためのものです。pacman はバイナリパッケージ (ABS によってビルドされたパッケージを含む) の管理用に特殊化された Arch ツールであるに対し、ABS は、インストール可能な .pkg.tar.zst パッケージにソースをコンパイルするためのツールのコレクションです。

Ports は BSD 系によって採用されている、ソースコードからのソフトウェアのビルドを自動化するシステムです。port を使ってソフトウェアのダウンロード、展開、パッチの適用、コンパイル、インストールを行います。port はユーザのコンピュータ上にあるただの小さなディレクトリで、それぞれの port に対応する個々のソフト名が付けられており、中にはソフトウェアのビルド・インストールのための情報が書かれたファイルが入っています。これにより、port のディレクトリ内で makemake install clean を実行すればよく、ソフトウェアのインストールがシンプルになります。

ABS も似たようなコンセプトです。ABS の一部分には、SVN リポジトリと、等価な Git リポジトリがあります。リポジトリには、Arch Linux で利用可能な各パッケージに対応するディレクトリが含まれています。リポジトリのディレクトリには PKGBUILD ファイルが含まれており (他のファイルが含まれている場合もある)、ソフトウェアのソースやバイナリは含まれていません。ディレクトリ内で makepkg を実行することで、ソフトウェアのソースがダウンロードされ、コンパイルされ、ビルドディレクトリ内にパッケージングされます。そして、pacman を使ってそのパッケージをインストールできます。

概要

'ABS' は複数のコンポーネントから構成されているので、それらをまとめて 'ABS' と呼ばれることがあります。故に、(技術的には正しくありませんが) 'ABS' は完全なツールキットとして以下のツールを指すことがあります:

リポジトリツリー
すべての公式パッケージのビルドに必要なファイルが含まれているディレクトリ構造。パッケージ自体やソフトウェアのソースファイルは含みません。svngit のリポジトリで利用できます。詳細は #リポジトリツリー セクションを見てください。
PKGBUILD
ソースコードの URL と、コンパイルやパッケージングの命令が記述されている Bash スクリプト。
makepkg
PKGBUILD を読み込むシェルコマンドツール。自動的にソースをダウンロード・コンパイルし、(makepkg.confPKGEXT に従って) .pkg.tar* を作成します。makepkg を使って AUR やサードパーティのソースからカスタムパッケージを作成することも可能です。詳細は パッケージの作成 を見て下さい。
pacman
pacman は ABS とは完全に切り離されています。しかし、ビルドしたパッケージをインストール・削除したり依存関係を解決したりするために pacman は makepkg によって、または手動で実行される必要があります。
AUR
Arch User Repository は ABS と分離されていますが、AUR の (サポートされていない) PKGBUILD は、makepkg を使ってビルドされ、ソフトウェアをコンパイルしパッケージングします。単なる素の git リポジトリである ABS ツリーとは対象的に、AUR は様々なインタラクティブな機能を持つ洗練されたウェブサイトインターフェイスとして存在します。AUR には、公式の Arch パッケージとしては利用できないソフトウェアのための、ユーザによって提供されている数多くの PKGBUILD があります。公式の Arch ツリー以外のパッケージをビルドする必要がある場合、AUR にあるかもしれません。
警告: 公式の PKGBUILD ではパッケージはクリーンな chroot でビルドされることを前提としています。汚いビルド環境でソフトウェアをビルドしても上手くいかなかったり、動作時に予期せぬ挙動が起こったりすることがあります。ビルドシステムは依存関係を動的に検出して、ビルド環境に存在するパッケージによって結果が変わるためです。

リポジトリツリー

coreextratesting 公式リポジトリは、チェックアウトのために packages リポジトリにあります。communitymultilib リポジトリは community リポジトリに含まれています。

各パッケージにはサブディレクトリが存在します。サブディレクトリの中には repostrunk ディレクトリがあります。repos はさらにリポジトリ名 (例: core) とアーキテクチャに分かれています。公式ビルドでは repos に入っている PKGBUILD とその他ビルドファイルが使われます。trunk のファイルは開発者によって準備のために使われ、その後 repos にコピーされます。

例えば、acl のツリーは以下のような見た目をしています:

acl
acl/repos
acl/repos/core-x86_64
acl/repos/core-x86_64/PKGBUILD
acl/trunk
acl/trunk/PKGBUILD

パッケージのソースコードは ABS ディレクトリ内には存在しません。その代わり、パッケージのビルド時にソースコードをダウンロードする URL が PKGBUILD に含まれています。

ユースケース

ABS は、ソースからのコンパイルに関連する特定のタスクを自動化します。ABS のユースケースとしては以下があります:

  • パッケージを(再)コンパイルする必要があるケース。
  • パッケージがまだ利用できないソフトウェアのソースから新しいパッケージを make しインストールする (パッケージの作成 を見てください)。
  • 既存のパッケージをニーズに合わせてカスタマイズする (例: オプションを有効化/無効化する、パッチを当てる)。
  • (FreeBSD 風に) コンパイラフラグを指定してシステム全体をリビルドする。
  • 自分のカスタムカーネルをクリーンにビルド・インストールする (カーネル#コンパイル を見てください)。
  • カーネルモジュールをカスタムカーネルで動くようにする。
  • PKGBUILD 内のバージョン番号を編集して、新しい、古い、ベータ、開発バージョンの Arch パッケージを簡単にコンパイル・インストールする。

使用法

PKGBUILD ソースを取得する

特定のパッケージをソースからビルドするために必要な PKGBUILD ファイルを取得するには、SVN あるいは Git ベースのアプローチのどちらかを使用できます。

Git を使って PKGBUILD ソースを取得する

asp ツールを使う

要件としては、asp パッケージをインストールしてください。Asp は、Git インターフェイスを使って Arch Linux パッケージのビルドソースファイルを取得するためのツールです。また、Arch Linux BBS フォーラムのスレッド [1] も見てください。

特定のパッケージの svntogit リポジトリをクローンするには:

$ asp checkout pkgname

これは、与えられたパッケージの git リポジトリを、パッケージと同じ名前のディレクトリにクローンします。

クローンされた git リポジトリをアップデートするには、その git リポジトリ内で git pull とその次に asp update を実行してください。

さらに、他の git コマンドもすべて使うことができ、パッケージの古いバージョンをチェックアウトしたり、カスタムの変更をトラックしたりすることもできます。git の使用法に関する詳細は git ページを見てください。

単に特定のパッケージの現在の PKGBUILD のスナップショットをコピーしたいだけなのであれば、以下のコマンドを使ってください:

$ asp export pkgname
git を直接使う

以下の git コマンドを使って特定のブランチだけをクローンしてください。このようにして、リポジトリ全体をコピーすることを防ぎます:

$ git clone --branch branch/package --single-branch https://github.com/archlinux/svntogit-packages.git

例えば、apache ビルドファイルをコピーするには:

$ git clone --branch packages/apache --single-branch https://github.com/archlinux/svntogit-packages.git

SVN を使って PKGBUILD ソースを取得する

要件

subversion パッケージをインストールしてください。

リポジトリをチェックアウトする
警告: リポジトリ全体をダウンロードしないでください。以下の指示だけに従ってください。SVN リポジトリ全体は巨大です。理不尽なほどのディスク容量を消費するばかりでなく、あなたがダウンロードするために archlinux.org サーバーに大きな負担をかけることになります。サービスに過度の負担をかける行為をした場合、あなたのアドレスがブロックされる可能性もあります。何らかのスクリプトで公の SVN を使わないようにしてください。

公式リポジトリcoreextratesting をチェックアウトするには:

$ svn checkout --depth=empty svn://svn.archlinux.org/packages

リポジトリ communitymultilib をチェックアウトするには:

$ svn checkout --depth=empty svn://svn.archlinux.org/community

両ケースで、からのディレクトリが作成されるだけですが、svn のチェックアウトであることは分かります。

パッケージをチェックアウトする

チェックアウトした svn リポジトリのあるディレクトリ (つまり packages または community) で以下のコマンドを実行してください:

$ svn update package-name

上記のコマンドにより、リクエストしたパッケージがチェックアウトされます。最上位のディレクトリで svn update を実行すると、アップデートされます。

存在しないパッケージを指定しても、svn は警告を表示しません。"At revision 115847" のような出力がされるだけです。ファイルは作成されません。その場合:

  • パッケージ名のスペルを確認してください。
  • パッケージが別のリポジトリに (例えば、community からメインのリポジトリへ) 移っていないか確認してください。
  • https://archlinux.org/packages を確認して他のベースパッケージからビルドされていないかチェックしてください (例えば python-tensorflowtensorflow の PKGBUILD からビルドします)。
ヒント: 古いバージョンのパッケージをチェックアウトしたい場合、#パッケージの古いバージョンをチェックアウトするを参照してください。

リポジトリの最新のリビジョンをリビルドしたい場合、チェックアウトしたパッケージを定期的に更新する必要があります。以下のコマンドで更新できます:

$ svn update
パッケージの古いバージョンをチェックアウトする

#リポジトリをチェックアウトする で説明されている通りにチェックアウトした svn リポジトリ内では (つまり、"packages" や "community")、まずログを確かめます:

$ svn log package-name

ヒストリを調べて目的のリビジョンを見つけ、チェックアウトしたいリビジョンを指定してください。例えば、リビジョン r1729 にチェックアウトするには:

$ svn update -r1729 package-name

これは、package-name の既存のコピーを、指定したリビジョンにアップデートします。

日付を指定することもできます。指定した日にリビジョンが存在しない場合、svn は、指定した日より前の最も最近のパッケージを使用します。以下の例では、2009-03-03 のリビジョンをチェックアウトします:

$ svn update -r'{20090303}' package-name

他のリポジトリに移動する前のリビジョンにパッケージをチェックアウトすることもできます。ログをよくチェックし、パッケージが移動された日や最後のリビジョン番号を調べてください。

パッケージをビルドする

チェックアウトした PKGBUILD からパッケージをビルドするときに makepkg を設定する方法は makepkg#設定を見てください。

PKGBUILD が含まれたディレクトリをどこか好きなところにコピーしてください。それから必要な修正を加えてください。makepkg#使用方法に書かれているように makepkg を使ってパッケージを作成・インストールします。

ヒントとテクニック

修正を加えたパッケージを保護する

pacman でシステムを更新すると、ABS で作ったパッケージが、公式リポジトリにある同じ名前のパッケージで置き換えられてしまいます。これを回避するには以下の方法を見て下さい。

group 配列を PKGBUILD に挿入し、対象のパッケージを modified と言う名前の group に追加してください。

PKGBUILD
groups=('modified')

そしてこのグループを /etc/pacman.confIgnoreGroup セクションに追加してください。

/etc/pacman.conf
IgnoreGroup = modified

システムアップデートで公式リポジトリにパッケージの新しいバージョンがあっても、pacman は IgnoreGroup セクションにパッケージがあるため更新をスキップすると表示します。部分的なアップグレードにならないようにここでパッケージを ABS からビルドしなおす必要があります。

他のツール

  • pbget - Web インターフェイスから直接個々のパッケージの PKGBUILD を取得します。AUR サポートもあり。
翻訳ステータス: このページは en:Arch Build System の翻訳バージョンです。最後の翻訳日は 2022-10-27 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。