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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎パッケージの例: 追加。英語版より。)
(→‎準備: 翻訳を修正)
 
(2人の利用者による、間の6版が非表示)
9行目: 9行目:
   
 
[[Rust]] のプロジェクトをパッケージングする際は、基本的にパッケージ名は生成されるバイナリの名前と同じにするべきです。これはライブラリクレートをパッケージングする場合には当てはまらず、バイナリのクレートの場合にのみ当てはまることに注意してください。2つ以上のバイナリを生成するクレートの場合、上流のクレート名を使うのが通常適切です。いかなる場合でも、パッケージ名はすべて小文字である必要があります。
 
[[Rust]] のプロジェクトをパッケージングする際は、基本的にパッケージ名は生成されるバイナリの名前と同じにするべきです。これはライブラリクレートをパッケージングする場合には当てはまらず、バイナリのクレートの場合にのみ当てはまることに注意してください。2つ以上のバイナリを生成するクレートの場合、上流のクレート名を使うのが通常適切です。いかなる場合でも、パッケージ名はすべて小文字である必要があります。
  +
  +
== ソース ==
  +
  +
ほとんどの Rust プロジェクトは tarball、ソースアーカイブ(例: GitHub リリースのソースリンク)、その他の公開されているソースからビルドすることができます。あるいは、多くのプロジェクトが、[[cargo]] のための安定しているダウンロード URL スキームを提供する [https://crates.io crates.io] 上に公開されています。お望みならば、[[PKGBUILD#source]] で以下のテンプレートを使うことができます:
  +
  +
<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 ツールチェーンの 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}} を実行する前に。ビルドの他のすべての側面はここで説明されているように機能するはずですが、依存関係はビルド時に解決されるため、結果は完全に再現性のあるビルドにはなりません。}}
   
 
== ビルド ==
 
== ビルド ==
14行目: 47行目:
 
Rust パッケージのビルド:
 
Rust パッケージのビルド:
   
build() {
+
build() {
  +
export RUSTUP_TOOLCHAIN=stable
cargo build --release --locked
 
  +
export CARGO_TARGET_DIR=target
}
 
  +
cargo build --frozen --release --all-features
  +
}
   
 
説明:
 
説明:
   
