# Arch Build System (日本語)

関連記事

- ABS FAQ
- Arch Packaging Standards
- パッケージの作成
- ABS によるカーネルコンパイル
- PKGBUILD
- makepkg
- pacman
- 公式リポジトリ
- Arch User Repository

この記事では Arch Build System の概要と、初心者のためのウォークスルーを提供しています。完全なリファレンスガイドではありません！ABS の簡単な手引きは、ABS FAQ を見て下さい。より詳しい情報が必要な場合は、man ページを参照してください。

Note: ABS の同期は日に一度行われます。そのためリポジトリで利用可能になっているものとラグが生じることがあります。

## Arch Build System について

ABS とは Arch Build System の略で、FreeBSD などで採用されている ports に似ています。ABS はソースコードから `.pkg.tar.xz` 形式のバイナリパッケージを作成することができます。作られたパッケージは pacman によって、通常の(配布されている)バイナリパッケージと同様に管理することができます。

### ports システムとは

'Ports' は BSD 系 UNIX によって採用されている、ソースコードからのソフトウェアのビルドを自動化するシステムです。port を使ってソフトウェアのソースコードのダウンロード・展開、パッチの適用、コンパイル、インストールを行います。'port' はただの小さなディレクトリで、それぞれの 'port' に対応する個々のソフト名が付けられており、中にはソフトウェアのビルド・インストールのための情報が書かれたファイルが入っています。ソフトウェアをインストールしたい時は、port のフォルダまで移動し `make` もしくは `make install clean` と入力するだけでパッケージのダウンロードからコンパイル、インストールまでを自動的に行います。

### ABS の特徴

ABS も　Ports に似たシステムで、`/var/abs` ディレクトリ下に、カテゴリ - パッケージ名の順番で、ツリー状のフォルダ群 (ABS ツリー) を保存しています。これには Arch Linux の公式ソフト すべてのパッケージが含まれます (Ports と同様に、ソースコードやバイナリパッケージを含んでいないのでサイズはそんなに大きくありません)。パッケージ名 (例えば、'ABS') のフォルダを開いたとします。すると、中にはソフトウェアパッケージやソースはなく、代わりに PKGBUILD というファイルが含まれています。PKGBUILD は簡潔な Bash スクリプトで、ソースコードのダウンロード元や、コンパイル、パッケージ作成に必要なコマンドが記述してあります。ABS の makepkg を実行することで、ソフトウェアはコンパイル・パッケージングされビルド用ディレクトリにパッケージが作成されます。後は pacman を使って、ソフトウェアを簡単に管理することが可能です。

### ABS の概要

'ABS' という言葉は総称 (umbrella term) として使われることがあります。ABS は複数のものから構成されているからです; そのため、技術的には正確ではありませんが、'ABS' はツールキットとして以下のツールを意味します:

ABS ツリー
  ABS のディレクトリ構造; あなたの（ローカル）マシンの `/var/abs/` 下の SVN 階層のことです。`/etc/abs.conf` で設定したリポジトリにある全ての公式 Arch Linux ソフトウェア毎にサブディレクトリが存在します。ただしパッケージ自体は含まれていません。このツリーは pacman で abs パッケージをインストールして `abs` スクリプトを実行した後に作られます。

PKGBUILD
  ソースコードの URL とコンパイル・パッケージングの手順が入った Bash スクリプト。

makepkg
  PKGBUILD を読み込む ABS のシェルコマンドツール。自動的にソースをダウンロード・コンパイルし `.pkg.tar*` (形式は `makepkg.conf` の `PKGEXT` で設定) を作成します。makepkg を使って AUR やサードパーティのソースからカスタムパッケージを作成することも可能です (Creating Packages (日本語) を見て下さい)。

pacman
  pacman は abs とは完全に切り離されています。ただし、ビルドしたパッケージをインストール・削除したり依存関係を解決するのには pacman が必要になります。pacman は makepkg によって実行されることもあります。

AUR
  Arch User Repository は勿論 ABS とは別物ですが、AUR の(サポートがない) PKGBUILD をビルドするときには makepkg を使ってパッケージをコンパイル・作成します。ローカルマシン上の ABS ツリーと対照的に、AUR にはウェブインターフェースがあります。AUR にはユーザーによって投稿された沢山の PKGBUILD が含まれており、その PKGBUILD を使うことで公式の Arch リポジトリにないソフトウェアをインストールできます。公式の Arch ツリーにないパッケージをビルドする必要がある場合は、AUR を使うことになります。

## ABS を使う理由

