RISC-V Workshopが開催されているが、このタイミングでプログラミング言語RustのRISC-V移植版が公開されているのを発見した。 やっぱり来ると思ったよ!
Rustのコンパイル環境はLLVMをベースにしているようだ。 ターゲットボードはHiFive1となっている。ちょうど良いので環境を構築してみよう。
RISC-V Rust-Toolchainのビルド
通常のRISC-Vツールチェインのビルドに必要なパッケージに加えて、Ubuntu-17.10では以下のパッケージを追加でダウンロードする必要があった。
sudo apt install cmake ninja-build
まずはRISC-V向けにポーティングされたRustのビルド環境をダウンロードする。上記のリポジトリをcloneして、ビルドするということになる。 ビルド環境一式をダウンロードするので、かなり重たい。 自宅のインターネットはそこまで高速ではないのでちょっと時間がかかる。
git clone --recursive https://github.com/dvc94ch/riscv-rust-toolchain cd riscv-rust-toolchain
env.sh
にはいくつかの環境変数を設定しなければならない。
source ./env.sh
ビルドを実行する。かなり時間がかかる。ちなみに最初は人権のない4GBのメモリのノートPCで実行したが、メモリが足りずにFailしてしまった。 LLVMってこんなにビルドにメモリ使うのか。。。
make -j4
ビルドが終了すると、riscv-rust-toolchain/toolchain/
にビルド後のファイル一式が作成される。
RISC-V Rust QuickStartの試行
とりあえずRustを試行するためには、以下をダウンロードする。
git clone https://github.com/dvc94ch/riscv-rust-quickstart
riscv-rust-quickstart/env.sh
はツールチェインの場所を指定しないといけないので、これを指定しよう。
diff --git a/env.sh b/env.sh index e552973..928cb0e 100644 --- a/env.sh +++ b/env.sh @@ -1,4 +1,4 @@ -export RISCV_RUST_TOOLCHAIN=~/repos/riscv-rust +export RISCV_RUST_TOOLCHAIN=${HOME}/work/riscv-rust-toolchain export TOOLCHAIN=$RISCV_RUST_TOOLCHAIN/toolchain export PATH=$TOOLCHAIN/bin:$PATH
ビルドを実行する。うーん、エラーが出た。何かの設定が足りないらしい?
$ make build xargo build --target riscv32-unknown-none error: failed to run `rustc` to learn about target-specific information Caused by: process didn't exit successfully: `rustc - --crate-name ___ --print=file-names -C link-arg=-Tlink.x -C linker=riscv32-unknown-elf-ld --target riscv32-unknown-none --crate-type bin --crate-type rlib` (exit code: 101) --- stderr error: Error loading target specification: Field target-c-int-width in target specification is required | = help: Use `--print target-list` for a list of built-in targets Makefile:5: recipe for target 'build' failed make: *** [build] Error 101
そもそもrustcはデフォルトの場所を指しているのだが、これは合っているのだろうか?
--print target-list
をしても何も出てこないなあ?
$ rustc --print target-list | ag riscv
$
RUST_TARGET_PATH
という環境変数についてあまり良く分かっていないけど、${RUST_TARGET_PATH}/riscv32-unknown-none.json
が読み込まれるはずではないのだろうか?
他のサンプルを見ていると、riscv32-unknown-none.json
に修正が必要な気がする。
diff --git a/riscv32-unknown-none.json b/riscv32-unknown-none.json index 098616d..8a67332 100644 --- a/riscv32-unknown-none.json +++ b/riscv32-unknown-none.json @@ -7,10 +7,8 @@ "os": "none", "cpu": "generic-rv32", "features": "+m", - "max-atomic-width": 0, - "target-c-int-width": 32, - - + "max-atomic-width": "0", + "target-c-int-width": "32", "linker": "ld.lld", "linker-flavor": "ld", "executables": true,
これで再度ビルド。
$ make build xargo build --target riscv32-unknown-none error: failed to run `rustc` to learn about target-specific information Caused by: process didn't exit successfully: `rustc - --crate-name ___ --print=file-names -C link-arg=-Tlink.x -C linker=riscv32-unknown-elf-ld --target riscv32-unknown-none --crate-type bin --crate-type rlib` (exit code: 101) --- stderr error: Could not create LLVM TargetMachine for triple: riscv32: No available targets are compatible with this triple. Makefile:5: recipe for target 'build' failed make: *** [build] Error 101
うーん、やっぱり失敗。続く。