]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Implement grub-mkrescue for coreboot (needs external grub-mkisofs)
authorRobert Millan <rmh@aybabtu.com>
Sun, 8 Nov 2009 20:56:32 +0000 (20:56 +0000)
committerRobert Millan <rmh@aybabtu.com>
Sun, 8 Nov 2009 20:56:32 +0000 (20:56 +0000)
ChangeLog.branch [new file with mode: 0644]
conf/i386-coreboot.rmk
util/i386/coreboot/grub-mkrescue.in [new file with mode: 0644]

diff --git a/ChangeLog.branch b/ChangeLog.branch
new file mode 100644 (file)
index 0000000..4794498
--- /dev/null
@@ -0,0 +1,5 @@
+2009-11-08  Robert Millan  <rmh.grub@aybabtu.com>
+
+       * util/i386/coreboot/grub-mkrescue.in: New file.
+       * conf/i386-coreboot.rmk (bin_SCRIPTS, grub_mkrescue_SOURCES): New
+       variables.
index 09ec7787c4ebdbcd412288d881070009a135062e..5645395b8c1f8af1a984dc271e0356d8d9fe159f 100644 (file)
@@ -152,6 +152,9 @@ grub_emu_LDFLAGS = $(LIBCURSES)
 sbin_SCRIPTS += grub-install
 grub_install_SOURCES = util/i386/pc/grub-install.in
 
+bin_SCRIPTS += grub-mkrescue
+grub_mkrescue_SOURCES = util/i386/coreboot/grub-mkrescue.in
+
 # Modules.
 pkglib_MODULES = linux.mod multiboot.mod               \
        aout.mod play.mod serial.mod ata.mod            \
diff --git a/util/i386/coreboot/grub-mkrescue.in b/util/i386/coreboot/grub-mkrescue.in
new file mode 100644 (file)
index 0000000..fbfc138
--- /dev/null
@@ -0,0 +1,144 @@
+#! /bin/sh -e
+
+# Make GRUB rescue image
+# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009  Free Software Foundation, Inc.
+#
+# GRUB is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GRUB is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+
+# Initialize some variables.
+transform="@program_transform_name@"
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+bindir=@bindir@
+libdir=@libdir@
+PACKAGE_NAME=@PACKAGE_NAME@
+PACKAGE_TARNAME=@PACKAGE_TARNAME@
+PACKAGE_VERSION=@PACKAGE_VERSION@
+target_cpu=@target_cpu@
+platform=@platform@
+pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}`
+
+grub_mkimage=${bindir}/`echo grub-mkelfimage | sed ${transform}`
+
+# Usage: usage
+# Print the usage.
+usage () {
+    cat <<EOF
+Usage: grub-mkrescue [OPTION] output_image
+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
+  --overlay=DIR           overlay directory DIR in the memdisk image
+                          (may be specified multiple times)
+  --pkglibdir=DIR         use images from directory DIR instead of ${pkglibdir}
+  --grub-mkimage=FILE     use FILE as grub-mkimage
+
+grub-mkimage generates a bootable rescue image of the specified type.
+
+Report bugs to <bug-grub@gnu.org>.
+EOF
+}
+
+input_dir=${pkglibdir}
+
+# Check the arguments.
+for option in "$@"; do
+    case "$option" in
+    -h | --help)
+       usage
+       exit 0 ;;
+    -v | --version)
+       echo "grub-mkrescue (GNU GRUB ${PACKAGE_VERSION})"
+       exit 0 ;;
+    --modules=*)
+       modules=`echo "$option" | sed 's/--modules=//'` ;;
+    --overlay=*)
+       overlay=${overlay}${overlay:+ }`echo "$option" | sed 's/--overlay=//'` ;;
+    --pkglibdir=*)
+       input_dir=`echo "$option" | sed 's/--pkglibdir=//'` ;;
+    --grub-mkimage=*)
+       grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'` ;;
+    -*)
+       echo "Unrecognized option \`$option'" 1>&2
+       usage
+       exit 1
+       ;;
+    *)
+       if test "x$output_image" != x; then
+           echo "Unrecognized option \`$option'" 1>&2
+           usage
+           exit 1
+       fi
+       output_image="${option}" ;;
+    esac
+done
+
+if test "x$output_image" = x; then
+  usage
+  exit 1
+fi
+
+memdisk_dir=`mktemp -d`
+iso9660_dir=`mktemp -d`
+mkdir -p ${memdisk_dir}/boot/grub ${iso9660_dir}/boot/grub
+
+for file in ${input_dir}/*.mod ${input_dir}/efiemu??.o \
+  ${input_dir}/command.lst ${input_dir}/moddep.lst ${input_dir}/fs.lst \
+  ${input_dir}/handler.lst ${input_dir}/parttool.lst; do
+  if test -f "$file"; then
+    cp -f "$file" ${iso9660_dir}/boot/grub/
+  fi
+done
+
+# obtain date-based UUID
+iso_uuid=$(date +%Y-%m-%d-%H-%M-%S-00)
+
+# first-stage grub.cfg
+cat << EOF >> ${memdisk_dir}/boot/grub/grub.cfg
+search --fs-uuid --set ${iso_uuid}
+set prefix=(\${root})/boot/grub
+source /boot/grub/grub.cfg
+EOF
+
+# build memdisk
+memdisk_img=`mktemp`
+tar -C ${memdisk_dir} -cf ${memdisk_img} boot
+rm -rf ${memdisk_dir}
+
+# build core.img
+mkdir -p ${iso9660_dir}/boot/grub
+${grub_mkimage} -d ${input_dir}/ -m ${memdisk_img} -o ${iso9660_dir}/boot/multiboot.img \
+  at_keyboard memdisk tar ata search iso9660 configfile sh
+rm -f ${memdisk_img}
+
+for d in ${overlay}; do
+  echo "Overlaying $d"
+  cp -dpR "${d}"/* "${iso9660_dir}"/
+done
+
+# second-stage grub.cfg
+modules="`cat ${input_dir}/partmap.lst` ${modules}"
+for i in ${modules} ; do
+  echo "insmod $i"
+done > ${iso9660_dir}/boot/grub/grub.cfg
+
+# build iso image
+grub-mkisofs \
+  --modification-date=$(echo ${iso_uuid} | sed -e s/-//g) \
+  -o ${output_image} -r -J ${iso9660_dir}
+
+exit 0