新しいターゲットの追加
これは、新しいターゲットのサポートを追加するための一連の手順です。 到達し得る最終状態やそこに至る経路は数多くあるため、すべてのセクションが あなたの目的に関連するとは限りません。
関連するドキュメントについては、ターゲット階層ポリシーも参照してください。
新しい 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.toml の target セクションを使用して、ビルド済みバージョンの 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.toml の
llvm-filecheck 設定項目で FileCheck へのパスを指定するか、
bootstrap.toml の rust.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.rs の
STAGE0_MISSING_TARGETS リストにターゲットトリプルを明示的に追加する必要があります。
これは、デフォルトのブートストラップコンパイラ(通常はベータコンパイラ)が、
追加したばかりの新しいターゲットを認識しないために必要です。
したがって、ブートストラップがこのターゲットはまだ stage0 コンパイラではサポートされていないことを
認識できるように、STAGE0_MISSING_TARGETS に追加する必要があります。
const STAGE0_MISSING_TARGETS: &[&str] = &[
+ "NEW_TARGET_TRIPLE"
];
クレートへのパッチ適用
libc や cc など、コンパイラが依存しているクレートに変更を加える必要があるかもしれません。
その場合は、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.toml の rust.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 つのレベルがあります。
- クロスコンパイルのみされるターゲット(
rustup target add) - ネイティブツールチェインを持つターゲット(
rustup toolchain install)
ターゲットをクロスコンパイルからネイティブへ昇格する例については、 #75914 を参照してください。