]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Cherrypick bugfixes and coreboot+qemu support from expermental
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 17 May 2010 19:35:39 +0000 (21:35 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 17 May 2010 19:35:39 +0000 (21:35 +0200)
util/grub-mkrescue.in

index 993ffe0cb2b404622ead169a844f24bbbbce741d..4e105f12588431ea8815a8b971ad3b8cd939cdc6 100644 (file)
@@ -30,10 +30,13 @@ target_cpu=@target_cpu@
 native_platform=@platform@
 pkglib_DATA="@pkglib_DATA@"
 
-multiboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-multiboot
-pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-pc
+multiboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-multiboot
+coreboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-coreboot
+qemu_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-qemu
+pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-pc
 efi32_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-efi
 efi64_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/x86_64-efi
+rom_directory=
 
 # Usage: usage
 # Print the usage.
@@ -44,8 +47,9 @@ Make GRUB rescue image.
 
   -h, --help              print this message and exit
   -v, --version           print the version information and exit
-  --modules=MODULES       pre-load specified modules MODULES
   --output=FILE           save output in FILE [required]
+  --modules=MODULES       pre-load specified modules MODULES
+  --rom-directory=DIR     save rom images in DIR [optional]
 
 $0 generates a bootable rescue image with specified source files or directories.
 
@@ -66,6 +70,8 @@ for option in "$@"; do
        modules=`echo "$option" | sed 's/--modules=//'` ;;
     --output=*)
        output_image=`echo "$option" | sed 's/--output=//'` ;;
+    --rom-directory=*)
+       rom_directory=`echo "$option" | sed 's/--rom-directory=//'` ;;
     # Intentionally undocumented
     --override-directory=*)
        override_dir=`echo "${option}/" | sed 's/--override-directory=//'`
