RISC-VのMLで話題に挙がっていた、Windows版RISC-V GCCのコンパイル方法をやってみた。 まだイマイチ洗練されていないようだが、バイナリ自体は作れるようだ。 環境にはmsys2を利用する。
RISC-V GCC for Windowsのビルド方法
msys2には、あらかじめ以下のライブラリとツールをインストールしておく。
pacman -Su msys2-runtime diffutils
./build.sh
を利用する。
ただしこのままではコンパイルできない。自分向けにいくつか改造している。
diff --git a/src/compiler/build.sh b/src/compiler/build.sh index 0edffaa..aa74063 100755 --- a/src/compiler/build.sh +++ b/src/compiler/build.sh @@ -5,37 +5,38 @@ # XXX sudo for install? # XXX impossible to build statically linked binutils? -# F32C_MAKEOPTIONS="LDFLAGS=-static" +F32C_MAKEOPTIONS="LDFLAGS=-static" -SUDO=sudo +SUDO= MAKE=make MAKE_JOBS=2 -BINUTILS_SRC_DIR=~/github/riscv-binutils-gdb -GCC_SRC_DIR=~/github/riscv-gcc -F32C_SRC_DIR=~/github/f32c +BINUTILS_SRC_DIR=~/work/riscv-binutils-gdb +GCC_SRC_DIR=~/work/riscv-gcc +F32C_SRC_DIR=~/work/f32c F32C_TOOLCHAIN_DST_DIR=~/f32c_toolchain
SUDO
はmsys2には必要ない。- ソースファイルの場所とビルド後のツールの格納場所を指定する。
@@ -44,14 +45,17 @@ fi ${SUDO} mkdir -p ${F32C_TOOLCHAIN_DST_DIR} -for TARGET_ARCH in riscv32 mips +for TARGET_ARCH in riscv32 do - for SRC_DIR in ${BINUTILS_SRC_DIR} ${GCC_SRC_DIR} + # for SRC_DIR in ${BINUTILS_SRC_DIR} ${GCC_SRC_DIR} + for SRC_DIR in ${GCC_SRC_DIR} do cd ${SRC_DIR} ${MAKE} distclean find . -name config.cache -exec rm {} \; ./configure --target=${TARGET_ARCH}-elf --enable-languages=c,c++ \ + --build=x86_64-pc-msys2 \ --prefix=${F32C_TOOLCHAIN_DST_DIR} \ --mandir=${F32C_TOOLCHAIN_DST_DIR}/man \ --infodir=${F32C_TOOLCHAIN_DST_DIR}/info \
- mipsのビルドターゲットは不要
- ビルドオプションに
--build=x86_64-pc-msys2 \
を追加する。
これで./build.sh
を実行してしばらく待っていると、しばらくして ~/f32c_toolchain
にビルドツールが生成されていることが分かる。
msyksphinz@fixedesk MINGW64 ~ $ cd ~/f32c_toolchain/bin/ msyksphinz@fixedesk MINGW64 ~/f32c_toolchain/bin $ ls a.out riscv32-elf-gcc-7.0.1.exe riscv32-elf-nm.exe riscv64-elf-cpp.exe riscv64-unknown-elf-cpp.exe riscv32-elf-addr2line.exe riscv32-elf-gcc-ar.exe riscv32-elf-objcopy.exe riscv64-elf-g++.exe riscv64-unknown-elf-g++.exe riscv32-elf-ar.exe riscv32-elf-gcc-nm.exe riscv32-elf-objdump.exe riscv64-elf-gcc.exe riscv64-unknown-elf-gcc.exe riscv32-elf-as.exe riscv32-elf-gcc-ranlib.exe riscv32-elf-ranlib.exe riscv64-elf-gcc-7.0.1.exe riscv64-unknown-elf-gcc-7.0.1.exe riscv32-elf-c++.exe riscv32-elf-gcov.exe riscv32-elf-readelf.exe riscv64-elf-gcc-ar.exe riscv64-unknown-elf-gcc-ar.exe riscv32-elf-c++filt.exe riscv32-elf-gcov-tool.exe riscv32-elf-run.exe riscv64-elf-gcc-nm.exe riscv64-unknown-elf-gcc-nm.exe riscv32-elf-cpp.exe riscv32-elf-gdb.exe riscv32-elf-size.exe riscv64-elf-gcc-ranlib.exe riscv64-unknown-elf-gcc-ranlib.exe riscv32-elf-elfedit.exe riscv32-elf-gprof.exe riscv32-elf-strings.exe riscv64-elf-gcov.exe riscv64-unknown-elf-gcov.exe riscv32-elf-g++.exe riscv32-elf-ld.bfd.exe riscv32-elf-strip.exe riscv64-elf-gcov-tool.exe riscv64-unknown-elf-gcov-tool.exe riscv32-elf-gcc.exe riscv32-elf-ld.exe riscv64-elf-c++.exe riscv64-unknown-elf-c++.exe
GCCのテストを行う
ためしに以下のようなプログラムを作って、きちんと命令が生成されるか確認する。 ライブラリなどは、とりあえず不要とした。
float add (float a, float b) { return a + b; }
コンパイルしてみる。
$ ~/f32c_toolchain/bin/riscv32-elf-gcc -c main.cpp $ ~/f32c_toolchain/bin/riscv32-elf-objdump.exe -d main.o main.o: file format elf32-littleriscv Disassembly of section .text: 00000000 <_Z3addff>: 0: 1101 addi sp,sp,-32 2: ce22 sw s0,28(sp) 4: 1000 addi s0,sp,32 6: fea42627 fsw fa0,-20(s0) a: feb42427 fsw fa1,-24(s0) e: fec42707 flw fa4,-20(s0) 12: fe842787 flw fa5,-24(s0) 16: 00f777d3 fadd.s fa5,fa4,fa5 1a: 20f78553 fmv.s fa0,fa5 1e: 4472 lw s0,28(sp) 20: 6105 addi sp,sp,32 22: 8082 ret
一応、コンパイルは出来ているようだ。ダンプ結果が何だか変だな。