summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuildlive51
-rw-r--r--distro/arch/meta20
-rw-r--r--functions.sh77
3 files changed, 138 insertions, 10 deletions
diff --git a/buildlive b/buildlive
index ad607cb..120c14d 100755
--- a/buildlive
+++ b/buildlive
@@ -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
}