「Makepkg」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎md5sum を新規作成する: 記事さしかえ)
(文字列「http://doc.qt.io/」を「https://doc.qt.io/」に置換)
(3人の利用者による、間の15版が非表示)
24行目: 24行目:
 
{{Related|Arch Build System}}
 
{{Related|Arch Build System}}
 
{{Related articles end}}
 
{{Related articles end}}
[https://projects.archlinux.org/pacman.git/tree/scripts/makepkg.sh.in makepkg] はパッケージのビルドを自動化するためのスクリプトです。 このスクリプトを使用するための要件ビルド対応のUnixプラットフォームと[[PKGBUILD]]です。
+
[https://projects.archlinux.org/pacman.git/tree/scripts/makepkg.sh.in makepkg] はパッケージのビルドを自動化するスクリプトです。makepkg スクリプトを使用するはビルドが出来る Unix プラットフォームと [[PKGBUILD]] が必要です。
   
 
makepkg は {{Pkg|pacman}} パッケージの中に入っています。
 
makepkg は {{Pkg|pacman}} パッケージの中に入っています。
30行目: 30行目:
 
== 設定 ==
 
== 設定 ==
   
makepkg の設定オプションの詳細については{{ic|man makepkg.conf}} を参照してください。
+
makepkg の設定オプションについて詳しく {{ic|man makepkg.conf}} を参照してください。
   
システム構成は {{ic|/etc/makepkg.conf}} で利用できまが、ユーザ固有変更は {{ic|$XDG_CONFIG_HOME/pacman/makepkg.conf} または {{ic|~/.makepkg.conf} で行うことがきます。パッケージを作成する前に構成確認するをお勧めます
+
{{ic|/etc/makepkg.conf}} が makepkg のメインの設定ファイルですユーザー個別設定は {{ic|$XDG_CONFIG_HOME/pacman/makepkg.conf}} または {{ic|~/.makepkg.conf}} で可能です。パッケージをビルドする前に makepkg の設定オプション微調整するとよいでょう
   
=== パッケージ作成者情報
+
=== パッケージ作成者情報 ===
   
パッケージには、''パッケージ作成者''(''packager'') を識別するメタデータ付与されている。デフォルトでは、ユーザーがコンパイルしたパッケージは {{ic|Unknown Packager}} とマークされています。複数のユーザーがシステム上のパッケージをコンパイルする場合、パッケージを他のユーザーに配布している場合、実際の連絡先を入力すると便利です。 これは、{{ic|makepkg.conf}} の {{ic|PACKAGER}} 変数設定することで実行できます。
+
パッケージにはメタデータが付与されておりパッケージ作成者を識別することできます。デフォルトでは、ユーザーがコンパイルしたパッケージは {{ic|Unknown Packager}} となります。システム上の複数のユーザーがパッケージをコンパイルする場合、あるいはパッケージを他に配布る場合、実際の連絡先を入力すると便利です。{{ic|makepkg.conf}} の {{ic|PACKAGER}} 変数設定することできます。
   
インストールされたパッケージでこれを確認するには
+
インストールたパッケージの作成者情報を確認するには:
   
 
{{hc|$ pacman -Qi ''package''|<nowiki>
 
{{hc|$ pacman -Qi ''package''|<nowiki>
46行目: 46行目:
 
</nowiki>}}
 
</nowiki>}}
   
署名付きパッケージ自動的に生成するには{{ic|GPGKEY}} 変数設定します
+
生成したパッケージ自動的に署名するには {{ic|makepkg.conf}} で {{ic|GPGKEY}} 変数設定してください
   
 
=== パッケージの出力 ===
 
=== パッケージの出力 ===
   
  +
デフォルトでは ''makepkg'' はパッケージ tarball を作業ディレクトリに作成し、ソースデータを {{ic|src/}} ディレクトリに直接ダウンロードします。カスタムパスを設定することで、例えばビルドしたパッケージを {{ic|~/build/packages/}} に、ソースを全て {{ic|~/build/sources/}} に保存することができます。
次に、ソースファイルやパッケージが置かれる場所、パッケージ作成者としての名前を設定することができます。このステップは任意です; デフォルトでは、パッケージは makepkg が実行された作業ディレクトリに作成されます。
 
   
  +
必要に応じて以下の {{ic|makepkg.conf}} 変数を設定してください:
{{hc|/etc/makepkg.conf|<nowiki>
 
[...]
 
 
#########################################################################
 
# 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>"
 
 
[...]
 
</nowiki>}}
 
 
例えば、ディレクトリを作成して:
 
 
$ mkdir /home/$USER/packages
 
 
{{ic|/etc/makepkg.conf}} の {{ic|PKGDEST}} 変数を修正してください。
 
 
{{ic|PACKAGER}} 変数はコンパイルしたパッケージの {{ic|.PKGINFO}} メタデータファイルの中に {{ic|packager}} 値を設定します。デフォルトでは、ユーザーがコンパイルしたパッケージは以下のように表示されます:
 
 
{{hc|pacman -Qi package|<nowiki>
 
[...]
 
Packager : Unknown Packager
 
[...]
 
</nowiki>}}
 
 
設定した後:
 
 
{{hc|pacman -Qi package|<nowiki>
 
[...]
 
Packager : John Doe <john@doe.com>
 
[...]
 
</nowiki>}}
 
   
  +
* {{ic|PKGDEST}} &mdash; 生成したパッケージを保存するディレクトリ。
システム上で複数のユーザーがパッケージをコンパイルしていたり、あなたのパッケージを他のユーザーに渡す場合にこれを使うと有用です。
 
  +
* {{ic|SRCDEST}} &mdash; [[PKGBUILD#source|ソース]]データを保存するディレクトリ (別の場所を指定すると {{ic|src/}} へのシンボリックリンクが作成されます)。
  +
* {{ic|SRCPKGDEST}} &mdash; 生成したソースパッケージを保存するディレクトリ ({{ic|makepkg -S}} でビルドされます)。
   
 
=== 署名チェック ===
 
=== 署名チェック ===
139行目: 100行目:
 
$ makepkg -i
 
$ makepkg -i
   
  +
== ヒントとテクニック ==
== Tips and tricks ==
 
   
 
=== 最適化されたパッケージの作成 ===
 
=== 最適化されたパッケージの作成 ===
   
パッケージされたソフトウェアの性能向上は、ホストマシンに対してコンパイラの最適化を有効することによって達成できます。 欠点は、特定のプロセッサー・アーキテクチャー用にコンパイルされパッケージが他のマシンで正しく実行されいことです。x86_64マシンでは、パッケージを再構築する時間を投資することを保証するほど、実際のパフォーマンスが大幅に向上ることはめったにありません
+
makepkg のデフォルトでは、様々なマシンでインストールできるような一般的なパッケージを生成するようにオプションが設定されています。ホストマシンにあわせてコンパイラの最適化を有効することで、パッケージ化するソフトウェアの性能を向上させることができます。ただし特定のプロセッサアーキテクチャにあわせてパッケージをコンパイル場合、他のマシンで正しく動作しくなります。x86_64マシンでは、時間を投資して公パッケージをリビルドすることでそれに見合うだけのパフォーマンス向上を得られることは稀です
   
ただし、"非標準"のコンパイラフラグを使用することでパフォーマンスを低下させのは非常に簡単です。 コンパイラの多くの最適化は特定の状況でのみ有効であり、すべてのパッケージに無差別に適用するべきはありません。何かが速いこ確認/ベンチマークすることができない限り、そうでない可能性は非常に高いで!The Gentoo [http://www.gentoo.org/doc/en/gcc-optimization.xml Compilation Optimization Guide] and [http://wiki.gentoo.org/wiki/Safe_CFLAGS Safe CFLAGS] wiki の記事コンパイラの最適化に関する詳細な情報を提供しています。
+
標準のコンパイラフラグを使ことでパフォーマンスが劣化す可能性も十分あります。ほとんどのコンパイラオプションは特定の状況でのみ有効であり、無差別に全てのパッケージに適用しないほうが良いしょう。何かが速くなると確認ベンチマークできない限り、無駄にコンパイラオプションを使わないことを推奨しまGentoo [https://wiki.gentoo.org/wiki/GCC_optimization/ja コンパイル最適化ガイド] [https://wiki.gentoo.org/wiki/Safe_CFLAGS 安全な CFLAGS] 記事はコンパイラの最適化に関する詳しい解説が載っています。
   
C/C++コンパイラ({{pkg|gcc}} や {{Pkg|clang}} など)に渡されるオプションは{{ic|CFLAGS}},{{ic|CXXFLAGS}} および {{ic|CPPFLAGS}} 環境変数によって制御されます。同{{ic|make}}ビルドシステムは{{ic|MAKEFLAGS}} を使用します。Archビルドシステムで使用するために、makepkgは{{ic|makepkg.conf}} 設定オプションとしてこれらの環境変数を公開ています。 デフォルト値は幅広いマシンにインストールできる汎用パッケージを成するように設定されています。
+
C/C++ コンパイラ (例: {{Pkg|gcc}} や {{Pkg|clang}}) に渡されるオプションは {{ic|CFLAGS}}, {{ic|CXXFLAGS}}, {{ic|CPPFLAGS}} 環境変数制御されます。同じよう {{Pkg|make}} ビルドシステムは {{ic|MAKEFLAGS}} を使ます。Archビルドシステムでは {{ic|makepkg.conf}} 設定オプションとして ''makepkg'' はこれらの環境変数を使用します。デフォルト値は幅広いマシンにインストールできる汎用パッケージを成するように設定されています。
   
  +
{{Note|全てのビルドシステムが {{ic|makepkg.conf}} に設定した変数を使うわけではないということに注意してください。例えば ''cmake'' はプリプロセッサオプションの環境変数 {{ic|CPPFLAGS}} を無視します。多くの [[PKGBUILD]] にはパッケージ化するソフトウェアによって使われているビルドシステム固有のオプションが含まれています。}}
   
  +
GCC はアーキテクチャ固有の最適化を自動で認識・有効化することができます。自動最適化を使用するには、{{ic|-march}} と {{ic|-mtune}} フラグを全て削除してから {{ic|1=-march=native}} を追加してください。例:
{{Note|Keep in mind that not all build systems use the variables configured in {{ic|makepkg.conf}}. For example, ''cmake'' disregards the preprocessor options environment variable, {{ic|CPPFLAGS}}. Consequently, many [[PKGBUILD]]s contain workarounds with options specific to the build system used by the packaged software.}}
 
 
GCC can automatically detect and enable safe architecture-specific optimizations. To use this feature, first remove any {{ic|-march}} and {{ic|-mtune}} flags, then add {{ic|1=-march=native}}. For example,
 
   
 
CFLAGS="-march=native -O2 -pipe -fstack-protector-strong"
 
CFLAGS="-march=native -O2 -pipe -fstack-protector-strong"
 
CXXFLAGS="${CFLAGS}"
 
CXXFLAGS="${CFLAGS}"
   
  +
{{ic|1=march=native}} フラグによってどのフラグが有効になるのか確認するには、次のコマンドを実行してください:
To see what flags this enables on your machine, run:
 
   
 
$ gcc -march=native -v -Q --help=target
 
$ gcc -march=native -v -Q --help=target
   
 
{{Note|1=<nowiki></nowiki>
 
{{Note|1=<nowiki></nowiki>
* If you specify different value than {{ic|1=-march=native}}, then {{ic|1=-Q --help=target}} '''will not''' work as expected.[https://bbs.archlinux.org/viewtopic.php?pid=1616694#p1616694] You need to go through a compilation phase to find out which options are really enabled. See [https://wiki.gentoo.org/wiki/Safe_CFLAGS#Find_CPU-specific_options Find CPU-specific options] on Gentoo wiki for instructions.
+
* {{ic|1=-march=native}} 以外の値を指定した場合、{{ic|1=-Q --help=target}} は期待通りに機能しなくなります [https://bbs.archlinux.org/viewtopic.php?pid=1616694#p1616694]。どのオプションが実際に有効になるのかはコンパイルを行わないと分かりません。詳しくは Gentoo wiki [https://wiki.gentoo.org/wiki/Safe_CFLAGS#Find_CPU-specific_options Find CPU-specific options] を参照。
* To find out the optimal options for a '''32 bit''' x86 architecture, you can use the script [https://github.com/pixelb/scripts/blob/master/scripts/gcccpuopt gcccpuopt].
+
* [https://github.com/pixelb/scripts/blob/master/scripts/gcccpuopt gcccpuopt] スクリプトを使うことで '''32ビット'''の x86 アーキテクチャの最適化オプションを確認することができます。
 
}}
 
}}
   
==== MAKEFLAGS ====
+
====MAKEFLAGS====
   
{{ic|MAKEFLAGS}} オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: {{ic|-j4}}。{{ic|nproc}} を使うことで利用可能なプロセッサの数がわかります。[[PKGBUILD]] によっては、特定のバージョンで競合状態になったり、もしくはサポートされていないために、この値を {{ic|-j1}} で上書きします。これによってビルドが失敗するパッケージがある場合は、エラーがあなたの MAKEFLAGS によって引き起こされていることを確認してから、バグトラッカーに[[バグ報告ガイドライン|報告]]してください。
+
{{ic|MAKEFLAGS}} オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: {{ic|-j4}}。{{ic|nproc}} を使うことで利用可能なプロセッサの数がわかります。[[PKGBUILD]] によっては、特定のバージョンで競合状態になったり、もしくはマルチコアによるコンパイルがサポートされていないために、この値を {{ic|-j1}} で上書きします。これによってビルドが失敗するパッケージがある場合は、エラーがあなたの MAKEFLAGS によって引き起こされていることを確認してから、バグトラッカーに[[バグ報告ガイドライン|報告]]してください。
   
 
利用可能なオプションの全ては {{ic|man make}} を見て下さい。
 
利用可能なオプションの全ては {{ic|man make}} を見て下さい。
174行目: 134行目:
 
=== パッケージの堅牢化 ===
 
=== パッケージの堅牢化 ===
   
{{pkg|hardening-wrapper}} パッケージをインストールしてください。このパッケージは gcc や g++ などをラッピングして {{ic|/etc/hardening-wrapper.conf}} でセキュリティを強化するフラグを制御できます。
+
{{pkg|hardening-wrapper}}{{Broken package link|パッケージが存在しません}} パッケージをインストールしてください。このパッケージは gcc や g++ などをラッピングして {{ic|/etc/hardening-wrapper.conf}} でセキュリティを強化するフラグを制御できます。
   
 
ハードニングフラグを全て有効にするには:
 
ハードニングフラグを全て有効にするには:
253行目: 213行目:
   
 
=== 新しいチェックサムを生成する ===
 
=== 新しいチェックサムを生成する ===
  +
PKGBUILD ファイルが存在するディレクトリと同じディレクトリで以下のコマンドを実行すれば新しいチェックサムが生成されます:
  +
$ updpkgsums
   
  +
Windows の改行コード ({{ic|\r\n}}) に注意してください。Git はテキストファイルに含まれている Windows の改行コードを UNIX の改行コード {{ic|\n}} に置き換えるため、チェックサムが変わってしまいます。AUR のパッケージのチェックサムが検証できなかった場合、チェックサムを計算する前に以下のコマンドを使ってファイルの中から {{ic|\r}} を取り除いてみてください:
新しいチェックサムを生成するために、PKGBUILDファイルと同じディレクトリで次のコマンドを実行します。
 
  +
$ sed -i 's/\r//g' <filename>
   
  +
=== 他の圧縮アルゴリズムを使用する ===
$ updpkgsums
 
   
  +
{{ic|PKGEXT}} を変更することでパッケージの容量が増えるかわりにパッケージとインストールを高速化することができます。例えば、以下のコマンドではパッケージを圧縮しないようにします:
Windowsスタイルの改行( {{ic|\r\n}} )に注意してください。 Git はテキストファイルのUNIXスタイルの {{ic|\n} 改行に置き換えられます。これはチェックサムの違いにつながります。 AURでパッケージのチェックサム検証が失敗した場合は、各ファイルから {{ic|\r}} を削除してみてください。
 
   
  +
$ PKGEXT='.pkg.tar' makepkg
$ sed -i 's / \ r // g' <filename>
 
   
  +
以下のコマンドは lzop アルゴリズムを使用します ({{pkg|lzo}} パッケージのインストールが必要):
もちろん、チェックサムを計算する前にです。
 
   
  +
$ PKGEXT='.pkg.tar.lzo' makepkg
=== Makepkg が PKGBUILD を二度利用する ===
 
Makepkg は PKGBUILD を二度実行します (最初に実行した時と、fakeroot 下で2回目)。PKGBUILD に置かれた標準から外れた関数は全て同じく二度実行されます。
 
   
  +
上記の設定を永続化するには {{ic|/etc/makepkg.conf}} で {{ic|PKGEXT}} を設定してください。
=== 圧縮しないパッケージを作成する ===
 
パッケージをローカルでインストールしたいだけの場合、[[Wikipedia:ja:xz (ファイルフォーマット)|LZMA2]] の圧縮と解凍を避けることでプロセスを高速化できます:
 
   
  +
=== マルチコアを利用して圧縮する ===
{{hc|/etc/makepkg.conf|2=
 
  +
{{pkg|xz}} は[[Wikipedia:ja:対称型マルチプロセッシング|対称型マルチプロセッシング (SMP)]] による圧縮をサポートしています。{{ic|--threads}} フラグを使うことで圧縮が高速化されます。例えば、makepkg で出来る限り多くの CPU コアを使ってパッケージを圧縮するには、{{ic|/etc/makepkg.conf}} の {{ic|COMPRESSXZ}} 配列を編集:
[...]
 
#PKGEXT='.pkg.tar.xz'
 
PKGEXT='.pkg.tar'
 
[...]
 
}}
 
   
  +
COMPRESSXZ=(xz -c -z - '''--threads=0''')
以下のように圧縮アルゴリズムを指定してビルドすることもできます (lzop アルゴリズムを使用する例、{{pkg|lzo}} パッケージが必要です):
 
   
  +
{{pkg|gzip}} の代替である並列実装の {{pkg|pigz}} はデフォルトで全ての CPU コアを使用します ({{ic|-p/--processes}} フラグを使うことでコアの数を減らせます):
$ PKGEXT='.pkg.tar.lzo' makepkg
 
   
  +
COMPRESSGZ=('''pigz''' -c -f -n)
=== マルチコアを利用して圧縮する ===
 
{{pkg|xz}} は[[Wikipedia:ja:対称型マルチプロセッシング|対称型マルチプロセッシング (SMP)]] による圧縮をサポートしています。{{ic|--threads}} オプションを使うことでマルチコアを活用できます:
 
 
{{hc|/etc/makepkg.conf|2=
 
[...]
 
COMPRESSXZ=(xz -c -z - '''--threads=0''')
 
[...]
 
}}
 
   
 
=== 64ビット環境で32ビットのパッケージをビルド ===
 
=== 64ビット環境で32ビットのパッケージをビルド ===
316行目: 266行目:
   
 
=== QMAKE を使用するパッケージで makepkg.conf の CFLAGS/CXXFLAGS/CPPFLAGS が適用されない ===
 
=== QMAKE を使用するパッケージで makepkg.conf の CFLAGS/CXXFLAGS/CPPFLAGS が適用されない ===
Qmake は {{ic|CFLAGS}} と {{ic|CXXFLAGS}} 変数を自動的に設定します。makepkg の設定ファイルで定義した変数を qmake に使わせるには、PKGBUILD を編集して [http://doc.qt.io/qt-5/qmake-variable-reference.html#qmake-cflags-release QMAKE_CFLAGS_RELEASE] と [http://doc.qt.io/qt-5/qmake-variable-reference.html#qmake-cxxflags-release QMAKE_CXXFLAGS_RELEASE] 変数を qmake に指定する必要があります。例:
+
Qmake は {{ic|CFLAGS}} と {{ic|CXXFLAGS}} 変数を自動的に設定します。makepkg の設定ファイルで定義した変数を qmake に使わせるには、PKGBUILD を編集して [https://doc.qt.io/qt-5/qmake-variable-reference.html#qmake-cflags-release QMAKE_CFLAGS_RELEASE] と [https://doc.qt.io/qt-5/qmake-variable-reference.html#qmake-cxxflags-release QMAKE_CXXFLAGS_RELEASE] 変数を qmake に指定する必要があります。例:
   
 
{{hc|PKGBUILD|<nowiki>
 
{{hc|PKGBUILD|<nowiki>
334行目: 284行目:
 
</nowiki>}}
 
</nowiki>}}
   
もしくは、システム全体で設定したい場合、{{ic|qmake.conf}} を作成して [http://doc.qt.io/qt-5/qmake-environment-reference.html#qmakespec QMAKESPEC] 環境変数を設定してください。
+
もしくは、システム全体で設定したい場合、{{ic|qmake.conf}} を作成して [https://doc.qt.io/qt-5/qmake-environment-reference.html#qmakespec QMAKESPEC] 環境変数を設定してください。
   
 
=== QMAKE を使用するパッケージのインストールディレクトリを指定する ===
 
=== QMAKE を使用するパッケージのインストールディレクトリを指定する ===
367行目: 317行目:
 
$ grep -R "$(pwd)/src" pkg/
 
$ grep -R "$(pwd)/src" pkg/
   
詳しくは [http://www.mail-archive.com/arch-general@archlinux.org/msg15561.html こちら] を参照。
+
詳しくは [https://www.mail-archive.com/arch-general@archlinux.org/msg15561.html こちら] を参照。
   
 
== 参照 ==
 
== 参照 ==
  +
* [https://www.archlinux.org/pacman/makepkg.8.html makepkg(8) マニュアルページ]
  +
* [https://www.archlinux.org/pacman/makepkg.conf.5.html makepkg.conf(5) マニュアルページ]
 
* [https://github.com/pixelb/scripts/blob/master/scripts/gcccpuopt gcccpuopt]: 現在の CPU にあわせた gcc の cpu オプションを表示するスクリプト
 
* [https://github.com/pixelb/scripts/blob/master/scripts/gcccpuopt gcccpuopt]: 現在の CPU にあわせた gcc の cpu オプションを表示するスクリプト
 
* [https://projects.archlinux.org/pacman.git/tree/scripts/makepkg.sh.in makepkg のソースコード]
 
* [https://projects.archlinux.org/pacman.git/tree/scripts/makepkg.sh.in makepkg のソースコード]

2018年2月6日 (火) 23:42時点における版

関連記事

makepkg はパッケージのビルドを自動化するスクリプトです。makepkg スクリプトを使用するにはビルドが出来る Unix プラットフォームと PKGBUILD が必要です。

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

設定

makepkg の設定オプションについて詳しくは man makepkg.conf を参照してください。

/etc/makepkg.conf が makepkg のメインの設定ファイルです。ユーザー個別の設定は $XDG_CONFIG_HOME/pacman/makepkg.conf または ~/.makepkg.conf で可能です。パッケージをビルドする前に makepkg の設定オプションを微調整するとよいでしょう。

パッケージ作成者の情報

パッケージにはメタデータが付与されておりパッケージ作成者を識別することができます。デフォルトでは、ユーザーがコンパイルしたパッケージは Unknown Packager となります。システム上の複数のユーザーがパッケージをコンパイルする場合、あるいはパッケージを他者に配布する場合、実際の連絡先を入力すると便利です。makepkg.confPACKAGER 変数で設定することができます。

インストールしたパッケージの作成者情報を確認するには:

$ pacman -Qi package
[...]
Packager       : John Doe <john@doe.com>
[...]

生成したパッケージに自動的に署名するには makepkg.confGPGKEY 変数を設定してください。

パッケージの出力

デフォルトでは makepkg はパッケージ tarball を作業ディレクトリに作成し、ソースデータを src/ ディレクトリに直接ダウンロードします。カスタムパスを設定することで、例えばビルドしたパッケージを ~/build/packages/ に、ソースを全て ~/build/sources/ に保存することができます。

必要に応じて以下の makepkg.conf 変数を設定してください:

  • PKGDEST — 生成したパッケージを保存するディレクトリ。
  • SRCDESTソースデータを保存するディレクトリ (別の場所を指定すると src/ へのシンボリックリンクが作成されます)。
  • SRCPKGDEST — 生成したソースパッケージを保存するディレクトリ (makepkg -S でビルドされます)。

署名チェック

ノート: makepkg で実装されている署名チェックは pacman のキーリングを使用しません [1]。代わりにユーザーのキーリングが使われます。

.sig.asc 形式の署名ファイルが PKGBUILD の source 行に含まれている場合、makepkg は自動的に署名を検証します。ユーザーのキーリングに署名検証に必要な公開鍵が存在しない場合、makepkg はインストールを停止して PGP 鍵が検証できないというメッセージを表示します。

PKGBUILDvalidpgpkeys エントリで鍵 ID が指定されているときパッケージをビルドするには公開鍵が必要になります。公開鍵が存在しない場合、あるいは他の開発者による公開鍵を追加したい場合、手動で鍵をインポートするか、もしくは鍵サーバーを使ってインポートすることができます。

使用方法

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

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

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

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

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

$ makepkg

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

$ makepkg -c

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

$ makepkg -s

依存パッケージが取ってこれるのは設定されたリポジトリからだけということに注意してください; 詳しくは pacman#リポジトリ を見て下さい。また、ビルドの前に手動で依存パッケージをインストールすることもできます (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

ヒントとテクニック

最適化されたパッケージの作成

makepkg のデフォルトでは、様々なマシンでインストールできるような一般的なパッケージを生成するようにオプションが設定されています。ホストマシンにあわせてコンパイラの最適化を有効化することで、パッケージ化するソフトウェアの性能を向上させることができます。ただし特定のプロセッサアーキテクチャにあわせてパッケージをコンパイルした場合、他のマシンでは正しく動作しなくなります。x86_64 のマシンでは、時間を投資して公式のパッケージをリビルドすることでそれに見合うだけのパフォーマンスの向上を得られることは稀です。

標準外のコンパイラフラグを使うことでパフォーマンスが劣化する可能性も十分あります。ほとんどのコンパイラオプションは特定の状況でのみ有効であり、無差別に全てのパッケージに適用しないほうが良いでしょう。何かが速くなると確認・ベンチマークできない限り、無駄にコンパイラオプションを使わないことを推奨します。Gentoo の コンパイル最適化ガイド安全な CFLAGS 記事にはコンパイラの最適化に関する詳しい解説が載っています。

C/C++ コンパイラ (例: gccclang) に渡されるオプションは CFLAGS, CXXFLAGS, CPPFLAGS 環境変数で制御されます。同じように make ビルドシステムは MAKEFLAGS を使います。Arch のビルドシステムでは makepkg.conf の設定オプションとして makepkg はこれらの環境変数を使用します。デフォルト値は幅広いマシンにインストールできる汎用のパッケージを作成するように設定されています。

ノート: 全てのビルドシステムが makepkg.conf に設定した変数を使うわけではないということに注意してください。例えば cmake はプリプロセッサオプションの環境変数 CPPFLAGS を無視します。多くの PKGBUILD にはパッケージ化するソフトウェアによって使われているビルドシステム固有のオプションが含まれています。

GCC はアーキテクチャ固有の最適化を自動で認識・有効化することができます。自動最適化を使用するには、-march-mtune フラグを全て削除してから -march=native を追加してください。例:

CFLAGS="-march=native -O2 -pipe -fstack-protector-strong"
CXXFLAGS="${CFLAGS}"

march=native フラグによってどのフラグが有効になるのか確認するには、次のコマンドを実行してください:

$ gcc -march=native -v -Q --help=target
ノート:
  • -march=native 以外の値を指定した場合、-Q --help=target は期待通りに機能しなくなります [2]。どのオプションが実際に有効になるのかはコンパイルを行わないと分かりません。詳しくは Gentoo wiki の Find CPU-specific options を参照。
  • gcccpuopt スクリプトを使うことで 32ビットの x86 アーキテクチャの最適化オプションを確認することができます。

MAKEFLAGS

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

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

パッケージの堅牢化

hardening-wrapper[リンク切れ: パッケージが存在しません] パッケージをインストールしてください。このパッケージは gcc や g++ などをラッピングして /etc/hardening-wrapper.conf でセキュリティを強化するフラグを制御できます。

ハードニングフラグを全て有効にするには:

/etc/hardening-wrapper.conf
HARDENING_BINDNOW=1
HARDENING_PIE=1
HARDENING_FORTIFY=2
HARDENING_RELRO=1
HARDENING_STACK_CHECK=1
HARDENING_STACK_PROTECTOR=2

インストール後、/etc/profilesource するか、一度ログアウトしてログインしなおす必要があります。ラッパーが使われているか確認するには:

$ which gcc
/usr/lib/hardening-wrapper/bin/gcc

後は普通にパッケージを作成すれば自動的に使用されます。

セキュリティを高めるフラグが使われているかどうか確認したい場合、checksec パッケージをインストールしてください。個別の実行ファイルをチェックしたり、ディレクトリを再帰的にチェックできます。例:

$ checksec --dir /tmp/makepkg/dwm/pkg/dwm/usr/bin
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FORTIFY Checked         Total   Filename
Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   Yes     4               6       /tmp/makepkg/dwm/pkg/dwm/usr/bin/dwm

セキュリティ#パッケージの再ビルドも参照してください。

特定のパッケージ作成者によるパッケージを表示

以下のコマンドはシステムにインストールされているパッケージの中から packagername という名前のパッケージ作成者によって作られたパッケージを全て表示します:

$ expac "%n %p" | grep "packagername" | column -t

以下のコマンドは /etc/makepkgPACKAGER 変数に設定されている値とパッケージ作成者が一致するパッケージを表示します (/etc/pacman.conf に定義されているリポジトリに含まれているパッケージだけが対象):

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

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

tmpfs

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

/etc/makepkg.conf
[...]

#########################################################################
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(!distcc color !ccache check !sign)
#  A negated environment option will do the opposite of the comments below.
#
#-- 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=(!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 が使用されます。

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

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

ccache

ccache を使うことでコンパイル結果をキャッシュしてビルド時間を短縮できます。

新しいチェックサムを生成する

PKGBUILD ファイルが存在するディレクトリと同じディレクトリで以下のコマンドを実行すれば新しいチェックサムが生成されます:

$ updpkgsums

Windows の改行コード (\r\n) に注意してください。Git はテキストファイルに含まれている Windows の改行コードを UNIX の改行コード \n に置き換えるため、チェックサムが変わってしまいます。AUR のパッケージのチェックサムが検証できなかった場合、チェックサムを計算する前に以下のコマンドを使ってファイルの中から \r を取り除いてみてください:

$ sed -i 's/\r//g' <filename>

他の圧縮アルゴリズムを使用する

PKGEXT を変更することでパッケージの容量が増えるかわりにパッケージとインストールを高速化することができます。例えば、以下のコマンドではパッケージを圧縮しないようにします:

$ PKGEXT='.pkg.tar' makepkg

以下のコマンドは lzop アルゴリズムを使用します (lzo パッケージのインストールが必要):

$ PKGEXT='.pkg.tar.lzo' makepkg

上記の設定を永続化するには /etc/makepkg.confPKGEXT を設定してください。

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

xz対称型マルチプロセッシング (SMP) による圧縮をサポートしています。--threads フラグを使うことで圧縮が高速化されます。例えば、makepkg で出来る限り多くの CPU コアを使ってパッケージを圧縮するには、/etc/makepkg.confCOMPRESSXZ 配列を編集:

COMPRESSXZ=(xz -c -z - --threads=0)

gzip の代替である並列実装の pigz はデフォルトで全ての CPU コアを使用します (-p/--processes フラグを使うことでコアの数を減らせます):

COMPRESSGZ=(pigz -c -f -n)

64ビット環境で32ビットのパッケージをビルド

警告: この方法で linux パッケージをビルドしようとすると問題が発生するという報告があります。カーネルパッケージをビルドする場合は chroot を使用する方法を使うことを推奨します。

まず multilib リポジトリを有効にして multilib-develインストールしてください。gccgcc-libs パッケージを削除するかどうかきかれたら yes と答えてください。gcc-multilib は64ビットと32ビット両方のソフトウェアをビルドすることができます。

それから32ビットの設定ファイルを作成:

~/.makepkg.i686.conf
CARCH="i686"
CHOST="i686-unknown-linux-gnu"
CFLAGS="-m32 -march=i686 -mtune=generic -O2 -pipe -fstack-protector-strong"
CXXFLAGS="${CFLAGS}"
LDFLAGS="-m32 -Wl,-O1,--sort-common,--as-needed,-z,relro"

そして makepkg を以下のように実行してください:

$ linux32 makepkg --config ~/.makepkg.i686.conf

トラブルシューティング

Makepkg によるパッケージの署名に失敗する

gnupg 2.1 から gpg-agent は手動で起動する必要がなくなり、gpg を実行したときに自動的に起動します。gpg-agent を手動で起動しなかったとき makepkg によって起動されます。問題は makepkg が fakeroot で gpg を起動するため、gpg-agent も同じ環境で起動されてしまいます。これによって問題が起こります。makepkg を実行する前に手動で gpg-agent を起動することで解決できますが (詳しくは GnuPG#gpg-agent を参照)、信頼性のある方法ではありません: FS#49946

gpg-agent の設定に頭を使いたくない場合、署名は後回しにして makepkg を実行し、それから gpg --detach-sign name.pkg.tar.xz でパッケージに署名する方法もあります。

QMAKE を使用するパッケージで makepkg.conf の CFLAGS/CXXFLAGS/CPPFLAGS が適用されない

Qmake は CFLAGSCXXFLAGS 変数を自動的に設定します。makepkg の設定ファイルで定義した変数を qmake に使わせるには、PKGBUILD を編集して QMAKE_CFLAGS_RELEASEQMAKE_CXXFLAGS_RELEASE 変数を qmake に指定する必要があります。例:

PKGBUILD
...

build() {
  cd "$srcdir/$_pkgname-$pkgver-src"
  qmake-qt4 "$srcdir/$_pkgname-$pkgver-src/$_pkgname.pro" \
    PREFIX=/usr \
    QMAKE_CFLAGS_RELEASE="${CFLAGS}"\
    QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS}"

  make
}

...

もしくは、システム全体で設定したい場合、qmake.conf を作成して QMAKESPEC 環境変数を設定してください。

QMAKE を使用するパッケージのインストールディレクトリを指定する

qmake によって生成される makefile は INSTALL_ROOT 環境変数を使ってプログラムをインストールするディレクトリを指定します。したがって package 関数を以下のようにしてください:

PKGBUILD
...

package() {
	cd "$srcdir/${pkgname%-git}"
	make INSTALL_ROOT="$pkgdir" install
}

...

また、qmake を正しく設定する必要があります。例えば .pro ファイルに以下を記述してください:

YourProject.pro
...

target.path = /usr/local/bin
INSTALLS += target

...

WARNING: Package contains reference to $srcdir

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

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

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

詳しくは こちら を参照。

参照