1
0
Fork 0
mirror of https://gitlab.com/sortix/sortix.git synced 2023-02-13 20:55:38 -05:00
sortix--sortix/build-aux/iso-grub-cfg.sh
Jonas 'Sortie' Termansen 9588b0d3db Add ports to the Sortix repository.
This change imports the ports collection from the former porttix and srctix
repositories and converts them to port(5) files with metadata pointing to
the upstream release tarballs with patches checked into this repository.
Ports are now developed and versioned along with the operating system and
are automatically built per the PACKAGES environment variable. The patches
are licensed under the same license as the relevant ports.

Tix has gained support for the new port(5) format. tix-port(8) is the new
high level ports build even point that handles downloading pstream releases
into the new mirror cache directory, applying the patches, building the port
with the lower-level tix-build(8), and finally installing the binary
package. The new tix-vars(8) program parses port(5) files and the new
tix-rmdiff(8) program produces input for tix-rmpatch(8).

The old doc/ directory is discontinued in favor of manual pages documenting
the new ports system.

The obsolete porttix-create(8) and srctix-create(8) programs are removed.
2022-06-13 22:29:53 +02:00

546 lines
10 KiB
Bash
Executable file

#!/bin/sh
# Copyright (c) 2018, 2022 Jonas 'Sortie' Termansen.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# iso-grub-cfg.sh
# Generate GRUB bootloader configuration for release .iso filesystems.
# Note: This file has detailed documentation in release-iso-bootconfig(7).
set -e
this=$(which -- "$0")
thisdir=$(dirname -- "$this")
platform=
directory=
version=
dashdash=
previous_option=
for argument do
if test -n "$previous_option"; then
eval $previous_option=\$argument
previous_option=
continue
fi
case $argument in
*=?*) parameter=$(expr "X$argument" : '[^=]*=\(.*\)' || true) ;;
*=) parameter= ;;
*) parameter=yes ;;
esac
case $dashdash$argument in
--) dashdash=yes ;;
--platform=*) platform=$parameter ;;
--platform) previous_option=platform ;;
--version=*) version=$parameter ;;
--version) previous_option=version ;;
-*) echo "$0: unrecognized option $argument" >&2
exit 1 ;;
*) directory="$argument" ;;
esac
done
if test -n "$previous_option"; then
echo "$0: option '$argument' requires an argument" >&2
exit 1
fi
if test -z "$platform"; then
echo "$0: platform wasn't set with --platform" >&2
exit 1
fi
if test -z "$version"; then
echo "$0: version wasn't set with --version" >&2
exit 1
fi
if test -z "$directory"; then
echo "$0: no directory operand supplied" >&2
exit 1
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() {
(export LC_ALL=C; du -bh "$1" 2>/dev/null || du -h "$1") |
sed -E 's/^([^[:space:]]+).*/\1/'
}
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 |
grep -E '\.tix\.tar\.xz$' |
sed -E 's/\.tix\.tar\.xz$//')
mkdir -p boot/grub
exec > boot/grub/grub.cfg
for hook in \
advanced_menu_post \
advanced_menu_pre \
initrd_post \
kernel_post \
kernel_pre \
menu_post \
menu_pre \
ports_menu \
ports_menu_post \
ports_menu_pre \
ports_menu_sets \
ports_post \
ports_pre \
tix_menu \
tix_menu_post \
tix_menu_pre \
tix_menu_sets \
; do
cat << EOF
function hook_$hook {
true
}
EOF
done
for set in all $sets no; do
cat << EOF
function hook_ports_set_$set {
true
}
function hook_tix_set_$set {
true
}
EOF
done
echo
cat << EOF
insmod part_msdos
insmod ext2
EOF
find . | grep -Eq '\.gz$' && echo "insmod gzio"
find . | grep -Eq '\.xz$' && echo "insmod xzio"
cat << EOF
insmod all_video
if loadfont unicode; then
insmod gfxterm
terminal_output gfxterm
fi
set version="$version"
set machine="$machine"
set base_menu_title="Sortix \$version for \$machine"
set menu_title="\$base_menu_title"
set timeout=10
set default="0"
if [ -e /boot/random.seed ]; then
no_random_seed=
else
no_random_seed=--no-random-seed
fi
set enable_src=true
export version
export machine
export base_menu_title
export menu_title
export timeout
export default
export no_random_seed
export enable_src
EOF
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
echo
echo 'function select_ports_set_no {'
for port in $ports; do
printf " port_%s=false\n" "$(portvar "$port")"
done
printf " hook_port_set_no\n"
echo "}"
for set in $sets; do
echo
set_content=$(eval echo \$set_$set)
echo "function select_ports_set_$set {"
for port in $ports; do
printf " port_%s=%s\n" "$(portvar "$port")" "$(isinset "$port" "$set_content")"
done
printf " hook_port_set_%s\n" "$set"
echo "}"
done
echo
echo 'function select_ports_set_all {'
for port in $ports; do
printf " port_%s=true\n" "$(portvar "$port")"
done
printf " hook_port_set_all\n"
echo "}"
echo
echo 'function select_tix_set_no {'
for port in $ports; do
printf " tix_%s=false\n" "$(portvar "$port")"
done
printf " hook_tix_set_no\n"
echo "}"
for set in $sets; do
echo
set_content=$(eval echo \$set_$set)
echo "function select_tix_set_$set {"
for port in $ports; do
printf " tix_%s=%s\n" "$(portvar "$port")" "$(isinset "$port" "$set_content")"
done
printf " hook_tix_set_%s\n" "$set"
echo "}"
done
echo
echo 'function select_tix_set_all {'
for port in $ports; do
printf " tix_%s=true\n" "$(portvar "$port")"
done
printf " hook_tix_set_all\n"
echo "}"
echo
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
hook_kernel_pre
echo -n "Loading /$kernel ($(human_size $kernel)) ... "
multiboot /$kernel \$no_random_seed "\$@"
echo done
hook_kernel_post
if [ \$no_random_seed != --no-random-seed ]; then
echo -n "Loading /boot/random.seed (256) ... "
module /boot/random.seed --random-seed
echo done
fi
EOF
for initrd in $system_initrd $src_initrd $live_initrd $overlay_initrd; do
if [ "$initrd" = "$src_initrd" ]; then
cat << EOF
if \$enable_src; then
echo -n "Loading /$initrd ($(human_size $initrd)) ... "
module /$initrd
echo done
fi
EOF
else
cat << EOF
echo -n "Loading /$initrd ($(human_size $initrd)) ... "
module /$initrd
echo done
EOF
fi
done
cat << EOF
hook_initrd_post
}
EOF
echo
cat << EOF
function load_ports {
hook_ports_pre
EOF
if [ -z "$ports" ]; then
printf " true\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
cat << EOF
hook_ports_post
}
EOF
echo
cat << EOF
function load_sortix {
load_base "\$@"
load_ports
}
EOF
cat << EOF
if [ -e /boot/grub/hooks.cfg ]; then
. /boot/grub/hooks.cfg
fi
. /boot/grub/main.cfg
EOF
exec > boot/grub/main.cfg
menuentry() {
echo
printf "menuentry \"Sortix (%s)\" {\n" "$1"
if [ -n "$2" ]; then
printf " load_sortix %s\n" "$2"
#printf " load_sortix '"
#printf '%s' "$2" | sed "s,','\\'',g"
#printf "'\n"
else
printf " load_sortix\n"
fi
printf "}\n"
}
cat << EOF
menu_title="\$base_menu_title"
hook_menu_pre
EOF
menuentry "live environment" '-- /sbin/init'
menuentry "new installation" '-- /sbin/init --target=sysinstall'
menuentry "upgrade existing installation" '-- /sbin/init --target=sysupgrade'
cat << EOF
menuentry "Select ports..." {
configfile /boot/grub/ports.cfg
}
menuentry "Advanced..." {
configfile /boot/grub/advanced.cfg
}
hook_menu_post
EOF
exec > boot/grub/advanced.cfg
cat << EOF
menuentry "Back..." {
configfile /boot/grub/main.cfg
}
menu_title="\$base_menu_title - Advanced Options"
hook_advanced_menu_pre
if "\$enable_src"; then
menuentry "Disable loading source code" {
enable_src=false
configfile /boot/grub/advanced.cfg
}
else
menuentry "Enable loading source code" {
enable_src=true
configfile /boot/grub/advanced.cfg
}
fi
menuentry "Select binary packages..." {
configfile /boot/grub/tix.cfg
}
hook_advanced_menu_post
EOF
exec > boot/grub/ports.cfg
cat << EOF
menuentry "Back..." {
configfile /boot/grub/main.cfg
}
menu_title="\$base_menu_title - Ports"
hook_ports_menu_pre
menuentry "Load all ports" {
select_ports_set_all
configfile /boot/grub/ports.cfg
}
hook_ports_menu_sets
EOF
for set in $sets; do
echo
set_content=$(eval echo \$set_$set)
printf 'menuentry "Load only '"$set"' ports" {\n'
printf " select_ports_set_%s\n" "$set"
printf ' configfile /boot/grub/ports.cfg\n'
printf '}\n'
done
cat << EOF
menuentry "Load no ports" {
select_ports_set_no
configfile /boot/grub/ports.cfg
}
hook_ports_menu
EOF
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
cat << EOF
hook_ports_menu_post
EOF
exec > boot/grub/tix.cfg
cat << EOF
menuentry "Back..." {
configfile /boot/grub/advanced.cfg
}
menu_title="\$base_menu_title - Binary Packages"
hook_tix_menu_pre
menuentry "Load all binary packages" {
select_tix_set_all
configfile /boot/grub/tix.cfg
}
hook_tix_menu_sets
EOF
for set in $sets; do
echo
set_content=$(eval echo \$set_$set)
printf 'menuentry "Load only '"$set"' binary packages" {\n'
printf " select_tix_set_%s\n" "$set"
printf ' configfile /boot/grub/tix.cfg\n'
printf '}\n'
done
cat << EOF
menuentry "Load no binary packages" {
select_tix_set_no
configfile /boot/grub/tix.cfg
}
hook_tix_menu
EOF
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
cat << EOF
hook_tix_menu_post
EOF