CentOS 7 - RISC-V + LLVM 環境架設
這篇文章主要參考於這個 github: https://github.com/sifive/riscv-llvm
---廢話區---
這個本來是大四上 Compiler 的時候有用 Ubuntu 建置過
雖然明明只是照指令一行一行打
但對當時的我還是很頭痛
所以上次剛進碩班老師要我建這個環境的時候
我心裡充滿了恐懼
尤其是又要在我完全沒用過的 CentOS 上用
因此我還為此逃避了好幾個月不弄
老師沒把我趕出去真的是佛心來的
不過後來還是終於面對現實去把環境弄起來了
但不得不說 當時真的遇到很多瓶頸
絕對不像在 Ubuntu 上指令照著打一打東西就會順利出來了 (因為裡面文件指令適用於 Ubuntu)
當時經過蠻多各種 ERROR 試了又試 東查西查 才終於把整個環境架出來
所以這次趁著要重新建置整個環境的機會
希望這篇文章能幫助日後自己想起來建置步驟
也能幫助其他想在 CentOS 上建置這個環境的人
---正文區---
(安裝懶人包在這,但還是建議往下跟著一步一步做才知道哪裡有問題~)
先更新好軟體包
sudo yum update
安裝相依的軟體包 (由於是 CentOS ,有些名稱跟原本網站不太一樣要注意)
# 這些跟網站給的安裝軟體名稱都是一樣的
sudo yum install binutils libtool texinfo gzip zip unzip patchutils curl git make cmake automake bison flex gperf grep sed gawk python bc
# 這些是名稱不同的要注意
sudo yum groupinstall "Development Tools" "Development Libraries" #sudo yum install build-essential(?)
sudo yum install http://repo.okay.com.mx/centos/7/x86_64/release/okay-release-1-1.noarch.rpm #sudo yum install ninja-build
sudo yum install ninja-build
sudo yum install zlib-devel #sudo yum install zlib1g-dev
sudo yum install expat-devel #sudo yum install libexpat1-dev
sudo yum install libmpc-devel #sudo yum install libmpc-dev
sudo yum install glib2-devel #sudo yum install libglib2.0-dev
sudo yum install libfdt-devel #sudo yum install libfdt-dev
sudo yum install pixman-devel #sudo yum install libpixman-1-dev
# 沒有 python3 的要先裝
sudo yum python3
建立 riscv 資料夾
mkdir riscv
進入 riscv 資料夾
cd riscv
設定暫時的環境變數 (紅色可以自己指定你想安裝 riscv 的路徑)
export PATH=/opt/riscv/bin:$PATH
hash -r
下載 riscv-gnu-toolchain
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
(這一步會需要好幾十分鐘)
進入 riscv-gnu-toolchain 資料夾
pushd riscv-gnu-toolchain
進行設定 (--prefix=你想安裝 riscv 的路徑)
./configure --prefix=/opt/riscv --enable-multilib
執行安裝 (-j 表示多線程處理,例如 8核就可以打 -j8,-j`nproc`則是會自動抓你系統的總核心數)
make -j`nproc`
跳出資料夾
popd
下載 riscv-llvm
git clone https://github.com/llvm/llvm-project.git riscv-llvm
進入資料夾
pushd riscv-llvm/
建立 softlink
ln -s ../../clang llvm/tools || true
建立 _build 資料夾
mkdir _build
進入 _build 資料夾
cd _build
安裝 (藍色部分可以自己設定想安裝 llvm 的路徑,跟前面紅色不一樣唷!)
cmake3 -G Ninja -DCMAKE_BUILD_TYPE="Release" \
-DBUILD_SHARED_LIBS=True -DLLVM_USE_SPLIT_DWARF=True \
-DCMAKE_INSTALL_PREFIX="/opt/llvm" \
-DLLVM_OPTIMIZED_TABLEGEN=True -DLLVM_BUILD_TESTS=False \
-DDEFAULT_SYSROOT="/opt/llvm/riscv64-unknown-elf" \
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf" \
-DLLVM_TARGETS_TO_BUILD="RISCV" \
../llvm
這時候會出現一個錯誤!
不過經過 yum search cmake 發現了 cmake3
所以要透過 yum 先安裝 CMake 3
sudo yum install cmake3
然後把指令的 cmake 改成 cmake3
-DBUILD_SHARED_LIBS=True -DLLVM_USE_SPLIT_DWARF=True \
-DCMAKE_INSTALL_PREFIX="/opt/llvm" \
-DLLVM_OPTIMIZED_TABLEGEN=True -DLLVM_BUILD_TESTS=False \
-DDEFAULT_SYSROOT="/opt/llvm/riscv64-unknown-elf" \
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv64-unknown-elf" \
-DLLVM_TARGETS_TO_BUILD="RISCV" \
../llvm
結果又出現錯誤!
這也很明顯的是 GCC 版本過舊
所以我選擇安裝 GCC 7
先使用 yum 安裝這兩個軟體
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
在 scl 虛擬環境中啟動 gcc 7 (**啟動的效果只存在於當前這個 bash,關掉後就不見了)
scl enable devtoolset-7 bash
確認 GCC 7 安裝成功
gcc --version
版本號有正確出現就表示成功了唷!
不過再回到上個 cmake3 的步驟前
請先做以下步驟
rm -f CMakeCache.txt
export CC="你的 gcc 7 路徑" #用 which gcc 就可以看到 gcc 7 路徑了
export CXX="你的 g++ 7 路徑" #用 which g++ 就可以看到 g++ 7 路徑了
前面都做完後,接著安裝
cmake --build . --target install
(這步驟也會需要蠻久時間的)
然後跳出資料夾
popd
到這裡如果都沒錯誤發生的話,就是已經安裝好了唷!
這裡也提供 .sh 檔直接執行就可以跑上面的所有指令了
接著就可以進行測試了!
---測試區---
剛裝好的東西不要忘記加到環境路徑!
export PATH=/opt/riscv/bin:/opt/llvm/bin:$PATH
接著建立測試檔案 hello.c
vim hello.c
int main(){
printf("Hello RISCV!\n");
return 0;
}
(這裡刪掉了 #include <stdio.h> 因為clang 會報錯)
用 64bit RISC-V 測試
clang -O -c hello.c #Compile C Code
riscv64-unknown-elf-gcc hello.o -o hello -march=rv64imac -mabi=lp64
qemu-riscv64 hello #run the program
最後顯示出這個畫面就是大功告成了!
*小技巧:
上面用 export 設定的環境變數都只會於當前這個 bash 下生效
關掉後就會失效了
如果想要讓他在你每次登入時都可以自動生效
打開 bashrc 檔案
vim ~/.bashrc
把你想自動生效的環境設定指令直接寫進去檔案裏面
ex.
source scl_source enable devtoolset-7 # 讓 devtoolset-7 生效
export PATH=/opt/riscv/bin:/opt/llvm/bin:$PATH
留言
張貼留言