我们使用Ubuntu系统,来进行环境配置,其他的Linux版本,可以仿照此来进行。
然后下载一些基础的库(如果还缺少库,请自行进行添加)。
sudo apt install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev cmake ninja-build pkg-config libglib2.0-dev libpixman-1-dev python git libfdt-dev libncurses5-dev libncursesw5-dev device-tree-compiler
再选择一个目录,作为RISC-V编译程序的存放位置。然后设置环境变量,此处的~/RISCV
可以替换。注意,此处的变量需要在每次登陆时重新设置(或设置环境变量,Ubuntu系统的配置)。
~$ mkdir RISCV
~$ RISCV=~/RISCV
~$ cd RISCV
我们生成的是64位的版本,32位的请参考源代码相应的手册。
如果源代码下载很慢,请自行学习科学上网。
如果源代码编译失败,请考虑增加你的物理内存,或者增加虚拟内存。
这是一个交叉编译的工具链,能让我们在当前架构的CPU下,生成RISC-V的程序。
首先便是下载源代码(需要非常久):
RISCV$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git
然后对源代码进行编译,创建一个目录build,用以存放生成的编译程序(newlib和linux是两个不同的函数库,可以选择一个):
RISCV$ cd riscv-gnu-toolchain
riscv-gnu-toolchain$ mkdir build
riscv-gnu-toolchain$ cd build
build$ mkdir newlib
build$ cd newlib
newlib$ ../../configure --prefix=$RISCV/newlib
newlib$ make -j $(nproc)
build$ mkdir linux
build$ cd linux
linux$ ../../configure --prefix=$RISCV/linux
linux$ make linux -j $(nproc)
至此,我们已经可以编译RISCV架构的C/C++程序了。
在$RISCV/newlib
下的bin
里面,我们可以看到riscv64-unknown-elf-gcc
(或$RISCV/linux/bin/riscv64-unknown-elf-g++
)的编译器,其用法和gcc
与g++
无异。生成的是RISC-V版的可执行文件,故在X86架构下,需要使用模拟器。
这是一个模拟器,代码已经被包含在riscv-gnu-toolchain
里面。但我们此处使用qemu自身的代码仓库。
开始构建。
RISCV$ git clone --recursive https://gitlab.com/qemu-project/qemu.git qemu-project
RISCV$ cd qemu-project
qemu-project$ mkdir build
qemu-project$ cd build
build$ ../configure --target-list=riscv64-softmmu,riscv64-linux-user --prefix=$RISCV/qemu
build$ ninja
build$ ninja install
在$RISCV/qemu/bin
里面,可以看到qemu-riscv64
,可以运行上述交叉编译器生成的程序。
这是另外一个模拟器spike,依旧是先下载源代码:
RISCV$ git clone https://github.com/riscv/riscv-isa-sim.git
然后编译newlib版:
RISCV$ cd riscv-isa-sim
riscv-isa-sim$ mkdir build
riscv-isa-sim$ cd build
build$ ../configure --prefix=$RISCV/newlib #linux版为$RISCV/linux
build$ make -j $(nproc)
build$ make install
可以在$RISCV/newlib
(或$RISCV/linux
)下的bin
里面,看到我们的spike
程序。
spike需要pk,才能运行RISC-V程序。
下载源代码:
RISCV$ git clone https://github.com/riscv/riscv-pk.git
编译(注意,此处需要$RISCV/newlib/bin
在$PATH
中,且须在gcc
的路径前面):
RISCV$ cd riscv-pk
riscv-pk$ mkdir -p build/newlib
riscv-pk$ cd build/newlib
newlib$ ../../configure --prefix=$RISCV/newlib --host=riscv64-unknown-elf #linux版为$RISCV/linux/bin/riscv64-unknown-linux
newlib$ make -j $(nproc)
newlib$ make install
这是另外一个编译器,clang便是llvm中的子项目。
首先下载源代码:
RISCV$ git clone https://github.com/llvm/llvm-project.git
然后编译源代码:
RISCV$ cd llvm-project
llvm-project$ mkdir build
llvm-project$ cd build
build$ cmake -DLLVM_TARGETS_TO_BUILD="X86;RISCV" -DLLVM_ENABLE_PROJECTS="clang;llvm" -DCMAKE_INSTALL_PREFIX=$RISCV/llvm -G "Ninja" ../llvm
build$ ninja
build$ ninja install
我们可以在$RISCV/llvm/bin
中找到clang
,这个便是我们的编译器了。