# ====== 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