# makepkg (日本語)

関連記事

- パッケージの作成
- PKGBUILD
- Arch User Repository
- pacman
- 公式リポジトリ
- Arch Build System

makepkg は pacman (Arch Linux のパッケージマネージャ) でのインストールに適したパッケージをコンパイル・ビルドするために使われます。makepkg はパッケージのビルドを自動化するスクリプトです; ソースファイルのダウンロード・検証、依存関係の確認、ビルド時の設定、ソースのコンパイル、一時 root へのインストール、カスタマイズ、メタ情報の生成、そして全てをまとめたパッケージの作成。

makepkg は pacman パッケージの中に入っています。

## 設定

`/etc/makepkg.conf` が makepkg のメインの設定ファイルです。ほとんどのユーザーはパッケージをビルドする前に makepkg の設定オプションを微調整するとよいでしょう。`~/.makepkg.conf` ファイルを作成することもできます。

### アーキテクチャ、コンパイルフラグ

makepkg でソフトウェアをコンパイルする時 `MAKEFLAGS`, `CFLAGS`, `CXXFLAGS` オプションが make, gcc, `g++` によって使われます。デフォルトでは、様々なマシンでインストールできるような一般的なパッケージを生成するようにオプションが設定されています。ホストマシン用にコンパイルをチューニングすることでパフォーマンスを改善することが可能です。コンパイルするホストのプロセッサに合わせてパッケージをコンパイルするデメリットは、他のマシンでは動作しなくなるかもしれないということです。

Note: あなたが export した変数を全てのパッケージビルドシステムが使うわけではないということに注意してください。元の Makefile や PKGBUILD 内の変数を上書きすることがあります。

    /etc/makepkg.conf

    [...]

    #########################################################################
    # ARCHITECTURE, COMPILE FLAGS
    #########################################################################
    #
    CARCH="x86_64"
    CHOST="x86_64-unknown-linux-gnu"

    #-- Exclusive: will only run on x86_64
    # -march (or -mcpu) builds exclusively for an architecture
    # -mtune optimizes for an architecture, but builds for whole processor family
    CPPFLAGS="-D_FORTIFY_SOURCE=2"
    CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
    CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
    LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
    #-- Make Flags: change this for DistCC/SMP systems
    #MAKEFLAGS="-j2"

    [...]

デフォルトの makepkg.conf の `CFLAGS` と `CXXFLAGS` はそれぞれのアーキテクチャを持つ全てのマシンと互換性があります。

x86_64 のマシンでは、時間を投資して公式のパッケージをリビルドすることでそれに見合うだけのパフォーマンスの向上を得られることは稀です。

GCC バージョン 4.3.0 から、マシンの CPU の自動検知とサポートされている最適化の自動セレクトを有効にする `-march=native` スイッチが使えるようになっています。これを使うには、以下のように `CFLAGS` と `CXXFLAGS` を変更してください:

    # -march=native also sets the correct -mtune=
    CFLAGS="-march=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
    CXXFLAGS="${CFLAGS}"

Tip: `march=native` フラグがどうなるか見るには、次を実行してください:

    $ gcc -march=native -E -v - </dev/null 2>&1 | sed -n 's/.* -v - //p'

`-march=native` は全ての利用可能な命令セットを有効にし特定の CPU にあわせてスケジューリングを改善するので CPU タイプに合わせた最適化によって理論上はパフォーマンスが向上します。アプリケーション (例えば: 音声・動画エンコードツール、科学的なアプリケーション、数学プログラムなど) をリビルドするときにこれは特に顕著で、Arch Linux によって提供されているデフォルトのオプション (またパッケージ) を使うときには有効にならない新しい命令を使えることで大きなアドバンテージを得ることができます。

コンパイラスイッチによって、ループ展開・悪いベクトル化・狂ったインライン化などでコンパイラはコードサイズを膨張させがちなので"標準外の" CFLAGS を使うことでパフォーマンスを下げるのはとても簡単です。何かが速くなると確認・ベンチマークできない限り、高速化できる可能性はほとんどありません！

利用可能なオプションの完全なリストは GCC の man ページを見て下さい。Gentoo の Compilation Optimization Guide や Safe CFLAGS にはより詳しい情報が載っています。

#### MAKEFLAGS

`MAKEFLAGS` オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: `-j4`。`nproc` を使うことで利用可能なプロセッサの数がわかります。PKGBUILD によっては、特定のバージョンで競合状態になったり、もしくはサポートされていないために、この値を `-j1` で上書きします。これによってビルドが失敗するパッケージがある場合は、エラーがあなたの MAKEFLAGS によって引き起こされていることを確認してから、バグトラッカーに報告してください。

利用可能なオプションの全ては `man make` を見て下さい。

### パッケージの出力

