# CROSS defaults to the host x86_64 toolchain; set CROSS=x86_64-elf- when available.
CC := $(CROSS)gcc
LD := $(CROSS)ld
GRUB_FILE ?= grub-file
CFLAGS := -std=c11 -O2 -Wall -Wextra -Werror -ffreestanding -fno-stack-protector -fno-pic -fno-pie -m64 -mno-red-zone -mcmodel=small -Iinclude64
ASFLAGS := -m64 -ffreestanding -fno-pic -fno-pie -mno-red-zone -Iinclude64
LDFLAGS := -m elf_x86_64 -nostdlib -T arch/x86_64/linker.ld
BUILD := build-x86_64
C_SRCS := kernel64/kernel.c kernel64/serial.c kernel64/console.c kernel64/idt.c mm64/pmm.c kernel64/syscall.c kernel64/sched.c
ASM_SRCS := arch/x86_64/boot.S arch/x86_64/interrupts.S
OBJS := $(patsubst %.c,$(BUILD)/%.o,$(C_SRCS)) $(patsubst %.S,$(BUILD)/%.o,$(ASM_SRCS))

.PHONY: all clean check iso legacy-info
all: $(BUILD)/luna-kernel.elf
$(BUILD)/luna-kernel.elf: $(OBJS) arch/x86_64/linker.ld
	$(LD) $(LDFLAGS) -Map=$(BUILD)/luna-kernel.map -o $@ $(OBJS)
$(BUILD)/%.o: %.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c $< -o $@
$(BUILD)/%.o: %.S
	@mkdir -p $(dir $@)
	$(CC) $(ASFLAGS) -c $< -o $@
check: all
	@file $(BUILD)/luna-kernel.elf
	@readelf -h $(BUILD)/luna-kernel.elf | grep -E 'Class:|Machine:|Entry point'
	@readelf -S $(BUILD)/luna-kernel.elf | grep -E 'multiboot|\.text|\.bss'
	@tests/check-elf.sh $(BUILD)/luna-kernel.elf
iso: all
	@command -v grub-mkrescue >/dev/null || { echo 'grub-mkrescue is required for iso'; exit 1; }
	@mkdir -p $(BUILD)/iso/boot/grub
	@cp $(BUILD)/luna-kernel.elf $(BUILD)/iso/boot/luna-kernel.elf
	@printf 'set timeout=0\nset default=0\nmenuentry "LUNA Kernel x86_64" {\n  multiboot2 /boot/luna-kernel.elf\n  boot\n}\n' > $(BUILD)/iso/boot/grub/grub.cfg
	grub-mkrescue -o $(BUILD)/luna-kernel.iso $(BUILD)/iso
legacy-info:
	@echo 'Original 32-bit sources are retained; default target builds the new x86_64 port.'
clean:
	rm -rf $(BUILD)
