xref: /DragonOS/tools/grub_auto_install.sh (revision 471d65cf158c9bf741c21f5d0ab92efe7bf1c3d4)
1#!/bin/bash
2
3if test -n "$ZSH_VERSION"; then
4  CURRENT_SHELL=zsh
5elif test -n "$BASH_VERSION"; then
6  CURRENT_SHELL=bash
7elif test -n "$KSH_VERSION"; then
8  CURRENT_SHELL=ksh
9elif test -n "$FCEDIT"; then
10  CURRENT_SHELL=ksh
11elif test -n "$PS3"; then
12  CURRENT_SHELL=unknown
13else
14  CURRENT_SHELL=sh
15fi
16
17source "$HOME/.$CURRENT_SHELL"rc
18
19ABS_PREFIX=/opt/dragonos-grub
20grub_dir_i386_efi=${ABS_PREFIX}/arch/i386/efi/grub
21grub_dir_i386_legacy=${ABS_PREFIX}/arch/i386/legacy/grub
22grub_dir_x86_64_efi=${ABS_PREFIX}/arch/x86_64/efi/grub
23grub_dir_riscv64_efi=${ABS_PREFIX}/arch/riscv64/efi/grub
24
25sudo mkdir -p ${grub_dir_i386_efi}
26sudo mkdir -p ${grub_dir_i386_legacy}
27sudo mkdir -p ${grub_dir_x86_64_efi}
28
29# 防止外层声明了环境变量,影响到grub的编译
30export CC=gcc
31export LD=ld
32export AS=as
33export NM=nm
34export OBJCOPY=objcopy
35
36
37#检测grub是否已经安装
38if [ -d ${grub_dir_i386_efi}/bin ] && [ -d ${grub_dir_i386_legacy}/bin ] && [ -d ${grub_dir_x86_64_efi}/bin ] ; then
39	exit 0
40fi
41#仅支持Ubuntu/Debain, Arch, Centos/RHEL8/Fedora下的自动安装
42supported_package_manager="apt-get pacman dnf"
43packages=("make binutils bison gcc gettext flex bison automake autoconf wget gawk" \
44          "make binutils bison gcc gettext flex bison automake autoconf wget gawk")
45update_options=("update" \
46                "-Sy")
47install_options=("install -y" \
48                 "-S --needed --noconfirm")
49found_pm=0
50pm_index=0
51for pm in ${supported_package_manager}; do
52    if hash 2>/dev/null ${pm}; then
53        found_pm=1
54        break
55    fi
56    let pm_index=$pm_index+1
57done
58if [ ${found_pm} = "1" ]; then
59	echo "found package manager: ${pm}"
60else
61	echo "找不到任何支持的包管理器: ${supported_package_manager}"
62	echo "脚本暂不支持对该系统下grub的安装,请手动完成"
63	exit 0
64fi
65
66#下载grub2.06
67if [ ! -f "grub-2.06.tar.xz" ]; then
68    echo "开始下载grub2.06"
69    wget https://mirrors.ustc.edu.cn/gnu/grub/grub-2.06.tar.xz || exit 1
70    echo "下载完成"
71fi
72
73tar xvf grub-2.06.tar.xz
74#安装对应依赖
75sudo ${pm} ${update_options[$pm_index]}
76sudo ${pm} ${install_options[$pm_index]} ${packages[$pm_index]}
77
78cd grub-2.06
79echo "开始安装grub2.06"
80#编译安装三个版本的grub
81
82# 如果不存在i386_legacy的grub,就编译安装
83if [ ! -d ${grub_dir_i386_legacy}/bin ]; then
84    echo "开始编译安装i386_legacy版本的grub"
85    ./configure --target=i386 --prefix=${grub_dir_i386_legacy} --disable-werror || exit 1
86    make -j $(nproc) || exit 1
87    sudo make install || exit 1
88    make clean || exit 1
89    sudo chmod -R 777 ${grub_dir_i386_legacy}
90fi
91
92# 如果不存在i386_efi的grub,就编译安装
93if [ ! -d ${grub_dir_i386_efi}/bin ]; then
94    echo "开始编译安装i386_efi版本的grub"
95    ./configure --target=i386 --with-platform=efi --prefix=${grub_dir_i386_efi} --disable-werror ||	exit 1
96    make -j $(nproc) || exit 1
97    sudo make install || exit 1
98    make clean || exit 1
99    sudo chmod -R 777 ${grub_dir_i386_efi}
100fi
101
102# 如果不存在x86_64_efi的grub,就编译安装
103if [ ! -d ${grub_dir_x86_64_efi}/bin ]; then
104    echo "开始编译安装x86_64_efi版本的grub"
105    ./configure --target=x86_64 --with-platform=efi --prefix=${grub_dir_x86_64_efi} --disable-werror || exit 1
106    make -j $(nproc) || exit 1
107    sudo make install || exit 1
108    make clean || exit 1
109    sudo chmod -R 777 ${grub_dir_x86_64_efi}
110fi
111
112# 如果不存在riscv64_efi的grub,就编译安装
113# riscv64目前使用DragonStub进行启动,不需要grub
114# if [ ! -d ${grub_dir_riscv64_efi}/bin ]; then
115#     echo "开始编译安装riscv64_efi版本的grub"
116#     # 使用which命令判断,如果不存在riscv64-linux-musl交叉编译工具链,则报错
117#     if [ ! -n "$(which riscv64-linux-musl-gcc)" ]; then
118#         echo "riscv64-linux-musl-gcc不存在,请先安装riscv64-linux-musl交叉编译工具链"
119#         exit 1
120#     fi
121
122#     ./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
123#     make -j $(nproc) || exit 1
124#     sudo make install || exit 1
125#     make clean || exit 1
126#     sudo chmod -R 777 ${grub_dir_riscv64_efi}
127# fi
128
129
130cd ..
131
132rm -rf grub-2.06
133rm grub-2.06.tar.xz*
134echo "grub2.06安装完成"
135