xref: /DragonOS/tools/build_gcc_toolchain.sh (revision ac643d420b22f9d454ecefccd51ed34a9664586b)
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"