CC = gcc
CFLAGS = -m32 -ffreestanding -O2 -Wall -Wextra -Iinclude

AS = nasm
ASFLAGS = -f elf32

LD = ld
LDFLAGS = -m elf_i386 -T linker.ld

TARGET = iso/boot/kernel.bin
ISO_IMAGE = peredOS.iso

# Жесткий список всех объектов, идущих в линкер
OBJ = boot/boot.o \
      kernel/kmain.o \
      kernel/gdt.o \
      kernel/gdt_asm.o \
      kernel/idt.o \
      kernel/interrupt.o \
      kernel/logger.o \
      kernel/io.o \
      drivers/serial.o \
      drivers/vga.o

# Дефолтное правило (просто сборка бинарника)
all: $(TARGET)
	@echo "[+] Сборка бинарника успешно завершена!"

# Линковка ядра
$(TARGET): $(OBJ)
	@echo "[+] Линкуем ядро..."
	$(LD) $(LDFLAGS) $(OBJ) -o $(TARGET)

# Компиляция Си-файлов ядра
kernel/%.o: kernel/%.c
	@echo "[+] Компилируем ядро (C): $<"
	$(CC) $(CFLAGS) -c $< -o $@

# Компиляция ассемблера GDT
kernel/gdt_asm.o: kernel/gdt.asm
	@echo "[+] Компилируем gdt.asm..."
	$(AS) $(ASFLAGS) kernel/gdt.asm -o kernel/gdt_asm.o

# Компиляция ассемблера IDT
kernel/interrupt.o: kernel/interrupt.asm
	@echo "[+] Компилируем interrupt.asm..."
	$(AS) $(ASFLAGS) kernel/interrupt.asm -o kernel/interrupt.o
# Компиляция драйверов
drivers/%.o: drivers/%.c
	@echo "[+] Компилируем драйвер: $<"
	$(CC) $(CFLAGS) -c $< -o $@

# Компиляция загрузочного сектора
boot/boot.o: boot/boot.asm
	@echo "[+] Компилируем бутлоадер..."
	$(AS) $(ASFLAGS) boot/boot.asm -o boot/boot.o

# Сборка полноценного ISO-образа через GRUB
iso: $(TARGET)
	@echo "[+] Собираем загрузочный ISO-образ..."
	grub-mkrescue -o $(ISO_IMAGE) iso/

# Честный запуск через ISO в QEMU
run: iso
	@echo "[+] Запускаем peredOS в QEMU через CD-ROM..."
	qemu-system-i386 -cdrom $(ISO_IMAGE) -serial stdio

# Очистка мусора
clean:
	@echo "[-] Очистка объектных файлов и образов..."
	rm -f boot/*.o kernel/*.o drivers/*.o $(TARGET) $(ISO_IMAGE)

.PHONY: all clean run iso
