「Rust パッケージガイドライン」の版間の差分
(英語版と同期) |
(→準備: 翻訳を修正) |
||
(2人の利用者による、間の8版が非表示) | |||
6行目: | 6行目: | ||
このドキュメントでは [[Rust]] の [[PKGBUILD]] を書く時の基準とガイドラインを説明しています。 |
このドキュメントでは [[Rust]] の [[PKGBUILD]] を書く時の基準とガイドラインを説明しています。 |
||
+ | == パッケージの命名 == |
||
− | == 一般的なガイドライン == |
||
+ | [[Rust]] のプロジェクトをパッケージングする際は、基本的にパッケージ名は生成されるバイナリの名前と同じにするべきです。これはライブラリクレートをパッケージングする場合には当てはまらず、バイナリのクレートの場合にのみ当てはまることに注意してください。2つ以上のバイナリを生成するクレートの場合、上流のクレート名を使うのが通常適切です。いかなる場合でも、パッケージ名はすべて小文字である必要があります。 |
||
− | === パッケージの命名 === |
||
+ | == ソース == |
||
− | [[Rust]] のバイナリの場合はプログラムの名前だけを使ってください。 |
||
+ | ほとんどの Rust プロジェクトは tarball、ソースアーカイブ(例: GitHub リリースのソースリンク)、その他の公開されているソースからビルドすることができます。あるいは、多くのプロジェクトが、[[cargo]] のための安定しているダウンロード URL スキームを提供する [https://crates.io crates.io] 上に公開されています。お望みならば、[[PKGBUILD#source]] で以下のテンプレートを使うことができます: |
||
− | {{Note|パッケージ名は全て小文字である必要があります。}} |
||
+ | |||
+ | <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}} を実行する前に。ビルドの他のすべての側面はここで説明されているように機能するはずですが、依存関係はビルド時に解決されるため、結果は完全に再現性のあるビルドにはなりません。}} |
||
== ビルド == |
== ビルド == |
||
18行目: | 47行目: | ||
Rust パッケージのビルド: |
Rust パッケージのビルド: |
||
− | + | build() { |
|
+ | export RUSTUP_TOOLCHAIN=stable |
||
− | cargo build --release --locked |
||
+ | export CARGO_TARGET_DIR=target |
||
− | } |
||
+ | cargo build --frozen --release --all-features |
||
+ | } |
||
説明: |
説明: |
||
− | * {{ic|--release}} |
+ | * {{ic|--release}} ''cargo'' にリリース ビルドをコンパイルするように指示します (デフォルトはデバッグビルドです) |
− | * {{ic|-- |
+ | * {{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 ユーザーの便宜のためにここに含まれています。}} |
||
== チェック == |
== チェック == |
||
31行目: | 66行目: | ||
大抵の Rust プロジェクトではテストスイートを簡単に実行できるようになっています: |
大抵の Rust プロジェクトではテストスイートを簡単に実行できるようになっています: |
||
− | + | 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!()}} マクロなどの一部の機能を無効化してしまうことに注意してください。なので、理論上、補足できる問題が少なくなってしまう''可能性''があります。どちらのアプローチでも、依存するクレートを再びコンパイルするので、合計のビルド時間が増えます。 |
||
== パッケージ == |
== パッケージ == |
||
39行目: | 77行目: | ||
Rust はバイナリを {{ic|target/release}} にビルドするので {{ic|/usr/bin}} にインストールします: |
Rust はバイナリを {{ic|target/release}} にビルドするので {{ic|/usr/bin}} にインストールします: |
||
− | + | package() { |
|
− | install - |
+ | 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}} などの不必要なファイルを作成してしまいます。 |
||
+ | |||
+ | == パッケージの例 == |
||
+ | |||
+ | パッケージページの ''パッケージアクション > ソースファイル'' をクリックして、PKGBUILD を見ることができます。 |
||
+ | |||
+ | * {{Pkg|cbindgen}} |
||
+ | * {{Pkg|ripgrep}} |
2023年6月26日 (月) 21:20時点における最新版
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() { 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 を構築しない場合のユーザー設定による一般的な副作用が回避されます。
チェック
大抵の 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 を見ることができます。