「Makepkg」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(他言語へのリンクを修正)
 
(7人の利用者による、間の49版が非表示)
2行目: 2行目:
 
[[Category:パッケージ開発]]
 
[[Category:パッケージ開発]]
 
[[Category:Arch について]]
 
[[Category:Arch について]]
  +
[[Category:コマンド]]
[[ar:Makepkg]]
 
[[el:Makepkg]]
+
[[Category:OpenPGP]]
 
[[en:Makepkg]]
 
[[en:Makepkg]]
 
[[es:Makepkg]]
 
[[es:Makepkg]]
[[fa:Makepkg]]
+
[[fr:Makepkg]]
[[fr:makepkg]]
 
[[it:Makepkg]]
 
[[nl:Makepkg]]
 
 
[[pt:Makepkg]]
 
[[pt:Makepkg]]
 
[[ru:Makepkg]]
 
[[ru:Makepkg]]
[[sr:Makepkg]]
 
[[tr:Makepkg]]
 
 
[[zh-hans:Makepkg]]
 
[[zh-hans:Makepkg]]
 
{{Related articles start}}
 
{{Related articles start}}
24行目: 19行目:
 
{{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行目: 25行目:
 
== 設定 ==
 
== 設定 ==
   
makepkg の設定オプションの詳細については{{ic|man makepkg.conf}} を参照してください。
+
makepkg の設定オプションについて詳しく {{man|5|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行目: 41行目:
 
</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>
 
[...]
 
   
  +
* {{ic|PKGDEST}} &mdash; 生成したパッケージを保存するディレクトリ。
#########################################################################
 
  +
* {{ic|SRCDEST}} &mdash; [[PKGBUILD#source|ソース]] データを保存するディレクトリ (別の場所を指定すると {{ic|src/}} へのシンボリックリンクが作成されます)
# PACKAGE OUTPUT
 
  +
* {{ic|SRCPKGDEST}} &mdash; 生成したソースパッケージを保存するディレクトリ ({{ic|makepkg -S}} でビルド)
#########################################################################
 
#
 
# 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>"
 
   
  +
{{Tip|{{ic|PKGDEST}} ディレクトリのキャッシュを削除する方法は [[pacman#パッケージキャッシュの削除]] を参照してください。例: {{ic|paccache -r -c ~/build/packages/}}}}
[...]
 
</nowiki>}}
 
   
  +
=== 署名チェック ===
例えば、ディレクトリを作成して:
 
   
  +
{{Note|makepkg で実装されている署名チェックは pacman のキーリングを使用しません [http://allanmcrae.com/2015/01/two-pgp-keyrings-for-package-management-in-arch-linux/] 代わりにユーザーのキーリングが使われます。}}
$ mkdir /home/$USER/packages
 
   
  +
''.sig'' または ''.asc'' の形式の署名ファイルが [[PKGBUILD]] ソース配列の一部である場合、''makepkg'' は自動的に [[GnuPG#署名の確認|検証]] を試みます。ユーザーのキーリングに署名の検証に必要な公開鍵が含まれていない場合、''makepkg'' は PGP 鍵を検証できなかったというメッセージを表示してインストールを中止します。
{{ic|/etc/makepkg.conf}} の {{ic|PKGDEST}} 変数を修正してください。
 
   
  +
パッケージに必要な公開鍵が欠落している場合、[[PKGBUILD]] には必要な鍵 ID を持つ [[PKGBUILD#validpgpkeys|validpgpkeys]] エントリが含まれている可能性が高くなります。その場合手動で [[GnuPG#鍵のインポート|インポート]] 、または [[GnuPG#鍵サーバーを使用|鍵サーバー上]] で見つけてそこからインポートします。署名チェックを一時的に無効にするには、{{ic|--skippgpcheck}} オプションを指定して ''makepkg'' を実行します。
{{ic|PACKAGER}} 変数はコンパイルしたパッケージの {{ic|.PKGINFO}} メタデータファイルの中に {{ic|packager}} 値を設定します。デフォルトでは、ユーザーがコンパイルしたパッケージは以下のように表示されます:
 
   
  +
== 使用方法 ==
{{hc|pacman -Qi package|<nowiki>
 
[...]
 
Packager : Unknown Packager
 
[...]
 
</nowiki>}}
 
   
  +
続行する前に、{{Grp|base-devel}} グループを [[インストール]] してください。このグループに属するパッケージは、[[PKGBUILD]] ファイルでビルド時の依存関係 (''makedepends'') としてリストする必要はありません。
設定した後:
 
   
{{hc|pacman -Qi package|<nowiki>
+
{{Note|1=<nowiki></nowiki>
  +
* [[pacman]] に渡されるコマンドに対して [[sudo]] が適切に設定されていることを確認してください。
[...]
 
  +
* ''makepkg'' 自体を root として実行することは [https://lists.archlinux.org/archives/list/pacman-dev@lists.archlinux.org/message/ZLRXMUGXULDHLTGSRYVGVWG3BVATV3OY/ 許可されていません].[https://gitlab.archlinux.org/pacman/pacman/blob/master/NEWS] {{ic|PKGBUILD}} に任意のコマンドが含まれる可能性があることに加えて、root としてビルドすることは一般的に安全ではないと考えられています。[https://bbs.archlinux.org/viewtopic.php?id=67561] 通常のユーザー アカウントにアクセスできないユーザーは、[http://allanmcrae.com/2015/01/replacing-makepkg-asroot/ nobody user] として makepkg を実行する必要があります。
Packager : John Doe <john@doe.com>
 
  +
}}
[...]
 
</nowiki>}}
 
   
  +
パッケージをビルドするには、[[パッケージの作成]] で説明されているように、まず [[PKGBUILD]] またはビルド スクリプトを作成する必要があります。既存のスクリプトは、[[Arch Build System]] ''(ABS)'' ツリーまたは [[AUR]] から入手できます。 {{ic|PKGBUILD}} を取得したら、それが保存されているディレクトリに移動し、次のコマンドを実行してパッケージをビルドします。
システム上で複数のユーザーがパッケージをコンパイルしていたり、あなたのパッケージを他のユーザーに渡す場合にこれを使うと有用です。
 
   
  +
$ makepkg
=== 署名チェック ===
 
   
  +
必要な依存関係が欠落している場合、''makepkg'' は失敗する前に警告を発します。パッケージをビルドして必要な依存関係をインストールするには、フラグ {{ic|-s}}/{{ic|--syncdeps}} を追加します。
{{Note|makepkg で実装されている署名チェックは pacman のキーリングを使用しません [http://allanmcrae.com/2015/01/two-pgp-keyrings-for-package-management-in-arch-linux/]。代わりにユーザーのキーリングが使われます。}}
 
   
  +
$ makepkg --syncdeps
{{ic|.sig}} や {{ic|.asc}} 形式の署名ファイルが [[PKGBUILD]] の source 行に含まれている場合、''makepkg'' は自動的に署名を検証します。ユーザーのキーリングに署名検証に必要な公開鍵が存在しない場合、''makepkg'' はインストールを停止して PGP 鍵が検証できないというメッセージを表示します。
 
   
  +
{{ic|-r}}/{{ic|--rmdeps}} フラグを追加すると、''makepkg'' は後で不要になった make 依存関係を削除します。常にパッケージをビルドしている場合は、[[Pacman ヒント#使用していないパッケージ (孤立したパッケージ) の削除]] を時々使用することを検討してください。
[[PKGBUILD]] に [[PKGBUILD#validpgpkeys|validpgpkeys]] エントリで鍵 ID が指定されているときパッケージをビルドするには公開鍵が必要になります。公開鍵が存在しない場合、あるいは他の開発者による公開鍵を追加したい場合、手動で鍵を[[GnuPG#鍵のインポート|インポート]]するか、もしくは[[GnuPG#鍵サーバーを使用する|鍵サーバー]]を使ってインポートすることができます。
 
   
  +
{{Note|
== 使用方法 ==
 
  +
* これらの依存関係は、構成されたリポジトリで利用可能である必要があります。詳細は [[pacman#リポジトリとミラー]] を参照してください。または、ビルドの前に依存関係を手動でインストールすることもできます ({{ic|pacman -S --asdeps ''dep1'' ''dep2''}})
  +
* 依存関係をインストールするときは、グローバル値のみが使用されます。つまり、分割パッケージのパッケージング関数で行われたオーバーライドは使用されません。
  +
}}
   
  +
すべての依存関係が満たされ、パッケージが正常にビルドされると、パッケージファイル ({{ic|''pkgname''-''pkgver''.pkg.tar.zst}}) が作業ディレクトリに作成されます。インストールするには、{{ic|-i}}/{{ic|--install}} を使用します ({{ic|pacman -U ''pkgname''-''pkgver''.pkg.tar.zst}}):
次に進む前に、{{Grp|base-devel}} グループがインストールされているか確認してください。このグループに属しているパッケージは [[PKGBUILD]] の中に依存パッケージとして載せる必要はないことになっています。以下を (root で) 実行して {{Grp|base-devel}} グループをインストールしてください:
 
   
  +
$ makepkg --install
# pacman -S base-devel
 
   
  +
{{ic|$srcdir}} に抽出されたファイルなど、残りのファイルとディレクトリをクリーンアップするには、オプション {{ic|-c}}/{{ic|--clean}} を追加します。これは、同じビルド ディレクトリを使用しながら、同じパッケージの複数のビルドやパッケージバージョンの更新に役立ちます。古いファイルや残りのファイルが新しいビルドに引き継がれるのを防ぎます。
{{Note|依存パッケージが欠けていることに不満を言う前に、全ての Arch Linux 環境では {{Grp|base}} グループがインストールされていることが前提になっていることを思い出してください。'''makepkg''' や [[AUR ヘルパー]]でビルドするときには {{Grp|base-devel}} グループがインストールされていることが前提になっています。}}
 
   
  +
$ makepkg --clean
パッケージを作成するには、まず[[パッケージの作成]]に記述されているようにして [[PKGBUILD]] を作成するか [[Arch Build System|ABS ツリー]]や [[Arch User Repository]] などから取得してくる必要があります。
 
   
  +
詳細については、{{man|8|makepkg}} を参照してください。
{{Warning|信頼できるソースからパッケージをビルド・インストールしてください。}}
 
   
  +
== 最適化 ==
{{ic|PKGBUILD}} を入手したら、PKGBUILD が保存されているディレクトリに移動してから次のコマンドを実行して {{ic|PKGBUILD}} に記述されたパッケージを作成します:
 
   
  +
デフォルトのオプションは、{{Pkg|devtools}} が [[公式リポジトリ]] のパッケージを構築するために使用するオプションと一致します。[https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173678] したがって、エンドユーザーは、ローカル環境に合わせて次のオプションを微調整することで、多かれ少なかれ大きなメリットを実感できる可能性があります。
$ makepkg
 
   
  +
=== パフォーマンス関連の変更 ===
パッケージ作成後、要らなくなったファイル ($srcdir に展開されたファイルなど) を makepkg によって削除するには、以下のオプションを加えて下さい。同じパッケージをビルドしたりパッケージのバージョンを更新するときに、同じビルドフォルダを使う場合、このオプションは有益です。残ったファイルを新しいビルドに持ち越す危険がなくなります。
 
   
  +
[https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/commit/90bf367e61b4f77f8351d0412be3d0c4ddadb85a Commit 90bf367e] ([https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/blob/6.0.2-9/makepkg.conf?ref_type=tags pacman 6.0.2-9 2024年2月から]) ローカル パッケージのビルド パフォーマンスに重要な影響を与える可能性がある 2 つの設定変更が実装されており、特にユーザーによるレビューが推奨されます。:
$ makepkg -c
 
   
  +
* {{ic|debug}} フラグと {{ic|lto}} フラグを有効にする: [[# デバッグパッケージと LTO を無効にする]] を参照してください。
必要な依存パッケージが欠けている場合、makepkg は警告を表示します。必要な依存パッケージを自動的にインストールするには、次のコマンドを使って下さい:
 
  +
* デフォルトの zstd 圧縮アルゴリズムレベルを {{ic|--ultra -20}} に設定: [[#圧縮レベルの変更]] を参照
   
  +
:{{Note|圧縮レベルの変更は、2024-08-16 [https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/commit/319671cc720a31cfaa81e25354d58699a1bedf6c] のコミット 319671cc で元に戻され、pacman 7.0 でロールアウトされます。[https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/merge_requests/19]}}
$ makepkg -s
 
   
  +
さらに詳しいコンテキストについては、[https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/merge_requests/1 Archlinux/packaging/packages/pacman!1] および [https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/issues/23 archlinux/packaging/packages/pacman#23] を参照してください。
依存パッケージが取ってこれるのは設定されたリポジトリからだけということに注意してください; 詳しくは [[pacman#リポジトリ]] を見て下さい。また、ビルドの前に手動で依存パッケージをインストールすることもできます ({{ic|pacman -S --asdeps dep1 dep2}})。
 
   
  +
=== 最適化されたバイナリの構築 ===
全ての依存関係が解決されパッケージのビルドが成功すれば、パッケージファイル ({{ic|pkgname-pkgver.pkg.tar.xz}}) が作業ディレクトリの中に作成されます。インストールするには、(root で) 次を実行してください:
 
   
  +
makepkg のデフォルトでは、様々なマシンでインストールできるような一般的なパッケージを生成するようにオプションが設定されています。ホストマシンにあわせてコンパイラの最適化を有効化することで、パッケージ化するソフトウェアの性能を向上させることができます。ただし特定のプロセッサアーキテクチャにあわせてパッケージをコンパイルした場合、他のマシンでは正しく動作しなくなります。x86_64 のマシンでは、時間を投資して公式のパッケージをリビルドすることでそれに見合うだけのパフォーマンスの向上を得られることは稀です。
# pacman -U pkgname-pkgver.pkg.tar.xz
 
   
  +
標準外のコンパイラフラグを使うことでパフォーマンスが劣化する可能性も十分あります。ほとんどのコンパイラオプションは特定の状況でのみ有効であり、無差別に全てのパッケージに適用しないほうが良いでしょう。何かが速くなると確認・ベンチマークできない限り、無駄にコンパイラオプションを使わないことを推奨します。Gentoo の [https://wiki.gentoo.org/wiki/GCC_optimization/ja コンパイル最適化ガイド] や [https://wiki.gentoo.org/wiki/Safe_CFLAGS 安全な CFLAGS] 記事にはコンパイラの最適化に関する詳しい解説が載っています。
もしくは、{{ic|pacman -U pkgname-pkgver.pkg.tar.xz}} を実行する代わりに {{ic|-i}} フラグを使ってインストールすることもできます:
 
   
  +
C/C++ コンパイラ (例: {{Pkg|gcc}} や {{Pkg|clang}}) に渡されるオプションは {{ic|CFLAGS}}, {{ic|CXXFLAGS}}, {{ic|CPPFLAGS}} 環境変数で制御されます。同じように {{Pkg|make}} ビルドシステムは {{ic|MAKEFLAGS}} を使います。Arch のビルドシステムでは {{ic|makepkg.conf}} の設定オプションとして ''makepkg'' はこれらの環境変数を使用します。デフォルト値は幅広いマシンにインストールできる汎用のパッケージを作成するように設定されています。
$ makepkg -i
 
   
  +
{{Note|
== Tips and tricks ==
 
  +
* すべてのビルドシステムが {{ic|makepkg.conf}} で設定された変数を使用するわけではないことに注意してください。たとえば、''cmake'' はプリプロセッサオプション環境変数 {{ic|CPPFLAGS}} を無視します。したがって、多くの [[PKGBUILD]] には、パッケージ化されたソフトウェアで使用されるビルドシステムに固有のオプションを使用した回避策が含まれています。
  +
* {{ic|Makefile}} のソースコードまたはコンパイルコマンドラインの特定の引数で指定された設定が優先され、{{ic|makepkg.conf}} の設定がオーバーライドされる可能性があります。
  +
}}
   
  +
GCC はアーキテクチャ固有の最適化を自動で認識・有効化することができます。自動最適化を使用するには、{{ic|-march}} と {{ic|-mtune}} フラグを全て削除してから {{ic|1=-march=native}} を追加してください。例:
=== 最適化されたパッケージの作成 ===
 
   
  +
{{hc|/etc/makepkg.conf|2=
パッケージ化されたソフトウェアの性能向上は、ホストマシンに対してコンパイラの最適化を有効にすることによって達成できます。 欠点は、特定のプロセッサー・アーキテクチャー用にコンパイルされたパッケージが他のマシン上で正しく実行されないことです。x86_64マシンでは、正式なパッケージを再構築する時間を投資することを保証するほど、実際のパフォーマンスが大幅に向上することはめったにありません。
 
  +
CFLAGS="'''-march=native''' -O2 -pipe ..."
  +
CXXFLAGS="${CFLAGS} ..."
  +
}}
   
  +
{{ic|1=march=native}} フラグによってどのフラグが有効になるのか確認するには、次のコマンドを実行してください:
ただし、"非標準"のコンパイラフラグを使用することでパフォーマンスを低下させるのは非常に簡単です。 コンパイラの多くの最適化は特定の状況でのみ有効であり、すべてのパッケージに無差別に適用するべきではありません。何かが速いことを確認/ベンチマークすることができない限り、そうでない可能性は非常に高いです!The Gentoo [http://www.gentoo.org/doc/en/gcc-optimization.xml Compilation Optimization Guide] と [http://wiki.gentoo.org/wiki/Safe_CFLAGS Safe CFLAGS] の記事では、コンパイラの最適化に関する詳細な情報を提供しています。
 
   
  +
$ gcc -march=native -v -Q --help=target
C/C++コンパイラ({{pkg|gcc}} や {{Pkg|clang}} など)に渡されるオプションは、{{ic|CFLAGS}},{{ic|CXXFLAGS}} および {{ic|CPPFLAGS}} 環境変数によって制御されます。同様に、{{ic|make}}ビルドシステムは{{ic|MAKEFLAGS}} を使用します。Archビルドシステムで使用するために、makepkgは{{ic|makepkg.conf}} 設定オプションとしてこれらの環境変数を公開しています。 デフォルト値は、幅広いマシンにインストールできる汎用パッケージを生成するように設定されています。
 
   
  +
{{Note|1=<nowiki></nowiki>
{{Note|すべてのビルドシステムが {{ic|makepkg.conf}} に設定された変数を使用するわけではないことに注意してください。 たとえば、''cmake'' はプリプロセッサオプション環境変数{{ic|CPPFLAGS}} を無視します。 したがって、多くの[[PKGBUILD]]には、パッケージ化されたソフトウェアで使用されるビルドシステムに固有のオプションによる回避策が含まれています。}}
 
  +
{{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#Manual Gentoo:Safe CFLAGS#Manual] を参照して下さい。
   
  +
}}
GCCは安全なアーキテクチャ固有の最適化を自動的に検出して有効にすることができます。この機能を使用するには、まず、{{ic|-march}} および {{ic|-mtune}} フラグを削除してから、 {{ic|1=-march=native}} を追加します。 例えば、
 
   
  +
{{ic|pacman}} バージョン 5.2.2 以降、{{ic|makepkg.conf}} には、Rust コンパイラに与えられるフラグの {{ic|RUSTFLAGS}} 環境変数のオーバーライドも含まれています。Rust コンパイラは、指定された {{ic|RUSTFLAGS}} 値に {{ic|1=-C target-cpu=native}} を追加することで、アーキテクチャ固有の最適化を検出して有効にすることもできます。
CFLAGS="-march=native -O2 -pipe -fstack-protector-strong"
 
CXXFLAGS="${CFLAGS}"
 
   
  +
{{hc|/etc/makepkg.conf|2=
マシン上でどのフラグが有効になっているかを確認するには、次のコマンドを実行します。
 
  +
RUSTFLAGS="-C opt-level=2 '''-C target-cpu=native'''"
  +
}}
   
  +
これにより有効になる CPU 機能を確認するには、次のコマンドを実行します。
$ gcc -march=native -v -Q --help=target
 
   
  +
$ rustc -C target-cpu=native --print cfg
{{Note|1=<nowiki></nowiki>
 
* {{ic|1=-march=native}} 以外の値を指定すると、{{ic|1=-Q --help=target}} は'''期待どおり'''に動作しません。[https://bbs.archlinux.org/viewtopic.php?pid=1616694#p1616694] どのオプションが実際に有効になっているかを調べるには、コンパイル段階を経なければなりません。詳細については、Gentoo wikiのCPU固有のオプションの検索を参照してください。
 
* '''32ビット''' x86アーキテクチャの最適なオプションを調べるには、[https://github.com/pixelb/scripts/blob/master/scripts/gcccpuopt gcccpuopt] スクリプトを使用できます。}}
 
   
  +
{{ic|1=-C target-cpu=native}} を指定せずに {{ic|--print cfg}} を実行すると、デフォルトの設定が出力されます。{{ic|opt-level}} パラメータは、必要に応じて、{{ic|3}}、{{ic|s}}、または {{ic|z}} に変更できます。詳細については、[https://doc.rust-lang.org/rustc/codegen-options/index.html#opt-level Rust コンパイラのドキュメント] を参照してください。
==== MAKEFLAGS ====
 
   
  +
=== ビルド時間を短縮する ===
{{ic|MAKEFLAGS}} オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: {{ic|-j4}}。{{ic|nproc}} を使うことで利用可能なプロセッサの数がわかります。[[PKGBUILD]] によっては、特定のバージョンで競合状態になったり、もしくはサポートされていないために、この値を {{ic|-j1}} で上書きします。これによってビルドが失敗するパッケージがある場合は、エラーがあなたの MAKEFLAGS によって引き起こされていることを確認してから、バグトラッカーに[[バグ報告ガイドライン|報告]]してください。
 
   
  +
==== 並列コンパイル ====
利用可能なオプションの全ては {{ic|man make}} を見て下さい。
 
   
  +
{{Pkg|make}} ビルドシステムは、{{ic|MAKEFLAGS}} [[環境変数]] を使用して、''make'' の追加オプションを指定します。 変数は、 {{ic|makepkg.conf}} ファイルでも設定できます。
=== パッケージの堅牢化 ===
 
   
  +
マルチコア/マルチプロセッサシステムを使用しているユーザーは、同時に実行するジョブの数を指定できます。 これは、 ''nproc'' を使用して使用可能なプロセッサの数を決定することで実現できます。 {{ic|1=MAKEFLAGS="-j $(nproc)"}} 一部の [[PKGBUILD]] は、特定のバージョンの競合状態のため、または単に最初からサポートされていないため、これを {{ic|-j1}} で具体的にオーバーライドします。 このためにビルドに失敗したパッケージは、エラーが実際に発生していることを確認した後、バグトラッカー(または[[AUR]]パッケージの場合はパッケージメンテナ)に [https://wiki.archlinux.jp/index.php/%E3%83%90%E3%82%B0%E5%A0%B1%E5%91%8A%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3 報告] して下さい {{ic|MAKEFLAGS}} が原因です。
{{pkg|hardening-wrapper}} パッケージをインストールしてください。このパッケージは gcc や g++ などをラッピングして {{ic|/etc/hardening-wrapper.conf}} でセキュリティを強化するフラグを制御できます。
 
   
  +
使用可能なオプションの完全なリストについては、 {{man|1|make}} を参照してください。
ハードニングフラグを全て有効にするには:
 
   
  +
==== メモリ内のファイルからビルドする ====
{{hc|1=/etc/hardening-wrapper.conf|2=
 
HARDENING_BINDNOW=1
 
HARDENING_PIE=1
 
HARDENING_FORTIFY=2
 
HARDENING_RELRO=1
 
HARDENING_STACK_CHECK=1
 
HARDENING_STACK_PROTECTOR=2}}
 
   
  +
コンパイルには多くの I/O 操作と小さなファイルの処理が必要なため、作業ディレクトリを [[tmpfs]] に移動すると、ビルド時間が早くなる可能性があります。
インストール後、{{ic|/etc/profile}} を [[source]] するか、一度ログアウトしてログインしなおす必要があります。ラッパーが使われているか確認するには:
 
   
  +
{{ic|BUILDDIR}} 変数を一時的に ''makepkg'' にエクスポートして、ビルドディレクトリを既存の tmpfs に設定できます。例えば:
$ which gcc
 
/usr/lib/hardening-wrapper/bin/gcc
 
   
  +
$ BUILDDIR=/tmp/makepkg makepkg
後は普通にパッケージを作成すれば自動的に使用されます。
 
   
  +
永続的な設定は、デフォルトの {{ic|/etc/makepkg.conf}} ファイルの {{ic|BUILDENVIRONMENT}} セクションの最後にある {{ic|BUILDDIR}} オプションのコメントを外すことで行うことができます。この値をたとえば {{ic|1=BUILDDIR=/tmp/makepkg}} に設定すると、 Arch のデフォルトの {{ic|/tmp}} テンポラリ・ファイル・システムが使用されます。
セキュリティを高めるフラグが使われているかどうか確認したい場合、{{pkg|checksec}} パッケージを[[インストール]]してください。個別の実行ファイルをチェックしたり、ディレクトリを再帰的にチェックできます。例:
 
   
  +
{{Note|
$ checksec --dir /tmp/makepkg/dwm/pkg/dwm/usr/bin
 
  +
* メモリ不足を防ぐために、 tmpfs で大きなパッケージをコンパイルすることは避けてください。
RELRO STACK CANARY NX PIE RPATH RUNPATH FORTIFY Checked Total Filename
 
  +
* tmpfs フォルダーは、 {{ic|noexec}} オプションなしでマウントする必要があります。そうしないと、ビルドされたバイナリが実行されなくなります。
Full RELRO Canary found NX enabled PIE enabled No RPATH No RUNPATH Yes 4 6 /tmp/makepkg/dwm/pkg/dwm/usr/bin/dwm
 
  +
* tmpfs でコンパイルされたパッケージは、再起動後も保持されないことに注意してください。 [[#Package output|PKGDEST]] オプションを適切に設定して、ビルドされたパッケージを永続ディレクトリに自動的に移動することを検討してください。
  +
}}
   
  +
==== コンパイルキャッシュの使用 ====
[[セキュリティ#パッケージの再ビルド]]も参照してください。
 
   
  +
[[ccache]] を使うことでコンパイル結果をキャッシュしてビルド時間を短縮できます。
=== 特定のパッケージ作成者によるパッケージを表示 ===
 
   
  +
==== mold linker の使用 ====
以下のコマンドはシステムにインストールされているパッケージの中から ''packagername'' という名前のパッケージ作成者によって作られたパッケージを全て表示します:
 
   
  +
{{Pkg|mold}} は、[[GCC|ld]]/[[LLVM|lld]] リンカーのドロップイン代替品であり、大幅に高速化されていると主張しています。
$ expac "%n %p" | grep "''packagername''" | column -t
 
   
  +
''mold'' を使用するには、{{ic|1=-fuse-ld=mold}} を {{ic|LDFLAGS}} に追加します。例えば:
以下のコマンドは {{ic|/etc/makepkg}} の {{ic|PACKAGER}} 変数に設定されている値とパッケージ作成者が一致するパッケージを表示します ({{ic|/etc/pacman.conf}} に定義されているリポジトリに含まれているパッケージだけが対象):
 
   
  +
{{hc|/etc/makepkg.conf|2=
$ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
 
  +
LDFLAGS="... -fuse-ld=mold"
  +
}}
   
  +
追加のオプションを ''mold'' に渡すには、それらを {{ic|LDFLAGS}} に追加します。例えば:
=== コンパイル時間を短縮する ===
 
   
  +
{{hc|/etc/makepkg.conf|2=
==== tmpfs ====
 
  +
LDFLAGS="... -fuse-ld=mold -Wl,--separate-debug-file"
  +
}}
   
  +
Rust パッケージに ''mold'' を使用するには、{{ic|1=-C link-arg=-fuse-ld=mold}} を {{ic|RUSTFLAGS}} に追加します。例えば:
パッケージをコンパイルするのは I/O に負担がかかる作業のため、[[tmpfs]] を利用することでビルド時間を大幅に短縮することができます。該当する {{ic|/etc/makepkg.conf}} のオプションは {{ic|BUILD ENVIRONMENT}} セクションの一番下にあります:
 
{{hc|/etc/makepkg.conf|<nowiki>
 
[...]
 
   
  +
{{hc|/etc/makepkg.conf|2=
#########################################################################
 
  +
RUSTFLAGS="... -C link-arg=-fuse-ld=mold"
# 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
 
   
  +
==== デバッグパッケージと LTO を無効にする ====
[...]
 
</nowiki>}}
 
   
  +
[https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/blob/6.0.2-9/makepkg.conf?ref_type=tags pacman 6.0.2-9 2024 年 2 月以降の] pacman 6.0.2-9 に含まれる [https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/commit/90bf367e61b4f77f8351d0412be3d0c4ddadb85a コミット 90bf367e] では、{{ic|debug}} と {{ic|lto}} オプションがデフォルトで有効になりました。
{{ic|1=BUILDDIR=/tmp/makepkg}} 行をアンコメントして {{ic|1=BUILDDIR=/tmp/builds}} などに設定すれば (もしくはデフォルトの値のままにすれば) Arch のデフォルトの {{ic|/tmp}} [[tmpfs]] が使用されます。
 
{{Note|[[tmpfs]] フォルダは {{ic|noexec}} オプションを付けずにマウントされている必要があります。このオプションを使うとビルドスクリプトやユーティリティが実行できません。また、[[tmpfs]] の記事に記されているように、デフォルトのサイズは利用できる RAM の半分となっており、容量を全て使いきってしまうおそれがあります。}}
 
[[tmpfs]] でコンパイルしたパッケージは再起動するとなくなってしまうので注意してください。そのため、何度もインストールするようなパッケージは他の(永続的な)ディレクトリに移動したほうが良いでしょう。
 
   
  +
デバッグパッケージをビルドすると、公式リポジトリがユーザーの問題をトラブルシューティングするためのツールが提供できるようになります ([https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173528 archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173528]) ただし、パッケージを独自にビルドする場合は必要なく、速度が低下します。ビルドプロセス [https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173782 archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173782] を参照してください。
==== ccache ====
 
   
  +
[[Wikipedia:Link-time optimization|Link-time optimization]] により最適化されたバイナリが生成されますが、ビルドプロセスは大幅に長くなります ([https://gitlab.archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173678 archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173678])
[[ccache]] を使うことでコンパイル結果をキャッシュしてビルド時間を短縮できます。
 
  +
これらのオプションを無効にするには、{{ic|!}} を追加します。{{ic|1=OPTIONS=()}} 配列の直前にある文字 {{ic|1=OPTIONS=(...!debug !lto...)}}
  +
  +
=== 圧縮 ===
  +
  +
==== 他の圧縮アルゴリズムを使用する ====
  +
  +
パッケージ アーカイブが大きくなる代わりに、パッケージングとインストールの両方を高速化するには、{{ic|PKGEXT}} を変更します。
  +
  +
たとえば、次の例ではパッケージ ファイルの圧縮がスキップされ、[[インストール]] で展開する必要がなくなります。
  +
  +
$ PKGEXT='.pkg.tar' makepkg
  +
  +
別の例として、以下は速度に重点を置いた LZ4 アルゴリズムを使用しています。
  +
  +
$ PKGEXT='.pkg.tar.lz4' makepkg
  +
  +
上記の設定を永続化するには {{ic|/etc/makepkg.conf}} で {{ic|PKGEXT}} を設定します。
  +
  +
==== マルチコアを利用して圧縮する ====
  +
  +
{{Pkg|zstd}} は、 {{ic|--threads}} フラグを介して [[Wikipedia:対称型マルチプロセッシング|対称型マルチプロセッシング(SMP)]] をサポートし、圧縮を高速化します。たとえば、 makepkg がパッケージを圧縮するためにできるだけ多くの CPU コアを使用できるようにするには、{{ic|/etc/makepkg.conf}} の {{ic|COMPRESSZST}} 配列を編集します:
  +
  +
COMPRESSZST=(zstd -c -z -q '''--threads=0''' -)
  +
  +
{{pkg|xz}} は[[Wikipedia:ja:対称型マルチプロセッシング|対称型マルチプロセッシング (SMP)]] による圧縮をサポートしています。{{ic|--threads}} フラグを使うことで圧縮が高速化されます。例えば、makepkg でできる限り多くの CPU コアを使ってパッケージを圧縮するには、{{ic|/etc/makepkg.conf}} の {{ic|COMPRESSXZ}} 配列を編集:
  +
  +
COMPRESSXZ=(xz -c -z '''--threads=0''' -)
  +
  +
{{pkg|gzip}} の代替である並列実装の {{pkg|pigz}} はデフォルトで全ての CPU コアを使用します ({{ic|-p/--processes}} フラグを使うことでコアの数を減らせます。)
  +
  +
COMPRESSGZ=('''pigz''' -c -f -n)
  +
  +
{{Pkg|pbzip2}}は、 {{Pkg|bzip2}} のドロップイン並列実装であり、デフォルトで使用可能なすべての CPU コアも使用します。 {{ic|-p#}} フラグを使用すると、使用するコアの数を減らすことができます(注: {{ic|-p}} とコアの数の間にスペースは必要ありません。)
  +
  +
COMPRESSBZ2=('''pbzip2''' -c -f)
  +
  +
{{Pkg|lbzip2}} は、デフォルトで利用可能なすべての CPU コアを使用する {{Pkg|bzip2}} の別のドロップイン並列実装です。{{ic|-n}} フラグを使用すると、使用するコアを減らすことができます。
  +
  +
COMPRESSBZ2=('''lbzip2''' -c -f)
  +
  +
{{AUR|plzip}} は {{Pkg|lzip}} のマルチスレッド実装であり、デフォルトで利用可能なすべての CPU コアも使用します。{{ic|-n}}/{{ic|--threads}} フラグを使用して、使用するコアを減らすことができます。
  +
  +
COMPERSSLZ=('''plzip''' -c -f)
  +
  +
==== 圧縮レベルの変更 ====
  +
  +
いくつかの圧縮アルゴリズム (zstd および xz を含む) は、速度、メモリ、圧縮効率の間のトレードオフを定義する圧縮レベルの設定をサポートしています。
  +
  +
== ヒントとテクニック ==
  +
  +
=== ソースのダウンロードと抽出の時間を短縮する ===
  +
  +
==== ソースの場所の定義 ====
  +
  +
特に [https://wiki.archlinux.jp/index.php/VCS_%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3 VCSパッケージ] をビルドするときに {{ic|SRCDEST}} を利用すると、以降のリビルドでソースの取得や展開にかかる時間を短縮できます。
   
 
=== 新しいチェックサムを生成する ===
 
=== 新しいチェックサムを生成する ===
   
新しいチェックサムを生成するために、PKGBUILDファイルと同じディレクトリでのコマンドを実行します
+
PKGBUILD ファイルが存在するディレクトリと同じディレクトリで以下のコマンドを実行すれば新いチェックサムが生成されます:
   
 
$ updpkgsums
 
$ updpkgsums
   
Windowsスタイルの改行( {{ic|\r\n}} )に注意してください。 Git はテキストファイルのUNIXスタイルの {{ic|\n} 改行に置き換えられます。これはチェックサムの違につながります。 AURパッケージのチェックサム検証が失敗した場合ファイルから {{ic|\r}} をてみてください
+
Windows の改行コード ({{ic|\r\n}}) に注意してください。Git はテキストファイルに含まれている Windows 改行コードを UNIX 改行コード {{ic|\n}} に置き換えるため、チェックサムが変わってしまいます。AURパッケージのチェックサム検証できなかった場合、チェックサムを計算する前に以下のコマンドを使ってファイルの中から {{ic|\r}} を取りてみてください:
   
$ sed -i 's / \ r // g' <filename>
+
$ sed -i 's/\r//g' <filename>
   
  +
=== ローカルのソースファイルからビルドする ===
もちろん、チェックサムを計算する前にです。
 
   
  +
ソース コードに変更を加えたい場合は、''-o, --nobuild ファイルのみをダウンロードして抽出する'' オプションを使用すると、パッケージをビルドせずにソースコードをダウンロードできます。
=== 他の圧縮アルゴリズムを使用する ===
 
   
  +
$ makepkg -o
パッケージとインストールの両方を高速化するために、より大きなパッケージアーカイブのトレードオフを使用して、{{ic|PKGEXT}} を変更することができます。たとえば、次のようにすると、パッケージアーカイブは1回の呼び出しに対してのみ圧縮解除されます。
 
   
  +
これで、ソースに変更を加えてから、''-e, --noextract ソースファイルを抽出しない (既存の $srcdir/ dir を使用)'' オプションを使用してパッケージをビルドできるようになりました。すでにビルドされているパッケージと既存のパッケージを上書きするには、''-f'' オプションを使用します。
$ PKGEXT='.pkg.tar' makepkg
 
   
  +
$ makepkg -ef
別の例として、以下は {{Pkg|lzo}} パッケージを必要とするlzopアルゴリズムを使用しています。
 
   
  +
=== 特定のパッケージ作成者によるパッケージを表示 ===
$ PKGEXT='.pkg.tar.lzo' makepkg
 
   
  +
以下のコマンドはシステムにインストールされているパッケージの中から ''packagername'' という名前のパッケージ作成者によって作られたパッケージを全て表示します:
これらの設定を永続化するには、{{ic|PKGEXT}} を {{ic|/etc/makepkg.conf}} に記述します。
 
   
  +
$ expac "%n %p" | grep "''packagername''" | column -t
=== マルチコアを利用して圧縮する ===
 
{{pkg|xz}} は[[Wikipedia:ja:対称型マルチプロセッシング|対称型マルチプロセッシング (SMP)]] による圧縮をサポートしています。{{ic|--threads}} オプションを使うことでマルチコアを活用できます:
 
   
  +
以下のコマンドは {{ic|/etc/makepkg}} の {{ic|PACKAGER}} 変数に設定されている値とパッケージ作成者が一致するパッケージを表示します ({{ic|/etc/pacman.conf}} に定義されているリポジトリに含まれているパッケージだけが対象):
{{hc|/etc/makepkg.conf|2=
 
  +
[...]
 
  +
$ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
COMPRESSXZ=(xz -c -z - '''--threads=0''')
 
[...]
 
}}
 
   
 
=== 64ビット環境で32ビットのパッケージをビルド ===
 
=== 64ビット環境で32ビットのパッケージをビルド ===
  +
 
{{Warning|この方法で {{Pkg|linux}} パッケージをビルドしようとすると問題が発生するという報告があります。カーネルパッケージをビルドする場合は [[64ビット環境に32ビット環境をインストール|chroot を使用する方法]]を使うことを推奨します。}}
 
{{Warning|この方法で {{Pkg|linux}} パッケージをビルドしようとすると問題が発生するという報告があります。カーネルパッケージをビルドする場合は [[64ビット環境に32ビット環境をインストール|chroot を使用する方法]]を使うことを推奨します。}}
   
300行目: 316行目:
 
$ linux32 makepkg --config ~/.makepkg.i686.conf
 
$ linux32 makepkg --config ~/.makepkg.i686.conf
   
  +
=== 署名の無いパッケージ ===
== トラブルシューティング ==
 
   
  +
[[Jenkins]] などの自動ビルド環境で署名に使用される gpg 秘密鍵のパスフレーズを提供できる人がいない場合があります。パスフレーズなしでシステムに秘密の gpg キーを保存することはお勧めできません。
=== Makepkg によるパッケージの署名に失敗する ===
 
   
  +
makepkg で作成された結果の zst パッケージは、作成後に署名することができます。
[https://www.gnupg.org/faq/whats-new-in-2.1.html gnupg 2.1] から gpg-agent は手動で起動する必要がなくなり、gpg を実行したときに自動的に起動します。gpg-agent を手動で起動しなかったとき makepkg によって起動されます。問題は makepkg が fakeroot で gpg を起動するため、gpg-agent も同じ環境で起動されてしまいます。これによって問題が起こります。makepkg を実行する前に手動で gpg-agent を起動することで解決できますが (詳しくは [[GnuPG#gpg-agent]] を参照)、信頼性のある方法ではありません: {{Bug|49946}}。
 
   
  +
$ gpg --detach-sign --pinentry-mode loopback --passphrase --passphrase-fd 0 --output ''NewlyBuilt.pkg.tar.zst.sig'' --sign ''NewlyBuilt.pkg.tar.zst''
gpg-agent の設定に頭を使いたくない場合、署名は後回しにして makepkg を実行し、それから {{ic|gpg --detach-sign ''name''.pkg.tar.xz}} でパッケージに署名する方法もあります。
 
   
  +
GPG パスフレーズは、選択したオートメーションスイートによって安全に提供され、隠蔽されます。
=== 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 に指定する必要があります。例:
 
   
  +
出来上がった {{ic|zst}} と {{ic|sig}} ファイルは有効な署名を期待する [[pacman]] クライアントや、あなた自身のリポジトリをホストするときに {{ic|repo-add --sign}} で作成したリポジトリから参照することができます。
{{hc|PKGBUILD|<nowiki>
 
...
 
   
  +
=== Magnet URIs ===
build() {
 
cd "$srcdir/$_pkgname-$pkgver-src"
 
qmake-qt4 "$srcdir/$_pkgname-$pkgver-src/$_pkgname.pro" \
 
PREFIX=/usr \
 
QMAKE_CFLAGS_RELEASE="${CFLAGS}"\
 
QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS}"
 
   
  +
{{ic|<nowiki>magnet://</nowiki>}} のプレフィックスを持つ magnet URIs リソースのサポートは {{AUR|transmission-dlagent}} ダウンロードエージェントを使って追加することができます。
make
 
}
 
   
  +
=== systemd コントロールグループでの makepkg の実行 ===
...
 
</nowiki>}}
 
   
  +
ビルドしているパッケージが、デフォルトの ''make'' フラグ (他のほとんどのパッケージでは適切に設定されている) を使用してビルドするには多くのリソースを必要とする場合は、そのパッケージを独自の [[コントロールグループ]] で実行してみて下さい。{{AUR|makepkg-cg}} は、systemd コントロールグループを介してこれを実現する ''makepkg'' のラッパーです ({{man|5|systemd.resource-control}} を参照)
もしくは、システム全体で設定したい場合、{{ic|qmake.conf}} を作成して [http://doc.qt.io/qt-5/qmake-environment-reference.html#qmakespec QMAKESPEC] 環境変数を設定してください。
 
  +
  +
=== アイドルスケジュールポリシーで実行 ===
  +
  +
パッケージのビルドプロセスは、特に [[#並列コンパイル]] の場合に CPU 使用率が高くなる可能性があります。CPU 負荷が高い場合、{{man|1|nice}} の値が最も高くても、システムの速度が大幅に低下し、使用できなくなる可能性があります。ユーザーインターフェイスとフォアグラウンドアプリケーションが途切れたり、応答しなくなったりすることがあります。
  +
  +
これは、''makepkg'' を実行する前に、スケジューリングポリシーを {{ic|SCHED_IDLE}} に変更することで回避できます。これにより、パッケージ構築プロセスが通常のタスクに干渉せず、残りの未使用の CPU 時間のみが利用されることが保証されます。
  +
  +
{{man|7|sched|SCHED_IDLE: Scheduling very low priority jobs}} から:
  +
  +
: このポリシーは、非常に低い優先度 ({{ic|SCHED_OTHER}} または {{ic|SCHED_BATCH}} ポリシーの +19 nice 値よりも低い) でジョブを実行することを目的としています。
  +
  +
{{ic|SCHED_IDLE}} ポリシーは、{{ic|-i}} フラグを指定して {{ic|1|chrt}} コマンドを実行し、優先度 0 ({{ic|SCHED_IDLE の唯一の有効なオプション) を指定して設定できます。}}) を使用し、現在のシェルの PID を指定します。
  +
  +
ほとんどのシェルの場合:
  +
  +
$ chrt -iap 0 $$
  +
  +
{{Tip|このコマンドを {{ic|makepkg.conf}} に置くことで、すべてのビルドに適用できます。}}
  +
  +
[[fish]] シェルの場合、{{ic|$$}} が設定されていない場合:
  +
  +
$ chrt -iap 0 %self
  +
  +
=== 各パッケージディレクトリ内の相対パス ===
  +
  +
[[#パッケージの出力|パッケージ出力オプション]] に絶対パスを使用する代わりに、各パッケージディレクトリ内に相対パスを設定することもできます。
  +
  +
{{Note|次のオプションは、{{ic|$startdir}} が定義されていないコンテキストで {{ic|makepkg.conf}} を使用する可能性があるため、一部の [[AUR ヘルパー]] で問題を引き起こす可能性があります。}}
  +
  +
たとえば、次のように {{ic|makepkg.conf}} ファイルでターゲットパスを定義できます。{{ic|$startdir}} 変数は、パッケージをビルドするときに {{ic|PKGBUILD}} が配置されるディレクトリを参照します。
  +
  +
PKGDEST="$startdir/build/packages/"
  +
SRCDEST="$startdir/build/sources/"
  +
SRCPKGDEST="$startdir/build/srcpackages/"
  +
LOGDEST="$startdir/logs/"
  +
  +
これにより、次のような結果が得られます。
  +
  +
* ビルドされたパッケージは、{{ic|"パッケージ ディレクトリ"/build/packages/}} に保存されます。
  +
* ダウンロードされたすべてのソースファイルは、{{ic|"パッケージ ディレクトリ"/build/sources/}} に保存されます。
  +
* ビルドされたソースパッケージは、{{ic|"パッケージ ディレクトリ"/build/srcpackages/}} に保存されます。
  +
* すべてのログは、{{ic|"パッケージ ディレクトリ"/logs/}} に保存されます。
  +
  +
''makepkg'' は通常どおりに {{ic|src/}} および {{ic|pkg/}} ディレクトリを作成するため、これは予期された動作です。
  +
  +
== トラブルシューティング ==
   
 
=== QMAKE を使用するパッケージのインストールディレクトリを指定する ===
 
=== QMAKE を使用するパッケージのインストールディレクトリを指定する ===
360行目: 413行目:
 
$ 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 こちら] を参照。
  +
  +
=== プロキシの背後にある時、makepkg は依存関係のダウンロードに失敗します ===
  +
  +
''makepkg'' が依存関係を呼び出すと、 pacman を呼び出してパッケージをインストールします。これには、 ''sudo'' を介した管理者権限が必要です。ただし、 ''sudo''は [[環境変数]]を特権環境に渡さず、プロキシ関連の変数 {{ic|ftp_proxy}}、 {{ic|http_proxy}}、 {{ic|https_proxy}}、 および {{ic|no_proxy}}
  +
  +
プロキシの背後で ''makepkg'' を機能させるには、次のいずれかの方法を実行する必要があります。
  +
  +
==== XferCommand で URL を設定して、プロキシを有効にする ====
  +
  +
XferCommandは、 {{ic|/etc/pacman.conf}} で目的のプロキシURLを使用するように設定できます。 {{ic|pacman.conf}} [http://www.mail-archive.com/arch-general@archlinux.org/msg15561.html] に次の行を追加するか、コメントを解除します。
  +
  +
{{hc|/etc/pacman.conf|<nowiki>
  +
...
  +
XferCommand = /usr/bin/curl -x http://username:password@proxy.proxyhost.com:80 -L -C - -f -o %o %u
  +
...
  +
</nowiki>}}
  +
  +
==== sudoer の env_keep を介してプロキシを有効にする ====
  +
  +
あるいは、sudoer の {{ic|env_keep}} オプションを使用することもできます。これにより、特定の変数を特権環境に保持できます。詳細については、 [https://wiki.archlinux.jp/index.php/Sudo#.E7.92.B0.E5.A2.83.E5.A4.89.E6.95.B0 sudo#環境変数] を参照してください。
  +
  +
=== makepkg は失敗するが、make は成功する ===
  +
  +
''make'' を使用して手動でコンパイルできても、''makepkg'' で失敗する場合、それはほぼ確実に {{ic|/etc/makepkg.conf}} がコンパイル変数を通常は機能する合理的なものに設定されていますが、それは コンパイルしているものと互換性がありません。 これらのフラグを PKGBUILD {{ic|options}} 配列に追加してみてください。
  +
  +
{{ic|!buildflags}}、 デフォルトの {{ic|CPPFLAGS}}、 {{ic|CFLAGS}}、 {{ic|CXXFLAGS}}、 および {{ic|LDFLAGS}} を防ぐため。
  +
  +
{{ic|!makeflags}}、 並列ビルドを有効にするために {{ic|/etc/makepkg.conf}} を編集した場合に、デフォルトの {{ic|MAKEFLAGS}} を防ぐため。
  +
  +
{{ic|!debug}}、 デフォルトの {{ic|DEBUG_CFLAGS}} を防ぐため、および {{ic|DEBUG_CXXFLAGS}} (パッケージがデバッグビルドの場合)
  +
  +
これらのいずれかで問題が修正された場合、問題の原因となっているフラグを正確に特定すれば、アップストリームでバグを報告できる可能性があります。
   
 
== 参照 ==
 
== 参照 ==
  +
* [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 のソースコード]

2024年10月20日 (日) 03:54時点における最新版

関連記事

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

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

目次

設定

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

/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 でビルド)
ヒント: PKGDEST ディレクトリのキャッシュを削除する方法は pacman#パッケージキャッシュの削除 を参照してください。例: paccache -r -c ~/build/packages/

署名チェック

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

.sig または .asc の形式の署名ファイルが PKGBUILD ソース配列の一部である場合、makepkg は自動的に 検証 を試みます。ユーザーのキーリングに署名の検証に必要な公開鍵が含まれていない場合、makepkg は PGP 鍵を検証できなかったというメッセージを表示してインストールを中止します。

パッケージに必要な公開鍵が欠落している場合、PKGBUILD には必要な鍵 ID を持つ validpgpkeys エントリが含まれている可能性が高くなります。その場合手動で インポート 、または 鍵サーバー上 で見つけてそこからインポートします。署名チェックを一時的に無効にするには、--skippgpcheck オプションを指定して makepkg を実行します。

使用方法

続行する前に、base-devel グループを インストール してください。このグループに属するパッケージは、PKGBUILD ファイルでビルド時の依存関係 (makedepends) としてリストする必要はありません。

ノート:
  • pacman に渡されるコマンドに対して sudo が適切に設定されていることを確認してください。
  • makepkg 自体を root として実行することは 許可されていません.[2] PKGBUILD に任意のコマンドが含まれる可能性があることに加えて、root としてビルドすることは一般的に安全ではないと考えられています。[3] 通常のユーザー アカウントにアクセスできないユーザーは、nobody user として makepkg を実行する必要があります。

パッケージをビルドするには、パッケージの作成 で説明されているように、まず PKGBUILD またはビルド スクリプトを作成する必要があります。既存のスクリプトは、Arch Build System (ABS) ツリーまたは AUR から入手できます。 PKGBUILD を取得したら、それが保存されているディレクトリに移動し、次のコマンドを実行してパッケージをビルドします。

$ makepkg

必要な依存関係が欠落している場合、makepkg は失敗する前に警告を発します。パッケージをビルドして必要な依存関係をインストールするには、フラグ -s/--syncdeps を追加します。

$ makepkg --syncdeps

-r/--rmdeps フラグを追加すると、makepkg は後で不要になった make 依存関係を削除します。常にパッケージをビルドしている場合は、Pacman ヒント#使用していないパッケージ (孤立したパッケージ) の削除 を時々使用することを検討してください。

ノート:
  • これらの依存関係は、構成されたリポジトリで利用可能である必要があります。詳細は pacman#リポジトリとミラー を参照してください。または、ビルドの前に依存関係を手動でインストールすることもできます (pacman -S --asdeps dep1 dep2)
  • 依存関係をインストールするときは、グローバル値のみが使用されます。つまり、分割パッケージのパッケージング関数で行われたオーバーライドは使用されません。

すべての依存関係が満たされ、パッケージが正常にビルドされると、パッケージファイル (pkgname-pkgver.pkg.tar.zst) が作業ディレクトリに作成されます。インストールするには、-i/--install を使用します (pacman -U pkgname-pkgver.pkg.tar.zst):

$ makepkg --install

$srcdir に抽出されたファイルなど、残りのファイルとディレクトリをクリーンアップするには、オプション -c/--clean を追加します。これは、同じビルド ディレクトリを使用しながら、同じパッケージの複数のビルドやパッケージバージョンの更新に役立ちます。古いファイルや残りのファイルが新しいビルドに引き継がれるのを防ぎます。

$ makepkg --clean

詳細については、makepkg(8) を参照してください。

最適化

デフォルトのオプションは、devtools公式リポジトリ のパッケージを構築するために使用するオプションと一致します。[4] したがって、エンドユーザーは、ローカル環境に合わせて次のオプションを微調整することで、多かれ少なかれ大きなメリットを実感できる可能性があります。

パフォーマンス関連の変更

Commit 90bf367e (pacman 6.0.2-9 2024年2月から) ローカル パッケージのビルド パフォーマンスに重要な影響を与える可能性がある 2 つの設定変更が実装されており、特にユーザーによるレビューが推奨されます。:

ノート: 圧縮レベルの変更は、2024-08-16 [5] のコミット 319671cc で元に戻され、pacman 7.0 でロールアウトされます。[6]

さらに詳しいコンテキストについては、Archlinux/packaging/packages/pacman!1 および archlinux/packaging/packages/pacman#23 を参照してください。

最適化されたバイナリの構築

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

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

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

ノート:
  • すべてのビルドシステムが makepkg.conf で設定された変数を使用するわけではないことに注意してください。たとえば、cmake はプリプロセッサオプション環境変数 CPPFLAGS を無視します。したがって、多くの PKGBUILD には、パッケージ化されたソフトウェアで使用されるビルドシステムに固有のオプションを使用した回避策が含まれています。
  • Makefile のソースコードまたはコンパイルコマンドラインの特定の引数で指定された設定が優先され、makepkg.conf の設定がオーバーライドされる可能性があります。

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

/etc/makepkg.conf
CFLAGS="-march=native -O2 -pipe ..."
CXXFLAGS="${CFLAGS} ..."

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

$ gcc -march=native -v -Q --help=target
ノート: -march=native 以外の値を指定した場合、-Q --help=target は期待通りに機能しなくなります [7] どのオプションが実際に有効になるのかはコンパイルを行わないと分かりません。詳しくは Gentoo wiki の Gentoo:Safe CFLAGS#Manual を参照して下さい。

pacman バージョン 5.2.2 以降、makepkg.conf には、Rust コンパイラに与えられるフラグの RUSTFLAGS 環境変数のオーバーライドも含まれています。Rust コンパイラは、指定された RUSTFLAGS 値に -C target-cpu=native を追加することで、アーキテクチャ固有の最適化を検出して有効にすることもできます。

/etc/makepkg.conf
RUSTFLAGS="-C opt-level=2 -C target-cpu=native"

これにより有効になる CPU 機能を確認するには、次のコマンドを実行します。

$ rustc -C target-cpu=native --print cfg

-C target-cpu=native を指定せずに --print cfg を実行すると、デフォルトの設定が出力されます。opt-level パラメータは、必要に応じて、3s、または z に変更できます。詳細については、Rust コンパイラのドキュメント を参照してください。

ビルド時間を短縮する

並列コンパイル

make ビルドシステムは、MAKEFLAGS 環境変数 を使用して、make の追加オプションを指定します。 変数は、 makepkg.conf ファイルでも設定できます。

マルチコア/マルチプロセッサシステムを使用しているユーザーは、同時に実行するジョブの数を指定できます。 これは、 nproc を使用して使用可能なプロセッサの数を決定することで実現できます。 MAKEFLAGS="-j $(nproc)" 一部の PKGBUILD は、特定のバージョンの競合状態のため、または単に最初からサポートされていないため、これを -j1 で具体的にオーバーライドします。 このためにビルドに失敗したパッケージは、エラーが実際に発生していることを確認した後、バグトラッカー(またはAURパッケージの場合はパッケージメンテナ)に 報告 して下さい MAKEFLAGS が原因です。

使用可能なオプションの完全なリストについては、 make(1) を参照してください。

メモリ内のファイルからビルドする

コンパイルには多くの I/O 操作と小さなファイルの処理が必要なため、作業ディレクトリを tmpfs に移動すると、ビルド時間が早くなる可能性があります。

BUILDDIR 変数を一時的に makepkg にエクスポートして、ビルドディレクトリを既存の tmpfs に設定できます。例えば:

$ BUILDDIR=/tmp/makepkg makepkg

永続的な設定は、デフォルトの /etc/makepkg.conf ファイルの BUILDENVIRONMENT セクションの最後にある BUILDDIR オプションのコメントを外すことで行うことができます。この値をたとえば BUILDDIR=/tmp/makepkg に設定すると、 Arch のデフォルトの /tmp テンポラリ・ファイル・システムが使用されます。

ノート:
  • メモリ不足を防ぐために、 tmpfs で大きなパッケージをコンパイルすることは避けてください。
  • tmpfs フォルダーは、 noexec オプションなしでマウントする必要があります。そうしないと、ビルドされたバイナリが実行されなくなります。
  • tmpfs でコンパイルされたパッケージは、再起動後も保持されないことに注意してください。 PKGDEST オプションを適切に設定して、ビルドされたパッケージを永続ディレクトリに自動的に移動することを検討してください。

コンパイルキャッシュの使用

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

mold linker の使用

mold は、ld/lld リンカーのドロップイン代替品であり、大幅に高速化されていると主張しています。

mold を使用するには、-fuse-ld=moldLDFLAGS に追加します。例えば:

/etc/makepkg.conf
LDFLAGS="... -fuse-ld=mold"

追加のオプションを mold に渡すには、それらを LDFLAGS に追加します。例えば:

/etc/makepkg.conf
LDFLAGS="... -fuse-ld=mold -Wl,--separate-debug-file"

Rust パッケージに mold を使用するには、-C link-arg=-fuse-ld=moldRUSTFLAGS に追加します。例えば:

/etc/makepkg.conf
RUSTFLAGS="... -C link-arg=-fuse-ld=mold"

デバッグパッケージと LTO を無効にする

pacman 6.0.2-9 2024 年 2 月以降の pacman 6.0.2-9 に含まれる コミット 90bf367e では、debuglto オプションがデフォルトで有効になりました。

デバッグパッケージをビルドすると、公式リポジトリがユーザーの問題をトラブルシューティングするためのツールが提供できるようになります (archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173528) ただし、パッケージを独自にビルドする場合は必要なく、速度が低下します。ビルドプロセス archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173782 を参照してください。

Link-time optimization により最適化されたバイナリが生成されますが、ビルドプロセスは大幅に長くなります (archlinux.org/archlinux/packaging/packages/pacman/-/issues/23#note_173678) これらのオプションを無効にするには、! を追加します。OPTIONS=() 配列の直前にある文字 OPTIONS=(...!debug !lto...)

圧縮

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

パッケージ アーカイブが大きくなる代わりに、パッケージングとインストールの両方を高速化するには、PKGEXT を変更します。

たとえば、次の例ではパッケージ ファイルの圧縮がスキップされ、インストール で展開する必要がなくなります。

$ PKGEXT='.pkg.tar' makepkg

別の例として、以下は速度に重点を置いた LZ4 アルゴリズムを使用しています。

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

上記の設定を永続化するには /etc/makepkg.confPKGEXT を設定します。

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

zstd は、 --threads フラグを介して 対称型マルチプロセッシング(SMP) をサポートし、圧縮を高速化します。たとえば、 makepkg がパッケージを圧縮するためにできるだけ多くの CPU コアを使用できるようにするには、/etc/makepkg.confCOMPRESSZST 配列を編集します:

COMPRESSZST=(zstd -c -z -q --threads=0 -)

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

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

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

COMPRESSGZ=(pigz -c -f -n)

pbzip2は、 bzip2 のドロップイン並列実装であり、デフォルトで使用可能なすべての CPU コアも使用します。 -p# フラグを使用すると、使用するコアの数を減らすことができます(注: -p とコアの数の間にスペースは必要ありません。)

COMPRESSBZ2=(pbzip2 -c -f)

lbzip2 は、デフォルトで利用可能なすべての CPU コアを使用する bzip2 の別のドロップイン並列実装です。-n フラグを使用すると、使用するコアを減らすことができます。

COMPRESSBZ2=(lbzip2 -c -f)

plzipAURlzip のマルチスレッド実装であり、デフォルトで利用可能なすべての CPU コアも使用します。-n/--threads フラグを使用して、使用するコアを減らすことができます。

COMPERSSLZ=(plzip -c -f)

圧縮レベルの変更

いくつかの圧縮アルゴリズム (zstd および xz を含む) は、速度、メモリ、圧縮効率の間のトレードオフを定義する圧縮レベルの設定をサポートしています。

ヒントとテクニック

ソースのダウンロードと抽出の時間を短縮する

ソースの場所の定義

特に VCSパッケージ をビルドするときに SRCDEST を利用すると、以降のリビルドでソースの取得や展開にかかる時間を短縮できます。

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

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

$ updpkgsums

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

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

ローカルのソースファイルからビルドする

ソース コードに変更を加えたい場合は、-o, --nobuild ファイルのみをダウンロードして抽出する オプションを使用すると、パッケージをビルドせずにソースコードをダウンロードできます。

$ makepkg -o

これで、ソースに変更を加えてから、-e, --noextract ソースファイルを抽出しない (既存の $srcdir/ dir を使用) オプションを使用してパッケージをビルドできるようになりました。すでにビルドされているパッケージと既存のパッケージを上書きするには、-f オプションを使用します。

$ makepkg -ef

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

以下のコマンドはシステムにインストールされているパッケージの中から 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)

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

署名の無いパッケージ

Jenkins などの自動ビルド環境で署名に使用される gpg 秘密鍵のパスフレーズを提供できる人がいない場合があります。パスフレーズなしでシステムに秘密の gpg キーを保存することはお勧めできません。

makepkg で作成された結果の zst パッケージは、作成後に署名することができます。

$ gpg --detach-sign --pinentry-mode loopback --passphrase --passphrase-fd 0 --output NewlyBuilt.pkg.tar.zst.sig --sign NewlyBuilt.pkg.tar.zst 

GPG パスフレーズは、選択したオートメーションスイートによって安全に提供され、隠蔽されます。

出来上がった zstsig ファイルは有効な署名を期待する pacman クライアントや、あなた自身のリポジトリをホストするときに repo-add --sign で作成したリポジトリから参照することができます。

Magnet URIs

magnet:// のプレフィックスを持つ magnet URIs リソースのサポートは transmission-dlagentAUR ダウンロードエージェントを使って追加することができます。

systemd コントロールグループでの makepkg の実行

ビルドしているパッケージが、デフォルトの make フラグ (他のほとんどのパッケージでは適切に設定されている) を使用してビルドするには多くのリソースを必要とする場合は、そのパッケージを独自の コントロールグループ で実行してみて下さい。makepkg-cgAUR は、systemd コントロールグループを介してこれを実現する makepkg のラッパーです (systemd.resource-control(5) を参照)

アイドルスケジュールポリシーで実行

パッケージのビルドプロセスは、特に #並列コンパイル の場合に CPU 使用率が高くなる可能性があります。CPU 負荷が高い場合、nice(1) の値が最も高くても、システムの速度が大幅に低下し、使用できなくなる可能性があります。ユーザーインターフェイスとフォアグラウンドアプリケーションが途切れたり、応答しなくなったりすることがあります。

これは、makepkg を実行する前に、スケジューリングポリシーを SCHED_IDLE に変更することで回避できます。これにより、パッケージ構築プロセスが通常のタスクに干渉せず、残りの未使用の CPU 時間のみが利用されることが保証されます。

sched(7) § SCHED_IDLE: Scheduling very low priority jobs から:

このポリシーは、非常に低い優先度 (SCHED_OTHER または SCHED_BATCH ポリシーの +19 nice 値よりも低い) でジョブを実行することを目的としています。

SCHED_IDLE ポリシーは、-i フラグを指定して <codechrt>1 コマンドを実行し、優先度 0 (SCHED_IDLE の唯一の有効なオプション) を指定して設定できます。) を使用し、現在のシェルの PID を指定します。

ほとんどのシェルの場合:

$ chrt -iap 0 $$
ヒント: このコマンドを makepkg.conf に置くことで、すべてのビルドに適用できます。

fish シェルの場合、$$ が設定されていない場合:

$ chrt -iap 0 %self

各パッケージディレクトリ内の相対パス

パッケージ出力オプション に絶対パスを使用する代わりに、各パッケージディレクトリ内に相対パスを設定することもできます。

ノート: 次のオプションは、$startdir が定義されていないコンテキストで makepkg.conf を使用する可能性があるため、一部の AUR ヘルパー で問題を引き起こす可能性があります。

たとえば、次のように makepkg.conf ファイルでターゲットパスを定義できます。$startdir 変数は、パッケージをビルドするときに PKGBUILD が配置されるディレクトリを参照します。

PKGDEST="$startdir/build/packages/"
SRCDEST="$startdir/build/sources/"
SRCPKGDEST="$startdir/build/srcpackages/"
LOGDEST="$startdir/logs/"

これにより、次のような結果が得られます。

  • ビルドされたパッケージは、"パッケージ ディレクトリ"/build/packages/ に保存されます。
  • ダウンロードされたすべてのソースファイルは、"パッケージ ディレクトリ"/build/sources/ に保存されます。
  • ビルドされたソースパッケージは、"パッケージ ディレクトリ"/build/srcpackages/ に保存されます。
  • すべてのログは、"パッケージ ディレクトリ"/logs/ に保存されます。

makepkg は通常どおりに src/ および pkg/ ディレクトリを作成するため、これは予期された動作です。

トラブルシューティング

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/

詳しくは こちら を参照。

プロキシの背後にある時、makepkg は依存関係のダウンロードに失敗します

makepkg が依存関係を呼び出すと、 pacman を呼び出してパッケージをインストールします。これには、 sudo を介した管理者権限が必要です。ただし、 sudo環境変数を特権環境に渡さず、プロキシ関連の変数 ftp_proxyhttp_proxyhttps_proxy、 および no_proxy

プロキシの背後で makepkg を機能させるには、次のいずれかの方法を実行する必要があります。

XferCommand で URL を設定して、プロキシを有効にする

XferCommandは、 /etc/pacman.conf で目的のプロキシURLを使用するように設定できます。 pacman.conf [8] に次の行を追加するか、コメントを解除します。

/etc/pacman.conf
...
XferCommand = /usr/bin/curl -x http://username:password@proxy.proxyhost.com:80 -L -C - -f -o %o %u
...

sudoer の env_keep を介してプロキシを有効にする

あるいは、sudoer の env_keep オプションを使用することもできます。これにより、特定の変数を特権環境に保持できます。詳細については、 sudo#環境変数 を参照してください。

makepkg は失敗するが、make は成功する

make を使用して手動でコンパイルできても、makepkg で失敗する場合、それはほぼ確実に /etc/makepkg.conf がコンパイル変数を通常は機能する合理的なものに設定されていますが、それは コンパイルしているものと互換性がありません。 これらのフラグを PKGBUILD options 配列に追加してみてください。

!buildflags、 デフォルトの CPPFLAGSCFLAGSCXXFLAGS、 および LDFLAGS を防ぐため。

!makeflags、 並列ビルドを有効にするために /etc/makepkg.conf を編集した場合に、デフォルトの MAKEFLAGS を防ぐため。

!debug、 デフォルトの DEBUG_CFLAGS を防ぐため、および DEBUG_CXXFLAGS (パッケージがデバッグビルドの場合)

これらのいずれかで問題が修正された場合、問題の原因となっているフラグを正確に特定すれば、アップストリームでバグを報告できる可能性があります。

参照