xref: /DragonOS/tools/grub_auto_install.sh (revision 6cf1947dcf7d114ca0503a2bc876412b18c21247)
138b341b8SYJwu2023#!/bin/bash
2d2b28acbS栗子
3d2b28acbS栗子if test -n "$ZSH_VERSION"; then
4d2b28acbS栗子  CURRENT_SHELL=zsh
5d2b28acbS栗子elif test -n "$BASH_VERSION"; then
6d2b28acbS栗子  CURRENT_SHELL=bash
7d2b28acbS栗子elif test -n "$KSH_VERSION"; then
8d2b28acbS栗子  CURRENT_SHELL=ksh
9d2b28acbS栗子elif test -n "$FCEDIT"; then
10d2b28acbS栗子  CURRENT_SHELL=ksh
11d2b28acbS栗子elif test -n "$PS3"; then
12d2b28acbS栗子  CURRENT_SHELL=unknown
13d2b28acbS栗子else
14d2b28acbS栗子  CURRENT_SHELL=sh
15d2b28acbS栗子fi
16d2b28acbS栗子
17c89d0c12SLoGinsource "$HOME/.$CURRENT_SHELL"rc
18c89d0c12SLoGin
195ed4cd46SguanjinquanABS_PREFIX=/opt/dragonos-grub
205ed4cd46Sguanjinquangrub_dir_i386_efi=${ABS_PREFIX}/arch/i386/efi/grub
215ed4cd46Sguanjinquangrub_dir_i386_legacy=${ABS_PREFIX}/arch/i386/legacy/grub
225ed4cd46Sguanjinquangrub_dir_x86_64_efi=${ABS_PREFIX}/arch/x86_64/efi/grub
2348a3baa9SLoGingrub_dir_riscv64_efi=${ABS_PREFIX}/arch/riscv64/efi/grub
24d02e6ea4Slogin
25882f0b7eSYJwu2023sudo mkdir -p ${grub_dir_i386_efi}
26882f0b7eSYJwu2023sudo mkdir -p ${grub_dir_i386_legacy}
27882f0b7eSYJwu2023sudo mkdir -p ${grub_dir_x86_64_efi}
28d02e6ea4Slogin
295ed4cd46Sguanjinquan# 防止外层声明了环境变量,影响到grub的编译
305ed4cd46Sguanjinquanexport CC=gcc
315ed4cd46Sguanjinquanexport LD=ld
325ed4cd46Sguanjinquanexport AS=as
335ed4cd46Sguanjinquanexport NM=nm
345ed4cd46Sguanjinquanexport OBJCOPY=objcopy
355ed4cd46Sguanjinquan
3638b341b8SYJwu2023
3738b341b8SYJwu2023#检测grub是否已经安装
3801090de7SLoGinif [ -d ${grub_dir_i386_efi}/bin ] && [ -d ${grub_dir_i386_legacy}/bin ] && [ -d ${grub_dir_x86_64_efi}/bin ] ; then
3938b341b8SYJwu2023	exit 0
4038b341b8SYJwu2023fi
41*6cf1947dSdonjuanplatinum#仅支持Ubuntu/Debain, Arch, Centos/RHEL8/Fedora gentoo下的自动安装
42*6cf1947dSdonjuanplatinumsupported_package_manager="apt-get pacman dnf yum emerge"
4348a3baa9SLoGinpackages=("make binutils bison gcc gettext flex bison automake autoconf wget gawk" \
44*6cf1947dSdonjuanplatinum              "make binutils bison gcc gettext flex bison automake autoconf wget gawk" \
45*6cf1947dSdonjuanplatinum	      "make binutils bison gcc gettext flex bison automake autoconf wget gawk" \
46*6cf1947dSdonjuanplatinum	      "make binutils bison gcc gettext flex bison automake autoconf wget gawk" \
47*6cf1947dSdonjuanplatinum	      "dev-build/make sys-devel/binutils sys-devel/bison sys-devel/gcc sys-devel/gettext sys-devel/flex dev-build/automake dev-build/autoconf net-misc/wget sys-apps/gawk")
48285de542Szhaoyao73update_options=("update" \
49*6cf1947dSdonjuanplatinum                    "-Sy" \
50*6cf1947dSdonjuanplatinum		    "update" \
51*6cf1947dSdonjuanplatinum		    "update" \
52*6cf1947dSdonjuanplatinum		    "--sync"
53*6cf1947dSdonjuanplatinum	       )
54285de542Szhaoyao73install_options=("install -y" \
55*6cf1947dSdonjuanplatinum                     "-S --needed --noconfirm" \
56*6cf1947dSdonjuanplatinum		     "install -y" \
57*6cf1947dSdonjuanplatinum		     "install -y" \
58*6cf1947dSdonjuanplatinum		     ""
59*6cf1947dSdonjuanplatinum		)
60285de542Szhaoyao73found_pm=0
61285de542Szhaoyao73pm_index=0
62285de542Szhaoyao73for pm in ${supported_package_manager}; do
63285de542Szhaoyao73    if hash 2>/dev/null ${pm}; then
64285de542Szhaoyao73        found_pm=1
65285de542Szhaoyao73        break
66285de542Szhaoyao73    fi
67285de542Szhaoyao73    let pm_index=$pm_index+1
68285de542Szhaoyao73done
69285de542Szhaoyao73if [ ${found_pm} = "1" ]; then
70285de542Szhaoyao73	echo "found package manager: ${pm}"
71285de542Szhaoyao73else
72285de542Szhaoyao73	echo "找不到任何支持的包管理器: ${supported_package_manager}"
7338b341b8SYJwu2023	echo "脚本暂不支持对该系统下grub的安装,请手动完成"
7438b341b8SYJwu2023	exit 0
7538b341b8SYJwu2023fi
76a7f5ca7bSYJwu2023
7738b341b8SYJwu2023#下载grub2.06
78d02e6ea4Sloginif [ ! -f "grub-2.06.tar.xz" ]; then
79a7f5ca7bSYJwu2023    echo "开始下载grub2.06"
805ed4cd46Sguanjinquan    wget https://mirrors.ustc.edu.cn/gnu/grub/grub-2.06.tar.xz || exit 1
81a7f5ca7bSYJwu2023    echo "下载完成"
82d02e6ea4Sloginfi
83d02e6ea4Slogin
84d02e6ea4Slogintar xvf grub-2.06.tar.xz
8538b341b8SYJwu2023#安装对应依赖
86285de542Szhaoyao73sudo ${pm} ${update_options[$pm_index]}
87285de542Szhaoyao73sudo ${pm} ${install_options[$pm_index]} ${packages[$pm_index]}
8838b341b8SYJwu2023
8938b341b8SYJwu2023cd grub-2.06
9038b341b8SYJwu2023echo "开始安装grub2.06"
9138b341b8SYJwu2023#编译安装三个版本的grub
9248a3baa9SLoGin
9348a3baa9SLoGin# 如果不存在i386_legacy的grub,就编译安装
9448a3baa9SLoGinif [ ! -d ${grub_dir_i386_legacy}/bin ]; then
9548a3baa9SLoGin    echo "开始编译安装i386_legacy版本的grub"
96b66beefdSlogin    ./configure --target=i386 --prefix=${grub_dir_i386_legacy} --disable-werror || exit 1
97d02e6ea4Slogin    make -j $(nproc) || exit 1
985ed4cd46Sguanjinquan    sudo make install || exit 1
99d02e6ea4Slogin    make clean || exit 1
10048a3baa9SLoGin    sudo chmod -R 777 ${grub_dir_i386_legacy}
10148a3baa9SLoGinfi
10238b341b8SYJwu2023
10348a3baa9SLoGin# 如果不存在i386_efi的grub,就编译安装
10448a3baa9SLoGinif [ ! -d ${grub_dir_i386_efi}/bin ]; then
10548a3baa9SLoGin    echo "开始编译安装i386_efi版本的grub"
106b66beefdSlogin    ./configure --target=i386 --with-platform=efi --prefix=${grub_dir_i386_efi} --disable-werror ||	exit 1
107d02e6ea4Slogin    make -j $(nproc) || exit 1
1085ed4cd46Sguanjinquan    sudo make install || exit 1
109d02e6ea4Slogin    make clean || exit 1
11048a3baa9SLoGin    sudo chmod -R 777 ${grub_dir_i386_efi}
11148a3baa9SLoGinfi
11238b341b8SYJwu2023
11348a3baa9SLoGin# 如果不存在x86_64_efi的grub,就编译安装
11448a3baa9SLoGinif [ ! -d ${grub_dir_x86_64_efi}/bin ]; then
11548a3baa9SLoGin    echo "开始编译安装x86_64_efi版本的grub"
116b66beefdSlogin    ./configure --target=x86_64 --with-platform=efi --prefix=${grub_dir_x86_64_efi} --disable-werror || exit 1
117d02e6ea4Slogin    make -j $(nproc) || exit 1
1185ed4cd46Sguanjinquan    sudo make install || exit 1
11948a3baa9SLoGin    make clean || exit 1
12048a3baa9SLoGin    sudo chmod -R 777 ${grub_dir_x86_64_efi}
12148a3baa9SLoGinfi
12248a3baa9SLoGin
12348a3baa9SLoGin# 如果不存在riscv64_efi的grub,就编译安装
12401090de7SLoGin# riscv64目前使用DragonStub进行启动,不需要grub
12501090de7SLoGin# if [ ! -d ${grub_dir_riscv64_efi}/bin ]; then
12601090de7SLoGin#     echo "开始编译安装riscv64_efi版本的grub"
12701090de7SLoGin#     # 使用which命令判断,如果不存在riscv64-linux-musl交叉编译工具链,则报错
12801090de7SLoGin#     if [ ! -n "$(which riscv64-linux-musl-gcc)" ]; then
12901090de7SLoGin#         echo "riscv64-linux-musl-gcc不存在,请先安装riscv64-linux-musl交叉编译工具链"
13001090de7SLoGin#         exit 1
13101090de7SLoGin#     fi
13248a3baa9SLoGin
13301090de7SLoGin#     ./configure --target=riscv64 --with-platform=efi --prefix=${grub_dir_riscv64_efi} --host=x86_64-linux-gnu  --disable-werror  BUILD_CC=gcc HOST_CC=x86_64-linux-gnu-gcc  TARGET_CC=riscv64-linux-musl-gcc TARGET_OBJCOPY=riscv64-linux-musl-objcopy TARGET_STRIP=riscv64-linux-musl-strip TARGET_RANLIB=riscv64-linux-musl-ranlib TARGET_NM=riscv64-linux-musl-nm TARGET_LD=riscv64-linux-musl-ld
13401090de7SLoGin#     make -j $(nproc) || exit 1
13501090de7SLoGin#     sudo make install || exit 1
13601090de7SLoGin#     make clean || exit 1
13701090de7SLoGin#     sudo chmod -R 777 ${grub_dir_riscv64_efi}
13801090de7SLoGin# fi
13948a3baa9SLoGin
14038b341b8SYJwu2023
14138b341b8SYJwu2023cd ..
14248a3baa9SLoGin
14338b341b8SYJwu2023rm -rf grub-2.06
144d02e6ea4Sloginrm grub-2.06.tar.xz*
14538b341b8SYJwu2023echo "grub2.06安装完成"
146