FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io

RISC-V向けRust-Toolchain試行(1)

f:id:msyksphinz:20171129020950p:plain

RISC-V Workshopが開催されているが、このタイミングでプログラミング言語RustのRISC-V移植版が公開されているのを発見した。 やっぱり来ると思ったよ!

abopen.com

Rustのコンパイル環境はLLVMをベースにしているようだ。 ターゲットボードはHiFive1となっている。ちょうど良いので環境を構築してみよう。

RISC-V Rust-Toolchainのビルド

github.com

通常の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

うーん、やっぱり失敗。続く。