Basically what I want to do is to use grub-mkrescue to generate a grub2 rescue disk with some custom files (The Super Grub2 Disk stuff).

However I want to build different files depending on target+platform combination.

My four combinations are:

    * (Hybrid) x86_64+efi and i386+pc
    * i386 - pc
    * x86_64 - efi
    * i386 - efi

More about this setup.

1) As an initial setup I work with a Debian Unstable Sid Chroot amd64 as described in:
http://www.supergrubdisk.org/wiki/Super_Grub2_Disk_Sid_Chroot#Introduction
2) I use Debian's Grub2 source code so that I do not have to deal manually with dependencies. That's explained here: http://www.supergrubdisk.org/wiki/Super_Grub2_Disk_Sid_Chroot_Grub2_Build_And_Installation (just before Hybrid build section).

3) x86_64_efi build is working. Basically what I run in the src dir is:

  sudo rm -rf /usr/local/share/grub
  sudo rm -rf /usr/local/lib/grub
  make clean
  make distclean
  bash linguas.sh
  bash autogen.sh
./configure --target=i386 --with-platform=efi && make && sudo make uninstall
  make clean
  make distclean
./configure --target=i386 --with-platform=pc && make && sudo make uninstall
  make clean
  make distclean
./configure --target=x86_64 --with-platform=efi && make && sudo make uninstall
  make clean
  make distclean
  make clean
  make distclean
  bash linguas.sh
  bash autogen.sh
./configure --target=x86_64 --with-platform=efi && make && sudo make install

And what I do for generating the file image is:

grub-mkrescue --output=super_grub2_disk_x86_64_efi_2.00s1-beta6.iso $(mktemp -d)

4) i386_pc build is not working. Basically what I run in the src dir is:

  sudo rm -rf /usr/local/share/grub
  sudo rm -rf /usr/local/lib/grub
  make clean
  make distclean
  bash linguas.sh
  bash autogen.sh
./configure --target=i386 --with-platform=efi && make && sudo make uninstall
  make clean
  make distclean
./configure --target=i386 --with-platform=pc && make && sudo make uninstall
  make clean
  make distclean
./configure --target=x86_64 --with-platform=efi && make && sudo make uninstall
  make clean
  make distclean
  make clean
  make distclean
  bash linguas.sh
  bash autogen.sh
  ./configure --target=i386 --with-platform=pc && make && sudo make install


And what I do for generating the file image is:

grub-mkrescue --output=super_grub2_disk_i386_pc_2.00s1-beta6.iso $(mktemp -d)

5) I attach the current helper scripts that I use.

supergrub-mkrescue : This is a very simple wrapper around: grub-mkrescue. You do not need to take care about it.

supergrub-meta-mkrescue : This is what I have explained above. This script assumes that you have setup your grub2 source code in:
/home/adrian/gnu/sgd/debian_grub2/grub2-2.00
and that supergrub-mkrescue script is found in the same folder as supergrub-meta-mkrescue.

Currently supergrub-meta-mkrescue has been modified so that it ends (Check the return 0 ; line) after building:

* x86_64_efi
and
* i386 - pc
.

6) When I build i386 - pc I get this error:

xorriso : FAILURE : Given path does not exist on disk: -boot_image system_area='/usr/local/lib/grub/i386-pc/boot_hybrid.img'

Why is it failing to create /usr/local/lib/grub/i386-pc/boot_hybrid.img file?

7) Is it useful that I insist on building an i386+efi release? Any machine system that uses it? Some old Mac-something hardware perhaps?

8) What's the best way to build and install an hybrid system that includes both: x86_64_efi and i386 - pc stuff?

Current code is:

  ./configure --target=i386 --with-platform=pc && make && sudo make install
  make clean
  make distclean
./configure --target=x86_64 --with-platform=efi && make && sudo make install

9) A) What's the best way to remove grub configuration files installed on the system so that I can start from scratch so that already built target+platform grub binaries or configurations are ignored?

B) That's what I try to do in clean_every_build function in supergrub-meta-mkrescue script but I do not think its an efficient way of doing it.

