# SPDX-License-Identifier: CC0-1.0 # # SPDX-FileContributor: Antonio Niño Díaz, 2022 # User config # =========== # ROM config # ---------- NAME := vi GAME_TITLE := "VIOLET'S CV" GAME_CODE := "00" # Defines passed to all files # --------------------------- DEFINES := # Libraries # --------- LIBS := -lc LIBDIRS := # A list of paths # Include paths # ------------- INCLUDES := # A list of paths # Tools # ----- PREFIX := arm-none-eabi- CC := $(PREFIX)gcc CXX := $(PREFIX)g++ OBJDUMP := $(PREFIX)objdump OBJCOPY := $(PREFIX)objcopy MKDIR := mkdir RM := rm -rf # Verbose flag # ------------ # `make V=` builds the binary in verbose build mode V := @ # Directories # ----------- SOURCEDIR := source BUILDDIR := build # Build artfacts # -------------- ELF := $(NAME).elf DUMP := $(NAME).dump ROM := $(NAME).gba MAP := $(NAME).map GBAFIX := gbafix/gbafix # Source files # ------------ SOURCES_S := $(wildcard $(SOURCEDIR)/*.s $(SOURCEDIR)/**/*.s) SOURCES_C := $(wildcard $(SOURCEDIR)/*.c $(SOURCEDIR)/**/*.c) SOURCES_CPP := $(wildcard $(SOURCEDIR)/*.cpp $(SOURCEDIR)/**/*.cpp) # Compiler and linker flags # ------------------------- DEFINES += -D__GBA__ ARCH := -mcpu=arm7tdmi -mtune=arm7tdmi WARNFLAGS := -Wall INCLUDEFLAGS := $(foreach path,$(INCLUDES),-I$(path)) \ $(foreach path,$(LIBDIRS),-I$(path)/include) LIBDIRSFLAGS := $(foreach path,$(LIBDIRS),-L$(path)/lib) ASFLAGS += -x assembler-with-cpp $(DEFINES) $(ARCH) \ -mthumb -mthumb-interwork $(INCLUDEFLAGS) \ -ffunction-sections -fdata-sections -lm CFLAGS += -std=gnu11 $(WARNFLAGS) $(DEFINES) $(ARCH) \ -mthumb -mthumb-interwork $(INCLUDEFLAGS) -O2 \ -ffunction-sections -fdata-sections -lm -g CXXFLAGS += -std=gnu++14 $(WARNFLAGS) $(DEFINES) $(ARCH) \ -mthumb -mthumb-interwork $(INCLUDEFLAGS) -O2 \ -ffunction-sections -fdata-sections \ -fno-exceptions -fno-rtti LDFLAGS := -mthumb -mthumb-interwork $(LIBDIRSFLAGS) \ -Wl,-Map,$(MAP) -Wl,--gc-sections \ -specs=nano.specs -T source/sys/gba_cart.ld \ -Wl,--start-group $(LIBS) -Wl,--end-group -lm # Intermediate build files # ------------------------ OBJS := \ $(patsubst $(SOURCEDIR)/%.s,$(BUILDDIR)/%.s.o,$(SOURCES_S)) \ $(patsubst $(SOURCEDIR)/%.c,$(BUILDDIR)/%.c.o,$(SOURCES_C)) \ $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.cpp.o,$(SOURCES_CPP)) DEPS := $(OBJS:.o=.d) # Rules # ----- $(BUILDDIR)/%.s.o : $(SOURCEDIR)/%.s @echo " AS $<" @$(MKDIR) -p $(@D) # Build target's directory if it doesn't exist $(V)$(CC) $(ASFLAGS) -MMD -MP -c -o $@ $< $(BUILDDIR)/%.c.o : $(SOURCEDIR)/%.c @echo " CC $<" @$(MKDIR) -p $(@D) # Build target's directory if it doesn't exist $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $@ $< $(BUILDDIR)/%.cpp.o : $(SOURCEDIR)/%.cpp @echo " CXX $<" @$(MKDIR) -p $(@D) # Build target's directory if it doesn't exist $(V)$(CXX) $(CXXFLAGS) -MMD -MP -c -o $@ $< # Targets # ------- .PHONY: all clean dump all: $(ROM) $(GBAFIX): $(V)cd gbafix && make $(ELF): $(OBJS) @echo " LD $@" $(V)$(CC) -o $@ $(OBJS) $(LDFLAGS) $(ROM): $(ELF) $(GBAFIX) @echo " OBJCOPY $<" $(V)$(OBJCOPY) -O binary $< $@ @echo " GBAFIX $@" $(V)$(GBAFIX) $@ -t$(GAME_TITLE) -c$(GAME_CODE) $(DUMP): $(ELF) @echo " OBJDUMP $@" $(V)$(OBJDUMP) -h -C -S $< > $@ dump: $(DUMP) clean: @echo " CLEAN" $(V)$(RM) $(ROM) $(ELF) $(DUMP) $(MAP) $(BUILDDIR) $(V)cd gbafix && make clean # Include dependency files if they exist # -------------------------------------- -include $(DEPS)