diff options
-rwxr-xr-x | buildlive | 51 | ||||
-rw-r--r-- | distro/arch/meta | 20 | ||||
-rw-r--r-- | functions.sh | 77 |
3 files changed, 138 insertions, 10 deletions
@@ -31,7 +31,7 @@ fatalerror() { usage() { >&2 cat << EOF -$0 [--root <path>] [options] [distro 1] [distro 2] ... +$0 [--root <path>] [options] [--distro=<metadist> <isofile>] [distro] ... use $0 -L to list available distros options: --root <path> @@ -103,6 +103,20 @@ do --clean) CLEAN_USB=1 ;; + --distro=*) + metadist="${1/--distro=}" + if [ ! -f "distro/$metadist/meta" ] + then + fatalerror "distro/$metadist/meta not found" + fi + shift + isofn="$1" + if [ ! -f "$isofn" ] + then + fatalerror "File $isofn not found" + fi + DISTROLIST=(${DISTROLIST[@]} "/meta@$metadist@$isofn") + ;; *=*|-*) usage exit 1 @@ -174,6 +188,17 @@ fi for i in ${DISTROLIST[@]} do + if [[ "$i" == /meta@* ]] + then + # FIXME: we assume the meta file path and the iso file name + # does not have '@' character + ISOFILE="$(echo "$i" | cut -d@ -f3)" + ISOLIST=("${ISOLIST[@]}" "$ISOFILE") + # TODO: we just use the file name as the ISO name + # can we do it better? + ISONAMELIST=("${ISONAMELIST[@]}" "$(basename "$ISOFILE")") + continue + fi process_isoinfo "$i" ISOLIST=("${ISOLIST[@]}" "$ISOFILE") ISONAMELIST=("${ISONAMELIST[@]}" "$ISONAME") @@ -199,16 +224,28 @@ do DISTRO="${DISTROLIST[$i-1]}" ISO_FILEPATH="$ISOPATH/$ISOFILE" - set_distro "$DISTRO" - export DISTRONAME KEYWORD # for grub and syslinux generation - - process_distro "$DISTRO" + if [[ "$DISTRO" == /meta@* ]] + then + metadir="$(echo "$DISTRO" | cut -d@ -f2)" + _meta=meta_ + ISO_FILEPATH="$ISOFILE" + DISTRO="$metadir" + set_distro "$metadir" + KEYWORD="$ISONAME" + source "distro/$metadir/meta" + else + _meta= + ISO_FILEPATH="$ISOPATH/$ISOFILE" + set_distro "$DISTRO" + export DISTRONAME KEYWORD # for grub and syslinux generation + process_distro "$DISTRO" + fi if [ "$GRUBCFG_ONLY" == 0 ]; then install_live fi - gen_grubcfg "$DISTRO" >> "$GRUBCFG" - gen_syslinux "$DISTRO" >> "$SYSLINUXCFG" + ${_meta}gen_grubcfg "$DISTRO" >> "$GRUBCFG" + ${_meta}gen_syslinux "$DISTRO" >> "$SYSLINUXCFG" done if [ "$GRUBCFG_ONLY" == 1 ]; then diff --git a/distro/arch/meta b/distro/arch/meta new file mode 100644 index 0000000..5f375ed --- /dev/null +++ b/distro/arch/meta @@ -0,0 +1,20 @@ +entry() { + TITLE="$ISONAME" + KERNEL=/liveusb-kernel/$KEYWORD/x86_64/vmlinuz + INITRD=(/liveusb-kernel/$KEYWORD/intel_ucode.img + /liveusb-kernel/$KEYWORD/amd_ucode.img + /liveusb-kernel/$KEYWORD/x86_64/archiso.img) + OPTION="archisodevice=/dev/disk/by-uuid/$UUID archisobasedir=liveusb-data/$KEYWORD" + X64=y +} + +install_live() { + mount_iso + install -d "$DATADIR/$KEYWORD" "$KERNELDIR/$KEYWORD" + cp -r "$ISOMNT/arch/x86_64" "$DATADIR/$KEYWORD/" + cp -r "$ISOMNT/arch/boot/x86_64" "$KERNELDIR/$KEYWORD/" + cp "$ISOMNT/arch/boot/"*.img "$KERNELDIR/$KEYWORD/" + umount_iso +} + +entries=(entry) diff --git a/functions.sh b/functions.sh index a3b3a8d..452cabb 100644 --- a/functions.sh +++ b/functions.sh @@ -61,6 +61,45 @@ process_distro() { # ISOMNT="/media/$ISOFILE" } +# output_grub_entry +# output_syslinux_entry +# usage: first source the entry, then call this +# +# variables in entryfile: +# - UUID: the UUID of the partition +# - ISOFILE: the file name of iso +# +# parameters in entry file: +# - TITLE: GRUB menu entry title +# - KERNEL: path to kernel image +# - INITRD: path to initramfs/initrd image +# - OPTION: kernel command line +# - X64: y/n, indicates whether it's 64-bit +# +output_grub_entry() { + cat << EOF +menuentry '$TITLE' { + linux $KERNEL $OPTION + initrd ${INITRD[@]} +} + +EOF +} + +# we also need $LABEL when calling this +output_syslinux_entry() { + _INITRD=$(echo ${INITRD[*]}|sed 's/ /,/g') + + cat << EOF +LABEL $LABEL +MENU LABEL $TITLE +LINUX $KERNEL +INITRD $_INITRD +APPEND $OPTION + +EOF +} + gen_grubcfg() { local entry allentries allentries=("distro/$1/entry"*) @@ -69,13 +108,44 @@ gen_grubcfg() { fi for entry in "${allentries[@]}" do - UUID="$UUID" ISOFILE="$ISOFILE" ./mkgrubcfg.sh "$entry" + source "$entry" + UUID="$UUID" ISOFILE="$ISOFILE" output_grub_entry done if [ ${#allentries[@]} -gt 1 ]; then echo '}' fi } +meta_gen_grubcfg() { + local entry + source "distro/$1/meta" + if [ ${#entries[@]} -gt 1 ]; then + echo "submenu '$ISONAME' {" + fi + for entry in "${entries[@]}" + do + "$entry" + UUID="$UUID" ISOFILE="$ISOFILE" output_grub_entry + done + if [ ${#entries[@]} -gt 1 ]; then + echo '}' + fi +} + +meta_gen_syslinux() { + local entry count name + source "distro/$1/meta" + name=$(echo $1|sed 's/\//_/g') + count=0 + for entry in "${entries[@]}" + do + "$entry" + UUID="$UUID" ISOFILE="$ISOFILE" LABEL="${name}_${count}" \ + output_syslinux_entry + count=$(($count+1)) + done +} + gen_syslinux() { local entry allentries count name allentries=("distro/$1/entry"*) @@ -83,8 +153,9 @@ gen_syslinux() { count=0 for entry in "${allentries[@]}" do - UUID="$UUID" ISOFILE="$ISOFILE" LABEL="$name$count" \ - ./mksyslinux.sh "$entry" + source "$entry" + UUID="$UUID" ISOFILE="$ISOFILE" LABEL="${name}_${count}" \ + output_syslinux_entry count=$(($count+1)) done } |