gila/Makefile.toml
2025-05-17 12:05:09 -04:00

147 lines
3.9 KiB
TOML

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 = ["-drive", "file=build/gila.iso,format=raw,index=0,media=disk", "-serial", "stdio"]