Add GRUB menus to control which ports are loaded.
This commit is contained in:
parent
9f77beaea6
commit
03304642df
|
@ -1,5 +1,8 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
this=$(which -- "$0")
|
||||||
|
thisdir=$(dirname -- "$this")
|
||||||
|
|
||||||
platform=
|
platform=
|
||||||
directory=
|
directory=
|
||||||
version=
|
version=
|
||||||
|
@ -53,8 +56,46 @@ fi
|
||||||
|
|
||||||
machine=$(expr x"$platform" : 'x\([^-]*\).*')
|
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"
|
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
|
mkdir -p boot/grub
|
||||||
exec > boot/grub/grub.cfg
|
exec > boot/grub/grub.cfg
|
||||||
|
|
||||||
|
@ -77,66 +118,237 @@ terminal_output gfxterm
|
||||||
set menu_title="Sortix $version for $machine"
|
set menu_title="Sortix $version for $machine"
|
||||||
set timeout=10
|
set timeout=10
|
||||||
set default="0"
|
set default="0"
|
||||||
|
|
||||||
|
export menu_title
|
||||||
|
export timeout
|
||||||
|
export default
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
maybe_compressed() {
|
if [ -n "$ports" ]; then
|
||||||
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:]]+'
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry() {
|
|
||||||
echo
|
echo
|
||||||
args=""
|
for port in $ports; do
|
||||||
[ -n "$2" ] && args=" $2"
|
printf 'port_%s=true\n' "$(portvar "$port")"
|
||||||
kernel=$(maybe_compressed boot/sortix.bin)
|
done
|
||||||
live_initrd=$(maybe_compressed boot/live.initrd)
|
for port in $ports; do
|
||||||
overlay_initrd=$(maybe_compressed boot/overlay.initrd)
|
printf 'tix_%s=false\n' "$(portvar "$port")"
|
||||||
src_initrd=$(maybe_compressed boot/src.initrd)
|
done
|
||||||
system_initrd=$(maybe_compressed boot/system.initrd)
|
echo
|
||||||
printf "menuentry \"Sortix (%s)\" {\n" "$1"
|
for port in $ports; do
|
||||||
case $platform in
|
printf 'export port_%s\n' "$(portvar "$port")"
|
||||||
x86_64-*)
|
done
|
||||||
|
for port in $ports; do
|
||||||
|
printf 'export tix_%s\n' "$(portvar "$port")"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
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
|
cat << EOF
|
||||||
if ! cpuid -l; then
|
if ! cpuid -l; then
|
||||||
echo "Error: You cannot run this 64-bit operating system because" \
|
echo "Error: You cannot run this 64-bit operating system because this" \
|
||||||
"this computer has no 64-bit mode."
|
"computer has no 64-bit mode."
|
||||||
read
|
read
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
cat << EOF
|
cat << EOF
|
||||||
echo -n "Loading /$kernel ($(human_size $kernel)) ... "
|
echo -n "Loading /$kernel ($(human_size $kernel)) ... "
|
||||||
multiboot /$kernel$args
|
multiboot /$kernel "\$@"
|
||||||
echo done
|
echo done
|
||||||
EOF
|
EOF
|
||||||
for initrd in $system_initrd $src_initrd $live_initrd $overlay_initrd; do
|
for initrd in $system_initrd $src_initrd $live_initrd $overlay_initrd; do
|
||||||
cat << EOF
|
cat << EOF
|
||||||
echo -n "Loading /$initrd ($(human_size $initrd)) ... "
|
echo -n "Loading /$initrd ($(human_size $initrd)) ... "
|
||||||
module /$initrd
|
module /$initrd
|
||||||
echo done
|
echo done
|
||||||
EOF
|
EOF
|
||||||
done
|
done
|
||||||
find repository | grep -E '^(.*/)?.*\.tix\.tar\.xz$' | LC_ALL=C sort | while read tix; do
|
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
|
cat << EOF
|
||||||
echo -n "Loading /$tix$I ($(human_size $tix)) ... "
|
if \$tix_$(portvar "$port"); then
|
||||||
module /$tix
|
echo -n "Loading /$tix ($(human_size $tix)) ... "
|
||||||
|
module --nounzip /$tix --to /$tix
|
||||||
echo done
|
echo done
|
||||||
|
fi
|
||||||
|
if \$port_$(portvar "$port"); then
|
||||||
|
echo -n "Loading /$tix ($(human_size $tix)) ... "
|
||||||
|
module /$tix --tix
|
||||||
|
echo done
|
||||||
|
fi
|
||||||
EOF
|
EOF
|
||||||
done
|
done
|
||||||
|
printf "}\n"
|
||||||
|
|
||||||
|
echo
|
||||||
|
cat << EOF
|
||||||
|
function load_sortix {
|
||||||
|
load_base "\$@"
|
||||||
|
load_ports
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
menuentry() {
|
||||||
|
echo
|
||||||
|
printf "menuentry \"Sortix (%s)\" {\n" "$1"
|
||||||
|
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"
|
printf "}\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
menuentry "live environment" ''
|
menuentry "live environment" ''
|
||||||
menuentry "new installation" '--init="/sbin/init --target=sysinstall"'
|
menuentry "new installation" '--init="/sbin/init --target=sysinstall"'
|
||||||
menuentry "upgrade existing installation" '--init="/sbin/init --target=sysupgrade"'
|
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
|
||||||
|
|
|
@ -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"
|
Loading…
Reference in New Issue