C) You know I would like to remove the rm -rf /usr/local/share/grub and rm -rf /usr/local/lib/grub lines (too weird) and just use the:

./configure ; make ; make uninstall part.

D) Which I do not know if could be re-written as:

./configure ; make uninstall

(Notice that there is not a make step).

Does removing the make default target call (make) breaks "make uninstall" functionality?

10) As a summary I basically want to build and install from upstream source code and then make one rescue disk for each one of these four combinations. (And make theses rescue diks in a row)

    * (Hybrid) x86_64+efi and i386+pc
    * i386 - pc
    * x86_64 - efi
    * i386 - efi

So... any help on this build automation process?

Thank you very much!


adrian15
--
Support free software. Donate to Super Grub Disk. Apoya el software libre. Dona a Super Grub Disk. http://www.supergrubdisk.org/donate/
#!/bin/bash -e
usage() {
cat <<EOF

  $0 -o=output.iso
  Copyright Adrian Gibanel Lopez
  Licensed under the GNU PUBLIC LICENSE 3.0

  CREATE CALL
  ===========

  Usage: $0 [-o=FILENAME]
  Example: $0 -o=myrescatux.iso

EOF

}
# Check the arguments.
for option in "$@"; do
  case "$option" in
    -h | --help)
      usage
      exit 0
    ;;
    -o=*)
      CUSTOM_ISO_FILENAME=`echo "$option" | sed 's/-o=//'`
    ;;
  esac
done

# Get the version number for this Super GRUB2 Disk release
source menus/version.cfg


BOOT_ISOS_DIRECTORY="boot-isos"
overlay=$(mktemp -d)
ISO_FILENAME="super_grub2_disk_hybrid_${sgrub_version}.iso"

if [[ "x$CUSTOM_ISO_FILENAME" != x ]] ; then
  ISO_FILENAME="${CUSTOM_ISO_FILENAME}"
fi

default_options="--output=${ISO_FILENAME} $overlay"
mkdir -p "$overlay/boot/grub/"
cp -r menus/* "$overlay/boot/grub/"
if [ -d ${BOOT_ISOS_DIRECTORY} ] ; then
  cp -r ${BOOT_ISOS_DIRECTORY} "$overlay/boot/"
fi

cp AUTHORS COPYING "$overlay/boot/grub/"

# Generate mo files and add them to overlay
for pofile in po/*.po; do
  basename=${pofile##*/}
  lang_code="${basename%.po}"
  info_cfg="menus/sgd_locale/${lang_code}_info.cfg"
  msgfmt "$pofile" --output-file="$overlay/boot/grub/sgd_locale/${lang_code}.mo"
  if ! [[ -f "$info_cfg" ]]; then
    echo "Thank you for providing a new translation for Super GRUB2 Disk!"
    echo "Before this translation can be used in Super GRUB2 Disk we need to 
know what"
    echo "to call it in our language selection menu."
    echo "We need to know the name of the language you've translated, in that 
language."
    echo "For example, for Spanish you would enter \"EspaƱol\" (without the 
quotes)."
    echo -n "Please enter the name of the language for $pofile: "
    read language_name
    cp info_cfg_header.cfg "$info_cfg"
    echo "lang_code='${lang_code}'" >> "$info_cfg"

    # This will fail if $language_name contains a single quote character.
    # TODO: Fix aforementioned problem by escaping quotes in $language_name.
    echo "language_name='${language_name}'" >> "$info_cfg"

    echo "A file, ${info_cfg}, was created with this information."
    echo "Thanks again for contributing a new translation!"
    echo; echo
  fi
done

# Find unifont font file to create grub font. This is needed for gfxterm in 
grub, which
# in turn is needed for displaying non-ASCII characters for non-English 
translations.
# This unifont finding code was copied from grub's configure.ac.
for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
  for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/unifont; do
    if test -f "$dir/unifont.$ext"; then
      font_source="$dir/unifont.$ext"
      break 2
    fi
  done
done

if [[ -n "$font_source" ]]; then
  grub-mkfont "$font_source" --output="$overlay/boot/grub/unifont.pf2"
