# ====== Configuration ======
TARGET   ?= i686-elf
PLATFORM ?= pcmultiboot

CC       := $(TARGET)-gcc
AS       := $(TARGET)-as
AR       := $(TARGET)-ar

OBJ_DIR  := obj
LIB      := $(OBJ_DIR)/$(PLATFORM).a

-include $(PLATFORM).make

# ====== File Discovery ======
HEADERS  := $(wildcard *.h)

C_OBJS   := $(patsubst %.c, $(OBJ_DIR)/%.o, $(C_SRCS))
ASM_OBJS := $(patsubst %.s, $(OBJ_DIR)/%.o, $(ASM_SRCS))
OBJS     := $(C_OBJS) $(ASM_OBJS)

# ====== Default Flags (can be overridden in make.config) ======
CFLAGS ?= -Wall -Wextra -ffreestanding -mno-80387 -mgeneral-regs-only -O2 -I ../
ASFLAGS ?=

# ====== Default Rule ======
all: pre_build $(LIB)

# ====== Pre-build Hook ======
# This can be overridden or extended in platform make
pre_build: ;

# ====== Static Library ======
$(LIB): $(OBJS)
	$(AR) rcs $@ $(OBJS)

# ====== Compilation Rules ======
# C files depend on all headers.
$(OBJ_DIR)/%.o: %.c $(HEADERS) obj
	$(CC) $(CFLAGS) -c $< -o $@

# Assembly files do NOT depend on headers.
$(OBJ_DIR)/%.o: %.s obj
	$(AS) $(ASFLAGS) -o $@ $<

# ====== Clean Rule ======
clean:
	rm -rf $(OBJ_DIR) $(LIB)

obj:
	mkdir -p $(OBJ_DIR)

# ====== Phony Targets ======
.PHONY: all clean pre_build obj