build_gcc_toolchain.sh 6.6 KB

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