From 27fc1b4ac8fabd72f0778bb4a8594d7c89e557e8 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Sun, 26 Feb 2023 03:41:25 +0100 Subject: [PATCH] new Makefile big commit, but should be working ok now --- GBA.mk | 163 ++++++++++++++++ Jenkinsfile | 4 +- Makefile | 303 +++--------------------------- Toolchain.mk | 32 ++++ data/animations/npc/sturgeon.s | 2 +- linker.ld | 2 +- tools/src/scaninc/asm_file.cpp | 6 +- tools/src/scaninc/c_file.cpp | 4 +- tools/src/scaninc/source_file.cpp | 4 +- 9 files changed, 229 insertions(+), 291 deletions(-) create mode 100644 GBA.mk create mode 100644 Toolchain.mk diff --git a/GBA.mk b/GBA.mk new file mode 100644 index 00000000..62221d21 --- /dev/null +++ b/GBA.mk @@ -0,0 +1,163 @@ +.PHONY: default +default: + @echo do not use this directly + +include Toolchain.mk + +GAME_VERSION ?= USA +BUILD_DIR = build/$(GAME_VERSION) + +TITLE := GBAZELDA MC +MAKER_CODE := 01 +REVISION := 0 + +ifeq ($(GAME_VERSION), EU) +GAME_CODE := BZMP +BUILD_NAME := tmc_eu +GAME_LANGUAGE := ENGLISH +TRANSLATIONS := translations/English.bin translations/French.bin translations/German.bin translations/Spanish.bin translations/Italian.bin +else ifeq ($(GAME_VERSION), JP) +GAME_CODE := BZMJ +BUILD_NAME := tmc_jp +GAME_LANGUAGE := JAPANESE +TRANSLATIONS := +else ifeq ($(GAME_VERSION), USA) +GAME_CODE := BZME +BUILD_NAME := tmc +GAME_LANGUAGE := ENGLISH +TRANSLATIONS := translations/USA.bin +else ifeq ($(GAME_VERSION), DEMO_USA) +GAME_CODE := BZHE +BUILD_NAME := tmc_demo_usa +GAME_LANGUAGE := ENGLISH +TRANSLATIONS := translations/USA.bin +else ifeq ($(GAME_VERSION), DEMO_JP) +GAME_CODE := BZMJ +BUILD_NAME := tmc_demo_jp +GAME_LANGUAGE := JAPANESE +TRANSLATIONS := +else +$(error unknown version $(GAME_VERSION)) +endif + +ROM = $(BUILD_NAME).gba +ELF = $(BUILD_NAME).elf + +# Clear the default suffixes +.SUFFIXES: +# Don't delete intermediate files +.SECONDARY: +# Delete files that weren't built properly +.DELETE_ON_ERROR: +# Secondary expansion is required for dependency variables in object rules. +.SECONDEXPANSION: + +# ================== +# entrypoint targets +# ================== +CUSTOM ?= +COMPARE ?= $(if $(CUSTOM),0,1) + +.PHONY: build extract_assets build_assets +build: $(if $(CUSTOM), build_assets, $(BUILD_DIR)/extracted_assets_$(GAME_VERSION)) + @$(MAKE) -f GBA.mk $(ROM) +ifeq ($(COMPARE), 1) + @$(SHA1) $(BUILD_NAME).sha1 +endif +extract_assets: $(BUILD_DIR)/converted_assets_$(GAME_VERSION) +# TODO this is slow, especially on builds with minor/no changes +build_assets: $(BUILD_DIR)/converted_assets_$(GAME_VERSION) + $(ASSET_PROCESSOR) build $(GAME_VERSION) $(BUILD_DIR)/assets + +.PHONY: clean +clean: + rm -rf build + rm -f t*.gba + rm -f t*.elf + +# =============== +# build ASM files +# =============== + +ASINCLUDE := -I $(BUILD_DIR)/assets -I $(BUILD_DIR)/enum_include +ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(REVISION) --defsym $(GAME_LANGUAGE)=1 $(ASINCLUDE) + +# TODO try solve this without the glob +ENUM_ASM_SRCS := $(wildcard include/*.h) +ENUM_ASM_HEADERS := $(patsubst include/%.h,$(BUILD_DIR)/enum_include/%.inc,$(ENUM_ASM_SRCS)) + +# if this is too broad dependency scanning will clash with C file +$(BUILD_DIR)/asm/%.o: deps = $(shell $(SCANINC) -I . $(ASINCLUDE) $*.s) +$(BUILD_DIR)/data/%.o: deps = $(shell $(SCANINC) -I . $(ASINCLUDE) $*.s) +$(BUILD_DIR)/%.o: %.s $$(deps) $(ENUM_ASM_HEADERS) + @mkdir -p $(dir $@) + $(PREPROC) $(BUILD_NAME) $< -- $(ASINCLUDE) | $(AS) $(ASFLAGS) -o $@ + +$(BUILD_DIR)/enum_include/%.inc: include/%.h + @mkdir -p $(dir $@) + $(ENUM_PROCESSOR) $< $(CC) "-D__attribute__(x)=" "-D$(GAME_VERSION)" "-E" "-nostdinc" "-Itools/agbcc" "-Itools/agbcc/include" "-iquote include" > $@ + +# ============= +# build C files +# ============= + +# agbcc includes are separate because we don't want dependency scanning on them +CINCLUDE := -I include -I $(BUILD_DIR) +CPPFLAGS := -I tools/agbcc -I tools/agbcc/include $(CINCLUDE) -nostdinc -undef -D$(GAME_VERSION) -DREVISION=$(REVISION) -D$(GAME_LANGUAGE) +CFLAGS := -O2 -Wimplicit -Wparentheses -Werror -Wno-multichar -g3 + +interwork := $(BUILD_DIR)/src/interrupts.o \ +$(BUILD_DIR)/src/collision.o \ +$(BUILD_DIR)/src/playerItem.o \ +$(BUILD_DIR)/src/object.o \ +$(BUILD_DIR)/src/manager.o \ +$(BUILD_DIR)/src/npc.o \ +$(BUILD_DIR)/src/gba/m4a.o + +$(interwork): CFLAGS += -mthumb-interwork +$(BUILD_DIR)/src/eeprom.o: CFLAGS += -O1 -mthumb-interwork + +# if this is too broad dependency scanning will clash with ASM file +$(BUILD_DIR)/src/%.o: deps = $(shell $(SCANINC) $(CINCLUDE) $*.c) +$(BUILD_DIR)/%.o : %.c $$(deps) + @mkdir -p $(dir $@) + $(CPP) $(CPPFLAGS) $< -o $(BUILD_DIR)/$*.i + $(CC1) $(CFLAGS) -o $(BUILD_DIR)/$*.s $(BUILD_DIR)/$*.i + @echo "\t.text\n\t.align\t2, 0 @ Don't pad with nop\n" >> $(BUILD_DIR)/$*.s + $(AS) $(ASFLAGS) -o $@ $(BUILD_DIR)/$*.s + +# ============== +# build binaries +# ============== + +LDFLAGS = -Map ../../$(BUILD_DIR)/$(BUILD_NAME).map +LIB := -L ../../tools/agbcc/lib -lc + +$(ROM): $(ELF) + $(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x9000000 $< $@ + +$(ELF): objs = $(shell grep -o -E "(\w|/)+\.o" linker.ld) +$(ELF): $(BUILD_DIR)/linker.ld $$(addprefix $(BUILD_DIR)/, $$(objs)) + cd $(BUILD_DIR) && $(LD) $(LDFLAGS) -n -T linker.ld -o ../../$@ $(LIB) + $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent + +$(BUILD_DIR)/linker.ld: linker.ld + @mkdir -p $(BUILD_DIR) + $(CPP) $(CPPFLAGS) -x c linker.ld | grep -v '^#' >$(BUILD_DIR)/linker.ld + +# ====== +# assets +# ====== + +$(BUILD_DIR)/extracted_assets_%: assets/assets.json assets/gfx.json assets/map.json assets/samples.json assets/sounds.json $(TRANSLATIONS) + @mkdir -p $(dir $@) + $(ASSET_PROCESSOR) extract $(GAME_VERSION) $(BUILD_DIR)/assets + touch $@ + +$(BUILD_DIR)/converted_assets_%: $(BUILD_DIR)/extracted_assets_% + @mkdir -p $(dir $@) + $(ASSET_PROCESSOR) convert $(GAME_VERSION) $(BUILD_DIR)/assets + touch $@ + +translations/%.bin: translations/%.json + tools/bin/tmc_strings -p --source $< --dest $@ diff --git a/Jenkinsfile b/Jenkinsfile index 603ff83a..e54bf2fb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,12 +12,12 @@ pipeline { sh 'cp /usr/local/etc/roms/tmc.demo.jp.gba baserom_demo_jp.gba' sh 'cp /usr/local/etc/roms/tmc.jp.gba baserom_jp.gba' sh 'cp /usr/local/etc/roms/tmc.eu.gba baserom_eu.gba' - sh 'make -j setup' + sh 'make setup' } } stage('Build') { steps { - sh 'make usa demo_usa jp demo_jp eu -j' + sh 'make all -j' } } stage('Report Progress') { diff --git a/Makefile b/Makefile index cdf51352..afa20588 100644 --- a/Makefile +++ b/Makefile @@ -1,294 +1,37 @@ -include $(DEVKITARM)/base_tools - -COMPARE ?= 0 - -CPP := $(CC) -E -LD := $(DEVKITARM)/bin/arm-none-eabi-ld - -GAME_VERSION ?= USA -REVISION := 0 -GAME_LANGUAGE := ENGLISH - -TITLE := GBAZELDA MC -MAKER_CODE := 01 - -ifeq ($(GAME_VERSION), USA) -GAME_CODE := BZME -BUILD_NAME := tmc -else -ifeq ($(GAME_VERSION), DEMO_USA) -GAME_CODE := BZHE -BUILD_NAME := tmc_demo_usa -else -ifeq ($(GAME_VERSION), JP) -GAME_CODE := BZMJ -BUILD_NAME := tmc_jp -GAME_LANGUAGE := JAPANESE -else -ifeq ($(GAME_VERSION), DEMO_JP) -GAME_CODE := BZMJ -BUILD_NAME := tmc_demo_jp -GAME_LANGUAGE := JAPANESE -else -ifeq ($(GAME_VERSION), EU) -GAME_CODE := BZMP -BUILD_NAME := tmc_eu -else -$(error unknown version $(GAME_VERSION)) -endif -endif -endif -endif -endif - -SHELL := /bin/bash -o pipefail - - -ROM := $(BUILD_NAME).gba -OBJ_DIR := build/$(BUILD_NAME) - -ELF = $(ROM:.gba=.elf) -MAP = $(ROM:.gba=.map) - -C_SUBDIR = src -DATA_C_SUBDIR = src/data -ASM_SUBDIR = asm -DATA_ASM_SUBDIR = data -SONG_SUBDIR = sound/songs -MID_SUBDIR = sound/songs/midi -ASSET_SUBDIR = assets -ENUM_INCLUDE_SUBDIR = enum_include - -C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR) -ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR) -ASM_ENUM_INCLUDE_DIR = $(ASM_BUILDDIR)/$(ENUM_INCLUDE_SUBDIR) -DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR) -SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR) -MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR) -ASSET_BUILDDIR = $(OBJ_DIR)/$(ASSET_SUBDIR) -PREPROC_INC_PATHS = $(ASSET_BUILDDIR) $(ASM_ENUM_INCLUDE_DIR) - -ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(REVISION) --defsym $(GAME_LANGUAGE)=1 -I $(ASSET_SUBDIR) -I $(ASSET_BUILDDIR) -I $(ASM_ENUM_INCLUDE_DIR) - -CC1 := tools/agbcc/bin/agbcc -override CFLAGS += -O2 -Wimplicit -Wparentheses -Werror -Wno-multichar -g3 -# -fhex-asm - -# ifeq ($(DINFO),1) -# override CFLAGS += -g -# endif - -CPPFLAGS := -I tools/agbcc -I tools/agbcc/include -iquote include -nostdinc -undef -D$(GAME_VERSION) -DREVISION=$(REVISION) -D$(GAME_LANGUAGE) -I $(OBJ_DIR) - -LDFLAGS = -Map ../../$(MAP) - -LIB := -L ../../tools/agbcc/lib -lc - -SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c -GFX := tools/bin/gbagfx -AIF := tools/bin/aif2pcm -MID := tools/bin/mid2agb -SCANINC := tools/bin/scaninc -# TODO: use charmap? -PREPROC := tools/bin/preproc -FIX := tools/bin/gbafix -ASSET_PROCESSOR := tools/bin/asset_processor -ENUM_PROCESSOR := tools/extract_include_enum.py - -ASSET_CONFIGS = assets/assets.json assets/gfx.json assets/map.json assets/samples.json assets/sounds.json -TRANSLATIONS = translations/USA.bin translations/English.bin translations/French.bin translations/German.bin translations/Spanish.bin translations/Italian.bin - -# Clear the default suffixes -.SUFFIXES: -# Don't delete intermediate files -.SECONDARY: -# Delete files that weren't built properly -.DELETE_ON_ERROR: -# Secondary expansion is required for dependency variables in object rules. -.SECONDEXPANSION: - - -$(shell mkdir -p $(C_BUILDDIR) $(ASM_BUILDDIR) $(DATA_ASM_BUILDDIR) $(SONG_BUILDDIR) $(MID_BUILDDIR)) - -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 compare target,$(MAKECMDGOALS))) -$(call infoshell, $(MAKE) tools) -else -NODEP := 1 -endif - -interwork := $(C_BUILDDIR)/interrupts.o \ -$(C_BUILDDIR)/collision.o \ -$(C_BUILDDIR)/playerItem.o \ -$(C_BUILDDIR)/object.o \ -$(C_BUILDDIR)/manager.o \ -$(C_BUILDDIR)/npc.o - -$(interwork): CFLAGS += -mthumb-interwork -$(C_BUILDDIR)/gba/m4a.o: CFLAGS = -O2 -mthumb-interwork -Wimplicit -Wparentheses -Werror -Wno-multichar -$(C_BUILDDIR)/eeprom.o: CFLAGS = -O1 -mthumb-interwork -Wimplicit -Wparentheses -Werror -Wno-multichar - -C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c) -C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) - -ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s $(ASM_SUBDIR)/*/*.s) -ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS)) $(patsubst $(ASM_SUBDIR)/*/%.s,$(ASM_BUILDDIR)/**/%.o,$(ASM_SRCS)) - -DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s $(DATA_ASM_SUBDIR)/**/*.s $(DATA_ASM_SUBDIR)/**/**/*.s) -DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS)) - -SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s) -SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS)) - -MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid) -MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS)) - -ENUM_ASM_SRCS := $(wildcard include/*.h) -ENUM_ASM_HEADERS := $(patsubst include/%.h,$(ASM_ENUM_INCLUDE_DIR)/%.inc,$(ENUM_ASM_SRCS)) - -OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS) -OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS)) - -SUBDIRS := $(sort $(dir $(OBJS) $(ENUM_ASM_HEADERS))) - -$(shell mkdir -p $(SUBDIRS)) - -.PHONY: all setup clean-tools mostlyclean clean tidy tools extractassets buildassets custom +.PHONY: default all +default: build +all: eu jp usa demo_jp demo_usa MAKEFLAGS += --no-print-directory -AUTO_GEN_TARGETS := +.PHONY: build eu jp usa demo_jp demo_usa custom +build: GAME_VERSION ?=USA +build: tools + @$(MAKE) -f GBA.mk build GAME_VERSION=$(GAME_VERSION) -# TODO do we really need this extra step just so that the assets are always extracted at first? -all: build/extracted_assets_$(GAME_VERSION) - @$(MAKE) target GAME_VERSION=$(GAME_VERSION) +eu: GAME_VERSION=EU +jp: GAME_VERSION=JP +usa: GAME_VERSION=USA +demo_jp: GAME_VERSION=DEMO_JP +demo_usa: GAME_VERSION=DEMO_USA +eu jp usa demo_jp demo_usa: + @$(MAKE) GAME_VERSION=$(GAME_VERSION) -target: $(ROM) - @$(SHA1) $(BUILD_NAME).sha1 +custom: tools + @$(MAKE) GAME_VERSION=USA CUSTOM=1 -custom: buildassets - @$(MAKE) target GAME_VERSION=$(GAME_VERSION) +.PHONY: tools +tools: tools/bin -# kept for backwards compat -compare: $(ROM) - @$(SHA1) $(BUILD_NAME).sha1 - -setup: tools - -# all tools are build at once -# FIXME figure out why make builds multiple times when specifying all tools here -tools: $(GFX) - -$(GFX) $(AIF) $(MID) $(SCANINC) $(PREPROC) $(FIX) $(ASSET_PROCESSOR) tools/bin/agb2mid tools/bin/tmc_strings tools/bin/bin2c &: +tools/bin: mkdir -p tools/cmake-build - unset CC CXX AS LD LDFLAGS && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=tools -S tools -B tools/cmake-build + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=tools -S tools -B tools/cmake-build cmake --build tools/cmake-build -j --target install -# Automatically extract binary data -build/extracted_assets_%: $(ASSET_CONFIGS) $(TRANSLATIONS) - $(ASSET_PROCESSOR) extract $(GAME_VERSION) $(ASSET_BUILDDIR) - touch $@ - -# Extract assets to human readable form -extractassets: - $(ASSET_PROCESSOR) convert $(GAME_VERSION) $(ASSET_BUILDDIR) - -# Build the assets from the human readable form -buildassets: - $(ASSET_PROCESSOR) build $(GAME_VERSION) $(ASSET_BUILDDIR) - -mostlyclean: tidy - rm -f sound/direct_sound_samples/*.bin - rm -f $(SONG_OBJS) $(MID_SUBDIR)/*.s - find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + - rm -f $(AUTO_GEN_TARGETS) +.PHONY: clean clean-tools +clean: + @$(MAKE) -f GBA.mk clean clean-tools: rm -rf tools/bin rm -rf tools/cmake-build - -clean: mostlyclean clean-tools - -tidy: - rm -f tmc.gba tmc.elf tmc.map - rm -f tmc_demo_usa.gba tmc_demo_usa.elf tmc_demo_usa.map - rm -f tmc_jp.gba tmc_jp.elf tmc_jp.map - rm -f tmc_demo_jp.gba tmc_demo_jp.elf tmc_demo_jp.map - rm -f tmc_eu.gba tmc_eu.elf tmc_eu.map - rm -r build/* - - -%.s: ; -%.png: ; -%.pal: ; -%.aif: ; - -%.1bpp: %.png ; $(GFX) $< $@ -%.4bpp: %.png ; $(GFX) $< $@ -%.8bpp: %.png ; $(GFX) $< $@ -%.gbapal: %.pal ; $(GFX) $< $@ -%.gbapal: %.png ; $(GFX) $< $@ -%.lz: % ; $(GFX) $< $@ -%.rl: % ; $(GFX) $< $@ - cd $(@D) && ../../$(MID) $(> $(C_BUILDDIR)/$*.s - $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s - -ifeq ($(NODEP),1) -$(ASM_BUILDDIR)/%.o: asm_dep := -else -$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) -I . $(ASM_SUBDIR)/$*.s) -endif - -$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep) - $(PREPROC) $(BUILD_NAME) $< -- $(PREPROC_INC_PATHS) | $(AS) $(ASFLAGS) -o $@ - -$(ASM_ENUM_INCLUDE_DIR)/%.inc: include/%.h - $(ENUM_PROCESSOR) $< $(CC) "-D__attribute__(x)=" "-D$(GAME_VERSION)" "-E" "-nostdinc" "-Itools/agbcc" "-Itools/agbcc/include" "-iquote include" > $@ - -ifeq ($(NODEP),1) -$(DATA_ASM_BUILDDIR)/%.o: data_dep := -else -$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) -I . -I $(ASSET_SUBDIR) -I $(ASSET_BUILDDIR) -I $(ASM_ENUM_INCLUDE_DIR) $(DATA_ASM_SUBDIR)/$*.s) -endif - -$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep) $(ENUM_ASM_HEADERS) - $(PREPROC) $(BUILD_NAME) $< charmap.txt -- $(PREPROC_INC_PATHS) | $(CPP) -I include -nostdinc -undef -Wno-unicode - | $(AS) $(ASFLAGS) -o $@ - -$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s - $(AS) $(ASFLAGS) -I sound -o $@ $< - -$(OBJ_DIR)/linker.ld: linker.ld - $(CPP) $(CPPFLAGS) -x c linker.ld | grep -v '^#' >$(OBJ_DIR)/linker.ld - -$(ELF): $(OBJS) $(OBJ_DIR)/linker.ld - cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -n -T linker.ld -o ../../$@ $(LIB) - $(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent - -$(ROM): $(ELF) - $(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x9000000 $< $@ - -usa: ; @$(MAKE) GAME_VERSION=USA -demo_usa: ; @$(MAKE) GAME_VERSION=DEMO_USA -jp: ; @$(MAKE) GAME_VERSION=JP -demo_jp: ; @$(MAKE) GAME_VERSION=DEMO_JP -eu: ; @$(MAKE) GAME_VERSION=EU diff --git a/Toolchain.mk b/Toolchain.mk new file mode 100644 index 00000000..4adb9f3e --- /dev/null +++ b/Toolchain.mk @@ -0,0 +1,32 @@ +# ======== +# compiler +# ======== + +ifneq (,$(shell which arm-none-eabi-gcc)) +PREFIX := +else ifdef DEVKITARM +PREFIX := $(DEVKITARM)/bin/ +else +$(error arm-none-eabi-gcc not found, please install (devkitPro supported)) +endif + + +CC := $(PREFIX)arm-none-eabi-gcc +CPP := $(CC) -E +CXX := $(PREFIX)arm-none-eabi-g++ +AS := $(PREFIX)arm-none-eabi-as +LD := $(PREFIX)arm-none-eabi-ld +OBJCOPY := $(PREFIX)arm-none-eabi-objcopy + +# ============ +# custom tools +# ============ + +CC1 := tools/agbcc/bin/agbcc +SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c + +SCANINC := tools/bin/scaninc +PREPROC := tools/bin/preproc +ASSET_PROCESSOR := tools/bin/asset_processor +ENUM_PROCESSOR := tools/extract_include_enum.py +FIX := tools/bin/gbafix diff --git a/data/animations/npc/sturgeon.s b/data/animations/npc/sturgeon.s index a4fa9b14..dc4be7fd 100644 --- a/data/animations/npc/sturgeon.s +++ b/data/animations/npc/sturgeon.s @@ -45,4 +45,4 @@ gSpriteAnimations_Sturgeon:: @ 0810FBD0 .4byte gSpriteAnimations_Sturgeon_7 .4byte gSpriteAnimations_Sturgeon_8 .4byte gSpriteAnimations_Sturgeon_9 - .4byte 00000000 \ No newline at end of file + .4byte 00000000 diff --git a/linker.ld b/linker.ld index 50a77389..ab7e510a 100644 --- a/linker.ld +++ b/linker.ld @@ -880,7 +880,7 @@ SECTIONS { src/gba/m4a.o(.text); asm/lib/libagbsyscall.o(.text); src/eeprom.o(.text); - *libc.a:memcpy.o(.text); + libc.a(.text); /* handwritten assembly in arm mode */ asm/src/intr.o(.text); diff --git a/tools/src/scaninc/asm_file.cpp b/tools/src/scaninc/asm_file.cpp index f53777bc..18b1e956 100644 --- a/tools/src/scaninc/asm_file.cpp +++ b/tools/src/scaninc/asm_file.cpp @@ -29,7 +29,7 @@ AsmFile::AsmFile(std::string path) { FILE* fp = std::fopen(path.c_str(), "rb"); if (fp == NULL) - fatal_error("Failed to open \"%s\" for reading.\n", path.c_str()); + fatal_error("Failed to open \"{}\" for reading.\n", path.c_str()); std::fseek(fp, 0, SEEK_END); @@ -40,7 +40,7 @@ AsmFile::AsmFile(std::string path) { std::rewind(fp); if (std::fread(m_buffer, m_size, 1, fp) != 1) - fatal_error("Failed to read \"%s\".\n", path.c_str()); + fatal_error("Failed to read \"{}\".\n", path.c_str()); std::fclose(fp); @@ -159,7 +159,7 @@ void AsmFile::SkipString() { fatal_error(INPUT_ERROR_MESSAGE("unexpected EOF in string\n")); if (c == '\\') { - c = GetChar(); + c = GetChar(); } } } diff --git a/tools/src/scaninc/c_file.cpp b/tools/src/scaninc/c_file.cpp index a8ff921f..fc5ed555 100644 --- a/tools/src/scaninc/c_file.cpp +++ b/tools/src/scaninc/c_file.cpp @@ -26,7 +26,7 @@ CFile::CFile(std::string path) { FILE* fp = std::fopen(path.c_str(), "rb"); if (fp == NULL) - fatal_error("Failed to open \"%s\" for reading.\n", path.c_str()); + fatal_error("Failed to open \"{}\" for reading.\n", path.c_str()); std::fseek(fp, 0, SEEK_END); @@ -38,7 +38,7 @@ CFile::CFile(std::string path) { std::rewind(fp); if (std::fread(m_buffer, m_size, 1, fp) != 1) - fatal_error("Failed to read \"%s\".\n", path.c_str()); + fatal_error("Failed to read \"{}\".\n", path.c_str()); std::fclose(fp); diff --git a/tools/src/scaninc/source_file.cpp b/tools/src/scaninc/source_file.cpp index 0cefc9f1..107396b0 100644 --- a/tools/src/scaninc/source_file.cpp +++ b/tools/src/scaninc/source_file.cpp @@ -25,7 +25,7 @@ SourceFileType GetFileType(std::string& path) { std::size_t pos = path.find_last_of('.'); if (pos == std::string::npos) - fatal_error("no file extension in path \"%s\"\n", path.c_str()); + fatal_error("no file extension in path \"{}\"\n", path.c_str()); std::string extension = path.substr(pos + 1); @@ -38,7 +38,7 @@ SourceFileType GetFileType(std::string& path) { else if (extension == "inc") return SourceFileType::Inc; else - fatal_error("Unrecognized extension \"%s\"\n", extension.c_str()); + fatal_error("Unrecognized extension \"{}\"\n", extension.c_str()); // Unreachable return SourceFileType::Cpp;