diff options
Diffstat (limited to 'Makefile')
-rwxr-xr-x | Makefile | 160 |
1 files changed, 88 insertions, 72 deletions
@@ -1,99 +1,115 @@ -AS := $(DEVKITARM)/bin/arm-none-eabi-as -ASFLAGS := -mcpu=arm7tdmi - -CC1 := tools/agbcc/bin/agbcc -override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Wunused -Werror -O2 -fhex-asm - -CPP := $(DEVKITARM)/bin/arm-none-eabi-cpp -CPPFLAGS := -I tools/agbcc/include -iquote include -nostdinc -undef - -LD := $(DEVKITARM)/bin/arm-none-eabi-ld +include $(DEVKITARM)/base_tools + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + + +#### Tools #### + +SHELL := /bin/bash -o pipefail +AS := $(PREFIX)as +CC1 := tools/agbcc/bin/agbcc +CPP := $(PREFIX)cpp +LD := $(PREFIX)ld +OBJCOPY := $(PREFIX)objcopy +SHA1SUM := sha1sum -c +GBAGFX := tools/gbagfx/gbagfx +AIF2PCM := tools/aif2pcm/aif2pcm +MID2AGB := tools/mid2agb/mid2agb +PREPROC := tools/preproc/preproc +SCANINC := tools/scaninc/scaninc +RAMSCRGEN := tools/ramscrgen/ramscrgen -OBJCOPY := $(DEVKITARM)/bin/arm-none-eabi-objcopy +ASFLAGS := -mcpu=arm7tdmi +override CC1FLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Wunused -Werror -O2 -fhex-asm +CPPFLAGS := -I tools/agbcc/include -iquote include -nostdinc -undef -LIBGCC := tools/agbcc/lib/libgcc.a -LIBC := tools/agbcc/lib/libc.a +#### Files #### -MD5 := md5sum -c +BUILD_NAME = red -GFX := tools/gbagfx/gbagfx -AIF := tools/aif2pcm/aif2pcm -MID := tools/mid2agb/mid2agb -SCANINC := tools/scaninc/scaninc -PREPROC := tools/preproc/preproc -RAMSCRGEN := tools/ramscrgen/ramscrgen +ROM := pmd_$(BUILD_NAME).gba +MAP := $(ROM:%.gba=%.map) -# Clear the default suffixes. -.SUFFIXES: +BUILD_DIR := build/pmd_$(BUILD_NAME) -# Secondary expansion is required for dependency variables in object rules. -.SECONDEXPANSION: +C_SOURCES := $(wildcard src/*.c) +ASM_SOURCES := $(wildcard asm/*.s data/*.s) -.PRECIOUS: %.1bpp %.4bpp %.8bpp %.gbapal %.lz %.rl %.pcm %.bin +C_OBJECTS := $(addprefix $(BUILD_DIR)/, $(C_SOURCES:%.c=%.o)) +ASM_OBJECTS := $(addprefix $(BUILD_DIR)/, $(ASM_SOURCES:%.s=%.o)) +ALL_OBJECTS := $(C_OBJECTS) $(ASM_OBJECTS) -.PHONY: all clean tidy +SUBDIRS := $(sort $(dir $(ALL_OBJECTS))) -C_SRCS := $(wildcard src/*.c) -C_OBJS := $(C_SRCS:%.c=%.o) +LIBC := tools/agbcc/lib/libc.a +LIBGCC := tools/agbcc/lib/libgcc.a -ASM_SRCS := $(wildcard asm/*.s) -ASM_OBJS := $(ASM_SRCS:%.s=%.o) +LD_SCRIPT := $(BUILD_DIR)/ld_script.ld -DATA_ASM_SRCS := $(wildcard data/*.s) -DATA_ASM_OBJS := $(DATA_ASM_SRCS:%.s=%.o) +# Special configurations required for lib files +%/src/agb_flash.o : CC1FLAGS := -O -mthumb-interwork +%/src/agb_flash_1m.o: CC1FLAGS := -O -mthumb-interwork +%/src/agb_flash_mx.o: CC1FLAGS := -O -mthumb-interwork -OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) +#### Main Rules #### -all: pmd_red.gba +ALL_BUILDS := red -# For contributors to make sure a change didn't affect the contents of the ROM. +# Available targets +.PHONY: all clean tidy -compare: all - @$(MD5) rom.md5 +MAKEFLAGS += --no-print-directory +# Secondary expansion is required for dependency variables in object rules. +.SECONDEXPANSION: +# Clear the default suffixes +.SUFFIXES: +# Don't delete intermediate files +.SECONDARY: +# Delete files that weren't built properly +.DELETE_ON_ERROR: -clean: tidy +.PRECIOUS: %.1bpp %.4bpp %.8bpp %.gbapal %.lz %.rl %.pcm %.bin -tidy: - rm -f pmd_red.gba pmd_red.elf pmd_red.map - rm -f $(ASM_OBJS) - rm -f $(DATA_ASM_OBJS) - rm -f $(C_OBJS) - rm -f $(ASM_OBJS) - rm -f $(DATA_ASM_OBJS) - rm -f $(C_SRCS:%.c=%.i) - rm -f $(C_SRCS:%.c=%.s) - rm -f *.ld -src/agb_flash.o: CFLAGS := -O -mthumb-interwork -src/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork -src/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork +# Create build subdirectories -$(C_OBJS): %.o : %.c - @$(CPP) $(CPPFLAGS) $< -o $*.i - @$(CC1) $(CFLAGS) $*.i -o $*.s - @printf ".text\n\t.align\t2, 0\n" >> $*.s - $(AS) $(ASFLAGS) -o $@ $*.s +$(shell mkdir -p $(SUBDIRS)) -$(ASM_OBJS): %.o: %.s - $(AS) $(ASFLAGS) -o $@ $< +all: $(ROM) +ifeq ($(COMPARE),1) + @$(SHA1SUM) $(BUILD_NAME).sha1 +endif -$(DATA_ASM_OBJS): %.o: %.s - $(AS) $(ASFLAGS) -o $@ $< +clean: tidy + $(RM) $(ALL_OBJECTS) +tidy: + $(RM) $(ALL_BUILDS:%=pmd_%{.gba,.elf,.map}) + $(RM) -r build -sym_ewram.ld: sym_ewram.txt - $(RAMSCRGEN) ewram_data sym_ewram.txt ENGLISH >$@ +$(ROM): %.gba: %.elf + $(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0xA000000 $< $@ -sym_ewram2.ld: sym_ewram2.txt - $(RAMSCRGEN) ewram_data sym_ewram2.txt ENGLISH >$@ +%.elf: $(LD_SCRIPT) $(ALL_OBJECTS) $(LIBC) + cd $(BUILD_DIR) && $(LD) -T ld_script.ld -Map ../../$(MAP) -o ../../$@ ../../$(LIBC) ../../$(LIBGCC) -sym_iwram.ld: sym_iwram.txt - $(RAMSCRGEN) iwram_data sym_iwram.txt ENGLISH >$@ +$(LD_SCRIPT): ld_script.txt $(BUILD_DIR)/sym_ewram.ld $(BUILD_DIR)/sym_ewram2.ld $(BUILD_DIR)/sym_iwram.ld + cd $(BUILD_DIR) && sed -e "s#tools/#../../tools/#g" ../../ld_script.txt >ld_script.ld +$(BUILD_DIR)/sym_%.ld: sym_%.txt + $(CPP) -P $(CPPFLAGS) $< | sed -e "s#tools/#../../tools/#g" > $@ -ld_script.ld: ld_script.txt sym_ewram.ld sym_ewram2.ld sym_iwram.ld - sed -f ld_script.sed ld_script.txt >ld_script.ld +$(C_OBJECTS): $(BUILD_DIR)/%.o: %.c + @$(CPP) $(CPPFLAGS) $< -o $(BUILD_DIR)/$*.i + echo $(CC1) $(CC1FLAGS) $(BUILD_DIR)/$*.i -o $(BUILD_DIR)/$*.s + @$(CC1) $(CC1FLAGS) $(BUILD_DIR)/$*.i -o $(BUILD_DIR)/$*.s + @printf ".text\n\t.align\t2, 0\n" >> $(BUILD_DIR)/$*.s + $(AS) $(ASFLAGS) -o $@ $(BUILD_DIR)/$*.s -pmd_red.elf: ld_script.ld $(OBJS) $(LIBC) - $(LD) -T ld_script.ld -Map pmd_red.map -o $@ $(OBJS) $(LIBC) $(LIBGCC) +$(BUILD_DIR)/data/%.o: data/%.s + $(AS) $(ASFLAGS) $< -o $@ -pmd_red.gba: pmd_red.elf - $(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0xA000000 $< $@ +$(BUILD_DIR)/%.o: %.s + $(AS) $(ASFLAGS) $< -o $@
\ No newline at end of file |