1# init something here 2current_path=$PATH 3current_pwd=$PWD 4 5# 不建议自行选择安装的位置, 如果要修改请自行修改 INSTALL_POS 6STRUCTURE="x86_64" # 这里选择 x86_64 (64位),而不是选择 i686 架构(32位) 7INSTALL_POS="$HOME/opt/dragonos-gcc" 8PREFIX="$INSTALL_POS/gcc-$STRUCTURE-unknown-none" 9TARGET="${STRUCTURE}-elf" 10PATH="$PREFIX/bin:$PATH" 11TARGET_GCC="$STRUCTURE-elf-gcc" 12TARGET_LD="$STRUCTURE-elf-ld" 13TARGET_AS="$STRUCTURE-elf-as" 14 15# 获取选项 16KEEP_BINUTILS=0 17KEEP_GCC=0 18CHANGE_SOURCE=0 19FORCE=0 20while true; do 21 if [ ! -n "$1" ]; then 22 break 23 fi 24 case "$1" in 25 "-rebuild") 26 echo "清除${INSTALL_POS}目录下的所有信息" 27 rm -rf "${INSTALL_POS}" 28 ;; 29 "-kb") 30 KEEP_BINUTILS=1 31 ;; 32 "-kg") 33 KEEP_GCC=1 34 ;; 35 "-cs") 36 CHANGE_SOURCE=1 37 ;; 38 "-f") 39 FORCE=1 40 ;; 41 "-help") 42 echo "脚本选项如下:" 43 echo "-rebuild: 清除上一次安装的全部信息, 即删掉$INSTALL_POS目录下的所有内容, 然后重新构建gcc工具链." 44 echo "-kg(keep-gcc): 您确保${STRUCTURE}-gcc已被编译安装, 本次调用脚本不重复编译安装gcc. 如果没有安装,脚本仍然会自动安装." 45 echo "-kb(keep-binutils): 您确保binutils已被编译安装, 本次调用脚本不重复编译安装binutils. 如果没有安装,脚本仍然会自动安装." 46 echo "-cs(change source): 如果包含该选项, 使用清华源下载gcc和binutils. 否则默认官方源." 47 echo "-f(force): 如果包含该选项, 可以强制使用root权限安装在/root/目录下." 48 ;; 49 *) 50 echo "不认识参数$1" 51 ;; 52 esac 53 shift 1 54done 55 56# check: Don't install the gcc-toolchain in /root/* 57if [ "${HOME:0:5}" = "/root" ] && [ $FORCE -eq 0 ]; then 58 echo -e "\033[35m 不要把GCC交叉编译工具链安装在/root/目录下, 或者请不要使用sudo \033[0m" 59 echo -e "\033[35m gcc交叉编译工具链默认安装在: /home/<your_usr_name>/opt/dragonos-gcc/ \033[0m" 60 echo -e "\033[35m 如果想要在/root/目录下安装(或者您的操作系统只有root用户), 请使用指令: sudo bash build_gcc_toolchain.sh -f \033[0m" 61 exit 0 62else 63 # 安装开始[提示] 64 echo -e "\033[35m [开始安装] \033[0m" 65 echo -e "\033[33m gcc交叉编译工具链默认安装在: /home/<your_usr_name>/opt/dragonos-gcc/, 整个过程耗时: 5-30mins \033[0m" 66 sleep 0.3s 67fi 68 69# install prerequisited 70# 注意texinfo和binutils的版本是否匹配 71# 注意gmp/mpc/mpfr和gcc/g++的版本是否匹配 72sudo apt-get install -y \ 73 g++ \ 74 gcc \ 75 make \ 76 texinfo \ 77 libgmp3-dev \ 78 libmpc-dev \ 79 libmpfr-dev \ 80 flex \ 81 wget 82 83# build the workspace 84mkdir $HOME/opt 85mkdir $INSTALL_POS 86mkdir $PREFIX 87cd $INSTALL_POS 88 89 90# compile binutils 91BIN_UTILS="binutils-2.38" 92BIN_UTILS_TAR="${BIN_UTILS}.tar.gz" 93if [[ ! -n "$(find $PREFIX/bin/ -name ${TARGET_LD})" && ! -n "$(find $PREFIX/bin/ -name ${TARGET_AS})" ]] || [ KEEP_BINUTILS -ne 1 ]; then 94 if [ KEEP_BINUTILS -eq 1 ]; then 95 echo -e "\033[35m 没有检测到 ${TARGET_LD} 或 没有检测到 ${TARGET_AS}, -kb参数无效 \033[0m" 96 echo -e "\033[35m 开始安装binutils \033[0m" 97 sleep 1s 98 fi 99 if [ ! -d "$BIN_UTILS" ]; then 100 if [ ! -f "$BIN_UTILS_TAR" ]; then 101 echo -e "\033[33m [提醒] 如果使用的是国外源, 下载时间可能偏久. 如果需要使用清华源, 请以输入参数-cs, 即: bash build_gcc_toolchain.sh -cs \033[0m " 102 if [ CHANGE_SOURCE ]; then 103 # 国内源 104 wget "https://mirrors.ustc.edu.cn/gnu/binutils/${BIN_UTILS_TAR}" -P "$INSTALL_POS" 105 else 106 # 官方网站 107 wget https://ftp.gnu.org/gnu/binutils/${BIN_UTILS_TAR} -P "$INSTALL_POS" 108 fi 109 fi 110 tar zxvf "$BIN_UTILS_TAR" 111 fi 112 # 开始编译 113 mkdir build-binutils 114 cd build-binutils 115 ../${BIN_UTILS}/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror 116 make -j $(nproc) || exit 1 117 make install || exit 1 118 cd .. 119fi 120 121# compile GCC 122GCC_FILE="gcc-11.3.0" 123GCC_FILE_TAR="${GCC_FILE}.tar.gz" 124if [ ! -n "$(find $PREFIX/bin/* -name $TARGET_GCC)" ] || [ KEEP_GCC -ne 1 ]; then 125 if [ KEEP_GCC -eq 1 ]; then 126 echo -e "\033[35m 没有检测到 $TARGET_GCC, -kg参数无效 \033[0m" 127 echo -e "\033[35m 开始安装binutils \033[0m" 128 sleep 1s 129 fi 130 if [ ! -d "$GCC_FILE" ]; then 131 if [ ! -f "$GCC_FILE_TAR" ]; then 132 echo -e "\033[33m [提醒] 如果使用的是国外源, 下载时间可能偏久. 如果需要使用清华源, 请以输入参数-cs, 即: bash build_gcc_toolchain.sh -cs \033[0m " 133 if [ CHANGE_SOURCE ]; then 134 # 国内源 135 wget "https://mirrors.ustc.edu.cn/gnu/gcc/${GCC_FILE}/${GCC_FILE_TAR}" -P "$INSTALL_POS" 136 else 137 # 官方网站 138 wget "http://ftp.gnu.org/gnu/gcc/${GCC_FILE}/${GCC_FILE_TAR}" -P "$INSTALL_POS" 139 fi 140 fi 141 tar zxvf "$GCC_FILE_TAR" 142 fi 143 # 开始编译安装 144 mkdir build-gcc 145 cd build-gcc 146 ../${GCC_FILE}/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers 147 make all-gcc -j $(nproc) || exit 1 148 make all-target-libgcc -j $(nproc) || exit 1 149 make install-gcc -j $(nproc) || exit 1 150 make install-target-libgcc -j $(nproc) || exit 1 151 cd .. 152fi 153 154 155# update PATH 156if [ -n "$(grep -F "export DragonOS_GCC=$PREFIX/bin/" $HOME/.bashrc)" ]; then 157 echo "[info] DragonOS_GCC has been in the "'$PATH' 158else 159 echo 'export DragonOS_GCC='"$PREFIX"'/bin' >> "$HOME/.bashrc" 160 echo 'export PATH="$DragonOS_GCC:$PATH"' >> "$HOME/.bashrc" 161 echo "[info] Add DragonOS_GCC into PATH successfully." 162fi 163source "$HOME/.bashrc" 164 165 166# final check 167if [ -n "$(find $PREFIX/bin/* -name $TARGET_GCC)" ] && 168 [ -n "$(find $PREFIX/bin/* -name $TARGET_LD)" ] && 169 [ -n "$(find $PREFIX/bin/* -name $TARGET_AS)" ]; then 170 # 删除临时文件 171 rm -rf "$BIN_UTILS" 172 rm -rf "$BIN_UTILS_TAR" 173 rm -rf "build-binutils" 174 rm -rf "$GCC_FILE" 175 rm -rf "$GCC_FILE_TAR" 176 rm -rf "build-gcc" 177 178 echo -e "\033[42;37m [构建成功] Build Successfully.(请重新打开另一个Shell窗口或者重新打开你的IDE以获取新的环境变量) \033[0m" 179else 180 echo -e "\033[31m [错误] 未找到$STRUCTURE-elf-gcc, $STRUCTURE-elf-ld和$STRUCTURE-elf-as. \033[0m" 181 echo -e "\033[31m [构建失败] 请尝试重新运行build_gcc_toolchain.sh, 或者查看输出,找到错误的原因. \033[0m" 182fi 183 184cd "$current_pwd"