「Rust パッケージガイドライン」の版間の差分
(→チェック: 同期) |
(依存を翻訳して追加) |
||
| 15行目: | 15行目: | ||
<nowiki>source=("$pkgname-$pkgver.tar.gz::https://static.crates.io/crates/$pkgname/$pkgname-$pkgver.crate")</nowiki> |
<nowiki>source=("$pkgname-$pkgver.tar.gz::https://static.crates.io/crates/$pkgname/$pkgname-$pkgver.crate")</nowiki> |
||
| + | |||
| + | == 依存 == |
||
| + | |||
| + | 一部の Rust プロジェクトには外部依存関係がありますが、ほとんどは最終バイナリに静的に埋め込まれた Rust エコシステムライブラリを使用するだけです。そのため、ほとんどのプロジェクトでは、{{ic|depends}} を指定する必要はなく、{{ic|makedepends}} のみを指定する必要があります。Rust プロジェクトの大部分は、[[cargo]] 依存関係マネージャーを使用してビルドされるように設計されており、実際の Rust コンパイラは、現在ビルド時の依存関係を満たすためにライブラリのダウンロードを調整するだけでなく、必要なすべての呼び出しを {{ic|rustc}} に行います。''cargo'' と ''rustc'' はどちらも {{Pkg|rust}} パッケージで提供されていますが、これらの両方を一緒に入手したり、{{Pkg|rustup}} パッケージを個別に入手したりする別の方法もあります。そのため、ほとんどの PKGBUILD が呼び出すツールは ''cargo'' であり、これに直接依存する必要があります。 |
||
| + | |||
| + | makedepends=(cargo) |
||
| + | |||
| + | プロジェクトで Rust ツールチェーンのナイトリーバージョンを使用する必要がある場合は、以下を使用します。 |
||
| + | |||
| + | makedepends=(cargo-nightly) |
||
== ビルド == |
== ビルド == |
||
2023年6月26日 (月) 21:08時点における版
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 ツールチェーンのナイトリーバージョンを使用する必要がある場合は、以下を使用します。
makedepends=(cargo-nightly)
ビルド
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 を見ることができます。