1.2 开发环境 - 工具链安装
- 为了方便使用,计划将工具链做成 SS928 SDK 仓库的一部分,并编写一个安装脚本。
创建仓库
-
在 gitlab 上创建 SS928 SDK 仓库,并命名为
SS928_SDK_G7.3_K4.19
,其中 G7.3 代表 gcc 版本为 7.3,K4.19 代表内核版本为 4.19。 -
进入开发虚拟机,克隆仓库:
cd ~ mkdir -p hiss928/sdk && cd hiss928/sdk git clone http://gitlab.xxx.com/SDK/SS928_SDK_G7.3_K4.19.git ss928_sdk_g7.3_k4.19 cd ss928_sdk_g7.3_k4.19 && mkdir toolchain tmp
拷贝工具链
- 进入到厂商提供的工具链所在目录,使用以下命令将工具链拷贝至开发虚拟机:
scp aarch64-mix210-linux.tgz ubuntu@172.16.0.xx:hiss928/sdk/ss928_sdk_g7.3_k4.19/tmp
scp cc-riscv32-cfg5-musl-20211008-elf.tar.gz ubuntu@172.16.0.xx:hiss928/sdk/ss928_sdk_g7.3_k4.19/tmp
解压工具链
- 进入开发虚拟机,
cd ~/hiss928/sdk/ss928_sdk_g7.3_k4.19/tmp
- aarch64:
- 解压工具链
tar -xf aarch64-mix210-linux.tgz
- 解压后可以得到四个文件:
aarch64-mix210-linux.tar.bz2 aarch64-mix210-linux.install runtime_lib.tgz readme.txt
- 阅读
aarch64-mix210-linux.install
安装脚本,可以得出安装步骤如下:- 解压两个压缩包到指定的安装目录(用户可选)
- 将工具链加入系统路径,并写入
/etc/profile
- 解压工具链
- riscv32:
- 解压工具链
tar -xf cc-riscv32-cfg5-musl-20211008-elf.tar.gz
- 解压后可以得到三个文件:
cc_riscv32_musl.tar.gz README.md install.sh
- 阅读
install.sh
安装脚本,可以得出安装步骤如下:- 解压压缩包到默认的安装目录(安装目录换了个名字,多此一举)
- 为工具链创建软链接(多此一举)
- 整理gcc库(没搞明白,先照着弄)
- 将工具链加入系统路径,并写入
/etc/profile
- 解压工具链
编写安装脚本
-
以上两个工具链默认的安装脚本不符合需求,需求如下:
- 默认安装目录为仓库下的
toolchain
目录,且不可更改 - 未安装工具链时才执行安装操作
- 只在需要使用的时候将工具链加入系统路径(由于本人虚拟机里面工具链超级多)
- 默认安装目录为仓库下的
-
准备安装需要的文件:
cp -f aarch64-mix210-linux.tar.bz2 runtime_lib.tgz ~/hiss928/sdk/ss928_sdk_g7.3_k4.19/toolchain
cp -f cc_riscv32_musl.tar.gz ~/hiss928/sdk/ss928_sdk_g7.3_k4.19/toolchain
-
创建脚本文件:
cd ~/hiss928/sdk/ss928_sdk_g7.3_k4.19
touch env_setup.sh
chmod a+x env_setup.sh
-
编写脚本,脚本内容如下:
#!/bin/bash # 获取当前脚本所在目录 # 支持不进入到当前目录使用,例如 source ~/xxx/ss928_sdk_g7.3_k4.19/env_setup.sh echo "$0" | grep -q "bash" if [ $? -eq 0 ]; then CUR_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd ) else CUR_DIR=$(dirname $0) fi # 默认安装目录 TOOLCHAIN_PATH=${CUR_DIR}/toolchain # aarch64 工具链 AARCH64_TOOLCHAIN=aarch64-mix210-linux AARCH64_TOOLCHAIN_TAR=${TOOLCHAIN_PATH}/${AARCH64_TOOLCHAIN}.tar.bz2 AARCH64_RUNTIME_LIB=${TOOLCHAIN_PATH}/runtime_lib.tgz AARCH64_TOOLCHAIN_READY=${TOOLCHAIN_PATH}/aarch64_ready # 通过判断文件 aarch64_ready 的存在,来确定 aarch64 工具链是否已安装 if [ ! -f ${AARCH64_TOOLCHAIN_READY} ]; then # 解压工具链 tar -xvf ${AARCH64_TOOLCHAIN_TAR} -C ${TOOLCHAIN_PATH} tar -xvf ${AARCH64_RUNTIME_LIB} -C ${TOOLCHAIN_PATH}/${AARCH64_TOOLCHAIN} echo "ok" > ${AARCH64_TOOLCHAIN_READY} fi # riscv32 工具链 RISCV32_TOOLCHAIN=cc_riscv32_musl RISCV32_TOOLCHAIN_TAR=${TOOLCHAIN_PATH}/${RISCV32_TOOLCHAIN}.tar.gz RISCV32_TOOLCHAIN_READY=${TOOLCHAIN_PATH}/riscv32_ready # 通过判断文件 riscv32_ready 的存在,来确定 riscv32 工具链是否已安装 if [ ! -f ${RISCV32_TOOLCHAIN_READY} ]; then # 解压工具链 tar -xvf ${RISCV32_TOOLCHAIN_TAR} -C ${TOOLCHAIN_PATH} # 整理gcc库 pushd ${TOOLCHAIN_PATH}/${RISCV32_TOOLCHAIN}/lib/gcc/riscv32-linux-musl/7.3.0 mv libgcc.a libgcc_org.a cp libgcc-origin-noop.a libgcc.a popd echo "ok" > ${RISCV32_TOOLCHAIN_READY} fi # 加入系统路径 TMP_PATH=${PATH}:${TOOLCHAIN_PATH}/${AARCH64_TOOLCHAIN}/bin export PATH=${TMP_PATH}:${TOOLCHAIN_PATH}/${RISCV32_TOOLCHAIN}/bin
安装工具链
- 执行命令
source ./env_setup.sh
即可完成安装。
测试工具链
- aarch64:
- 查看 gcc 版本,
aarch64-mix210-linux-gcc -v
,可以看到版本为gcc version 7.3.0 (HC&C V1R3C00SPC200B042_20221123)
- 查看默认的 c++ 标准
aarch64-mix210-linux-g++ -E -dM - < /dev/null | grep __STDC_VERSION__
,报错如下:- error while loading shared libraries: libisl.so.19: cannot open shared object file: No such file or directory
- 库版本不匹配导致的,官方建议的虚拟机版本为 ubuntu 18.04,其 libisl 的版本为 libisl.so.19,而本人使用的虚拟机为 ubuntu 22.04,libisl 的版本为 libisl.so.23
- 解决方法:
sudo ln -sf /usr/lib/x86_64-linux-gnu/libisl.so.23 /usr/lib/x86_64-linux-gnu/libisl.so.19
- 创建一个只有 main 函数的文件,
aarch64-mix210-linux-g++ xx.cpp
,编译通过,即说明工具链可正常使用。
- 查看 gcc 版本,
- riscv32:
- 查看 gcc 版本,
riscv32-linux-musl-gcc -v
,可以看到版本为gcc version 7.3.0 (20211008)
- 查看默认的 c++ 标准
riscv32-linux-musl-g++ -E -dM - < /dev/null | grep __STDC_VERSION__
,输出为#define __STDC_VERSION__ 201112L
- 创建一个只有 main 函数的文件,
riscv32-linux-musl-g++ xx.cpp
,编译通过,即说明工具链可正常使用。
- 查看 gcc 版本,
完善仓库
-
cd ~/hiss928/sdk/ss928_sdk_g7.3_k4.19/toolchain && touch .gitignore
,文件内容如下:aarch64-mix210-linux/ aarch64_ready cc_riscv32_musl/ riscv32_ready
-
tmp 目录如不需要可以删除掉,最后仓库目录结构如下:
. ├── env_setup.sh ├── README.md └── toolchain ├── aarch64-mix210-linux.tar.bz2 ├── cc_riscv32_musl.tar.gz └── runtime_lib.tgz
-
推送代码到远端。