env_scripts = [ ''' #!@duckscript if eq ${TARGET} "x86_64-unknown-none" set_env QEMUCOMMAND "qemu-system-x86_64" set_env LIMINEBIN "BOOTX64.EFI" else if eq ${TARGET} "aarch64-unknown-none" set_env QEMUCOMMAND "qemu-system-aarch64" set_env LIMINEBIN "BOOTAA64.EFI" else if eq ${TARGET} "riscv64gc-unknown-none-elf" set_env QEMUCOMMAND "qemu-system-riscv64" set_env LIMINEBIN "BOOTRISCV64.EFI" else if eq ${TARGET} "loongarch64-unknown-none" set_env QEMUCOMMAND "qemu-system-loongarch64" set_env LIMINEBIN "BOOTLOONGARCH64.EFI" end ''' ] [env] # Directory for Limine binaries LIMINEDIR = "/usr/share/limine" # Compile target TARGET = "x86_64-unknown-none" # Binaries included in the OS initramfs BINS = [] [env.development] PROFILE = "dev" PROFILEDIR = "debug" ARTIFACTDIR = "target/${TARGET}/${PROFILEDIR}" [env.release] PROFILE = "release" PROFILEDIR = "release" ARTIFACTDIR = "target/${TARGET}/${PROFILEDIR}" [tasks.default] alias = "run" [tasks.clean] dependencies = ["clean_iso", "clean_initramfs"] command = "cargo" args = ["clean"] [tasks.prepare] script = "rustup install nightly; rustup target add ${TARGET}" [tasks.clean_iso] command = "rm" args = ["-rf", "build/iso", "build/gila.iso"] [tasks.clean_initramfs] command = "rm" args = ["-rf", "build/initramfs", "build/initramfs.tar.lzma"] [tasks.lib] condition = { files_modified = { input = ["src/lib/**/*.rs"], output = ["${ARTIFACTDIR}/libgila.rlib"] }, fail_message = "(inputs unchanged)" } dependencies = ["prepare"] command = "cargo" args = ["build", "--lib"] [tasks.kernel] condition = { files_modified = { input = [ "src/kernel/**/*.rs", "src/kernel/**/*.ld", "${ARTIFACTDIR}/libgila.rlib" ], output = ["${ARTIFACTDIR}/kernel"] }, fail_message = "(inputs unchanged)" } dependencies = ["lib"] command = "cargo" args = ["build", "--profile", "${PROFILE}", "--bin", "kernel"] [tasks.bins] dependencies = [] [tasks.initramfs] condition = { files_modified = { input = [ # This will not depend on *every* binary we build. # If we mount a disk later in boot we can store other binaries there. ], output = ["build/initramfs.tar.lzma"] }, fail_message = "(inputs unchanged)" } dependencies = ["bins"] script = ''' mkdir -p build/initramfs/system/bin mkdir -p build/initramfs/system/cfg for bin in $(echo ${BINS} | tr ";" " ") do cp ${ARTIFACTDIR}/$bin build/initramfs/system/bin/ done cp server_config.toml build/initramfs/system/cfg/ tar -c --lzma -f build/initramfs.tar.lzma build/initramfs ''' [tasks.iso] condition = { files_modified = { input = [ "${ARTIFACTDIR}/kernel", "limine.conf", "${LIMINEDIR}/limine-bios.sys", "${LIMINEDIR}/limine-bios-cd.bin", "${LIMINEDIR}/limine-uefi-cd.bin", "${LIMINEDIR}/${LIMINEBIN}" ], output = ["build/gila.iso"] }, fail_message = "(inputs unchanged)" } dependencies = ["kernel", "initramfs"] script = ''' mkdir -p build/iso/boot/limine mkdir -p build/iso/EFI/BOOT cp -f limine.conf build/iso/ cp -f ${LIMINEDIR}/limine-bios.sys build/iso/boot/limine/ cp -f ${LIMINEDIR}/limine-bios-cd.bin build/iso/boot/limine/ cp -f ${LIMINEDIR}/limine-uefi-cd.bin build/iso/boot/limine/ cp -f ${LIMINEDIR}/${LIMINEBIN} build/iso/EFI/BOOT cp -f build/initramfs.tar.lzma build/iso/boot/ cp -f ${ARTIFACTDIR}/kernel build/iso/boot/ mkdir -p build/iso/system/bin mkdir -p build/iso/system/tmp mkdir -p build/iso/system/cfg xorriso -as mkisofs \ -b boot/limine/limine-bios-cd.bin \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ --efi-boot boot/limine/limine-uefi-cd.bin \ -efi-boot-part \ --efi-boot-image \ --protective-msdos-label build/iso \ -o build/gila.iso limine bios-install build/gila.iso ''' [tasks.run] dependencies = ["iso"] command = "${QEMUCOMMAND}" args = ["-display", "none", "-drive", "file=build/gila.iso,format=raw,index=0,media=disk", "-serial", "stdio"]