# SPDX-License-Identifier: CC0-1.0 # # SPDX-FileContributor: Antonio Niño Díaz, 2023 BLOCKSDS ?= /opt/blocksds/core BLOCKSDSEXT ?= /opt/blocksds/external WONDERFUL_TOOLCHAIN ?= /opt/wonderful ARM_NONE_EABI_PATH ?= $(WONDERFUL_TOOLCHAIN)/toolchain/gcc-arm-none-eabi/bin/ # Source code paths # ----------------- SOURCEDIRS := source INCLUDEDIRS := include source/libdsf GFXDIRS := BINDIRS := # Defines passed to all files # --------------------------- ifeq ($(NE_DEBUG),1) DEFINES := -DNE_DEBUG -DNE_BLOCKSDS else DEFINES := -DNE_BLOCKSDS endif # Libraries # --------- LIBDIRS := $(BLOCKSDS)/libs/libnds # Build artifacts # --------------- ifeq ($(NE_DEBUG),1) NAME := NE_debug BUILDDIR := build_debug else NAME := NE BUILDDIR := build_release endif INSTALLNAME := nitro-engine ARCHIVE := lib/lib$(NAME).a # Tools # ----- PREFIX := $(ARM_NONE_EABI_PATH)arm-none-eabi- CC := $(PREFIX)gcc CXX := $(PREFIX)g++ AR := $(PREFIX)ar MKDIR := mkdir RM := rm -rf CP := cp INSTALL := install # Verbose flag # ------------ ifeq ($(VERBOSE),1) V := else V := @ endif # Source files # ------------ ifneq ($(BINDIRS),) SOURCES_BIN := $(shell find -L $(BINDIRS) -name "*.bin") INCLUDEDIRS += $(addprefix $(BUILDDIR)/,$(BINDIRS)) endif ifneq ($(GFXDIRS),) SOURCES_PNG := $(shell find -L $(GFXDIRS) -name "*.png") INCLUDEDIRS += $(addprefix $(BUILDDIR)/,$(GFXDIRS)) endif SOURCES_S := $(shell find -L $(SOURCEDIRS) -name "*.s") SOURCES_C := $(shell find -L $(SOURCEDIRS) -name "*.c") SOURCES_CPP := $(shell find -L $(SOURCEDIRS) -name "*.cpp") # Compiler and linker flags # ------------------------- DEFINES += -D__NDS__ -DARM9 ARCH := -march=armv5te -mtune=arm946e-s WARNFLAGS := -Wall -Wno-address-of-packed-member INCLUDEFLAGS := $(foreach path,$(INCLUDEDIRS),-I$(path)) \ $(foreach path,$(LIBDIRS),-I$(path)/include) ASFLAGS += -g -x assembler-with-cpp $(DEFINES) $(ARCH) \ -mthumb -mthumb-interwork $(INCLUDEFLAGS) \ -ffunction-sections -fdata-sections CFLAGS += -g -std=gnu11 $(WARNFLAGS) $(DEFINES) $(ARCH) \ -mthumb -mthumb-interwork $(INCLUDEFLAGS) -O2 \ -ffunction-sections -fdata-sections \ -fomit-frame-pointer CXXFLAGS += -g -std=gnu++14 $(WARNFLAGS) $(DEFINES) $(ARCH) \ -mthumb -mthumb-interwork $(INCLUDEFLAGS) -O2 \ -ffunction-sections -fdata-sections \ -fno-exceptions -fno-rtti \ -fomit-frame-pointer # Intermediate build files # ------------------------ OBJS_ASSETS := $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN))) \ $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_PNG))) HEADERS_ASSETS := $(patsubst %.bin,%_bin.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN))) \ $(patsubst %.png,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_PNG))) OBJS_SOURCES := $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_S))) \ $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_C))) \ $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_CPP))) OBJS := $(OBJS_ASSETS) $(OBJS_SOURCES) DEPS := $(OBJS:.o=.d) # Targets # ------- .PHONY: all clean install all: $(ARCHIVE) $(ARCHIVE): $(OBJS) @echo " AR $@" @$(MKDIR) -p $(@D) $(V)$(AR) rcs $@ $(OBJS) install: all @echo " INSTALL $(BLOCKSDSEXT)/$(INSTALLNAME)/" $(V)$(RM) $(BLOCKSDSEXT)/$(INSTALLNAME)/ $(V)$(INSTALL) -d $(BLOCKSDSEXT)/$(INSTALLNAME)/ \ $(BLOCKSDSEXT)/$(INSTALLNAME)/tools/img2ds \ $(BLOCKSDSEXT)/$(INSTALLNAME)/tools/md5_to_dsma \ $(BLOCKSDSEXT)/$(INSTALLNAME)/tools/obj2dl $(V)$(CP) -r include lib $(BLOCKSDSEXT)/$(INSTALLNAME)/ $(V)$(CP) -r tools/img2ds/*.py $(BLOCKSDSEXT)/$(INSTALLNAME)/tools/img2ds $(V)$(CP) -r tools/md5_to_dsma/*.py $(BLOCKSDSEXT)/$(INSTALLNAME)/tools/md5_to_dsma $(V)$(CP) -r tools/obj2dl/*.py $(BLOCKSDSEXT)/$(INSTALLNAME)/tools/obj2dl $(V)$(CP) -r licenses $(BLOCKSDSEXT)/$(INSTALLNAME)/ clean: @echo " CLEAN" $(V)$(RM) $(ARCHIVE) build_debug build_release # Rules # ----- $(BUILDDIR)/%.s.o : %.s @echo " AS $<" @$(MKDIR) -p $(@D) $(V)$(CC) $(ASFLAGS) -MMD -MP -c -o $@ $< $(BUILDDIR)/%.c.o : %.c @echo " CC $<" @$(MKDIR) -p $(@D) $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $@ $< $(BUILDDIR)/%.arm.c.o : %.arm.c @echo " CC $<" @$(MKDIR) -p $(@D) $(V)$(CC) $(CFLAGS) -MMD -MP -marm -mlong-calls -c -o $@ $< $(BUILDDIR)/%.cpp.o : %.cpp @echo " CXX $<" @$(MKDIR) -p $(@D) $(V)$(CXX) $(CXXFLAGS) -MMD -MP -c -o $@ $< $(BUILDDIR)/%.arm.cpp.o : %.arm.cpp @echo " CXX $<" @$(MKDIR) -p $(@D) $(V)$(CXX) $(CXXFLAGS) -MMD -MP -marm -mlong-calls -c -o $@ $< $(BUILDDIR)/%.bin.o $(BUILDDIR)/%_bin.h : %.bin @echo " BIN2C $<" @$(MKDIR) -p $(@D) $(V)$(BLOCKSDS)/tools/bin2c/bin2c $< $(@D) $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.bin.o $(BUILDDIR)/$*_bin.c $(BUILDDIR)/%.png.o $(BUILDDIR)/%.h : %.png %.grit @echo " GRIT $<" @$(MKDIR) -p $(@D) $(V)$(BLOCKSDS)/tools/grit/grit $< -ftc -W1 -o$(BUILDDIR)/$* $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.png.o $(BUILDDIR)/$*.c $(V)touch $(BUILDDIR)/$*.png.o $(BUILDDIR)/$*.h # All assets must be built before the source code # ----------------------------------------------- $(SOURCES_S) $(SOURCES_C) $(SOURCES_CPP): $(HEADERS_ASSETS) # Include dependency files if they exist # -------------------------------------- -include $(DEPS)