mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-06-05 23:34:47 +00:00
169 lines
5.7 KiB
Bash
Executable File
169 lines
5.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
# Build OS using AUTO.ISO minimal auto-install as bootstrap to merge codebase, recompile system, attempt build limine UEFI hybrid ISO
|
|
|
|
# make sure we are in the correct directory
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
|
|
SCRIPT_NAME="$(basename "$0")"
|
|
EXPECTED_DIR="$(pwd -P)"
|
|
|
|
if test "${EXPECTED_DIR}" != "${SCRIPT_DIR}"
|
|
then
|
|
( cd "$SCRIPT_DIR" || exit ; "./$SCRIPT_NAME" "$@" );
|
|
exit
|
|
fi
|
|
|
|
[ "$1" = "--headless" ] && QEMU_HEADLESS='-display none'
|
|
|
|
KVM=''
|
|
(lsmod | grep -q kvm) && KVM=' -accel kvm'
|
|
|
|
# Set this true if you want to test ISOs in QEMU after building.
|
|
TESTING=false
|
|
|
|
TMPDIR="$(mktemp -d)"
|
|
TMPISODIR="$TMPDIR/iso"
|
|
TMPDISK="$TMPDIR/ZealOS.raw"
|
|
TMPMOUNT="$TMPDIR/mnt"
|
|
|
|
# Change this if your default QEMU version does not work and you have installed a different version elsewhere.
|
|
QEMU_BIN_PATH="$(dirname "$(which qemu-system-x86_64)")"
|
|
|
|
mount_tempdisk() {
|
|
sudo modprobe nbd
|
|
sudo "$QEMU_BIN_PATH/qemu-nbd" -c /dev/nbd0 -f raw "$TMPDISK"
|
|
sudo partprobe /dev/nbd0 || true
|
|
sudo mount /dev/nbd0p1 "$TMPMOUNT"
|
|
}
|
|
|
|
umount_tempdisk() {
|
|
sync
|
|
sudo umount "$TMPMOUNT"
|
|
sudo "$QEMU_BIN_PATH/qemu-nbd" -d /dev/nbd0
|
|
}
|
|
|
|
script_cleanup() {
|
|
sync
|
|
|
|
sudo umount "$TMPMOUNT" >/dev/null 2>&1 || true
|
|
sudo "$QEMU_BIN_PATH/qemu-nbd" -d /dev/nbd0 >/dev/null 2>&1 || true
|
|
|
|
echo "Deleting temp folder ..."
|
|
sudo rm -rf "$TMPDIR"
|
|
sudo rm -rf "$TMPISODIR"
|
|
}
|
|
|
|
trap 'script_cleanup' EXIT
|
|
|
|
mkdir -p "$TMPMOUNT"
|
|
mkdir -p "$TMPISODIR"
|
|
|
|
echo "Building ZealBooter..."
|
|
make -C ../zealbooter distclean all || ( echo "ERROR: ZealBooter build failed !" && false )
|
|
|
|
echo "Making temp vdisk, running auto-install ..."
|
|
"$QEMU_BIN_PATH/qemu-img" create -f raw "$TMPDISK" 1024M
|
|
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -drive format=raw,file="$TMPDISK" -m 1G -rtc base=localtime -smp 4 -cdrom AUTO.ISO -device isa-debug-exit $QEMU_HEADLESS || true
|
|
|
|
echo "Copying all src/ code into vdisk Tmp/OSBuild/ ..."
|
|
rm -f ../src/Home/Registry.ZC
|
|
rm -f ../src/Home/MakeHome.ZC
|
|
rm -f ../src/Boot/Kernel.ZXE
|
|
mount_tempdisk
|
|
sudo mkdir -p "$TMPMOUNT/Tmp/OSBuild"
|
|
sudo cp -r ../src/* "$TMPMOUNT/Tmp/OSBuild/"
|
|
umount_tempdisk
|
|
|
|
echo "Rebuilding kernel headers, kernel, OS, and building Distro ISO ..."
|
|
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -drive format=raw,file="$TMPDISK" -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit $QEMU_HEADLESS || true
|
|
|
|
LIMINE_BINARY_BRANCH="v9.x-binary"
|
|
|
|
if [ -d "limine" ]
|
|
then
|
|
cd limine
|
|
git remote set-branches origin $LIMINE_BINARY_BRANCH
|
|
git fetch
|
|
git remote set-head origin $LIMINE_BINARY_BRANCH
|
|
git switch $LIMINE_BINARY_BRANCH
|
|
git config --local pull.ff true
|
|
git config --local pull.rebase true
|
|
git pull
|
|
rm limine
|
|
|
|
cd ..
|
|
else
|
|
git clone https://github.com/limine-bootloader/limine.git --branch=$LIMINE_BINARY_BRANCH --depth=1
|
|
fi
|
|
make -C limine
|
|
|
|
touch limine/Limine-BIOS-HDD.HH
|
|
echo "/*\$WW,1\$" > limine/Limine-BIOS-HDD.HH
|
|
cat limine/LICENSE >> limine/Limine-BIOS-HDD.HH
|
|
echo "*/\$WW,0\$" >> limine/Limine-BIOS-HDD.HH
|
|
cat limine/limine-bios-hdd.h >> limine/Limine-BIOS-HDD.HH
|
|
sed -i 's/const uint8_t/U8/g' limine/Limine-BIOS-HDD.HH
|
|
sed -i "s/\[\]/\[$(grep -o "0x" ./limine/limine-bios-hdd.h | wc -l)\]/g" limine/Limine-BIOS-HDD.HH
|
|
|
|
mount_tempdisk
|
|
echo "Extracting MyDistro ISO from vdisk ..."
|
|
cp "$TMPMOUNT/Tmp/MyDistro.ISO.C" ./ZealOS-MyDistro.iso
|
|
sudo rm -f "$TMPMOUNT/Tmp/MyDistro.ISO.C"
|
|
echo "Setting up temp ISO directory contents for use with limine xorriso command ..."
|
|
sudo cp -rf "$TMPMOUNT"/* "$TMPISODIR/"
|
|
sudo rm -f "$TMPISODIR/Boot/OldMBR.BIN"
|
|
sudo rm -f "$TMPISODIR/Boot/BootMHD2.BIN"
|
|
sudo mkdir -p "$TMPISODIR/EFI/BOOT"
|
|
sudo cp limine/Limine-BIOS-HDD.HH "$TMPISODIR/Boot/Limine-BIOS-HDD.HH"
|
|
sudo cp limine/BOOTX64.EFI "$TMPISODIR/EFI/BOOT/BOOTX64.EFI"
|
|
sudo cp limine/limine-uefi-cd.bin "$TMPISODIR/Boot/Limine-UEFI-CD.BIN"
|
|
sudo cp limine/limine-bios-cd.bin "$TMPISODIR/Boot/Limine-BIOS-CD.BIN"
|
|
sudo cp limine/limine-bios.sys "$TMPISODIR/Boot/Limine-BIOS.SYS"
|
|
sudo cp ../zealbooter/bin/kernel "$TMPISODIR/Boot/ZealBooter.ELF"
|
|
sudo cp ../zealbooter/limine.conf "$TMPISODIR/Boot/Limine.CONF"
|
|
echo "Copying DVDKernel.ZXE over ISO Boot/Kernel.ZXE ..."
|
|
sudo mv "$TMPMOUNT/Tmp/DVDKernel.ZXE" "$TMPISODIR/Boot/Kernel.ZXE"
|
|
sudo rm -f "$TMPISODIR/Tmp/DVDKernel.ZXE"
|
|
umount_tempdisk
|
|
|
|
xorriso -as mkisofs -R -r -J -b Boot/Limine-BIOS-CD.BIN \
|
|
-no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \
|
|
-apm-block-size 2048 --efi-boot Boot/Limine-UEFI-CD.BIN \
|
|
-efi-boot-part --efi-boot-image --protective-msdos-label \
|
|
"$TMPISODIR" -o ZealOS-limine.iso
|
|
|
|
./limine/limine bios-install ZealOS-limine.iso --no-gpt-to-mbr-isohybrid-conversion
|
|
|
|
if [ "$TESTING" = true ]; then
|
|
if [ ! -d "ovmf" ]; then
|
|
echo "Downloading OVMF..."
|
|
mkdir ovmf
|
|
cd ovmf
|
|
curl -o OVMF-X64.zip https://efi.akeo.ie/OVMF/OVMF-X64.zip
|
|
7z x OVMF-X64.zip
|
|
cd ..
|
|
fi
|
|
echo "Testing limine-zealbooter-xorriso isohybrid boot in UEFI mode ..."
|
|
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -m 1G -rtc base=localtime -bios ovmf/OVMF.fd -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS
|
|
echo "Testing limine-zealbooter-xorriso isohybrid boot in BIOS mode ..."
|
|
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS
|
|
echo "Testing native ZealC MyDistro legacy ISO in BIOS mode ..."
|
|
"$QEMU_BIN_PATH/qemu-system-x86_64" -machine q35 $KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-MyDistro.iso $QEMU_HEADLESS
|
|
fi
|
|
|
|
# comment these 2 lines if you want lingering old Distro ISOs
|
|
rm -f ./ZealOS-PublicDomain-BIOS-*.iso
|
|
rm -f ./ZealOS-BSD2-UEFI-*.iso
|
|
|
|
mv ./ZealOS-MyDistro.iso ./ZealOS-PublicDomain-BIOS-$(date +%Y-%m-%d-%H_%M_%S).iso
|
|
mv ./ZealOS-limine.iso ./ZealOS-BSD2-UEFI-$(date +%Y-%m-%d-%H_%M_%S).iso
|
|
|
|
echo "Finished."
|
|
echo
|
|
echo "ISOs built:"
|
|
ls | grep ZealOS-P
|
|
ls | grep ZealOS-B
|
|
echo
|