cube/Makefile
2025-08-21 22:26:26 -04:00

166 lines
3.5 KiB
Makefile

# 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)