Arch Build System の用途は以下の通りです:

- 何らかの理由で、パッケージをコンパイル・リコンパイルする
- パッケージがもう入手できなくなったので、ソフトウェアのソースから新しいパッケージを作成・インストールする (Creating Package を見て下さい)
- ニーズにあわせて既存のパッケージをカスタマイズする (オプションを有効化・無効化、パッチをあてる)
- FreeBSD 流に (à la FreeBSD)、自分で決めたコンパイルフラグを使ってシステム全体をリビルドする (例: pacbuilder)
- カスタムカーネルをクリーンにビルド・インストールする (Kernels (日本語)#コンパイル を見て下さい)
- カスタムカーネルと一緒に動作するカーネルモジュールを手に入れる
- PKGBUILD 内のバージョン番号を変えることで Arch パッケージの新しい・古い・ベータ版の・開発版のバージョンを簡単にコンパイル・インストールする

ABS は Arch Linux を使うにあたって必須のものではありませんが、ソースコンパイルなどの作業の自動化に役立ちます。

## ABS の使用方法

abs を使ってパッケージをビルドするには以下の手順を踏みます:

1. pacman で abs パッケージをインストール。
2. root で `abs` を実行。Arch Linux サーバーと同期して ABS ツリーを作成します。
3. ビルドファイル (通常 `/var/abs/<repo>/<pkgname>` 下にあります) をビルドディレクトリにコピー。
4. ビルドディレクトリまで移動して、PKGBUILD を (好みに・必要なら) 編集し、makepkg を実行。
5. PKGBUILD の指示に従って、makepkg は適切なソース tarball をダウンロードし、それを解凍して、必要ならパッチを適用し、`makepkg.conf` で指定された `CFLAGS` を使ってコンパイル、そして最後にビルドファイルを圧縮して `.pkg.tar.gz` か `.pkg.tar.xz` の拡張子が付いたパッケージを作ります。
6. インストールは `pacman -U <.pkg.tar.xz file>` をするだけです。パッケージの削除も pacman で行います。

### ツールのインストール

ABS を使うには、まず公式リポジトリから abs をインストールする必要があります。

abs をインストールするだけで (その依存として) abs-sync スクリプトや様々なビルドスクリプト、そして rsync が入ります。

ただし、実際に何かをビルドする前に、基本的なコンパイルツールも必要になります。これらはパッケージグループとして base-devel にまとめられています。このグループは pacman でインストール可能です。

### /etc/abs.conf

root で `/etc/abs.conf` を編集して利用するリポジトリを指定してください。

利用するリポジトリの前の `!` を削除することでそのリポジトリを有効にします。例:

    REPOS=(core extra community !testing)

### ABS ツリー

ABS ツリーは `/var/abs` 下に SVN のディレクトリ階層として以下のように存在しています:

    | -- core/
    |     || -- acl/
    |     ||     || -- PKGBUILD
    |     || -- attr/
    |     ||     || -- PKGBUILD
    |     || -- abs/
    |     ||     || -- PKGBUILD
    |     || -- autoconf/
    |     ||     || -- PKGBUILD
    |     || -- ...
    | -- extra/
    |     || -- acpid/
    |     ||     || -- PKGBUILD
    |     || -- apache/
    |     ||     || -- PKGBUILD
    |     || -- ...
    | -- community/
    |     || -- ...

ABS ツリーはパッケージデータベースと全く同じ構造を持っています:

- 第一階層: リポジトリの名前
- 第二階層: パッケージ名のディレクトリ
- 第三階層: PKGBUILD (パッケージのビルドに必要な情報が含まれています) とその他関連ファイル (パッチなど、パッケージのビルドに必要なファイル)

パッケージのソースコードは ABS ディレクトリには存在しません。その代わり、PKGBUILD ファイルには、パッケージをビルドする時にどこの URL からソースコードをダウンロードすればいいか書かれています。そのため、abs ツリー自体のサイズはとても小さくなっています。

#### ABS ツリーのダウンロード

root で次を実行してください:

    # abs

今、あなたの ABS ツリーは `/var/abs` 下に作成されました。ABS ツリーの適切なブランチが作られ `/etc/abs.conf` で指定されたものと対応していることに注意してください。

公式リポジトリと同期し続けるために abs コマンドは定期的に実行するのがベターです。また、個々の ABS パッケージファイルをダウンロードすることもできます:

    # abs <repository>/<package>

こうすれば一つのパッケージをビルドするのに abs ツリー全体をチェックする必要がなくなります。

### /etc/makepkg.conf

`/etc/makepkg.conf` ではグローバルの環境変数やコンパイルフラグを指定します。SMP なシステムを使っている等、最適化を指定したいと思った場合このファイルを編集してください。デフォルト設定は i686 と x86_64 に最適化が指定されていて、それぞれのアーキテクチャを使ったシングル CPU のシステムで問題なく動くようになっています (このデフォルト設定でも SMP マシンで動作はしますが、コンパイル時には一つのコア/CPU しか使われません -- makepkg.conf を見て下さい)。

#### /etc/makepkg.conf で PACKAGER 変数を設定する

`/etc/makepkg.conf` に PACKAGER 変数を設定することは任意ですが強く推奨されています。設定することでどのパッケージがあなたによってビルド・インストールされたかすぐわかるようにすることができるからです。community リポジトリの expac を使うことで簡単にパッケージの見分けがつきます:

##### 全てのパッケージの表示 (AUR のパッケージを含む)

    $ grep myname /etc/makepkg.conf
    PACKAGER="myname <myemail@myserver.com>"

    $ expac "%n %p" | grep "myname" | column -t
    archey3 myname
    binutils myname
    gcc myname
    gcc-libs myname
    glibc myname
    tar myname

##### リポジトリに含まれているパッケージのみを表示

この例では `/etc/pacman.conf` に定義されているリポジトリに含まれているパッケージだけを表示します:

    $ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
    binutils
    gcc
    gcc-libs
    glibc
    tar

### ビルドディレクトリの作成

実際のコンパイルをするためのビルドディレクトリを作成することを推奨します。ABS ツリーに変更を加えても、ABS のアップデートによってデータは (上書きされて) ロストしてしまうからです。あなたの home ディレクトリを使うのがグッドプラクティスです。ただし Arch ユーザーには `/var/abs/` の下に通常ユーザーで所有された 'local' ディレクトリを作成するのを好む人もいます。

あなたのビルドディレクトリの作成。例:

    $ mkdir -p $HOME/abs

ツリー (`/var/abs/<repository>/<pkgname>`) から ABS をビルドディレクトリにコピーしてください。

### パッケージのビルド

ここでは、例として slim ディスプレイマネージャのパッケージをビルドすることにします。

slim ABS を ABS ツリーからビルドディレクトリにコピー:

    $ cp -r /var/abs/extra/slim/ ~/abs

ビルドディレクトリに移動:

    $ cd ~/abs/slim

PKGBUILD を修正。コンポーネントのサポートを追加・削除したり、パッチをあてたり、パッケージバージョンの変更などをする。（任意）:

    $ nano PKGBUILD

通常ユーザーで makepkg を実行 (`-s` スイッチをつけると自動的に依存関係を解決します):

    $ makepkg -s

Note: 依存関係が欠けていることに文句を言う前に、全ての Arch Linux システムで base グループがインストールされていることを思い出してください。makepkg でビルドするときは "base-devel" グループがインストールされているのが前提となっています。#ツールのインストールを見てください。

root でインストール:

    # pacman -U slim-1.3.0-2-i686.pkg.tar.xz

これで完了です。ソースから slim をビルドして pacman でインストールする手順はこの通りです。パッケージの削除も pacman によって行います (`pacman -R slim`)。

ABS を使うことで利便性の向上と自動化を達成しながら、ビルドとインストールの関数を PKGBUILD に含めることでコントロールを失うことなく完全な透明性を維持することができます。

#### fakeroot

基本的に、伝統的な方法と同じ手順 (`./configure, make, make install`) を実行しますが、ソフトウェアは fake root 環境にインストールされます (fake root はビルドディレクトリ内のサブディレクトリで、システムの root ディレクトリとして振る舞います。fakeroot プログラムと一緒に、makepkg は fake root ディレクトリを作成し、コンパイルしたバイナリと関連ファイルをそのディレクトリに、所有者 root としてインストールします)。そして fake root やコンパイルしたソフトウェアを含むサブディレクトリツリーは圧縮され `.pkg.tar.xz` 拡張子の付くアーカイブ (もしくはパッケージ) になります。pacman はそのパッケージを展開してシステムの本当の root ディレクトリ (`/`) にインストールします。

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

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

group 行を PKGBUILD に挿入して、パッケージを `modified` という名前のグループに追加してください。

    PKGBUILD

    groups=('modified')

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

    /etc/pacman.conf

    IgnoreGroup = modified

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

Categories:

- About Arch (日本語)
- Package development (日本語)
- Package management (日本語)