「Rust パッケージガイドライン」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(依存を翻訳して追加)
(準備を翻訳して追加)
22行目: 22行目:
 
makedepends=(cargo)
 
makedepends=(cargo)
   
プロジェクトで Rust ツールチェーンのナイトリーバージョンを使用する必要がある場合は、以下を使用します。
+
プロジェクトで Rust ツールチェーンの nightly バージョンを使用する必要がある場合は、以下を使用します。
   
 
makedepends=(cargo-nightly)
 
makedepends=(cargo-nightly)
  +
  +
== 準備 ==
  +
  +
Rust 依存関係マネージャー [[cargo]] は、プロジェクトのビルドに必要なすべてのライブラリを事前にダウンロードできます。 このフェッチを {{ic|prepare()}} ステージで実行すると、後の {{ic|build()}} および他のステージを完全にオフラインで実行できるようになります。
  +
  +
prepare() {
  +
export RUSTUP_TOOLCHAIN=stable
  +
cargo fetch --locked --target "$CARCH-unknown-linux-gnu"
  +
}
  +
  +
何処:
  +
  +
* {{ic|1=RUSTUP_TOOLCHAIN=stable}} は、ユーザーがデフォルトを変更した場合にデフォルトのツールチェーンが ''stable'' に設定されていることを確認します。もちろん、上流のプロジェクトで必要な場合には、これを ''nightly'' に設定する必要があります。これにより、chroot を構築しない場合のユーザー設定による一般的な副作用が回避されます。また、上流プロジェクトのソースにこの目的を果たす {{ic|rust-toolchain}} ファイルまたは {{ic|rust-toolchain.toml}} ファイルがある場合、これは ''不要'' であることにも注意してください。
  +
* {{ic|--locked}} は、''cargo'' に、{{ic|Cargo.lock}} ファイルで指定されたバージョンを厳密に遵守し、依存関係を更新しないように指示します。これは [https://reproducible-builds.org/ 再現性のあるビルド] にとって重要です。
  +
* {{ic| --target "$CARCH-unknown-linux-gnu"}} は、ビルド中の特定のターゲットプラットフォームに必要な依存関係のみを取得するように ''cargo'' に指示し、ダウンロードを削減します ([[PKGBUILD#arch]] および [https: //doc.rust-lang.org/nightly/rustc/platform-support.html Rust プラットフォームのサポート]) を参照。
  +
  +
{{Note|リリースサイクル間で {{ic|Cargo.lock}} ファイルと {{ic|Cargo.toml}} の同期を維持しないアップストリーム ソースプロジェクトの VCS パッケージをビルドする場合は、{{ic|cargo update}} を追加します{{ic|cargo fetch}} を実行する前に。ビルドの他のすべての側面はここで説明されているように機能するはずですが、依存関係はビルド時に解決されるため、結果は完全に再現性のあるビルドにはなりません。}}
   
 
== ビルド ==
 
== ビルド ==

2023年6月26日 (月) 21:15時点における版

このドキュメントでは RustPKGBUILD を書く時の基準とガイドラインを説明しています。

パッケージの命名

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 に行います。cargorustc はどちらも 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 プラットフォームのサポート]) を参照。
ノート: リリースサイクル間で Cargo.lock ファイルと Cargo.toml の同期を維持しないアップストリーム ソースプロジェクトの VCS パッケージをビルドする場合は、cargo update を追加しますcargo fetch を実行する前に。ビルドの他のすべての側面はここで説明されているように機能するはずですが、依存関係はビルド時に解決されるため、結果は完全に再現性のあるビルドにはなりません。

ビルド

Rust パッケージのビルド:

 build() {
   cargo build --release --locked
 }

説明:

  • --releasecargo はリリースビルドをコンパイルします。
  • --lockedcargoCargo.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 を見ることができます。