else
  echo "Error: Unifont not found. Unifont is needed for Super GRUB2 Disk" >&2
  echo "to properly display non-ASCII characters. Aborting without creating an 
iso." >&2
  exit 1
fi

grub-mkrescue $default_options
rm -r "$overlay"

md5sum ${ISO_FILENAME} > ${ISO_FILENAME}.md5
sha1sum ${ISO_FILENAME} > ${ISO_FILENAME}.sha1
sha256sum ${ISO_FILENAME} > ${ISO_FILENAME}.sha256

#!/bin/bash

SUPER_GRUB2_DISK_FILE_PREFIX="super_grub2_disk"

DEBIAN_GRUB2_SRC_DIR="/home/adrian/gnu/sgd/debian_grub2/grub2-2.00"

SGD2_SOURCE_DIR="$(pwd)"

function grub2_src_prepare () {
  make clean
  make distclean
  bash linguas.sh
  bash autogen.sh
}

function build_sg2d () {

  ./supergrub-mkrescue 
-o="${SUPER_GRUB2_DISK_FILE_PREFIX}_${TARGET_PLATFORM}_${sgrub_version}.iso"

}

function clean_every_build () {

  sudo rm -rf /usr/local/share/grub
  sudo rm -rf /usr/local/lib/grub
  grub2_src_prepare
  ./configure --target=i386 --with-platform=efi && make && sudo make uninstall
  make clean
  make distclean
  ./configure --target=i386 --with-platform=pc && make && sudo make uninstall
  make clean
  make distclean
  ./configure --target=x86_64 --with-platform=efi && make && sudo make uninstall
  make clean
  make distclean

}


function grub2_sg2d_hybrid_build () {

  # Grub2 - Hybrid build

  cd ${DEBIAN_GRUB2_SRC_DIR}
  clean_every_build
  grub2_src_prepare
  ./configure --target=i386 --with-platform=pc && make && sudo make install
  make clean
  make distclean
  ./configure --target=x86_64 --with-platform=efi && make && sudo make install
  cd ${SGD2_SOURCE_DIR}

  # Super Grub2 Disk - Hybrid build
  TARGET_PLATFORM="hybrid"
  build_sg2d

}

function grub2_sg2d_i386_pc_build () {

  # Grub2 - i386 - pc build
  cd ${DEBIAN_GRUB2_SRC_DIR}
  clean_every_build
  grub2_src_prepare
  bash lingua.sh
  bash autogen.sh
  ./configure --target=i386 --with-platform=pc && make && sudo make install
  cd ${SGD2_SOURCE_DIR}

  # Super Grub2 Disk - i386 - pc build
  TARGET_PLATFORM="i386_pc"
  build_sg2d

}

function grub2_sg2d_x86_64_efi_build () {

  # Grub2 - x86_64 - efi build
  cd ${DEBIAN_GRUB2_SRC_DIR}
  clean_every_build
  grub2_src_prepare
  ./configure --target=x86_64 --with-platform=efi && make && sudo make install
  cd ${SGD2_SOURCE_DIR}

  # Super Grub2 Disk - x86_64 - efi build
  TARGET_PLATFORM="x86_64_efi"
  build_sg2d

}

function grub2_sg2d_i386_efi_build () {

  # Grub2 - i386 - efi build
  cd ${DEBIAN_GRUB2_SRC_DIR}
  clean_every_build
  grub2_src_prepare
  ./configure --target=i386 --with-platform=efi && make && sudo make install
  cd ${SGD2_SOURCE_DIR}

  # Super Grub2 Disk - i386 - efi build
  TARGET_PLATFORM="i386_efi"
  build_sg2d

}


if [ ! -d "${DEBIAN_GRUB2_SRC_DIR}" ] ; then

  echo -e -n "Please set up a valid path for Debian Grub2 source code in this 
same file: ${0}\n"

fi

# Needed for getting SG2D version
source menus/version.cfg

grub2_sg2d_x86_64_efi_build

grub2_sg2d_i386_pc_build

exit 0 ############################################### QUITAR ESTA LINEA





grub2_sg2d_i386_efi_build

grub2_sg2d_hybrid_build

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to