Missing then keyword.
[genkernel.git] / gen_bootloader.sh
old mode 100644 (file)
new mode 100755 (executable)
index 5f0bb51..5848bd2
@@ -1,8 +1,13 @@
+# $Id$
+
 set_bootloader() {
        case "${BOOTLOADER}" in
                grub)
                        set_bootloader_grub
                        ;;
+               grub2)
+                       set_bootloader_grub2
+                       ;;
                *)
                        print_warning "Bootloader ${BOOTLOADER} is not currently supported"
                        ;;
@@ -26,6 +31,29 @@ set_bootloader_grub_read_device_map() {
        echo "${TEMP}/grub.map"
 }
 
+set_bootloader_grub2() {
+       local GRUB_CONF
+       for candidate in \
+                       "${BOOTDIR}/grub2/grub.cfg" \
+                       "${BOOTDIR}/grub/grub.cfg" \
+                       ; do
+               if [[ -e "${candidate}" ]]; then
+                       GRUB_CONF=${candidate}
+                       break
+               fi
+       done
+
+       if [[ -z "${GRUB_CONF}" ]]; then
+               print_error 1 "Error! Grub2 configuration file does not exist, please ensure grub2 is correctly setup first."
+               return 0
+       fi
+
+       print_info 1 "You can customize Grub2 parameters in /etc/default/grub."
+       print_info 1 "Running grub2-mkconfig to create ${GRUB_CONF}..."
+       grub2-mkconfig -o "${GRUB_CONF}"
+       [ "${BUILD_RAMDISK}" -ne 0 ] && sed -i 's/ro single/ro debug/' "${GRUB_CONF}"
+}
+
 set_bootloader_grub() {
        local GRUB_CONF="${BOOTDIR}/grub/grub.conf"
 
@@ -58,14 +86,12 @@ set_bootloader_grub() {
                        echo "root (${GRUB_BOOT_DISK},${GRUB_BOOT_PARTITION})" >> ${GRUB_CONF}
                        echo >> ${GRUB_CONF}
 
-                       # Add grub configuration to grub.conf   
+                       # Add grub configuration to grub.conf
                        echo "# Genkernel generated entry, see GRUB documentation for details" >> ${GRUB_CONF}
                        echo "title=Gentoo Linux ($KV)" >> ${GRUB_CONF}
-                       if [ "${BUILD_INITRD}" -eq '0' ]
+                       echo -e "\tkernel /kernel-${KNAME}-${ARCH}-${KV} root=${GRUB_ROOTFS}" >> ${GRUB_CONF}
+                       if [ "${BUILD_INITRD}" = '1' ]
                        then
-                               echo -e "\tkernel /kernel-${KNAME}-${ARCH}-${KV} root=${GRUB_ROOTFS}" >> ${GRUB_CONF}
-                       else
-                               echo -e "\tkernel /kernel-${KNAME}-${ARCH}-${KV} root=/dev/ram0 init=/linuxrc real_root=${GRUB_ROOTFS}" >> ${GRUB_CONF}
                                if [ "${PAT}" -gt '4' ]
                                then
                                    echo -e "\tinitrd /initramfs-${KNAME}-${ARCH}-${KV}" >> ${GRUB_CONF}
@@ -79,6 +105,11 @@ set_bootloader_grub() {
 
        else
                # The grub.conf already exists, so let's try to duplicate the default entry
+               if set_bootloader_grub_check_for_existing_entry "${GRUB_CONF}"; then
+                       print_warning 1 "An entry was already found for a kernel/initramfs with this name...skipping update"
+                       return 0
+               fi
+
                set_bootloader_grub_duplicate_default "${GRUB_CONF}"
        fi
 
@@ -89,10 +120,20 @@ set_bootloader_grub_duplicate_default_replace_kernel_initrd() {
        sed -r -e "/^[[:space:]]*initrd/s/init(rd|ramfs)-[[:alnum:][:punct:]]+/init\1-${KNAME}-${ARCH}-${KV}/"
 }
 
+set_bootloader_grub_check_for_existing_entry() {
+       local GRUB_CONF=$1
+       if grep -q "^[[:space:]]*kernel[[:space:]=]*.*/kernel-${KNAME}-${ARCH}-${KV}\([[:space:]]\|$\)" "${GRUB_CONF}" &&
+               grep -q "^[[:space:]]*initrd[[:space:]=]*.*/initramfs-${KNAME}-${ARCH}-${KV}\([[:space:]]\|$\)" "${GRUB_CONF}"
+       then
+               return 0
+       fi
+       return 1
+}
+
 set_bootloader_grub_duplicate_default() {
        local GRUB_CONF=$1
        local GRUB_CONF_TMP="${GRUB_CONF}.tmp"
-       
+
        line_count=$(wc -l < "${GRUB_CONF}")
        line_nums="$(grep -n "^title" "${GRUB_CONF}" | cut -d: -f1)"
        if [ -z "${line_nums}" ]; then
@@ -103,6 +144,10 @@ set_bootloader_grub_duplicate_default() {
 
        # Find default entry
        default=$(sed -rn '/^[[:space:]]*default[[:space:]=]/s/^.*default[[:space:]=]+([[:alnum:]]+).*$/\1/p' "${GRUB_CONF}")
+    if [ -z "${default}" ]; then
+               print_warning 1 "No default entry found...assuming 0"
+               default=0
+       fi
        if ! echo ${default} | grep -q '^[0-9]\+$'; then
                print_error 1 "We don't support non-numeric (such as 'saved') default values...skipping update"
                return 0