Skip to content

Latest commit

 

History

History
151 lines (104 loc) · 4.63 KB

2.md

File metadata and controls

151 lines (104 loc) · 4.63 KB

安装RISC-V编译环境

环境要求

我们使用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位的请参考源代码相应的手册。

注意事项

如果源代码下载很慢,请自行学习科学上网。

如果源代码编译失败,请考虑增加你的物理内存,或者增加虚拟内存。

riscv-gnu-toolchain

这是一个交叉编译的工具链,能让我们在当前架构的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

构建newlib函数库版本

build$     mkdir newlib
build$     cd newlib
newlib$    ../../configure --prefix=$RISCV/newlib
newlib$    make -j $(nproc)

构建linux函数库(可选)

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++)的编译器,其用法和gccg++无异。生成的是RISC-V版的可执行文件,故在X86架构下,需要使用模拟器。

qemu

这是一个模拟器,代码已经被包含在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(可选)

这是另外一个模拟器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程序。

pk(可选)

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

llvm(可选)

这是另外一个编译器,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,这个便是我们的编译器了。


hello world!