summaryrefslogtreecommitdiff
path: root/arm7
diff options
context:
space:
mode:
Diffstat (limited to 'arm7')
-rw-r--r--arm7/Makefile175
1 files changed, 175 insertions, 0 deletions
diff --git a/arm7/Makefile b/arm7/Makefile
new file mode 100644
index 00000000..763dd714
--- /dev/null
+++ b/arm7/Makefile
@@ -0,0 +1,175 @@
+# Makefile to build Pokemon Diamond image
+
+.PHONY: clean tidy all default patch_mwasmarm
+
+# Try to include devkitarm if installed
+TOOLCHAIN := $(DEVKITARM)
+
+ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
+include $(TOOLCHAIN)/base_tools
+endif
+
+### Default target ###
+
+default: all
+
+# If you are using WSL, it is recommended you build with NOWINE=1.
+WSLENV ?= no
+ifeq ($(WSLENV),)
+NOWINE = 1
+else
+NOWINE = 0
+endif
+
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+WINE :=
+else
+EXE :=
+WINE := wine
+endif
+
+ifeq ($(NOWINE),1)
+WINE :=
+endif
+
+################ Target Executable and Sources ###############
+
+BUILD_DIR := build
+
+TARGET := pokediamond.us
+
+ROM := $(BUILD_DIR)/$(TARGET).nds
+ELF := $(BUILD_DIR)/$(TARGET).elf
+LD_SCRIPT := pokediamond.lcf
+
+# Directories containing source files
+SRC_DIRS := src
+ASM_DIRS := asm data files
+
+C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
+S_FILES := $(foreach dir,$(ASM_DIRS),$(wildcard $(dir)/*.s))
+
+# Object files
+O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.o)) \
+ $(foreach file,$(S_FILES),$(BUILD_DIR)/$(file:.s=.o)) \
+
+##################### Compiler Options #######################
+
+MWCCVERSION := 2.0/base
+
+CROSS := arm-none-eabi-
+
+MWCCARM := tools/mwccarm/$(MWCCVERSION)/mwccarm.exe
+# Argh... due to EABI version shenanigans, we can't use GNU LD to link together
+# MWCC built objects and GNU built ones. mwldarm, however, doesn't care, so we
+# have to use mwldarm for now.
+# TODO: Is there a hack workaround to let us go back to GNU LD? Ideally, the
+# only dependency should be MWCCARM.
+MWLDARM := tools/mwccarm/$(MWCCVERSION)/mwldarm.exe
+MWASMARM := tools/mwccarm/$(MWCCVERSION)/mwasmarm.exe
+
+AS := $(WINE) $(MWASMARM)
+CC := $(WINE) $(MWCCARM)
+CPP := cpp -P
+LD := $(WINE) $(MWLDARM)
+AR := $(CROSS)ar
+OBJDUMP := $(CROSS)objdump
+OBJCOPY := $(CROSS)objcopy
+
+# ./tools/mwccarm/2.0/base/mwasmarm.exe -proc arm5te asm/arm9_thumb.s -o arm9.o
+ASFLAGS = -proc arm5te
+CFLAGS = -O4,p -proc v5te -thumb -fp soft -lang c99 -Cpp_exceptions off -ir include
+LDFLAGS = -map -nodead -w off -proc v5te -interworking -map -symtab -m _start
+
+####################### Other Tools #########################
+
+# DS TOOLS
+TOOLS_DIR = tools
+SHA1SUM = sha1sum
+JSONPROC = $(TOOLS_DIR)/jsonproc/jsonproc
+GFX = $(TOOLS_DIR)/nitrogfx/nitrogfx
+MWASMARM_PATCHER = $(TOOLS_DIR)/mwasmarm_patcher/mwasmarm_patcher$(EXE)
+
+TOOLDIRS = $(filter-out $(TOOLS_DIR)/mwccarm,$(wildcard $(TOOLS_DIR)/*))
+TOOLBASE = $(TOOLDIRS:$(TOOLS_DIR)/%=%)
+TOOLS = $(foreach tool,$(TOOLBASE),$(TOOLS_DIR)/$(tool)/$(tool)$(EXE))
+
+######################### Targets ###########################
+
+infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
+
+# Build tools when building the rom
+# Disable dependency scanning for clean/tidy/tools
+ifeq (,$(filter-out all,$(MAKECMDGOALS)))
+$(call infoshell, $(MAKE) tools patch_mwasmarm)
+else
+NODEP := 1
+endif
+
+.PHONY: all clean mostlyclean tidy tools $(TOOLDIRS) patch_mwasmarm
+
+MAKEFLAGS += --no-print-directory
+
+all: $(ROM)
+ @$(SHA1SUM) -c $(TARGET).sha1
+
+clean: mostlyclean
+ make -C tools/mwasmarm_patcher clean
+
+mostlyclean: tidy
+ find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' \) -exec $(RM) {} +
+
+tidy:
+ $(RM) -r $(BUILD_DIR)
+
+tools: $(TOOLDIRS)
+
+$(TOOLDIRS):
+ @$(MAKE) -C $@
+
+$(MWASMARM): patch_mwasmarm
+
+patch_mwasmarm:
+ $(MWASMARM_PATCHER) $(MWASMARM)
+
+ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(ASM_DIRS))
+
+$(BUILD_DIR)/%.o: %.c
+ $(CC) -c $(CFLAGS) -o $@ $<
+
+$(BUILD_DIR)/%.o: %.s
+ $(AS) $(ASFLAGS) $< -o $@
+
+$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) undefined_syms.txt
+ $(CPP) $(VERSION_CFLAGS) -MMD -MP -MT $@ -MF $@.d -I include/ -I . -DBUILD_DIR=$(BUILD_DIR) -o $@ $<
+
+$(ELF): $(O_FILES) $(BUILD_DIR)/$(LD_SCRIPT)
+ $(LD) $(LDFLAGS) $(BUILD_DIR)/$(LD_SCRIPT) -o $(ELF) $(O_FILES)
+
+$(ROM): $(ELF)
+ $(OBJCOPY) -O binary --gap-fill=0xFF --pad-to=0x04000000 $< $@
+
+# Make sure build directory exists before compiling anything
+DUMMY != mkdir -p $(ALL_DIRS)
+
+%.4bpp: %.png
+ $(GFX) $< $@
+
+%.gbapal: %.png
+ $(GFX) $< $@
+
+%.gbapal: %.pal
+ $(GFX) $< $@
+
+%.lz: %
+ $(GFX) $< $@
+
+%.png: ;
+%.pal: ;
+
+$(BUILD_DIR)/data/icon.o: graphics/icon.4bpp graphics/icon.gbapal
+
+### Debug Print ###
+
+print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true