Add GRUB menus to control which ports are loaded.

This commit is contained in:
Jonas 'Sortie' Termansen 2016-03-07 02:04:24 +01:00
parent 9f77beaea6
commit 03304642df
2 changed files with 264 additions and 49 deletions

View File

@ -1,5 +1,8 @@
#!/bin/sh -e
this=$(which -- "$0")
thisdir=$(dirname -- "$this")
platform=
directory=
version=
@ -53,8 +56,46 @@ fi
machine=$(expr x"$platform" : 'x\([^-]*\).*')
maybe_compressed() {
if [ -e "$1.xz" ]; then
echo "$1.xz"
elif [ -e "$1.gz" ]; then
echo "$1.gz"
elif [ -e "$1" ]; then
echo "$1"
fi
}
human_size() {
LC_ALL=C du -bh "$1" | grep -Eo '^[^[:space:]]+'
}
portvar() {
echo "$1" | sed -e 's/-/_/g' -e 's/+/x/g'
}
isinset() {
(for port in $2; do
if [ x"$1" = x"$port" ]; then
echo true
exit 0
fi
done
echo false
exit 0)
}
. "$thisdir/ports.conf"
cd "$directory"
kernel=$(maybe_compressed boot/sortix.bin)
live_initrd=$(maybe_compressed boot/live.initrd)
overlay_initrd=$(maybe_compressed boot/overlay.initrd)
src_initrd=$(maybe_compressed boot/src.initrd)
system_initrd=$(maybe_compressed boot/system.initrd)
ports=$(ls repository | sed 's/\.tix\.tar\.xz//')
mkdir -p boot/grub
exec > boot/grub/grub.cfg
@ -77,66 +118,237 @@ terminal_output gfxterm
set menu_title="Sortix $version for $machine"
set timeout=10
set default="0"
export menu_title
export timeout
export default
EOF
maybe_compressed() {
if [ -e "$1.xz" ]; then
echo "$1.xz"
elif [ -e "$1.gz" ]; then
echo "$1.gz"
elif [ -e "$1" ]; then
echo "$1"
fi
}
if [ -n "$ports" ]; then
echo
for port in $ports; do
printf 'port_%s=true\n' "$(portvar "$port")"
done
for port in $ports; do
printf 'tix_%s=false\n' "$(portvar "$port")"
done
echo
for port in $ports; do
printf 'export port_%s\n' "$(portvar "$port")"
done
for port in $ports; do
printf 'export tix_%s\n' "$(portvar "$port")"
done
fi
human_size() {
LC_ALL=C du -bh "$1" | grep -Eo '^[^[:space:]]+'
echo
cat << EOF
. /boot/grub/main.cfg
EOF
exec > boot/grub/main.cfg
printf "function load_base {\n"
case $platform in
x86_64-*)
cat << EOF
if ! cpuid -l; then
echo "Error: You cannot run this 64-bit operating system because this" \
"computer has no 64-bit mode."
read
exit
fi
EOF
;;
esac
cat << EOF
echo -n "Loading /$kernel ($(human_size $kernel)) ... "
multiboot /$kernel "\$@"
echo done
EOF
for initrd in $system_initrd $src_initrd $live_initrd $overlay_initrd; do
cat << EOF
echo -n "Loading /$initrd ($(human_size $initrd)) ... "
module /$initrd
echo done
EOF
done
printf "}\n"
echo
printf "function load_ports {\n"
if [ -z "$ports" ]; then
printf "\ttrue\n"
fi
for port in $ports; do
tix=repository/$port.tix.tar.xz
cat << EOF
if \$tix_$(portvar "$port"); then
echo -n "Loading /$tix ($(human_size $tix)) ... "
module --nounzip /$tix --to /$tix
echo done
fi
if \$port_$(portvar "$port"); then
echo -n "Loading /$tix ($(human_size $tix)) ... "
module /$tix --tix
echo done
fi
EOF
done
printf "}\n"
echo
cat << EOF
function load_sortix {
load_base "\$@"
load_ports
}
EOF
menuentry() {
echo
args=""
[ -n "$2" ] && args=" $2"
kernel=$(maybe_compressed boot/sortix.bin)
live_initrd=$(maybe_compressed boot/live.initrd)
overlay_initrd=$(maybe_compressed boot/overlay.initrd)
src_initrd=$(maybe_compressed boot/src.initrd)
system_initrd=$(maybe_compressed boot/system.initrd)
printf "menuentry \"Sortix (%s)\" {\n" "$1"
case $platform in
x86_64-*)
cat << EOF
if ! cpuid -l; then
echo "Error: You cannot run this 64-bit operating system because" \
"this computer has no 64-bit mode."
read
exit
fi
EOF
;;
esac
cat << EOF
echo -n "Loading /$kernel ($(human_size $kernel)) ... "
multiboot /$kernel$args
echo done
EOF
for initrd in $system_initrd $src_initrd $live_initrd $overlay_initrd; do
cat << EOF
echo -n "Loading /$initrd ($(human_size $initrd)) ... "
module /$initrd
echo done
EOF
done
find repository | grep -E '^(.*/)?.*\.tix\.tar\.xz$' | LC_ALL=C sort | while read tix; do
cat << EOF
echo -n "Loading /$tix$I ($(human_size $tix)) ... "
module /$tix
echo done
EOF
done
if [ -n "$2" ]; then
printf "\tload_sortix %s\n" "$2"
#printf "\tload_sortix '"
#printf '%s' "$2" | sed "s,','\\'',g"
#printf "'\n"
else
printf "\tload_sortix\n"
fi
printf "}\n"
}
menuentry "live environment" ''
menuentry "new installation" '--init="/sbin/init --target=sysinstall"'
menuentry "upgrade existing installation" '--init="/sbin/init --target=sysupgrade"'
echo
cat << EOF
menuentry "Select ports..." {
configfile /boot/grub/ports.cfg
}
menuentry "Advanced..." {
configfile /boot/grub/advanced.cfg
}
EOF
exec > boot/grub/advanced.cfg
cat << EOF
menuentry "Back..." {
menu=main
configfile /boot/grub/main.cfg
}
menuentry "Select binary packages..." {
configfile /boot/grub/tix.cfg
}
EOF
exec > boot/grub/ports.cfg
cat << EOF
menuentry "Back..." {
menu=main
configfile /boot/grub/main.cfg
}
EOF
echo
printf 'menuentry "Load all ports" {'
for port in $ports; do
printf " port_%s=true\n" "$(portvar "$port")"
done
printf ' configfile /boot/grub/ports.cfg\n'
printf '}\n'
for set in $sets; do
echo
set_content=$(eval echo \$set_$set)
printf 'menuentry "Load only '"$set"' ports" {'
for port in $ports; do
printf " port_%s=%s\n" "$(portvar "$port")" "$(isinset "$port" "$set_content")"
done
printf ' configfile /boot/grub/ports.cfg\n'
printf '}\n'
done
echo
printf 'menuentry "Load no ports" {'
for port in $ports; do
printf " port_%s=false\n" "$(portvar "$port")"
done
printf ' configfile /boot/grub/ports.cfg\n'
printf '}\n'
echo
for port in $ports; do
cat << EOF
if \$port_$(portvar "$port"); then
menuentry "$port = true" {
port_$(portvar "$port")=false
configfile /boot/grub/ports.cfg
}
else
menuentry "$port = false" {
port_$(portvar "$port")=true
configfile /boot/grub/ports.cfg
}
fi
EOF
done
exec > boot/grub/tix.cfg
cat << EOF
menuentry "Back..." {
menu=main
configfile /boot/grub/advanced.cfg
}
EOF
echo
printf 'menuentry "Load all binary packages" {'
for port in $ports; do
printf " tix_%s=true\n" "$(portvar "$port")"
done
printf ' configfile /boot/grub/tix.cfg\n'
printf '}\n'
for set in $sets; do
echo
set_content=$(eval echo \$set_$set)
printf 'menuentry "Load only '"$set"' binary packages" {'
for port in $ports; do
printf " tix_%s=%s\n" "$(portvar "$port")" "$(isinset "$port" "$set_content")"
done
printf ' configfile /boot/grub/tix.cfg\n'
printf '}\n'
done
echo
printf 'menuentry "Load no binary packages" {'
for port in $ports; do
printf " tix_%s=false\n" "$(portvar "$port")"
done
printf ' configfile /boot/grub/tix.cfg\n'
printf '}\n'
echo
for port in $ports; do
cat << EOF
if \$tix_$(portvar "$port"); then
menuentry "$port = true" {
tix_$(portvar "$port")=false
configfile /boot/grub/tix.cfg
}
else
menuentry "$port = false" {
tix_$(portvar "$port")=true
configfile /boot/grub/tix.cfg
}
fi
EOF
done

3
build-aux/ports.conf Normal file
View File

@ -0,0 +1,3 @@
set_minimal="cut dash e2fsprogs grep grub mdocml sed xargs"
set_basic="$set_minimal binutils bison bzip2 diffutils flex gawk gcc git gzip libstdc++ make patch pkg-config tar xz xorriso"
sets="basic minimal"