* {{ic|--release}} ''cargo'' リリースビルドをコンパイルします
+
* {{ic|--release}} ''cargo'' リリース ビルドをコンパイルするように指示します (デフォルトはデバッグビルドです)
* {{ic|--locked}} ''cargo'' {{ic|Cargo.lock}} ファイルを変更し依存関係更新なくなります。[https://reproducible-builds.org/ 再現可能なビルド] とするために必要です。
+
* {{ic|--frozen}} ''cargo'' をオフラインのままにし、{{ic|Cargo.lock}} ファイルで指定され、{{ic|prepare()}} ステージでのフェッチ実行によっキャッシュされたバージョンのみ使用するように指示します。これは機能的には {{ic|--locked --offline}} と同等であり、これは [https://reproducible-builds.org/ 再現可能なビルド] って重要です。
  +
* {{ic|--all-features}} は、パッケージのすべての機能を有効にしてコンパイルするように ''cargo'' に指示します。あるいは、選択した機能のみを有効にする場合は、{{ic|--features ''FEATURE1'',''FEATURE2''}} を使用します。
  +
* {{ic|1=CARGO_TARGET_DIR=target}} は、現在のディレクトリを基準にして相対的な ''target'' に出力を配置するように ''cargo'' に指示します。これにより、chroot を構築しない場合のユーザー設定による一般的な副作用が回避されます。
  +
  +
{{Note|2 つの環境変数は、デフォルト設定で chroot 環境に ''常に'' 構築されるため、Arch リポジトリパッケージには必要ありません。これらは、ユーザーのデフォルト設定を変更し、パッケージを構築するときに chroot を使用しないことによる影響を理解していない可能性があります。AUR ユーザーの便宜のためにここに含まれています。}}
   
 
== チェック ==
 
== チェック ==
27行目: 66行目:
 
大抵の Rust プロジェクトではテストスイートを簡単に実行できるようになっています:
 
大抵の Rust プロジェクトではテストスイートを簡単に実行できるようになっています:
   
check() {
+
check() {
  +
export RUSTUP_TOOLCHAIN=stable
cargo test --release --locked
 
  +
cargo test --frozen --all-features
}
 
  +
}
  +
  +
テストを実行する際は {{ic|--release}} フラグを使用することは避けてください。さもないと、バイナリが[https://doc.rust-lang.org/cargo/reference/profiles.html#bench ''bench'' プロファイル]により再コンパイルされ、{{ic|build()}} により生成されたバイナリを置き換えてしまいます。あるいは、{{ic|CARGO_TARGET_DIR}} に異なる値を使って {{ic|--release}} フラグを使用してください。しかし、release モードはコンパイラ最適化も有効化し、整数のオーバーフロー検査や {{ic|debug_assert!()}} マクロなどの一部の機能を無効化してしまうことに注意してください。なので、理論上、補足できる問題が少なくなってしまう''可能性''があります。どちらのアプローチでも、依存するクレートを再びコンパイルするので、合計のビルド時間が増えます。
   
 
== パッケージ ==
 
== パッケージ ==
35行目: 77行目:
 
Rust はバイナリを {{ic|target/release}} にビルドするので {{ic|/usr/bin}} にインストールします:
 
Rust はバイナリを {{ic|target/release}} にビルドするので {{ic|/usr/bin}} にインストールします:
   
package() {
+
package() {
install -Dm 755 target/release/${pkgname} -t "${pkgdir}/usr/bin"
+
install -Dm0755 -t "$pkgdir/usr/bin/" "target/release/$pkgname"
}
+
}
  +
  +
パッケージが2つ以上の実行ファイルを {{ic|/usr/bin}} に持つ場合、find コマンドを使うことができます:
   
パッケージによっては man ページなど他のファイルもインストールするので、{{ic|cargo}} を用いるのがよいでしょう:
 
 
package() {
 
package() {
  +
find target/release \
cargo install --root "${pkgdir}"/usr --root "${srcdir}/${pkgname}-${pkgver}"
 
  +
-maxdepth 1 \
  +
-executable \
  +
-type f \
  +
-exec install -Dm0755 -t "$pkgdir/usr/bin/" {} +
 
}
 
}
  +
  +
=== {{ic|cargo install}} を使う際の注意点 ===
  +
  +
一部のパッケージは、man ページや他のアセットなどのより多くのファイルをインストールします。そのようなパッケージがそれらのファイルをインストールする方法が他にない場合、{{ic|cargo install}} を使うことができます。この場合、{{ic|cargo build}} を使ってパッケージがすでにビルドされていたとしても {{ic|cargo install}} は再ビルドを強制的に行うので、{{ic|build()}} は必須ではありません。{{ic|prepare()}} ステージはソースを予めフェッチしておくためにまだ使用できます:
  +
  +
package() {
  +
cd "$pkgname-$pkgver"
  +
export RUSTUP_TOOLCHAIN=stable
  +
cargo install --no-track --frozen --all-features --root "$pkgdir/usr/" --path .
  +
}
  +
  +
{{ic|--no-track}} 引数は常に使用する必要があります。さもないと、{{ic|cargo install}} は {{ic|/usr/.crates.toml}} や {{ic|/usr/.crates2.json}} などの不必要なファイルを作成してしまいます。
   
 
== パッケージの例 ==
 
== パッケージの例 ==

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

このドキュメントでは 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() {
    export RUSTUP_TOOLCHAIN=stable
    export CARGO_TARGET_DIR=target
    cargo build --frozen --release --all-features
}

説明:

  • --release cargo にリリース ビルドをコンパイルするように指示します (デフォルトはデバッグビルドです)
  • --frozen cargo をオフラインのままにし、Cargo.lock ファイルで指定され、prepare() ステージでのフェッチ実行によってキャッシュされたバージョンのみを使用するように指示します。これは機能的には --locked --offline と同等であり、これは 再現可能なビルド にとって重要です。
  • --all-features は、パッケージのすべての機能を有効にしてコンパイルするように cargo に指示します。あるいは、選択した機能のみを有効にする場合は、--features FEATURE1,FEATURE2 を使用します。
  • CARGO_TARGET_DIR=target は、現在のディレクトリを基準にして相対的な target に出力を配置するように cargo に指示します。これにより、chroot を構築しない場合のユーザー設定による一般的な副作用が回避されます。
ノート: 2 つの環境変数は、デフォルト設定で chroot 環境に 常に 構築されるため、Arch リポジトリパッケージには必要ありません。これらは、ユーザーのデフォルト設定を変更し、パッケージを構築するときに chroot を使用しないことによる影響を理解していない可能性があります。AUR ユーザーの便宜のためにここに含まれています。

チェック

大抵の 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 を見ることができます。