set quiet := true OS_NAME := os() ARCH_NAME := arch() HB_PREFIX := if ARCH_NAME == "aarch64" { "/opt/homebrew" } else { "/usr/local" } export PATH := HB_PREFIX + "/bin:" + HB_PREFIX + "/sbin:" + env_var("PATH") ACCEL := if OS_NAME == "macos" { if ARCH_NAME == "aarch64" { "-accel hvf" } else { "" } } else { if ARCH_NAME == "aarch64" { "-accel kvm" } else { "" } } CPU := if ARCH_NAME == "aarch64" { "host" } else { "max" } OVMF_ARM := if OS_NAME == "macos" { HB_PREFIX + "/share/qemu/edk2-aarch64-code.fd" } else { BUILD_DIR + "/edk2/edk2-aarch64-code.fd" } DISPLAY_FLAGS := if OS_NAME == "macos" { "-display cocoa,show-cursor=on" } else { env_var_or_default("QEMU_DISPLAY", "-display sdl") } ACCEL_INFO := if ACCEL == "" { "none (TCG)" } else { ACCEL } export BUILD_DIR := justfile_directory() + "/.build" export TEMP_DIR := BUILD_DIR + "/temp" export BOOT_BIN := BUILD_DIR + "/Bootloader/BOOTAA64.EFI" export IMG_FILE := BUILD_DIR + "/ksOS.img" mod Bootloader mod Kernel _default: just --list _prep: @mkdir -p {{BUILD_DIR}}/Bootloader @mkdir -p {{TEMP_DIR}}/Bootloader @mkdir -p {{BUILD_DIR}}/Kernel @if [ "{{OS_NAME}}" != "macos" ]; then \ mkdir -p {{BUILD_DIR}}/edk2; \ if [ ! -f "{{OVMF_ARM}}" ]; then \ echo "โฌ‡๏ธ Downloading vanilla EDK2 for Linux..."; \ curl -sL -o "{{OVMF_ARM}}.bz2" "https://github.com/qemu/qemu/raw/master/pc-bios/edk2-aarch64-code.fd.bz2"; \ bzip2 -d "{{OVMF_ARM}}.bz2"; \ fi \ fi @build: _prep @echo "๐Ÿ› ๏ธ Building everything..." just Bootloader build just Kernel build @_image: build @echo "๐Ÿ’พ Creating image..." @dd if=/dev/zero of={{IMG_FILE}} bs=1M count=64 status=none @mkfs.fat -F 32 {{IMG_FILE}} > /dev/null @mmd -i {{IMG_FILE}} ::/EFI ::/EFI/BOOT @mcopy -i {{IMG_FILE}} {{BOOT_BIN}} ::/EFI/BOOT/BOOTAA64.EFI @mcopy -i {{IMG_FILE}} {{BUILD_DIR}}/Kernel/ksOSKernel.bin ::/ksOSKernel.bin @run: _image @echo "๐Ÿš€ Launching (accel: {{ACCEL_INFO}})..." qemu-system-aarch64 {{ACCEL}} \ -machine virt,acpi=off \ -cpu {{CPU}} \ -m 512M \ -device ramfb \ {{DISPLAY_FLAGS}} \ -drive if=pflash,format=raw,readonly=on,file={{OVMF_ARM}} \ -drive file={{IMG_FILE}},format=raw,if=none,id=hd0 \ -device virtio-blk-device,drive=hd0 \ -serial stdio \ -monitor telnet:127.0.0.1:5555,server,nowait @crun: @echo "๐Ÿงน Cleaning and running.." just clean just run @clean: rm -rf {{BUILD_DIR}}