@@ -103,15 +109,15 @@ process_input_dir ()
 {
     input_dir="$1"
     platform="$2"
-    mkdir -p ${iso9660_dir}/boot/grub/${target_cpu}-${platform}
+    mkdir -p ${iso9660_dir}/boot/grub/${platform}
     for file in ${input_dir}/*.mod; do
         if test -f "$file"; then
-            cp -f "$file" ${iso9660_dir}/boot/grub/${target_cpu}-${platform}/
+            cp -f "$file" ${iso9660_dir}/boot/grub/${platform}/
         fi
     done
     for file in ${pkglib_DATA}; do
        if test -f "${input_dir}/${file}"; then
-            cp -f "${input_dir}/${file}" ${iso9660_dir}/boot/grub/${target_cpu}-${platform}/
+            cp -f "${input_dir}/${file}" ${iso9660_dir}/boot/grub/${platform}/
        fi
     done
 
@@ -123,28 +129,71 @@ process_input_dir ()
     done
 }
 
+make_image ()
+{
+    source_directory="$1"
+    platform=$2
+    if ! test -e "${source_directory}"; then
+       return;
+    fi
+
+    echo "Enabling $2 support ..."
+
+    memdisk_img=`mktemp "$MKTEMP_TEMPLATE"`
+    memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
+    mkdir -p ${memdisk_dir}/boot/grub
+
+    modules="$(cat ${source_directory}/partmap.lst) ${modules}"
+    cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg
+search --fs-uuid --set ${iso_uuid}
+set prefix=(\${root})/boot/grub/${platform}
+source \$prefix/grub.cfg
+EOF
+    (for i in ${modules} ; do
+        echo "insmod $i"
+    done ; \
+    echo "source /boot/grub/grub.cfg") \
+    > ${iso9660_dir}/boot/grub/${platform}/grub.cfg
+
+    tar -C ${memdisk_dir} -cf ${memdisk_img} boot
+    rm -rf ${memdisk_dir}
+    grub-mkimage -O ${platform} -d "${source_directory}" -m "${memdisk_img}" -o "$3" --prefix='(memdisk)/boot/grub' \
+        search iso9660 configfile normal memdisk tar $4
+    rm -rf ${memdisk_img}
+}
+
 if [ "${override_dir}" = "" ] ; then
     if test -e "${multiboot_dir}" ; then
-        process_input_dir ${multiboot_dir} multiboot
+        process_input_dir ${multiboot_dir} i386-multiboot
+    fi
+    if test -e "${coreboot_dir}" ; then
+        process_input_dir ${coreboot_dir} i386-coreboot
+    fi
+    if test -e "${qemu_dir}" ; then
+        process_input_dir ${qemu_dir} i386-qemu
     fi
     if test -e "${pc_dir}" ; then
-        process_input_dir ${pc_dir} pc
+        process_input_dir ${pc_dir} i386-pc
     fi
     if test -e "${efi32_dir}" ; then
-        process_input_dir ${efi32_dir} efi32
+        process_input_dir ${efi32_dir} i386-efi
     fi
     if test -e "${efi64_dir}" ; then
-        process_input_dir ${efi64_dir} efi64
+        process_input_dir ${efi64_dir} x86_64-efi
     fi
 else
-    process_input_dir ${override_dir} ${native_platform}
+    process_input_dir ${override_dir} ${target_cpu}-${native_platform}
     multiboot_dir=
     pc_dir=
     efi32_dir=
     efi64_dir=
+    coreboot_dir=
+    qemu_dir=
     case "${target_cpu}-${native_platform}" in
-        i386-pc) pc_dir=${override_dir} ;;
         i386-multiboot) multiboot_dir=${override_dir} ;;
+        i386-coreboot) coreboot_dir=${override_dir} ;;
+        i386-qemu) qemu_dir=${override_dir} ;;
+        i386-pc) pc_dir=${override_dir} ;;
        i386-efi) efi32_dir=${override_dir} ;;
        x86_64-efi) efi64_dir=${override_dir} ;;
     esac
@@ -154,33 +203,6 @@ fi
 iso_uuid=$(date -u +%Y-%m-%d-%H-%M-%S-00)
 grub_mkisofs_arguments="${grub_mkisofs_arguments} --modification-date=$(echo ${iso_uuid} | sed -e s/-//g)"
 
-# build coreboot multiboot.img
-if test -e "${multiboot_dir}" ; then
-    echo "Enabling multiboot support ..."
-    memdisk_img=`mktemp "$MKTEMP_TEMPLATE"`
-    memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
-    mkdir -p ${memdisk_dir}/boot/grub
-
-    modules="$(cat ${multiboot_dir}/partmap.lst) ${modules}"
-    cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg
-search --fs-uuid --set ${iso_uuid}
-set prefix=(\${root})/boot/grub/${target_cpu}-multiboot
-source \$prefix/grub.cfg
-EOF
-    (for i in ${modules} ; do
-        echo "insmod $i"
-    done ; \
-    echo "source /boot/grub/grub.cfg") \
-    > ${iso9660_dir}/boot/grub/i386-multiboot/grub.cfg
-
-    tar -C ${memdisk_dir} -cf ${memdisk_img} boot
-    rm -rf ${memdisk_dir}
-    grub-mkimage -O i386-coreboot -d ${multiboot_dir}/ -m ${memdisk_img} -o ${iso9660_dir}/boot/multiboot.img \
-        memdisk tar search iso9660 configfile sh \
-        ata at_keyboard
-    rm -f ${memdisk_img}
-fi
-
 # build BIOS core.img
 if test -e "${pc_dir}" ; then
     echo "Enabling BIOS support ..."
@@ -205,47 +227,32 @@ if test -e "${pc_dir}" ; then
                --embedded-boot ${embed_img}"
 fi
 
+# build multiboot core.img
+make_image "${multiboot_dir}" i386-multiboot "${iso9660_dir}/boot/multiboot.img" "ata at_keyboard"
+
 if test -e "${efi64_dir}" || test -e "${efi32_dir}"; then
     efi_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
     mkdir -p "${efi_dir}/efi/boot"
-else
-    efi_dir=
-fi
-
-# build bootx64.efi
-if test -e "${efi64_dir}" ; then
-    echo "Enabling EFI64 support ..."
-    memdisk_img=`mktemp "$MKTEMP_TEMPLATE"`
-    memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
-    mkdir -p ${memdisk_dir}/boot/grub
 
-    cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg
-search --fs-uuid --set ${iso_uuid}
-set prefix=(\${root})/boot/grub/${target_cpu}-efi
-source \$prefix/grub.cfg
-EOF
+    # build bootx64.efi
+    make_image "${efi64_dir}" x86_64-efi "${efi_dir}"/efi/boot/bootx64.efi ""
+    # build bootia32.efi
+    make_image "${efi32_dir}" i386-efi "${efi_dir}"/efi/boot/bootia32.efi ""
 
-    tar -C ${memdisk_dir} -cf ${memdisk_img} boot
-    rm -rf ${memdisk_dir}
-
-    grub-mkimage -O x86_64-efi -d "${efi64_dir}" -m "${memdisk_img}" -o "${efi_dir}"/efi/boot/bootx64.efi --prefix='(memdisk)/boot/grub' \
-        search iso9660 configfile sh memdisk tar
-    rm -f ${memdisk_img}
-
-    modules="$(cat "${efi64_dir}"/partmap.lst) ${modules}"
-    (for i in ${modules} ; do
-        echo "insmod $i"
-    done ; \
-    echo "source /boot/grub/grub.cfg") \
-    > "${iso9660_dir}"/boot/grub/x86_64-efi/grub.cfg
-fi
-
-if test x"${efi_dir}" != x; then
     mformat -C -f 2880 -L 16 -i "${iso9660_dir}"/efi.img ::
     mcopy -s -i "${iso9660_dir}"/efi.img ${efi_dir}/efi ::/
     grub_mkisofs_arguments="${grub_mkisofs_arguments} --efi-boot efi.img"
 fi
 
+make_image "${qemu_dir}" i386-qemu "${iso9660_dir}/boot/qemu.img" "ata at_keyboard"
+if [ -e "${iso9660_dir}/boot/qemu.img" ] && [ -d "${rom_directory}" ]; then
+    cp "${iso9660_dir}/boot/qemu.img" "${rom_directory}/qemu.img"
+fi
+make_image "${coreboot_dir}" i386-coreboot "${iso9660_dir}/boot/coreboot.elf" "ata at_keyboard"
+if [ -e "${iso9660_dir}/boot/coreboot.elf" ] && [ -d "${rom_directory}" ]; then
+    cp "${iso9660_dir}/boot/coreboot.elf" "${rom_directory}/coreboot.elf"
+fi
+
 # build iso image
 xorriso -pathspecs on -as mkisofs ${grub_mkisofs_arguments} --protective-msdos-label -o ${output_image} -r ${iso9660_dir} ${source}
 rm -rf ${iso9660_dir}