RISC-V のエミュレータを実装する際などに使用する riscv-gnu-toolchain を macOS にインストールしてみたので、メモを残しておきます。
インストール手順
git clone と make linux でかなりの時間を要します。時間に余裕をもって実行することをおすすめします。
1. clone する
ディレクトリはどこでも構わないので、上記の riscv-gnu-toolchain リポジトリを手順通り git clone
します。
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
手元のネット環境にもよりそうですが、おおよそ1時間くらいかかりました。
2. ビルドの前準備
最終的には make でビルドしますが、その前に必要なツールキットをインストールしておきます。
$ brew install python3 gawk gnu-sed gmp mpfr libmpc isl zlib expat
Python3 以外は各ツールをまったく知らなかったので、ちょっと調べてみました。
- gawk: awk の GNU 実装。GNU + awk で gawk かな?
- gnu-sed: 名前の通りだが、GNU の sed 。
- gmp: GNU Multiple Precision (Arithmetic Library)←頭文字を取って gmp 。多倍長整数などを扱うライブラリ。
- mpfr: 多倍長浮動小数点演算を扱うライブラリ。
- libmpc: 多倍長整数を扱うライブラリ。
- isl: Integer Set Library の頭文字を取ったもの。整数の集合に関する演算を扱うライブラリみたい。
- zlib: データの圧縮を扱うライブラリ。
- expat: XML パーサー。
3. 参照ディレクトリを設定する
今回は、/opt/riscv
というディレクトリに成果物をビルドしてもらうことを想定しています。下記コマンドを叩くと、どこを見るかを指定できます。
$ ./configure --prefix=/opt/riscv
ちなみに、今回私が作っている RISC-V エミュレータでは、rv64g
というアーキテクチャに対するクロスコンパイルを行いたいので、configure は下記のように設定します。
$ ./configure --prefix=/opt/riscv --with-arch=rv64g
4. Newlib と Linux のクロスコンパイラをインストールする
手順に従ってインストールしていきます。
$ make & make linux
これもかなり時間を要します。30分〜1時間くらいかかったように思います。
5. bin に PATH を通す
PATH を通しましょう。下記のように export するか、
$ export PATH=$PATH:/opt/riscv/bin
.zshrc
や .bashrc
に下記のように設定します。
PATH=$PATH:/opt/riscv/bin
おまけ: アセンブラをバイナリに変える
私が今回やりたかったのは、下記の RISC-V アセンブラをバイナリに変えることでした。なので、最後にバイナリを作成しましょう。
main: addi x29, x0, 5 addi x30, x0, 37 add x31, x30, x29
上記を add-addi.s として保存しているものとします。elf-gcc で elf を作り、その後 elf-objcopy で Plain Binary に変換します。
riscv64-unknown-elf-gcc -Wl,-Ttext=0x0 -nostdlib -o add-addi add-addi.s riscv64-unknown-elf-objcopy -O binary add-addi add-addi.bin
これでエミュレータに通すことができました。