Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

新しいターゲットの追加

これは、新しいターゲットのサポートを追加するための一連の手順です。 到達し得る最終状態やそこに至る経路は数多くあるため、すべてのセクションが あなたの目的に関連するとは限りません。

関連するドキュメントについては、ターゲット階層ポリシーも参照してください。

新しい LLVM の指定

非常に新しいターゲットの場合、現在 Rust に同梱されているものとは異なる LLVM のフォークを使用する必要があるかもしれません。 その場合は、src/llvm-project git サブモジュールに移動し(サブモジュールが更新されるように、 少なくとも一度は ./x check を実行する必要があるかもしれません)、 自分のフォークに適したコミットをチェックアウトしてから、その新しいサブモジュール参照を メインの Rust リポジトリにコミットします。

例は次のとおりです。

cd src/llvm-project
git remote add my-target-llvm some-llvm-repository
git checkout my-target-llvm/my-branch
cd ..
git add llvm-project
git commit -m 'Use my custom LLVM'

ビルド済み LLVM の使用

すでにビルド済みのローカル LLVM チェックアウトがある場合、 冗長なビルドを避けるために、そのビルドをシステム LLVM として扱うよう Rust を構成できる場合があります。

bootstrap.tomltarget セクションを使用して、ビルド済みバージョンの LLVM を使用するよう Rust に指示できます。

[target.x86_64-unknown-linux-gnu]
llvm-config = "/path/to/llvm/llvm-7.0.1/bin/llvm-config"

システム LLVM を使用しようとしている場合、以前に次のパスが確認されていますが、 あなたのシステムでは異なる可能性があります。

  • /usr/bin/llvm-config-8
  • /usr/lib/llvm-8/bin/llvm-config

コード生成テストで使用される LLVM の FileCheck ツールをインストールしておく必要があることに注意してください。 このツールは通常 LLVM と一緒にビルドされますが、独自のインストール済み LLVM を使用する場合は、 何らかの別の方法で FileCheck を提供する必要があります。 Debian ベースのシステムでは、llvm-N-tools パッケージをインストールできます(ここで N は LLVM のバージョン番号です。例: llvm-8-tools)。あるいは、bootstrap.tomlllvm-filecheck 設定項目で FileCheck へのパスを指定するか、 bootstrap.tomlrust.codegen-tests 項目でコード生成テストを無効化できます。

ターゲット仕様の作成

まずはターゲット JSON ファイルから始めるべきです。 --print target-spec-json を使用すると、既存のターゲットの仕様を確認できます。

rustc -Z unstable-options --target=wasm32-unknown-unknown --print target-spec-json

その JSON をファイルに保存し、ターゲットに合わせて適切に変更します。

ターゲット仕様の追加

JSON 仕様を記入し、ある程度正常にコンパイルできるようになったら、 その仕様をコンパイラ自体にコピーできます。

rustc_target::spec モジュール内の supported_targets マクロにある 大きなテーブルに行を追加する必要があります。 次に、新しいターゲットに対応する、target 関数を含むファイルを追加します。

例として使用できる既存のターゲットを探してください。

このターゲットをブートストラップで使用するには、src/bootstrap/src/core/sanity.rsSTAGE0_MISSING_TARGETS リストにターゲットトリプルを明示的に追加する必要があります。 これは、デフォルトのブートストラップコンパイラ(通常はベータコンパイラ)が、 追加したばかりの新しいターゲットを認識しないために必要です。 したがって、ブートストラップがこのターゲットはまだ stage0 コンパイラではサポートされていないことを 認識できるように、STAGE0_MISSING_TARGETS に追加する必要があります。

const STAGE0_MISSING_TARGETS: &[&str] = &[
+   "NEW_TARGET_TRIPLE"
];

クレートへのパッチ適用

libccc など、コンパイラが依存しているクレートに変更を加える必要があるかもしれません。 その場合は、Cargo の [patch] 機能を使用できます。 たとえば、未リリース版の libc を使用したい場合は、トップレベルの Cargo.toml ファイルに追加できます。

diff --git a/Cargo.toml b/Cargo.toml
index 1e83f05e0ca..4d0172071c1 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -113,6 +113,8 @@ cargo-util = { path = "src/tools/cargo/crates/cargo-util" }
 [patch.crates-io]
+libc = { git = "https://github.com/rust-lang/libc", rev = "0bf7ce340699dcbacabdf5f16a242d2219a49ee0" }

 # 何が起きているのかについては、`src/tools/rustc-workspace-hack/README.md` のコメントを参照してください
 # ここ
 rustc-workspace-hack = { path = 'src/tools/rustc-workspace-hack' }

その後、cargo update -p libc を実行してロックファイルを更新します。

ローカルの path 依存関係にパッチを適用すると、 その依存関係に対する警告が有効になることに注意してください。 一部の依存関係は警告なしではなく、bootstrap.tomlrust.deny-warnings 設定により、 ビルドが突然失敗し始める可能性があります。 警告に対処するには、次のようにするとよいでしょう。

  • 依存関係を変更して警告を取り除く
  • または、ローカル開発目的で、bootstrap.toml に rust.deny-warnings = false を設定して警告を抑制する。

クロスコンパイル

JSON とコードの両方にターゲット仕様が用意できたら、rustc をクロスコンパイルできます。

DESTDIR=/path/to/install/in \
./x install -i --stage 1 --host aarch64-apple-darwin.json --target aarch64-apple-darwin \
compiler/rustc library/std

ターゲット仕様がすでにブートストラップコンパイラで利用可能な場合は、 両方の引数で JSON ファイルの代わりにそれを使用できます。

ターゲットを tier 2(ターゲット)から tier 2(ホスト)へ昇格する

tier 2 ターゲットには 2 つのレベルがあります。

ターゲットをクロスコンパイルからネイティブへ昇格する例については、 #75914 を参照してください。