# --- Toolchain ---
CROSS_COMPILE ?= arm-none-eabi-
CC      := $(CROSS_COMPILE)gcc
LD      := $(CROSS_COMPILE)ld
SIZE    := $(CROSS_COMPILE)size
OBJCOPY := $(CROSS_COMPILE)objcopy

# --- Configuration ---
OUTPUT_NAME := puredoom
OUTPUT_ELF  := $(OUTPUT_NAME).elf
OBJDIR      := build
LINKER_SCRIPT := link.ld

# 指向包含 PureDOOM.h 的目录
INCLUDES := -I. 

# --- Flags ---
# -fno-strict-aliasing: Doom 源码中有大量类型双关，必须加上
# -DDOOM_IMPLEMENTATION: 在我们的C文件中定义，这里不需要，但可以在此通过宏控制特性
CFLAGS := -mcpu=arm926ej-s -marm -mfloat-abi=soft \
          -O2 -g -Wall -fno-strict-aliasing \
          -fPIC -ffreestanding -nostdlib \
          $(INCLUDES)
#让破doom_Boolean变成1字节，好像没用		  -fshort-enums \


# PureDOOM 特性开关 (我们不使用标准库宏，而是手动 set)
# 这里的定义是为了告诉 PureDOOM 不要尝试 include <stdio.h> 等
CFLAGS += -DDOOM_NOSYSTEM

# Linker Flags
# -shared: 生成位置无关的可加载库 (Loader 需要)
LDFLAGS := -shared -Bsymbolic --no-undefined -T $(LINKER_SCRIPT)

LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)

# --- Sources ---
# 只需要编译这一个文件
SRCS := hp_puredoom.c
OBJS := $(addprefix $(OBJDIR)/, $(SRCS:.c=.o))

# --- Rules ---
all: $(OUTPUT_ELF)

$(OUTPUT_ELF): $(OBJS)
	@echo "[LD] $@"
	@$(LD) $(LDFLAGS) $(OBJS) '$(LIBGCC)' -o $@
	@$(SIZE) $@

$(OBJDIR)/%.o: %.c | $(OBJDIR)
	@echo "[CC] $<"
	@$(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR):
	@mkdir -p $(OBJDIR)

clean:
	@rm -rf $(OBJDIR) $(OUTPUT_ELF)

rebuild: clean all