Rust パッケージガイドライン
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
このドキュメントでは Rust の PKGBUILD を書く時の基準とガイドラインを説明しています。
パッケージの命名
Rust のプロジェクトをパッケージングする際は、基本的にパッケージ名は生成されるバイナリの名前と同じにするべきです。これはライブラリクレートをパッケージングする場合には当てはまらず、バイナリのクレートの場合にのみ当てはまることに注意してください。2つ以上のバイナリを生成するクレートの場合、上流のクレート名を使うのが通常適切です。いかなる場合でも、パッケージ名はすべて小文字である必要があります。
ソース
ほとんどの Rust プロジェクトは tarball、ソースアーカイブ(例: GitHub リリースのソースリンク)、その他の公開されているソースからビルドすることができます。あるいは、多くのプロジェクトが、cargo のための安定しているダウンロード URL スキームを提供する crates.io 上に公開されています。お望みならば、PKGBUILD#source で以下のテンプレートを使うことができます:
source=("$pkgname-$pkgver.tar.gz::https://static.crates.io/crates/$pkgname/$pkgname-$pkgver.crate")
依存
一部の Rust プロジェクトには外部依存関係がありますが、ほとんどは最終バイナリに静的に埋め込まれた Rust エコシステムライブラリを使用するだけです。そのため、ほとんどのプロジェクトでは、depends
を指定する必要はなく、makedepends
のみを指定する必要があります。Rust プロジェクトの大部分は、cargo 依存関係マネージャーを使用してビルドされるように設計されており、実際の Rust コンパイラは、現在ビルド時の依存関係を満たすためにライブラリのダウンロードを調整するだけでなく、必要なすべての呼び出しを rustc
に行います。cargo と rustc はどちらも rust パッケージで提供されていますが、これらの両方を一緒に入手したり、rustup パッケージを個別に入手したりする別の方法もあります。そのため、ほとんどの PKGBUILD が呼び出すツールは cargo であり、これに直接依存する必要があります。
makedepends=(cargo)
プロジェクトで Rust ツールチェーンの nightly バージョンを使用する必要がある場合は、以下を使用します。
makedepends=(cargo-nightly)
準備
Rust 依存関係マネージャー cargo は、プロジェクトのビルドに必要なすべてのライブラリを事前にダウンロードできます。 このフェッチを prepare()
ステージで実行すると、後の build()
および他のステージを完全にオフラインで実行できるようになります。
prepare() { export RUSTUP_TOOLCHAIN=stable cargo fetch --locked --target "$CARCH-unknown-linux-gnu" }
何処:
RUSTUP_TOOLCHAIN=stable
は、ユーザーがデフォルトを変更した場合にデフォルトのツールチェーンが stable に設定されていることを確認します。もちろん、上流のプロジェクトで必要な場合には、これを nightly に設定する必要があります。これにより、chroot を構築しない場合のユーザー設定による一般的な副作用が回避されます。また、上流プロジェクトのソースにこの目的を果たすrust-toolchain
ファイルまたはrust-toolchain.toml
ファイルがある場合、これは 不要 であることにも注意してください。--locked
は、cargo に、Cargo.lock
ファイルで指定されたバージョンを厳密に遵守し、依存関係を更新しないように指示します。これは 再現性のあるビルド にとって重要です。--target "$CARCH-unknown-linux-gnu"
は、ビルド中の特定のターゲットプラットフォームに必要な依存関係のみを取得するように cargo に指示し、ダウンロードを削減します (PKGBUILD#arch および [https: //doc.rust-lang.org/nightly/rustc/platform-support.html Rust プラットフォームのサポート]) を参照。
ビルド
Rust パッケージのビルド:
build() { cargo build --release --locked }
説明:
--release
で cargo はリリースビルドをコンパイルします。--locked
で cargo はCargo.lock
ファイルを変更して依存関係を更新しなくなります。再現可能なビルド とするために必要です。
チェック
大抵の Rust プロジェクトではテストスイートを簡単に実行できるようになっています:
check() { export RUSTUP_TOOLCHAIN=stable cargo test --frozen --all-features }
テストを実行する際は --release
フラグを使用することは避けてください。さもないと、バイナリがbench プロファイルにより再コンパイルされ、build()
により生成されたバイナリを置き換えてしまいます。あるいは、CARGO_TARGET_DIR
に異なる値を使って --release
フラグを使用してください。しかし、release モードはコンパイラ最適化も有効化し、整数のオーバーフロー検査や debug_assert!()
マクロなどの一部の機能を無効化してしまうことに注意してください。なので、理論上、補足できる問題が少なくなってしまう可能性があります。どちらのアプローチでも、依存するクレートを再びコンパイルするので、合計のビルド時間が増えます。
パッケージ
Rust はバイナリを target/release
にビルドするので /usr/bin
にインストールします:
package() { install -Dm0755 -t "$pkgdir/usr/bin/" "target/release/$pkgname" }
パッケージが2つ以上の実行ファイルを /usr/bin
に持つ場合、find コマンドを使うことができます:
package() { find target/release \ -maxdepth 1 \ -executable \ -type f \ -exec install -Dm0755 -t "$pkgdir/usr/bin/" {} + }
cargo install
を使う際の注意点
一部のパッケージは、man ページや他のアセットなどのより多くのファイルをインストールします。そのようなパッケージがそれらのファイルをインストールする方法が他にない場合、cargo install
を使うことができます。この場合、cargo build
を使ってパッケージがすでにビルドされていたとしても cargo install
は再ビルドを強制的に行うので、build()
は必須ではありません。prepare()
ステージはソースを予めフェッチしておくためにまだ使用できます:
package() { cd "$pkgname-$pkgver" export RUSTUP_TOOLCHAIN=stable cargo install --no-track --frozen --all-features --root "$pkgdir/usr/" --path . }
--no-track
引数は常に使用する必要があります。さもないと、cargo install
は /usr/.crates.toml
や /usr/.crates2.json
などの不必要なファイルを作成してしまいます。
パッケージの例
パッケージページの パッケージアクション > ソースファイル をクリックして、PKGBUILD を見ることができます。