# Makefile for PrismOS
.PHONY: all clean run

# Toolchain
AS = nasm
CC = gcc
LD = ld
GRUB_MKRESCUE = grub-mkrescue

# Directories
KERNEL_DIR = kernel
ISO_DIR = iso_root

# Build files
KERNEL_BIN = $(ISO_DIR)/boot/kernel.bin
ASM_OBJ = $(KERNEL_DIR)/multiboot_entry.o $(KERNEL_DIR)/context_switch.o
C_OBJ = $(KERNEL_DIR)/kernel.o $(KERNEL_DIR)/vga.o $(KERNEL_DIR)/keyboard.o $(KERNEL_DIR)/string.o $(KERNEL_DIR)/memory.o $(KERNEL_DIR)/process.o $(KERNEL_DIR)/panic.o $(KERNEL_DIR)/fs.o $(KERNEL_DIR)/program.o programs/hello.o programs/calc.o programs/editor.o $(KERNEL_DIR)/shell.o

# Default target
all: prismos.iso

# Build kernel binary
$(KERNEL_BIN): $(ASM_OBJ) $(C_OBJ)
	$(LD) -T linker.ld -o $@ $(ASM_OBJ) $(C_OBJ)

# Assemble multiboot entry
$(KERNEL_DIR)/multiboot_entry.o: $(KERNEL_DIR)/multiboot_entry.asm
	$(AS) -f elf32 $< -o $@

$(KERNEL_DIR)/context_switch.o: $(KERNEL_DIR)/context_switch.asm
	$(AS) -f elf32 $< -o $@

# Compile C files
$(KERNEL_DIR)/kernel.o: $(KERNEL_DIR)/kernel.c $(KERNEL_DIR)/vga.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/vga.o: $(KERNEL_DIR)/vga.c $(KERNEL_DIR)/vga.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/keyboard.o: $(KERNEL_DIR)/keyboard.c $(KERNEL_DIR)/keyboard.h
	$(CC) -m32 -ffreestanding -fno-pie -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/string.o: $(KERNEL_DIR)/string.c $(KERNEL_DIR)/string.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/memory.o: $(KERNEL_DIR)/memory.c $(KERNEL_DIR)/memory.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/process.o: $(KERNEL_DIR)/process.c $(KERNEL_DIR)/process.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/panic.o: $(KERNEL_DIR)/panic.c $(KERNEL_DIR)/panic.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/fs.o: $(KERNEL_DIR)/fs.c $(KERNEL_DIR)/fs.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

$(KERNEL_DIR)/program.o: $(KERNEL_DIR)/program.c $(KERNEL_DIR)/program.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -c $< -o $@

programs/hello.o: programs/hello.c
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -Ikernel -c $< -o $@

programs/calc.o: programs/calc.c
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -Ikernel -c $< -o $@

programs/editor.o: programs/editor.c
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -Ikernel -c $< -o $@

$(KERNEL_DIR)/shell.o: shell/shell.c shell/shell.h
	$(CC) -m32 -ffreestanding -fno-pie -fno-stack-protector -I$(KERNEL_DIR) -I. -c $< -o $@

# Create ISO
prismos.iso: $(KERNEL_BIN) $(ISO_DIR)/boot/grub/grub.cfg
	$(GRUB_MKRESCUE) -o prismos.iso $(ISO_DIR)

# Run in QEMU
run: prismos.iso
	qemu-system-i386 -cdrom prismos.iso -boot d

# Debug mode
debug: prismos.iso
	qemu-system-i386 -cdrom prismos.iso -boot d -d int -nographic

# Clean
clean:
	rm -f $(KERNEL_DIR)/*.o programs/*.o prismos.iso
	rm -rf $(ISO_DIR)/boot/kernel.bin