ISODIR=$(shell pwd)/iso
IMGDIR=$(shell pwd)/img
ISO=astral.iso
IMG=astral-bootable.img
DISKNAME=hdd.img
LIMINEDIR=$(shell pwd)/host-pkgs/limine/usr/local/share/limine/
KERNEL=$(shell pwd)/builds/astral/astral
QEMUFLAGS=-M q35 -m 4g -smp cpus=1 -no-shutdown -no-reboot -monitor stdio -debugcon file:/dev/stdout -serial file:/dev/stdout -netdev user,id=net0 -device virtio-net,netdev=net0 -object filter-dump,id=f1,netdev=net0,file=netdump.dat
QEMUISOFLAGS=-cdrom $(ISO)
QEMUDISKFLAGS=-drive file=$(DISKNAME),if=none,id=nvme -device nvme,serial=deadc0ff,drive=nvme -boot order=dc
QEMUIMGFLAGS=-drive file=$(IMG),if=none,id=usb -device nec-usb-xhci,id=xhci -device usb-storage,bus=xhci.0,drive=usb,removable=on
INITRD=$(shell pwd)/initrds/initrd
DISTROTYPE=full

MINIMALPACKAGES=mlibc bash coreutils init distro-files vim nano mount netd shadow sudo neofetch

.PHONY: all kernel clean clean-kernel iso img initrd full minimal disk

all: jinx
	git submodule update --init --recursive
	mkdir -p $(ISODIR)
	make kernel
	make $(ISO)
	@echo
	@echo "|--------------------------------------------------------------|"
	@echo "|       To regenerate the initrd, run 'make initrd iso'.       |"
	@echo "| To generate a bootable USB/HDD image, run 'make initrd img'. |"
	@echo "|         To generate a disk image, run 'make disk'.           |"
	@echo "|--------------------------------------------------------------|"
	@echo

jinx:
	curl https://raw.githubusercontent.com/mintsuki/jinx/f459adb138abff6afc7936f5fd4bc9e24023a495/jinx > jinx
	chmod +x jinx

iso: $(ISO)
img: $(IMG)

$(ISO): limine.conf liminebg.bmp $(KERNEL) $(INITRD)-$(DISTROTYPE)
	mkdir -p $(ISODIR)
	ln -f $(INITRD)-$(DISTROTYPE) $(ISODIR)/initrd
	cp $(KERNEL) liminebg.bmp limine.conf $(LIMINEDIR)/limine-bios.sys $(LIMINEDIR)/limine-bios-cd.bin $(LIMINEDIR)/limine-uefi-cd.bin $(ISODIR)
	xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label $(ISODIR) -o $(ISO)

$(IMG): limine.conf liminebg.bmp $(KERNEL) $(INITRD)-$(DISTROTYPE)
	mkdir -p $(IMGDIR)/EFI/BOOT
	ln -f $(INITRD)-$(DISTROTYPE) $(IMGDIR)/initrd
	cp $(KERNEL) liminebg.bmp limine.conf $(LIMINEDIR)/limine-bios.sys $(IMGDIR)
	cp $(LIMINEDIR)/BOOTIA32.EFI $(IMGDIR)/EFI/BOOT
	cp $(LIMINEDIR)/BOOTX64.EFI $(IMGDIR)/EFI/BOOT
	./genbootimg.sh 1G $(IMG) $(IMGDIR)

# ------ build targets ------

kernel:
	rm -f builds/astral.packaged
	rm -f builds/astral.built
	./jinx build astral

# ------ initrd targets ------

$(INITRD)-full:
	./jinx install sysroot \*
	mkdir -p initrds
	./geninitrd.sh sysroot $(INITRD)-full

$(INITRD)-minimal:
	./jinx install minimalsysroot $(MINIMALPACKAGES)
	mkdir -p initrds
	./geninitrd.sh minimalsysroot $(INITRD)-minimal

initrd:
	rm $(INITRD)-$(DISTROTYPE)
	make $(INITRD)-$(DISTROTYPE)

# ------ disk targets ------

disk: disk-$(DISTROTYPE)

disk-full:
	./jinx install sysroot \*
	./gendisk.sh 4g sysroot $(DISKNAME)

disk-minimal:
	./jinx install minimalsysroot $(MINIMALPACKAGES)
	./gendisk.sh 1g minimalsysroot $(DISKNAME)

# ------ clean targets ------

clean-kernel:
	find builds/astral/ -name *.d -delete
	find builds/astral/ -name *.o -delete
	find builds/astral/ -name *.asmo -delete

clean:
	make -i clean-kernel
	rm jinx
	rm -rf builds
	rm -rf host-builds
	rm -rf pkgs
	rm -rf host-pkgs
	rm -rf sources
	rm -rf sysroot
	rm -rf $(ISODIR)
	rm -f $(ISO)
	rm -f $(DISKNAME)
	rm -rf initrds

# ------ run targets ------

run:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS)

run-gdb:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) -S -s

run-kvm:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) -enable-kvm -cpu host,migratable=off

run-disk:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS)

run-disk-gdb:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS) -S -s

run-disk-kvm:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS) -enable-kvm -cpu host,migratable=off

run-img:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUIMGFLAGS)

run-img-gdb:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUIMGFLAGS) -S -s

run-img-kvm:
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUIMGFLAGS) -enable-kvm -cpu host,migratable=off