次に、ソースファイルやパッケージが置かれる場所、パッケージ作成者としての名前を設定することができます。このステップは任意です; デフォルトでは、パッケージは makepkg が実行された作業ディレクトリに作成されます。

    /etc/makepkg.conf

    [...]

    #########################################################################
    # PACKAGE OUTPUT
    #########################################################################
    #
    # Default: put built package and cached source in build directory
    #
    #-- Destination: specify a fixed directory where all packages will be placed
    #PKGDEST=/home/packages
    #-- Source cache: specify a fixed directory where source files will be cached
    #SRCDEST=/home/sources
    #-- Source packages: specify a fixed directory where all src packages will be placed
    #SRCPKGDEST=/home/srcpackages
    #-- Packager: name/email of the person or organization building packages
    #PACKAGER="John Doe <john@doe.com>"

    [...]

例えば、ディレクトリを作成して:

    $ mkdir /home/$USER/packages

`/etc/makepkg.conf` の `PKGDEST` 変数を修正してください。

`PACKAGER` 変数はコンパイルしたパッケージの `.PKGINFO` メタデータファイルの中に `packager` 値を設定します。デフォルトでは、ユーザーがコンパイルしたパッケージは以下のように表示されます:

    pacman -Qi package

    [...]
    Packager       : Unknown Packager
    [...]

設定した後:

    pacman -Qi package

    [...]
    Packager       : John Doe <john@doe.com>
    [...]

システム上で複数のユーザーがパッケージをコンパイルしていたり、あなたのパッケージを他のユーザーに渡す場合にこれを使うと有用です。

### 署名チェック

以下の手順は makepkg を使ったコンパイルに必須のものではありません、初期設定は #使用方法 に進んで下さい。一時的に署名チェックを無効にしたいときは makepkg コマンドに `--skippgpcheck` オプションを付けて呼び出して下さい。 PKGBUILD の source 行の一部に .sig の形で署名ファイルがあると、makepkg はソースファイルの信頼性を検証します。例えば、署名 `pkgname-pkgver.tar.gz.sig` は gpg プログラムによってファイル `pkgname-pkgver.tar.gz` の整合性のチェックに使われます。望むなら、他の開発者による署名を手動で GPG キーリングに追加することができます。詳細は GnuPG の記事を見て下さい。

Note: The signature checking implemented in makepkg does not use pacman's keyring. Configure gpg as explained below to allow makepkg reading pacman's keyring.

gpg キーはユーザーの `~/.gnupg/pubring.gpg` ファイルの中に保存されていると期待されています。与えられた署名が含まれていない場合、makepkg は警告を表示します。

    makepkg

    [...]
    ==> Verifying source file signatures with gpg...
    pkgname-pkgver.tar.gz ... FAILED (unknown public key 1234567890)
    ==> WARNING: Warnings have occurred while verifying the signatures.
        Please make sure you really trust them.
    [...]

現在の gpg キーのリストを表示するには gpg コマンドを使って下さい。

    gpg --list-keys

`pubring.gpg` ファイルが存在しない時はすぐに作成されます。gpg を設定して Arch Linux の開発者によって投稿された署名チェックが成功した AUR パッケージをコンパイルできるようにすることが可能です。 以下の行をあなたの gpg 設定ファイルの一番下に追加してユーザーの個人キーリングに pacman のキーリングを含めて下さい。

    ~/.gnupg/gpg.conf

    [...]
    keyring /etc/pacman.d/gnupg/pubring.gpg

前と同じように `gpg --list-keys` を実行すると出力にキーリングと開発者のリストが含まれています。

## 使用方法

次に進む前に、base-devel グループがインストールされているか確認してください。このグループに属しているパッケージは PKGBUILD の中に依存パッケージとして載せる必要はないことになっています。以下を (root で) 実行して "base-devel" グループをインストールしてください:

    # pacman -S base-devel

Note: 依存パッケージが欠けていることに不満を言う前に、全ての Arch Linux 環境では base グループがインストールされていることが前提になっていることを思い出してください。makepkg や AUR ヘルパーでビルドするときには "base-devel" グループがインストールされていることが前提になっています。

パッケージを作成するには、まず Creating Packages (日本語) に記述されているようにして PKGBUILD を作成するか ABS ツリーや Arch User Repository などから取得してくる必要があります。

Warning: 信頼できるソースからパッケージをビルド・インストールしてください。

`PKGBUILD` を入手したら、PKGBUILD が保存されているディレクトリに移動してから次のコマンドを実行して `PKGBUILD` に記述されたパッケージを作成します:

    $ makepkg

パッケージ作成後、要らなくなったファイル ($srcdir に展開されたファイルなど) を makepkg によって削除するには、以下のオプションを加えて下さい。同じパッケージをビルドしたりパッケージのバージョンを更新するときに、同じビルドフォルダを使う場合、このオプションは有益です。残ったファイルを新しいビルドに持ち越す危険がなくなります。

    $ makepkg -c

