「Makepkg」の版間の差分
細 |
Kusakata.bot (トーク | 投稿記録) 細 (文字列「http://doc.qt.io/」を「https://doc.qt.io/」に置換) |
||
(4人の利用者による、間の26版が非表示) | |||
6行目: | 6行目: | ||
[[en:Makepkg]] |
[[en:Makepkg]] |
||
[[es:Makepkg]] |
[[es:Makepkg]] |
||
+ | [[fa:Makepkg]] |
||
[[fr:makepkg]] |
[[fr:makepkg]] |
||
[[it:Makepkg]] |
[[it:Makepkg]] |
||
13行目: | 14行目: | ||
[[sr:Makepkg]] |
[[sr:Makepkg]] |
||
[[tr:Makepkg]] |
[[tr:Makepkg]] |
||
− | [[zh- |
+ | [[zh-hans:Makepkg]] |
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|パッケージの作成}} |
{{Related|パッケージの作成}} |
||
{{Related|PKGBUILD}} |
{{Related|PKGBUILD}} |
||
+ | {{Related|.SRCINFO}} |
||
{{Related|Arch User Repository}} |
{{Related|Arch User Repository}} |
||
{{Related|pacman}} |
{{Related|pacman}} |
||
22行目: | 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] はパッケージのビルドを自動化するスクリプトです。makepkg スクリプトを使用するにはビルドが出来る Unix プラットフォームと [[PKGBUILD]] が必要です。 |
||
− | makepkg は [[pacman]] (Arch Linux のパッケージマネージャ) でのインストールに適したパッケージをコンパイル・ビルドするために使われます。makepkg はパッケージのビルドを自動化するスクリプトです; ソースファイルのダウンロード・検証、依存関係の確認、ビルド時の設定、ソースのコンパイル、一時 root へのインストール、カスタマイズ、メタ情報の生成、そして全てをまとめたパッケージの作成。 |
||
makepkg は {{Pkg|pacman}} パッケージの中に入っています。 |
makepkg は {{Pkg|pacman}} パッケージの中に入っています。 |
||
28行目: | 30行目: | ||
== 設定 == |
== 設定 == |
||
− | + | makepkg の設定オプションについて詳しくは {{ic|man makepkg.conf}} を参照してください。 |
|
+ | {{ic|/etc/makepkg.conf}} が makepkg のメインの設定ファイルです。ユーザー個別の設定は {{ic|$XDG_CONFIG_HOME/pacman/makepkg.conf}} または {{ic|~/.makepkg.conf}} で可能です。パッケージをビルドする前に makepkg の設定オプションを微調整するとよいでしょう。 |
||
− | === アーキテクチャ、コンパイルフラグ === |
||
− | makepkg でソフトウェアをコンパイルする時 {{ic|MAKEFLAGS}}, {{ic|CFLAGS}}, {{ic|CXXFLAGS}}, {{ic|CPPFLAGS}} オプションが {{Pkg|make}}, {{Pkg|gcc}}, {{ic|g++}} によって使われます。デフォルトでは、様々なマシンでインストールできるような一般的なパッケージを生成するようにオプションが設定されています。ホストマシン用にコンパイルをチューニングすることでパフォーマンスを改善することが可能です。コンパイルするホストのプロセッサに合わせてパッケージをコンパイルするデメリットは、他のマシンでは動作しなくなるかもしれないということです。 |
||
+ | === パッケージ作成者の情報 === |
||
− | {{Note|あなたが export した変数を全てのパッケージビルドシステムが使うわけではないということに注意してください。元の Makefile や [[PKGBUILD]] 内の変数を上書きすることがあります。}} |
||
+ | パッケージにはメタデータが付与されておりパッケージ作成者を識別することができます。デフォルトでは、ユーザーがコンパイルしたパッケージは {{ic|Unknown Packager}} となります。システム上の複数のユーザーがパッケージをコンパイルする場合、あるいはパッケージを他者に配布する場合、実際の連絡先を入力すると便利です。{{ic|makepkg.conf}} の {{ic|PACKAGER}} 変数で設定することができます。 |
||
− | {{hc|/etc/makepkg.conf|<nowiki> |
||
− | [...] |
||
− | |||
− | ######################################################################### |
||
− | # 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" |
||
+ | {{hc|$ pacman -Qi ''package''|<nowiki> |
||
+ | [...] |
||
+ | Packager : John Doe <john@doe.com> |
||
[...] |
[...] |
||
</nowiki>}} |
</nowiki>}} |
||
+ | 生成したパッケージに自動的に署名するには {{ic|makepkg.conf}} で {{ic|GPGKEY}} 変数を設定してください。 |
||
− | デフォルトの makepkg.conf の {{ic|CFLAGS}} と {{ic|CXXFLAGS}} はそれぞれのアーキテクチャを持つ全てのマシンと互換性があります。 |
||
+ | === パッケージの出力 === |
||
− | x86_64 のマシンでは、時間を投資して公式のパッケージをリビルドすることでそれに見合うだけのパフォーマンスの向上を得られることは稀です。 |
||
+ | デフォルトでは ''makepkg'' はパッケージ tarball を作業ディレクトリに作成し、ソースデータを {{ic|src/}} ディレクトリに直接ダウンロードします。カスタムパスを設定することで、例えばビルドしたパッケージを {{ic|~/build/packages/}} に、ソースを全て {{ic|~/build/sources/}} に保存することができます。 |
||
− | GCC バージョン 4.3.0 から、マシンの CPU の自動検知とサポートされている最適化の自動セレクトを有効にする {{ic|1=-march=native}} スイッチが使えるようになっています。これを使うには、以下のように {{ic|CFLAGS}} と {{ic|CXXFLAGS}} を変更してください: |
||
+ | 必要に応じて以下の {{ic|makepkg.conf}} 変数を設定してください: |
||
− | # -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}" |
||
+ | * {{ic|PKGDEST}} — 生成したパッケージを保存するディレクトリ。 |
||
− | {{Tip|{{ic|1=march=native}} フラグがどうなるか見るには、次を実行してください: |
||
+ | * {{ic|SRCDEST}} — [[PKGBUILD#source|ソース]]データを保存するディレクトリ (別の場所を指定すると {{ic|src/}} へのシンボリックリンクが作成されます)。 |
||
− | <nowiki>$ gcc -march=native -E -v - </dev/null 2>&1 | sed -n 's/.* -v - //p'</nowiki> |
||
+ | * {{ic|SRCPKGDEST}} — 生成したソースパッケージを保存するディレクトリ ({{ic|makepkg -S}} でビルドされます)。 |
||
− | }} |
||
+ | === 署名チェック === |
||
− | {{ic|1=-march=native}} は全ての利用可能な命令セットを有効にし特定の CPU にあわせてスケジューリングを改善するので CPU タイプに合わせた最適化によって理論上はパフォーマンスが向上します。アプリケーション (例えば: 音声・動画エンコードツール、科学的なアプリケーション、数学プログラムなど) をリビルドするときにこれは特に顕著で、Arch Linux によって提供されているデフォルトのオプション (またパッケージ) を使うときには有効にならない新しい命令を使えることで大きなアドバンテージを得ることができます。 |
||
+ | {{Note|makepkg で実装されている署名チェックは pacman のキーリングを使用しません [http://allanmcrae.com/2015/01/two-pgp-keyrings-for-package-management-in-arch-linux/]。代わりにユーザーのキーリングが使われます。}} |
||
− | コンパイラスイッチによって、ループ展開・悪いベクトル化・狂ったインライン化などでコンパイラはコードサイズを膨張させがちなので"標準外の" CFLAGS を使うことでパフォーマンスを下げるのはとても簡単です。何かが速くなると確認・ベンチマークできない限り、高速化できる可能性はほとんどありません! |
||
+ | {{ic|.sig}} や {{ic|.asc}} 形式の署名ファイルが [[PKGBUILD]] の source 行に含まれている場合、''makepkg'' は自動的に署名を検証します。ユーザーのキーリングに署名検証に必要な公開鍵が存在しない場合、''makepkg'' はインストールを停止して PGP 鍵が検証できないというメッセージを表示します。 |
||
− | 利用可能なオプションの完全なリストは GCC の man ページを見て下さい。Gentoo の [https://wiki.gentoo.org/wiki/GCC_optimization/ja Compilation Optimization Guide] や [http://wiki.gentoo.org/wiki/Safe_CFLAGS Safe CFLAGS] にはより詳しい情報が載っています。 |
||
+ | [[PKGBUILD]] に [[PKGBUILD#validpgpkeys|validpgpkeys]] エントリで鍵 ID が指定されているときパッケージをビルドするには公開鍵が必要になります。公開鍵が存在しない場合、あるいは他の開発者による公開鍵を追加したい場合、手動で鍵を[[GnuPG#鍵のインポート|インポート]]するか、もしくは[[GnuPG#鍵サーバーを使用する|鍵サーバー]]を使ってインポートすることができます。 |
||
− | ====MAKEFLAGS==== |
||
− | {{ic|MAKEFLAGS}} オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: {{ic|-j4}}。{{ic|nproc}} を使うことで利用可能なプロセッサの数がわかります。[[PKGBUILD]] によっては、特定のバージョンで競合状態になったり、もしくはサポートされていないために、この値を {{ic|-j1}} で上書きします。これによってビルドが失敗するパッケージがある場合は、エラーがあなたの MAKEFLAGS によって引き起こされていることを確認してから、バグトラッカーに[[バグ報告ガイドライン|報告]]してください。 |
||
+ | == 使用方法 == |
||
− | 利用可能なオプションの全ては {{ic|man make}} を見て下さい。 |
||
+ | 次に進む前に、{{Grp|base-devel}} グループがインストールされているか確認してください。このグループに属しているパッケージは [[PKGBUILD]] の中に依存パッケージとして載せる必要はないことになっています。以下を (root で) 実行して {{Grp|base-devel}} グループをインストールしてください: |
||
− | === パッケージの出力 === |
||
+ | # pacman -S base-devel |
||
− | 次に、ソースファイルやパッケージが置かれる場所、パッケージ作成者としての名前を設定することができます。このステップは任意です; デフォルトでは、パッケージは makepkg が実行された作業ディレクトリに作成されます。 |
||
+ | {{Note|依存パッケージが欠けていることに不満を言う前に、全ての Arch Linux 環境では {{Grp|base}} グループがインストールされていることが前提になっていることを思い出してください。'''makepkg''' や [[AUR ヘルパー]]でビルドするときには {{Grp|base-devel}} グループがインストールされていることが前提になっています。}} |
||
− | {{hc|/etc/makepkg.conf|<nowiki> |
||
− | [...] |
||
+ | パッケージを作成するには、まず[[パッケージの作成]]に記述されているようにして [[PKGBUILD]] を作成するか [[Arch Build System|ABS ツリー]]や [[Arch User Repository]] などから取得してくる必要があります。 |
||
− | ######################################################################### |
||
− | # 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>" |
||
+ | {{Warning|信頼できるソースからパッケージをビルド・インストールしてください。}} |
||
− | [...] |
||
− | </nowiki>}} |
||
+ | {{ic|PKGBUILD}} を入手したら、PKGBUILD が保存されているディレクトリに移動してから次のコマンドを実行して {{ic|PKGBUILD}} に記述されたパッケージを作成します: |
||
− | 例えば、ディレクトリを作成して: |
||
+ | $ makepkg |
||
− | $ mkdir /home/$USER/packages |
||
+ | パッケージ作成後、要らなくなったファイル ($srcdir に展開されたファイルなど) を makepkg によって削除するには、以下のオプションを加えて下さい。同じパッケージをビルドしたりパッケージのバージョンを更新するときに、同じビルドフォルダを使う場合、このオプションは有益です。残ったファイルを新しいビルドに持ち越す危険がなくなります。 |
||
− | {{ic|/etc/makepkg.conf}} の {{ic|PKGDEST}} 変数を修正してください。 |
||
+ | $ makepkg -c |
||
− | {{ic|PACKAGER}} 変数はコンパイルしたパッケージの {{ic|.PKGINFO}} メタデータファイルの中に {{ic|packager}} 値を設定します。デフォルトでは、ユーザーがコンパイルしたパッケージは以下のように表示されます: |
||
+ | 必要な依存パッケージが欠けている場合、makepkg は警告を表示します。必要な依存パッケージを自動的にインストールするには、次のコマンドを使って下さい: |
||
− | {{hc|pacman -Qi package|<nowiki> |
||
− | [...] |
||
− | Packager : Unknown Packager |
||
− | [...] |
||
− | </nowiki>}} |
||
+ | $ makepkg -s |
||
− | 設定した後: |
||
+ | 依存パッケージが取ってこれるのは設定されたリポジトリからだけということに注意してください; 詳しくは [[pacman#リポジトリ]] を見て下さい。また、ビルドの前に手動で依存パッケージをインストールすることもできます ({{ic|pacman -S --asdeps dep1 dep2}})。 |
||
− | {{hc|pacman -Qi package|<nowiki> |
||
− | [...] |
||
− | Packager : John Doe <john@doe.com> |
||
− | [...] |
||
− | </nowiki>}} |
||
+ | 全ての依存関係が解決されパッケージのビルドが成功すれば、パッケージファイル ({{ic|pkgname-pkgver.pkg.tar.xz}}) が作業ディレクトリの中に作成されます。インストールするには、(root で) 次を実行してください: |
||
− | システム上で複数のユーザーがパッケージをコンパイルしていたり、あなたのパッケージを他のユーザーに渡す場合にこれを使うと有用です。 |
||
+ | # pacman -U pkgname-pkgver.pkg.tar.xz |
||
− | === 署名チェック === |
||
− | 以下の手順は makepkg を使ったコンパイルに必須のものではありません、初期設定は [[#使用方法]] に進んで下さい。一時的に署名チェックを無効にしたいときは makepkg コマンドに {{ic|--skippgpcheck}} オプションを付けて呼び出して下さい。 |
||
− | [[PKGBUILD]] の source 行の一部に .sig の形で署名ファイルがあると、makepkg はソースファイルの信頼性を検証します。例えば、署名 {{ic|pkgname-pkgver.tar.gz.sig}} は gpg プログラムによってファイル {{ic|pkgname-pkgver.tar.gz}} の整合性のチェックに使われます。望むなら、他の開発者による署名を手動で GPG キーリングに追加することができます。詳細は [[GnuPG]] の記事を見て下さい。 |
||
+ | もしくは、{{ic|pacman -U pkgname-pkgver.pkg.tar.xz}} を実行する代わりに {{ic|-i}} フラグを使ってインストールすることもできます: |
||
− | {{Note|makepkg で実装されている署名チェックは pacman のキーリングを使用しません。以下にあるように gpg を設定して makepkg が pacman のキーリングを読み込めるようにしてください。}} |
||
+ | $ makepkg -i |
||
− | gpg キーはユーザーの {{ic|~/.gnupg/pubring.gpg}} ファイルの中に保存されていると期待されています。与えられた署名が含まれていない場合、makepkg は警告を表示します。 |
||
− | {{hc|makepkg|<nowiki> |
||
− | [...] |
||
− | ==> 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. |
||
− | [...] |
||
− | </nowiki>}} |
||
− | 現在の gpg キーのリストを表示するには gpg コマンドを使って下さい。 |
||
− | {{bc|gpg --list-keys}} |
||
− | {{ic|pubring.gpg}} ファイルが存在しない時はすぐに作成されます。gpg を設定して Arch Linux の開発者によって投稿された署名チェックが成功した AUR パッケージをコンパイルできるようにすることが可能です。 |
||
− | 以下の行をあなたの gpg 設定ファイルの一番下に追加してユーザーの個人キーリングに pacman のキーリングを含めて下さい。 |
||
− | {{hc|~/.gnupg/gpg.conf|<nowiki> |
||
− | [...] |
||
− | keyring /etc/pacman.d/gnupg/pubring.gpg |
||
− | </nowiki>}} |
||
− | 前と同じように {{ic|gpg --list-keys}} を実行すると出力にキーリングと開発者のリストが含まれています。 |
||
+ | == ヒントとテクニック == |
||
− | == 使用方法 == |
||
+ | === 最適化されたパッケージの作成 === |
||
− | 次に進む前に、{{Grp|base-devel}} グループがインストールされているか確認してください。このグループに属しているパッケージは [[PKGBUILD]] の中に依存パッケージとして載せる必要はないことになっています。以下を (root で) 実行して "base-devel" グループをインストールしてください: |
||
+ | makepkg のデフォルトでは、様々なマシンでインストールできるような一般的なパッケージを生成するようにオプションが設定されています。ホストマシンにあわせてコンパイラの最適化を有効化することで、パッケージ化するソフトウェアの性能を向上させることができます。ただし特定のプロセッサアーキテクチャにあわせてパッケージをコンパイルした場合、他のマシンでは正しく動作しなくなります。x86_64 のマシンでは、時間を投資して公式のパッケージをリビルドすることでそれに見合うだけのパフォーマンスの向上を得られることは稀です。 |
||
− | # pacman -S base-devel |
||
+ | 標準外のコンパイラフラグを使うことでパフォーマンスが劣化する可能性も十分あります。ほとんどのコンパイラオプションは特定の状況でのみ有効であり、無差別に全てのパッケージに適用しないほうが良いでしょう。何かが速くなると確認・ベンチマークできない限り、無駄にコンパイラオプションを使わないことを推奨します。Gentoo の [https://wiki.gentoo.org/wiki/GCC_optimization/ja コンパイル最適化ガイド] や [https://wiki.gentoo.org/wiki/Safe_CFLAGS 安全な CFLAGS] 記事にはコンパイラの最適化に関する詳しい解説が載っています。 |
||
− | {{Note|依存パッケージが欠けていることに不満を言う前に、全ての Arch Linux 環境では {{Grp|base}} グループがインストールされていることが前提になっていることを思い出してください。'''makepkg''' や [[AUR ヘルパー]]でビルドするときには "base-devel" グループがインストールされていることが前提になっています。}} |
||
+ | C/C++ コンパイラ (例: {{Pkg|gcc}} や {{Pkg|clang}}) に渡されるオプションは {{ic|CFLAGS}}, {{ic|CXXFLAGS}}, {{ic|CPPFLAGS}} 環境変数で制御されます。同じように {{Pkg|make}} ビルドシステムは {{ic|MAKEFLAGS}} を使います。Arch のビルドシステムでは {{ic|makepkg.conf}} の設定オプションとして ''makepkg'' はこれらの環境変数を使用します。デフォルト値は幅広いマシンにインストールできる汎用のパッケージを作成するように設定されています。 |
||
− | パッケージを作成するには、まず[[パッケージの作成]]に記述されているようにして [[PKGBUILD]] を作成するか [[Arch Build System|ABS ツリー]]や [[Arch User Repository]] などから取得してくる必要があります。 |
||
+ | {{Note|全てのビルドシステムが {{ic|makepkg.conf}} に設定した変数を使うわけではないということに注意してください。例えば ''cmake'' はプリプロセッサオプションの環境変数 {{ic|CPPFLAGS}} を無視します。多くの [[PKGBUILD]] にはパッケージ化するソフトウェアによって使われているビルドシステム固有のオプションが含まれています。}} |
||
− | {{Warning|信頼できるソースからパッケージをビルド・インストールしてください。}} |
||
+ | GCC はアーキテクチャ固有の最適化を自動で認識・有効化することができます。自動最適化を使用するには、{{ic|-march}} と {{ic|-mtune}} フラグを全て削除してから {{ic|1=-march=native}} を追加してください。例: |
||
− | {{ic|PKGBUILD}} を入手したら、PKGBUILD が保存されているディレクトリに移動してから次のコマンドを実行して {{ic|PKGBUILD}} に記述されたパッケージを作成します: |
||
+ | CFLAGS="-march=native -O2 -pipe -fstack-protector-strong" |
||
− | $ makepkg |
||
+ | CXXFLAGS="${CFLAGS}" |
||
+ | {{ic|1=march=native}} フラグによってどのフラグが有効になるのか確認するには、次のコマンドを実行してください: |
||
− | パッケージ作成後、要らなくなったファイル ($srcdir に展開されたファイルなど) を makepkg によって削除するには、以下のオプションを加えて下さい。同じパッケージをビルドしたりパッケージのバージョンを更新するときに、同じビルドフォルダを使う場合、このオプションは有益です。残ったファイルを新しいビルドに持ち越す危険がなくなります。 |
||
+ | $ gcc -march=native -v -Q --help=target |
||
− | $ makepkg -c |
||
+ | {{Note|1=<nowiki></nowiki> |
||
− | 必要な依存パッケージが欠けている場合、makepkg は警告を表示します。必要な依存パッケージを自動的にインストールするには、次のコマンドを使って下さい: |
||
+ | * {{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] を参照。 |
||
+ | * [https://github.com/pixelb/scripts/blob/master/scripts/gcccpuopt gcccpuopt] スクリプトを使うことで '''32ビット'''の x86 アーキテクチャの最適化オプションを確認することができます。 |
||
+ | }} |
||
+ | ====MAKEFLAGS==== |
||
− | $ makepkg -s |
||
+ | {{ic|MAKEFLAGS}} オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: {{ic|-j4}}。{{ic|nproc}} を使うことで利用可能なプロセッサの数がわかります。[[PKGBUILD]] によっては、特定のバージョンで競合状態になったり、もしくはマルチコアによるコンパイルがサポートされていないために、この値を {{ic|-j1}} で上書きします。これによってビルドが失敗するパッケージがある場合は、エラーがあなたの MAKEFLAGS によって引き起こされていることを確認してから、バグトラッカーに[[バグ報告ガイドライン|報告]]してください。 |
||
− | 依存パッケージが取ってこれるのは設定されたリポジトリからだけということに注意してください; 詳しくは [[pacman#リポジトリ]] を見て下さい。また、ビルドの前に手動で依存パッケージをインストールすることもできます ({{ic|pacman -S --asdeps dep1 dep2}})。 |
||
+ | 利用可能なオプションの全ては {{ic|man make}} を見て下さい。 |
||
− | 全ての依存関係が解決されパッケージのビルドが成功すれば、パッケージファイル ({{ic|pkgname-pkgver.pkg.tar.xz}}) が作業ディレクトリの中に作成されます。インストールするには、(root で) 次を実行してください: |
||
+ | === パッケージの堅牢化 === |
||
− | # pacman -U pkgname-pkgver.pkg.tar.xz |
||
+ | {{pkg|hardening-wrapper}}{{Broken package link|パッケージが存在しません}} パッケージをインストールしてください。このパッケージは gcc や g++ などをラッピングして {{ic|/etc/hardening-wrapper.conf}} でセキュリティを強化するフラグを制御できます。 |
||
− | もしくは、{{ic|pacman -U pkgname-pkgver.pkg.tar.xz}} を実行する代わりに {{ic|-i}} フラグを使ってインストールすることもできます: |
||
+ | ハードニングフラグを全て有効にするには: |
||
− | $ makepkg -i |
||
+ | |||
+ | {{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}} |
||
+ | |||
+ | インストール後、{{ic|/etc/profile}} を [[source]] するか、一度ログアウトしてログインしなおす必要があります。ラッパーが使われているか確認するには: |
||
+ | |||
+ | $ which gcc |
||
+ | /usr/lib/hardening-wrapper/bin/gcc |
||
+ | |||
+ | 後は普通にパッケージを作成すれば自動的に使用されます。 |
||
+ | |||
+ | セキュリティを高めるフラグが使われているかどうか確認したい場合、{{pkg|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 |
||
+ | |||
+ | 以下のコマンドは {{ic|/etc/makepkg}} の {{ic|PACKAGER}} 変数に設定されている値とパッケージ作成者が一致するパッケージを表示します ({{ic|/etc/pacman.conf}} に定義されているリポジトリに含まれているパッケージだけが対象): |
||
+ | |||
+ | $ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1) |
||
− | == Tips and Tricks == |
||
=== コンパイル時間を短縮する === |
=== コンパイル時間を短縮する === |
||
233行目: | 212行目: | ||
[[ccache]] を使うことでコンパイル結果をキャッシュしてビルド時間を短縮できます。 |
[[ccache]] を使うことでコンパイル結果をキャッシュしてビルド時間を短縮できます。 |
||
− | === |
+ | === 新しいチェックサムを生成する === |
+ | PKGBUILD ファイルが存在するディレクトリと同じディレクトリで以下のコマンドを実行すれば新しいチェックサムが生成されます: |
||
− | [http://allanmcrae.com/2013/04/pacman-4-1-released/ pacman 4.1] から {{ic|makepkg -g >> PKGBUILD}} は必要なくなり、pacman-contrib は {{ic|updpkgsums}} スクリプトに[https://projects.archlinux.org/pacman.git/tree/NEWS 併合]されました。このスクリプトを使って PKGBUILD の中に新しいチェックサムを生成することができます: |
||
$ updpkgsums |
$ updpkgsums |
||
+ | Windows の改行コード ({{ic|\r\n}}) に注意してください。Git はテキストファイルに含まれている Windows の改行コードを UNIX の改行コード {{ic|\n}} に置き換えるため、チェックサムが変わってしまいます。AUR のパッケージのチェックサムが検証できなかった場合、チェックサムを計算する前に以下のコマンドを使ってファイルの中から {{ic|\r}} を取り除いてみてください: |
||
− | === Makepkg が PKGBUILD を二度利用する === |
||
+ | $ sed -i 's/\r//g' <filename> |
||
− | Makepkg は PKGBUILD を二度実行します (最初に実行した時と、fakeroot 下で2回目)。PKGBUILD に置かれた標準から外れた関数は全て同じく二度実行されます。 |
||
− | === 圧縮 |
+ | === 他の圧縮アルゴリズムを使用する === |
− | パッケージをローカルでインストールしたいだけの場合、[[Wikipedia:ja:xz (ファイルフォーマット)|LZMA2]] の圧縮と解凍を避けることでプロセスを高速化できます: |
||
+ | {{ic|PKGEXT}} を変更することでパッケージの容量が増えるかわりにパッケージとインストールを高速化することができます。例えば、以下のコマンドではパッケージを圧縮しないようにします: |
||
− | {{hc|/etc/makepkg.conf|2= |
||
+ | |||
− | [...] |
||
− | + | $ PKGEXT='.pkg.tar' makepkg |
|
+ | |||
− | PKGEXT='.pkg.tar' |
||
+ | 以下のコマンドは lzop アルゴリズムを使用します ({{pkg|lzo}} パッケージのインストールが必要): |
||
− | [...] |
||
+ | |||
− | }} |
||
+ | $ PKGEXT='.pkg.tar.lzo' makepkg |
||
+ | |||
+ | 上記の設定を永続化するには {{ic|/etc/makepkg.conf}} で {{ic|PKGEXT}} を設定してください。 |
||
=== マルチコアを利用して圧縮する === |
=== マルチコアを利用して圧縮する === |
||
− | {{pkg|xz}} は[[Wikipedia:ja:対称型マルチプロセッシング|対称型マルチプロセッシング (SMP)]] による圧縮をサポートしていま |
+ | {{pkg|xz}} は[[Wikipedia:ja:対称型マルチプロセッシング|対称型マルチプロセッシング (SMP)]] による圧縮をサポートしています。{{ic|--threads}} フラグを使うことで圧縮が高速化されます。例えば、makepkg で出来る限り多くの CPU コアを使ってパッケージを圧縮するには、{{ic|/etc/makepkg.conf}} の {{ic|COMPRESSXZ}} 配列を編集: |
+ | COMPRESSXZ=(xz -c -z - '''--threads=0''') |
||
− | {{hc|/etc/makepkg.conf|2= |
||
− | [...] |
||
− | COMPRESSXZ=(7z a dummy -txz -si -so) |
||
− | [...] |
||
− | }} |
||
+ | {{pkg|gzip}} の代替である並列実装の {{pkg|pigz}} はデフォルトで全ての CPU コアを使用します ({{ic|-p/--processes}} フラグを使うことでコアの数を減らせます): |
||
− | AUR の {{AUR|xz-git}} は[[Wikipedia:ja:対称型マルチプロセッシング|対称型マルチプロセッシング (SMP)]] をサポートしています。 |
||
+ | COMPRESSGZ=('''pigz''' -c -f -n) |
||
− | {{hc|/etc/makepkg.conf|2= |
||
+ | |||
− | [...] |
||
+ | === 64ビット環境で32ビットのパッケージをビルド === |
||
− | COMPRESSXZ=(xz -T0 -c -z -) |
||
+ | {{Warning|この方法で {{Pkg|linux}} パッケージをビルドしようとすると問題が発生するという報告があります。カーネルパッケージをビルドする場合は [[64ビット環境に32ビット環境をインストール|chroot を使用する方法]]を使うことを推奨します。}} |
||
− | [...] |
||
+ | |||
− | }} |
||
+ | まず [[multilib]] リポジトリを有効にして {{Grp|multilib-devel}} を[[インストール]]してください。{{ic|gcc}} や {{ic|gcc-libs}} パッケージを削除するかどうかきかれたら yes と答えてください。gcc-multilib は64ビットと32ビット両方のソフトウェアをビルドすることができます。 |
||
+ | |||
+ | それから32ビットの設定ファイルを作成: |
||
+ | |||
+ | {{hc|~/.makepkg.i686.conf|<nowiki> |
||
+ | 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"</nowiki>}} |
||
+ | |||
+ | そして makepkg を以下のように実行してください: |
||
+ | $ linux32 makepkg --config ~/.makepkg.i686.conf |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
+ | |||
+ | === Makepkg によるパッケージの署名に失敗する === |
||
+ | |||
+ | [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-agent の設定に頭を使いたくない場合、署名は後回しにして makepkg を実行し、それから {{ic|gpg --detach-sign ''name''.pkg.tar.xz}} でパッケージに署名する方法もあります。 |
||
=== QMAKE を使用するパッケージで makepkg.conf の CFLAGS/CXXFLAGS/CPPFLAGS が適用されない === |
=== QMAKE を使用するパッケージで makepkg.conf の CFLAGS/CXXFLAGS/CPPFLAGS が適用されない === |
||
− | Qmake は {{ic|CFLAGS}} と {{ic|CXXFLAGS}} 変数を自動的に設定します。makepkg の設定ファイルで定義した変数を qmake に使わせるには、PKGBUILD を編集して [ |
+ | 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> |
||
279行目: | 275行目: | ||
qmake-qt4 "$srcdir/$_pkgname-$pkgver-src/$_pkgname.pro" \ |
qmake-qt4 "$srcdir/$_pkgname-$pkgver-src/$_pkgname.pro" \ |
||
PREFIX=/usr \ |
PREFIX=/usr \ |
||
− | CONFIG+=LINUX_INTEGRATED \ |
||
− | INSTALL_ROOT_PATH="$pkgdir"\ |
||
QMAKE_CFLAGS_RELEASE="${CFLAGS}"\ |
QMAKE_CFLAGS_RELEASE="${CFLAGS}"\ |
||
QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS}" |
QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS}" |
||
290行目: | 284行目: | ||
</nowiki>}} |
</nowiki>}} |
||
− | もしくは、システム全体で設定したい場合、{{ic|qmake.conf}} を作成して [ |
+ | もしくは、システム全体で設定したい場合、{{ic|qmake.conf}} を作成して [https://doc.qt.io/qt-5/qmake-environment-reference.html#qmakespec QMAKESPEC] 環境変数を設定してください。 |
+ | |||
+ | === QMAKE を使用するパッケージのインストールディレクトリを指定する === |
||
+ | qmake によって生成される makefile は {{ic|INSTALL_ROOT}} 環境変数を使ってプログラムをインストールするディレクトリを指定します。したがって package 関数を以下のようにしてください: |
||
+ | |||
+ | {{hc|PKGBUILD|<nowiki> |
||
+ | ... |
||
+ | |||
+ | package() { |
||
+ | cd "$srcdir/${pkgname%-git}" |
||
+ | make INSTALL_ROOT="$pkgdir" install |
||
+ | } |
||
+ | |||
+ | ... |
||
+ | </nowiki>}} |
||
+ | |||
+ | また、qmake を正しく設定する必要があります。例えば .pro ファイルに以下を記述してください: |
||
+ | |||
+ | {{hc|YourProject.pro|<nowiki> |
||
+ | ... |
||
+ | |||
+ | target.path = /usr/local/bin |
||
+ | INSTALLS += target |
||
+ | |||
+ | ... |
||
+ | </nowiki>}} |
||
=== WARNING: Package contains reference to $srcdir === |
=== WARNING: Package contains reference to $srcdir === |
||
298行目: | 317行目: | ||
$ grep -R "$(pwd)/src" pkg/ |
$ grep -R "$(pwd)/src" pkg/ |
||
− | 詳しくは [ |
+ | 詳しくは [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 のソースコード] |
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.conf
の PACKAGER
変数で設定することができます。
インストールしたパッケージの作成者情報を確認するには:
$ pacman -Qi package
[...] Packager : John Doe <john@doe.com> [...]
生成したパッケージに自動的に署名するには makepkg.conf
で GPGKEY
変数を設定してください。
パッケージの出力
デフォルトでは makepkg はパッケージ tarball を作業ディレクトリに作成し、ソースデータを src/
ディレクトリに直接ダウンロードします。カスタムパスを設定することで、例えばビルドしたパッケージを ~/build/packages/
に、ソースを全て ~/build/sources/
に保存することができます。
必要に応じて以下の makepkg.conf
変数を設定してください:
PKGDEST
— 生成したパッケージを保存するディレクトリ。SRCDEST
— ソースデータを保存するディレクトリ (別の場所を指定するとsrc/
へのシンボリックリンクが作成されます)。SRCPKGDEST
— 生成したソースパッケージを保存するディレクトリ (makepkg -S
でビルドされます)。
署名チェック
.sig
や .asc
形式の署名ファイルが PKGBUILD の source 行に含まれている場合、makepkg は自動的に署名を検証します。ユーザーのキーリングに署名検証に必要な公開鍵が存在しない場合、makepkg はインストールを停止して PGP 鍵が検証できないというメッセージを表示します。
PKGBUILD に validpgpkeys エントリで鍵 ID が指定されているときパッケージをビルドするには公開鍵が必要になります。公開鍵が存在しない場合、あるいは他の開発者による公開鍵を追加したい場合、手動で鍵をインポートするか、もしくは鍵サーバーを使ってインポートすることができます。
使用方法
次に進む前に、base-devel グループがインストールされているか確認してください。このグループに属しているパッケージは PKGBUILD の中に依存パッケージとして載せる必要はないことになっています。以下を (root で) 実行して base-devel グループをインストールしてください:
# pacman -S 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++ コンパイラ (例: gcc や clang) に渡されるオプションは CFLAGS
, CXXFLAGS
, CPPFLAGS
環境変数で制御されます。同じように make ビルドシステムは MAKEFLAGS
を使います。Arch のビルドシステムでは makepkg.conf
の設定オプションとして makepkg はこれらの環境変数を使用します。デフォルト値は幅広いマシンにインストールできる汎用のパッケージを作成するように設定されています。
GCC はアーキテクチャ固有の最適化を自動で認識・有効化することができます。自動最適化を使用するには、-march
と -mtune
フラグを全て削除してから -march=native
を追加してください。例:
CFLAGS="-march=native -O2 -pipe -fstack-protector-strong" CXXFLAGS="${CFLAGS}"
march=native
フラグによってどのフラグが有効になるのか確認するには、次のコマンドを実行してください:
$ gcc -march=native -v -Q --help=target
MAKEFLAGS
MAKEFLAGS
オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: -j4
。nproc
を使うことで利用可能なプロセッサの数がわかります。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/profile
を source するか、一度ログアウトしてログインしなおす必要があります。ラッパーが使われているか確認するには:
$ 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/makepkg
の PACKAGER
変数に設定されている値とパッケージ作成者が一致するパッケージを表示します (/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 でコンパイルしたパッケージは再起動するとなくなってしまうので注意してください。そのため、何度もインストールするようなパッケージは他の(永続的な)ディレクトリに移動したほうが良いでしょう。
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.conf
で PKGEXT
を設定してください。
マルチコアを利用して圧縮する
xz は対称型マルチプロセッシング (SMP) による圧縮をサポートしています。--threads
フラグを使うことで圧縮が高速化されます。例えば、makepkg で出来る限り多くの CPU コアを使ってパッケージを圧縮するには、/etc/makepkg.conf
の COMPRESSXZ
配列を編集:
COMPRESSXZ=(xz -c -z - --threads=0)
gzip の代替である並列実装の pigz はデフォルトで全ての CPU コアを使用します (-p/--processes
フラグを使うことでコアの数を減らせます):
COMPRESSGZ=(pigz -c -f -n)
64ビット環境で32ビットのパッケージをビルド
まず multilib リポジトリを有効にして multilib-devel をインストールしてください。gcc
や gcc-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 は CFLAGS
と CXXFLAGS
変数を自動的に設定します。makepkg の設定ファイルで定義した変数を qmake に使わせるには、PKGBUILD を編集して QMAKE_CFLAGS_RELEASE と QMAKE_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/
詳しくは こちら を参照。
参照
- makepkg(8) マニュアルページ
- makepkg.conf(5) マニュアルページ
- gcccpuopt: 現在の CPU にあわせた gcc の cpu オプションを表示するスクリプト
- makepkg のソースコード