650127e857
`src/data/map_group_count.h` is currently in `.gitignore`. However, git does not ignore a file if that file is already in the index. To actually ignore the file, the file must be deleted and that deletion must be committed. In addition, the Makefile did not previously clean `src/data/map_group_count.h`, nor know how to generate `src/data/map_group_count.h`. It did generate the file as a side-effect of a different rule, but if asked to generate, it did not know how to.
546 lines
19 KiB
Makefile
546 lines
19 KiB
Makefile
TOOLCHAIN := $(DEVKITARM)
|
|
COMPARE ?= 0
|
|
|
|
ifeq (compare,$(MAKECMDGOALS))
|
|
COMPARE := 1
|
|
endif
|
|
|
|
# don't use dkP's base_tools anymore
|
|
# because the redefinition of $(CC) conflicts
|
|
# with when we want to use $(CC) to preprocess files
|
|
# thus, manually create the variables for the bin
|
|
# files, or use arm-none-eabi binaries on the system
|
|
# if dkP is not installed on this system
|
|
|
|
ifneq (,$(TOOLCHAIN))
|
|
ifneq ($(wildcard $(TOOLCHAIN)/bin),)
|
|
export PATH := $(TOOLCHAIN)/bin:$(PATH)
|
|
endif
|
|
endif
|
|
|
|
PREFIX := arm-none-eabi-
|
|
OBJCOPY := $(PREFIX)objcopy
|
|
OBJDUMP := $(PREFIX)objdump
|
|
AS := $(PREFIX)as
|
|
|
|
LD := $(PREFIX)ld
|
|
|
|
# note: the makefile must be set up so MODERNCC is never called
|
|
# if MODERN=0
|
|
MODERNCC := $(PREFIX)gcc
|
|
PATH_MODERNCC := PATH="$(PATH)" $(MODERNCC)
|
|
|
|
ifeq ($(OS),Windows_NT)
|
|
EXE := .exe
|
|
else
|
|
EXE :=
|
|
endif
|
|
|
|
TITLE := POKEMON EMER
|
|
GAME_CODE := BPEE
|
|
MAKER_CODE := 01
|
|
REVISION := 0
|
|
MODERN ?= 1
|
|
TEST ?= 0
|
|
ANALYZE ?= 0
|
|
UNUSED_ERROR ?= 0
|
|
|
|
ifeq (agbcc,$(MAKECMDGOALS))
|
|
MODERN := 0
|
|
endif
|
|
|
|
ifeq (check,$(MAKECMDGOALS))
|
|
TEST := 1
|
|
endif
|
|
|
|
# use arm-none-eabi-cpp for macOS
|
|
# as macOS's default compiler is clang
|
|
# and clang's preprocessor will warn on \u
|
|
# when preprocessing asm files, expecting a unicode literal
|
|
# we can't unconditionally use arm-none-eabi-cpp
|
|
# as installations which install binutils-arm-none-eabi
|
|
# don't come with it
|
|
ifneq ($(MODERN),1)
|
|
ifeq ($(shell uname -s),Darwin)
|
|
CPP := $(PREFIX)cpp
|
|
else
|
|
CPP := $(CC) -E
|
|
endif
|
|
else
|
|
CPP := $(PREFIX)cpp
|
|
endif
|
|
|
|
ROM_NAME := pokeemerald_agbcc.gba
|
|
ELF_NAME := $(ROM_NAME:.gba=.elf)
|
|
MAP_NAME := $(ROM_NAME:.gba=.map)
|
|
OBJ_DIR_NAME := build/emerald
|
|
|
|
MODERN_ROM_NAME := pokeemerald.gba
|
|
MODERN_ELF_NAME := $(MODERN_ROM_NAME:.gba=.elf)
|
|
MODERN_MAP_NAME := $(MODERN_ROM_NAME:.gba=.map)
|
|
MODERN_OBJ_DIR_NAME := build/modern
|
|
|
|
SHELL := /bin/bash -o pipefail
|
|
|
|
ELF = $(ROM:.gba=.elf)
|
|
MAP = $(ROM:.gba=.map)
|
|
SYM = $(ROM:.gba=.sym)
|
|
|
|
TEST_OBJ_DIR_NAME_MODERN := build/modern-test
|
|
TEST_OBJ_DIR_NAME_AGBCC := build/test
|
|
|
|
ifeq ($(MODERN),0)
|
|
TEST_OBJ_DIR_NAME := $(TEST_OBJ_DIR_NAME_AGBCC)
|
|
else
|
|
TEST_OBJ_DIR_NAME := $(TEST_OBJ_DIR_NAME_MODERN)
|
|
endif
|
|
TESTELF = $(ROM:.gba=-test.elf)
|
|
HEADLESSELF = $(ROM:.gba=-test-headless.elf)
|
|
|
|
C_SUBDIR = src
|
|
GFLIB_SUBDIR = gflib
|
|
ASM_SUBDIR = asm
|
|
DATA_SRC_SUBDIR = src/data
|
|
DATA_ASM_SUBDIR = data
|
|
SONG_SUBDIR = sound/songs
|
|
MID_SUBDIR = sound/songs/midi
|
|
SAMPLE_SUBDIR = sound/direct_sound_samples
|
|
CRY_SUBDIR = sound/direct_sound_samples/cries
|
|
TEST_SUBDIR = test
|
|
|
|
C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR)
|
|
GFLIB_BUILDDIR = $(OBJ_DIR)/$(GFLIB_SUBDIR)
|
|
ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR)
|
|
DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR)
|
|
SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR)
|
|
MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR)
|
|
TEST_BUILDDIR = $(OBJ_DIR)/$(TEST_SUBDIR)
|
|
|
|
ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN)
|
|
|
|
ifeq ($(MODERN),0)
|
|
CC1 := tools/agbcc/bin/agbcc$(EXE)
|
|
override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -g
|
|
ROM := $(ROM_NAME)
|
|
OBJ_DIR := $(OBJ_DIR_NAME)
|
|
LIBPATH := -L ../../tools/agbcc/lib
|
|
LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall
|
|
else
|
|
CC1 = $(shell $(PATH_MODERNCC) --print-prog-name=cc1) -quiet
|
|
override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
|
ifeq ($(ANALYZE),1)
|
|
override CFLAGS += -fanalyzer
|
|
endif
|
|
# Only throw an error for unused elements if its RH-Hideout's repo
|
|
ifeq ($(UNUSED_ERROR),0)
|
|
ifneq ($(GITHUB_REPOSITORY_OWNER),rh-hideout)
|
|
override CFLAGS += -Wno-error=unused-variable -Wno-error=unused-const-variable -Wno-error=unused-parameter -Wno-error=unused-function -Wno-error=unused-but-set-parameter -Wno-error=unused-but-set-variable -Wno-error=unused-value -Wno-error=unused-local-typedefs
|
|
endif
|
|
endif
|
|
ROM := $(MODERN_ROM_NAME)
|
|
OBJ_DIR := $(MODERN_OBJ_DIR_NAME)
|
|
LIBPATH := -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libc.a))"
|
|
LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall
|
|
endif
|
|
|
|
ifeq ($(TESTELF),$(MAKECMDGOALS))
|
|
TEST := 1
|
|
endif
|
|
|
|
ifeq ($(TEST),1)
|
|
OBJ_DIR := $(TEST_OBJ_DIR_NAME)
|
|
endif
|
|
|
|
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=$(MODERN) -DTESTING=$(TEST)
|
|
ifneq ($(MODERN),1)
|
|
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
|
|
endif
|
|
|
|
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
|
|
GFX := tools/gbagfx/gbagfx$(EXE)
|
|
AIF := tools/aif2pcm/aif2pcm$(EXE)
|
|
MID := tools/mid2agb/mid2agb$(EXE)
|
|
SCANINC := tools/scaninc/scaninc$(EXE)
|
|
PREPROC := tools/preproc/preproc$(EXE)
|
|
RAMSCRGEN := tools/ramscrgen/ramscrgen$(EXE)
|
|
FIX := tools/gbafix/gbafix$(EXE)
|
|
MAPJSON := tools/mapjson/mapjson$(EXE)
|
|
JSONPROC := tools/jsonproc/jsonproc$(EXE)
|
|
PATCHELF := tools/patchelf/patchelf$(EXE)
|
|
ROMTEST ?= $(shell { command -v mgba-rom-test || command -v tools/mgba/mgba-rom-test$(EXE); } 2>/dev/null)
|
|
ROMTESTHYDRA := tools/mgba-rom-test-hydra/mgba-rom-test-hydra$(EXE)
|
|
TRAINERPROC := tools/trainerproc/trainerproc$(EXE)
|
|
|
|
PERL := perl
|
|
|
|
# Inclusive list. If you don't want a tool to be built, don't add it here.
|
|
TOOLDIRS := tools/aif2pcm tools/bin2c tools/gbafix tools/gbagfx tools/jsonproc tools/mapjson tools/mid2agb tools/preproc tools/ramscrgen tools/rsfont tools/scaninc tools/trainerproc
|
|
CHECKTOOLDIRS = tools/patchelf tools/mgba-rom-test-hydra
|
|
TOOLBASE = $(TOOLDIRS:tools/%=%)
|
|
TOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE))
|
|
|
|
MAKEFLAGS += --no-print-directory
|
|
|
|
# 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:
|
|
|
|
.PHONY: all rom clean compare tidy tools check-tools mostlyclean clean-tools clean-check-tools $(TOOLDIRS) $(CHECKTOOLDIRS) libagbsyscall agbcc modern tidymodern tidynonmodern check history
|
|
|
|
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
|
|
# Use a separate minimal makefile for speed
|
|
# Since we don't need to reload most of this makefile
|
|
ifeq (,$(filter-out all rom compare agbcc modern check libagbsyscall syms $(TESTELF),$(MAKECMDGOALS)))
|
|
$(call infoshell, $(MAKE) -f make_tools.mk)
|
|
else
|
|
NODEP ?= 1
|
|
endif
|
|
|
|
# check if we need to scan dependencies based on the rule
|
|
ifeq (,$(MAKECMDGOALS))
|
|
SCAN_DEPS ?= 1
|
|
else
|
|
# clean, tidy, tools, check-tools, mostlyclean, clean-tools, clean-check-tools, $(TOOLDIRS), $(CHECKTOOLDIRS), tidymodern, tidynonmodern, tidycheck don't even build the ROM
|
|
# libagbsyscall does its own thing
|
|
ifeq (,$(filter-out clean tidy tools mostlyclean clean-tools $(TOOLDIRS) clean-check-tools $(CHECKTOOLDIRS) tidymodern tidynonmodern tidycheck libagbsyscall,$(MAKECMDGOALS)))
|
|
SCAN_DEPS ?= 0
|
|
else
|
|
SCAN_DEPS ?= 1
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(SCAN_DEPS),1)
|
|
C_SRCS_IN := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
|
|
C_SRCS := $(foreach src,$(C_SRCS_IN),$(if $(findstring .inc.c,$(src)),,$(src)))
|
|
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
|
|
|
|
TEST_SRCS_IN := $(wildcard $(TEST_SUBDIR)/*.c $(TEST_SUBDIR)/*/*.c $(TEST_SUBDIR)/*/*/*.c)
|
|
TEST_SRCS := $(foreach src,$(TEST_SRCS_IN),$(if $(findstring .inc.c,$(src)),,$(src)))
|
|
TEST_OBJS := $(patsubst $(TEST_SUBDIR)/%.c,$(TEST_BUILDDIR)/%.o,$(TEST_SRCS))
|
|
TEST_OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(TEST_OBJS))
|
|
|
|
GFLIB_SRCS := $(wildcard $(GFLIB_SUBDIR)/*.c)
|
|
GFLIB_OBJS := $(patsubst $(GFLIB_SUBDIR)/%.c,$(GFLIB_BUILDDIR)/%.o,$(GFLIB_SRCS))
|
|
|
|
C_ASM_SRCS += $(wildcard $(C_SUBDIR)/*.s $(C_SUBDIR)/*/*.s $(C_SUBDIR)/*/*/*.s)
|
|
C_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS))
|
|
|
|
ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
|
|
ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
|
|
|
|
# get all the data/*.s files EXCEPT the ones with specific rules
|
|
REGULAR_DATA_ASM_SRCS := $(filter-out $(DATA_ASM_SUBDIR)/maps.s $(DATA_ASM_SUBDIR)/map_events.s, $(wildcard $(DATA_ASM_SUBDIR)/*.s))
|
|
|
|
DATA_ASM_SRCS := $(wildcard $(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))
|
|
|
|
OBJS := $(C_OBJS) $(GFLIB_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
|
|
OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
|
|
|
|
SUBDIRS := $(sort $(dir $(OBJS) $(dir $(TEST_OBJS))))
|
|
$(shell mkdir -p $(SUBDIRS))
|
|
endif
|
|
|
|
AUTO_GEN_TARGETS :=
|
|
|
|
all: history rom
|
|
|
|
history:
|
|
@bash ./check_history.sh
|
|
|
|
tools: $(TOOLDIRS)
|
|
|
|
check-tools: $(CHECKTOOLDIRS)
|
|
|
|
syms: $(SYM)
|
|
|
|
$(TOOLDIRS):
|
|
@$(MAKE) -C $@
|
|
|
|
$(CHECKTOOLDIRS):
|
|
@$(MAKE) -C $@
|
|
|
|
rom: $(ROM)
|
|
ifeq ($(COMPARE),1)
|
|
@$(SHA1) rom.sha1
|
|
endif
|
|
|
|
# For contributors to make sure a change didn't affect the contents of the ROM.
|
|
compare: all
|
|
|
|
clean: mostlyclean clean-tools clean-check-tools
|
|
|
|
clean-tools:
|
|
@$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);)
|
|
|
|
clean-check-tools:
|
|
@$(foreach tooldir,$(CHECKTOOLDIRS),$(MAKE) clean -C $(tooldir);)
|
|
|
|
mostlyclean: tidynonmodern tidymodern tidycheck
|
|
find sound -iname '*.bin' -exec rm {} +
|
|
rm -f $(MID_SUBDIR)/*.s
|
|
find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} +
|
|
rm -f $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc
|
|
rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc $(DATA_SRC_SUBDIR)/map_group_count.h
|
|
find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} +
|
|
rm -f $(AUTO_GEN_TARGETS)
|
|
@$(MAKE) clean -C libagbsyscall
|
|
|
|
tidy: tidynonmodern tidymodern tidycheck
|
|
|
|
tidynonmodern:
|
|
rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME)
|
|
rm -rf $(OBJ_DIR_NAME)
|
|
|
|
tidymodern:
|
|
rm -f $(MODERN_ROM_NAME) $(MODERN_ELF_NAME) $(MODERN_MAP_NAME)
|
|
rm -rf $(MODERN_OBJ_DIR_NAME)
|
|
|
|
tidycheck:
|
|
rm -f $(TESTELF) $(HEADLESSELF)
|
|
rm -rf $(TEST_OBJ_DIR_NAME_MODERN)
|
|
rm -rf $(TEST_OBJ_DIR_NAME_AGBCC)
|
|
|
|
|
|
ifneq ($(MODERN),0)
|
|
$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member
|
|
endif
|
|
|
|
include graphics_file_rules.mk
|
|
include map_data_rules.mk
|
|
include spritesheet_rules.mk
|
|
include json_data_rules.mk
|
|
include songs.mk
|
|
|
|
%.s: ;
|
|
%.png: ;
|
|
%.pal: ;
|
|
%.aif: ;
|
|
|
|
%.1bpp: %.png ; $(GFX) $< $@
|
|
%.4bpp: %.png ; $(GFX) $< $@
|
|
%.8bpp: %.png ; $(GFX) $< $@
|
|
%.gbapal: %.pal ; $(GFX) $< $@
|
|
%.gbapal: %.png ; $(GFX) $< $@
|
|
%.lz: % ; $(GFX) $< $@
|
|
%.rl: % ; $(GFX) $< $@
|
|
|
|
$(CRY_SUBDIR)/uncomp_%.bin: $(CRY_SUBDIR)/uncomp_%.aif ; $(AIF) $< $@
|
|
$(CRY_SUBDIR)/%.bin: $(CRY_SUBDIR)/%.aif ; $(AIF) $< $@ --compress
|
|
sound/%.bin: sound/%.aif ; $(AIF) $< $@
|
|
|
|
COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/global.h | tail -n1)
|
|
ifeq ($(COMPETITIVE_PARTY_SYNTAX),1)
|
|
%.h: %.party tools ; $(CPP) $(CPPFLAGS) - < $< | sed '/#[^p]/d' | $(TRAINERPROC) -o $@ -i $< -
|
|
endif
|
|
|
|
ifeq ($(MODERN),0)
|
|
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
|
|
$(C_BUILDDIR)/libc.o: CFLAGS := -O2
|
|
|
|
$(C_BUILDDIR)/siirtc.o: CFLAGS := -mthumb-interwork
|
|
|
|
$(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork
|
|
$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork
|
|
$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork
|
|
|
|
$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
|
|
|
|
$(C_BUILDDIR)/record_mixing.o: CFLAGS += -ffreestanding
|
|
$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE)
|
|
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet
|
|
else
|
|
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
|
|
$(C_BUILDDIR)/pokedex_plus_hgss.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init
|
|
# Annoyingly we can't turn this on just for src/data/trainers.h
|
|
$(C_BUILDDIR)/data.o: CFLAGS += -fno-show-column -fno-diagnostics-show-caret
|
|
endif
|
|
|
|
ifeq ($(DINFO),1)
|
|
override CFLAGS += -g
|
|
endif
|
|
|
|
# The dep rules have to be explicit or else missing files won't be reported.
|
|
# As a side effect, they're evaluated immediately instead of when the rule is invoked.
|
|
# It doesn't look like $(shell) can be deferred so there might not be a better way.
|
|
|
|
ifeq ($(SCAN_DEPS),1)
|
|
ifeq ($(NODEP),1)
|
|
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c
|
|
ifeq (,$(KEEP_TEMPS))
|
|
@echo "$(CC1) <flags> -o $@ $<"
|
|
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
|
|
else
|
|
@$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
|
|
@$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
|
|
@echo -e ".text\n\t.align\t2, 0\n" >> $(C_BUILDDIR)/$*.s
|
|
$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
|
|
endif
|
|
else
|
|
define C_DEP
|
|
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
|
ifeq (,$$(KEEP_TEMPS))
|
|
@echo "$$(CC1) <flags> -o $$@ $$<"
|
|
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
|
else
|
|
@$$(CPP) $$(CPPFLAGS) $$< -o $$(C_BUILDDIR)/$3.i
|
|
@$$(PREPROC) $$(C_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(C_BUILDDIR)/$3.s
|
|
@echo -e ".text\n\t.align\t2, 0\n" >> $$(C_BUILDDIR)/$3.s
|
|
$$(AS) $$(ASFLAGS) -o $$@ $$(C_BUILDDIR)/$3.s
|
|
endif
|
|
endef
|
|
$(foreach src, $(C_SRCS), $(eval $(call C_DEP,$(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(src)),$(src),$(patsubst $(C_SUBDIR)/%.c,%,$(src)))))
|
|
endif
|
|
|
|
ifeq ($(NODEP),1)
|
|
$(GFLIB_BUILDDIR)/%.o: $(GFLIB_SUBDIR)/%.c $$(c_dep)
|
|
ifeq (,$(KEEP_TEMPS))
|
|
@echo "$(CC1) <flags> -o $@ $<"
|
|
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
|
|
else
|
|
@$(CPP) $(CPPFLAGS) $< -o $(GFLIB_BUILDDIR)/$*.i
|
|
@$(PREPROC) $(GFLIB_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(GFLIB_BUILDDIR)/$*.s
|
|
@echo -e ".text\n\t.align\t2, 0\n" >> $(GFLIB_BUILDDIR)/$*.s
|
|
$(AS) $(ASFLAGS) -o $@ $(GFLIB_BUILDDIR)/$*.s
|
|
endif
|
|
else
|
|
define GFLIB_DEP
|
|
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
|
ifeq (,$$(KEEP_TEMPS))
|
|
@echo "$$(CC1) <flags> -o $$@ $$<"
|
|
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
|
else
|
|
@$$(CPP) $$(CPPFLAGS) $$< -o $$(GFLIB_BUILDDIR)/$3.i
|
|
@$$(PREPROC) $$(GFLIB_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(GFLIB_BUILDDIR)/$3.s
|
|
@echo -e ".text\n\t.align\t2, 0\n" >> $$(GFLIB_BUILDDIR)/$3.s
|
|
$$(AS) $$(ASFLAGS) -o $$@ $$(GFLIB_BUILDDIR)/$3.s
|
|
endif
|
|
endef
|
|
$(foreach src, $(GFLIB_SRCS), $(eval $(call GFLIB_DEP,$(patsubst $(GFLIB_SUBDIR)/%.c,$(GFLIB_BUILDDIR)/%.o, $(src)),$(src),$(patsubst $(GFLIB_SUBDIR)/%.c,%, $(src)))))
|
|
endif
|
|
|
|
ifeq ($(NODEP),1)
|
|
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s
|
|
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
|
|
else
|
|
define SRC_ASM_DATA_DEP
|
|
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
|
|
$$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@
|
|
endef
|
|
$(foreach src, $(C_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src))))
|
|
endif
|
|
|
|
ifeq ($(NODEP),1)
|
|
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s
|
|
$(AS) $(ASFLAGS) -o $@ $<
|
|
else
|
|
define ASM_DEP
|
|
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
|
|
$$(AS) $$(ASFLAGS) -o $$@ $$<
|
|
endef
|
|
$(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o, $(src)),$(src))))
|
|
endif
|
|
|
|
ifeq ($(NODEP),1)
|
|
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
|
|
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
|
|
else
|
|
$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
|
|
endif
|
|
endif
|
|
|
|
$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
|
|
$(AS) $(ASFLAGS) -I sound -o $@ $<
|
|
|
|
$(OBJ_DIR)/sym_bss.ld: sym_bss.txt
|
|
$(RAMSCRGEN) .bss $< ENGLISH > $@
|
|
|
|
$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt)
|
|
$(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms > $@
|
|
|
|
$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt
|
|
$(RAMSCRGEN) ewram_data $< ENGLISH > $@
|
|
|
|
# NOTE: Depending on event_scripts.o is hacky, but we want to depend on everything event_scripts.s depends on without having to alter scaninc
|
|
$(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(DATA_ASM_BUILDDIR)/event_scripts.o
|
|
python3 tools/learnset_helpers/teachable.py
|
|
|
|
# NOTE: Based on C_DEP above, but without NODEP and KEEP_TEMPS handling.
|
|
define TEST_DEP
|
|
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
|
|
@echo "$$(CC1) <flags> -o $$@ $$<"
|
|
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
|
|
endef
|
|
$(foreach src, $(TEST_SRCS), $(eval $(call TEST_DEP,$(patsubst $(TEST_SUBDIR)/%.c,$(TEST_BUILDDIR)/%.o,$(src)),$(src),$(patsubst $(TEST_SUBDIR)/%.c,%,$(src)))))
|
|
|
|
ifeq ($(MODERN),0)
|
|
LD_SCRIPT := ld_script.ld
|
|
LD_SCRIPT_DEPS := $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld
|
|
else
|
|
LD_SCRIPT := ld_script_modern.ld
|
|
LD_SCRIPT_DEPS :=
|
|
endif
|
|
|
|
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
|
|
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
|
|
|
|
LDFLAGS = -Map ../../$(MAP)
|
|
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall
|
|
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ <objects> <lib>"
|
|
@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat
|
|
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent
|
|
|
|
$(ROM): $(ELF)
|
|
$(OBJCOPY) -O binary $< $@
|
|
$(FIX) $@ -p --silent
|
|
|
|
agbcc: all
|
|
|
|
modern: all
|
|
|
|
LD_SCRIPT_TEST := ld_script_test.ld
|
|
|
|
$(OBJ_DIR)/ld_script_test.ld: $(LD_SCRIPT_TEST) $(LD_SCRIPT_DEPS)
|
|
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT_TEST) > ld_script_test.ld
|
|
|
|
$(TESTELF): $(OBJ_DIR)/ld_script_test.ld $(OBJS) $(TEST_OBJS) libagbsyscall tools check-tools
|
|
@echo "cd $(OBJ_DIR) && $(LD) -T ld_script_test.ld -o ../../$@ <objects> <test-objects> <lib>"
|
|
@cd $(OBJ_DIR) && $(LD) $(TESTLDFLAGS) -T ld_script_test.ld -o ../../$@ $(OBJS_REL) $(TEST_OBJS_REL) $(LIB)
|
|
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) -d0 --silent
|
|
$(PATCHELF) $(TESTELF) gTestRunnerArgv "$(TESTS)\0"
|
|
|
|
ifeq ($(GITHUB_REPOSITORY_OWNER),rh-hideout)
|
|
TEST_SKIP_IS_FAIL := \x01
|
|
else
|
|
TEST_SKIP_IS_FAIL := \x00
|
|
endif
|
|
|
|
check: $(TESTELF)
|
|
@cp $< $(HEADLESSELF)
|
|
$(PATCHELF) $(HEADLESSELF) gTestRunnerHeadless '\x01' gTestRunnerSkipIsFail "$(TEST_SKIP_IS_FAIL)"
|
|
$(ROMTESTHYDRA) $(ROMTEST) $(OBJCOPY) $(HEADLESSELF)
|
|
|
|
libagbsyscall:
|
|
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
|
|
|
|
###################
|
|
### Symbol file ###
|
|
###################
|
|
|
|
$(SYM): $(ELF)
|
|
$(OBJDUMP) -t $< | sort -u | grep -E "^0[2389]" | $(PERL) -p -e 's/^(\w{8}) (\w).{6} \S+\t(\w{8}) (\S+)$$/\1 \2 \3 \4/g' > $@
|