必要な依存パッケージが欠けている場合、makepkg は警告を表示します。必要な依存パッケージを自動的にインストールするには、次のコマンドを使って下さい:

    $ makepkg -s

依存パッケージが取ってこれるのは設定されたリポジトリからだけということに注意してください; 詳しくは pacman (日本語)#Repositories を見て下さい。また、ビルドの前に手動で依存パッケージをインストールすることもできます (`pacman -S --asdeps dep1 dep2`)。

全ての依存関係が解決されパッケージのビルドが成功すれば、パッケージファイル (`pkgname-pkgver.pkg.tar.xz`) が作業ディレクトリの中に作成されます。インストールするには、(root で) 次を実行してください:

    # pacman -U pkgname-pkgver.pkg.tar.xz

もしくは、`pacman -U pkgname-pkgver.pkg.tar.xz` を実行する代わりに `-i` フラグを使ってインストールすることもできます:

    $ makepkg -i

## Tips and Tricks

### コンパイル時間を短縮する

パッケージをコンパイルするのは I/O に負担がかかる作業のため、tmpfs を利用することでビルド時間を大幅に短縮することができます。該当する `/etc/makepkg.conf` のオプションは `BUILD ENVIRONMENT` セクションの一番下にあります:

    /etc/makepkg.conf

    [...]

    #########################################################################
    # BUILD ENVIRONMENT
    #########################################################################
    #
    # Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign)
    #  A negated environment option will do the opposite of the comments below.
    #
    #-- fakeroot: Allow building packages as a non-root user
    #-- distcc:   Use the Distributed C/C++/ObjC compiler
    #-- color:    Colorize output messages
    #-- ccache:   Use ccache to cache compilation
    #-- check:    Run the check() function if present in the PKGBUILD
    #-- sign:     Generate PGP signature file
    #
    BUILDENV=(fakeroot !distcc color !ccache check !sign)
    #
    #-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
    #-- specify a space-delimited list of hosts running in the DistCC cluster.
    #DISTCC_HOSTS=""
    #
    #-- Specify a directory for package building.
    #BUILDDIR=/tmp/makepkg

    [...]

`BUILDDIR=/tmp/makepkg` 行をアンコメントして `BUILDDIR=/tmp/builds` などに設定すれば (もしくはデフォルトの値のままにすれば) Arch のデフォルトの `/tmp` tmpfs が使用されます。

Note: tmpfs フォルダは `noexec` オプションを付けずにマウントされている必要があります。このオプションを使うとビルドスクリプトやユーティリティが実行できません。また、fstab (日本語)#tmpfs に記されているように、デフォルトのサイズは利用できる RAM の半分となっており、容量を全て使いきってしまうおそれがあります。

tmpfs でコンパイルしたパッケージは再起動するとなくなってしまうので注意してください。そのため、何度もインストールするようなパッケージは他の（永続的な）ディレクトリに移動したほうが良いでしょう。

### md5sum を新規作成する

pacman 4.1 から `makepkg -g >> PKGBUILD` は必要なくなり、pacman-contrib は `updpkgsums` スクリプトに併合されました。このスクリプトを使って PKGBUILD の中に新しいチェックサムを生成することができます:

    $ updpkgsums

### Makepkg が PKGBUILD を二度利用する

Makepkg は PKGBUILD を二度実行します (最初に実行した時と、fakeroot 下で2回目)。PKGBUILD に置かれた標準から外れた関数は全て同じく二度実行されます。

### WARNING: Package contains reference to $srcdir

リテラル文字列 `$srcdir` か `$pkgdir` があなたのパッケージ内のインストールされたファイルのどれかで終わっています。

ファイルを確認するには、makepkg のビルドディレクトリから次のコマンドを実行してください:

    $ grep -R "$(pwd)/src" pkg/

Link to discussion thread.

### 圧縮しないパッケージを作成する

パッケージをローカルでインストールしたいだけの場合、LZMA2 の圧縮と解凍を避けることでプロセスを高速化できます:

    /etc/makepkg.conf

    [...]
    #PKGEXT='.pkg.tar.xz'
    PKGEXT='.pkg.tar'
    [...]

### マルチコアを利用して圧縮する

xz は対称型マルチプロセッシング (SMP) による圧縮をサポートしていません。p7zip を使うことでマルチコアを活用できます:

    /etc/makepkg.conf

    [...]
    COMPRESSXZ=(7z a dummy -txz -si -so)
    [...]

AUR の xz-git は対称型マルチプロセッシング (SMP) をサポートしています。

    /etc/makepkg.conf

    [...]
    COMPRESSXZ=(xz -T0 -c -z -)
    [...]

## 参照

- gcccpuopt: 現在の CPU にあわせた gcc の cpu オプションを表示するスクリプト

Categories:

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