# SPDX-License-Identifier: CC0-1.0 # # SPDX-FileContributor: Antonio Niño Díaz, 2023 export BLOCKSDS ?= /opt/blocksds/core export BLOCKSDSEXT ?= /opt/blocksds/external NAME := ClassiCube GAME_TITLE := ClassiCube GAME_SUBTITLE := Built with BlocksDS GAME_AUTHOR := UnknownShadow200 GAME_ICON := misc/ds/icon.bmp SOURCEDIRS := src INCLUDEDIRS := DEFINES := -DPLAT_NDS LIBS := -ldswifi9 -lnds9 -lc LIBDIRS := $(BLOCKSDS)/libs/dswifi $(BLOCKSDS)/libs/libnds export WONDERFUL_TOOLCHAIN ?= /opt/wonderful ARM_NONE_EABI_PATH ?= $(WONDERFUL_TOOLCHAIN)/toolchain/gcc-arm-none-eabi/bin/ # DLDI and internal SD slot of DSi # -------------------------------- # Root folder of the SD image SDROOT := sdroot # Name of the generated image it "DSi-1.sd" for no$gba in DSi mode SDIMAGE := image.bin # Build artifacts # --------------- BUILDDIR := build-nds ELF := build-nds/$(NAME).elf DUMP := build-nds/$(NAME).dump MAP := build-nds/$(NAME).map ROM := $(NAME).nds # Tools # ----- PREFIX := $(ARM_NONE_EABI_PATH)arm-none-eabi- CC := $(PREFIX)gcc CXX := $(PREFIX)g++ LD := $(PREFIX)gcc OBJDUMP := $(PREFIX)objdump MKDIR := mkdir RM := rm -rf # Verbose flag # ------------ ifeq ($(VERBOSE),1) V := else V := @ endif # Source files # ------------ SOURCES_S := $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.s)) SOURCES_C := $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.c)) # Compiler and linker flags # ------------------------- ARCH := -mthumb -mcpu=arm946e-s+nofp SPECS := $(BLOCKSDS)/sys/crts/ds_arm9.specs WARNFLAGS := -Wall INCLUDEFLAGS := $(foreach path,$(INCLUDEDIRS),-I$(path)) \ $(foreach path,$(LIBDIRS),-I$(path)/include) LIBDIRSFLAGS := $(foreach path,$(LIBDIRS),-L$(path)/lib) ASFLAGS += -x assembler-with-cpp $(DEFINES) $(INCLUDEFLAGS) \ $(ARCH) -ffunction-sections -fdata-sections \ -specs=$(SPECS) CFLAGS += -std=gnu17 $(WARNFLAGS) $(DEFINES) $(INCLUDEFLAGS) \ $(ARCH) -O2 -ffunction-sections -fdata-sections \ -specs=$(SPECS) LDFLAGS := $(ARCH) $(LIBDIRSFLAGS) -Wl,-Map,$(MAP) $(DEFINES) \ -Wl,--start-group $(LIBS) -Wl,--end-group -specs=$(SPECS) # Intermediate build files # ------------------------ OBJS := $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_S))) \ $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_C))) DEPS := $(OBJS:.o=.d) # Targets # ------- .PHONY: all clean dump dldipatch sdimage all: $(ROM) # Combine the title strings ifeq ($(strip $(GAME_SUBTITLE)),) GAME_FULL_TITLE := $(GAME_TITLE);$(GAME_AUTHOR) else GAME_FULL_TITLE := $(GAME_TITLE);$(GAME_SUBTITLE);$(GAME_AUTHOR) endif $(ROM): $(ELF) @echo " NDSTOOL $@" $(V)$(BLOCKSDS)/tools/ndstool/ndstool -c $@ \ -7 $(BLOCKSDS)/sys/default_arm7/arm7.elf -9 $(ELF) \ -b $(GAME_ICON) "$(GAME_FULL_TITLE)" \ $(NDSTOOL_ARGS) $(ELF): $(OBJS) @echo " LD $@" $(V)$(LD) -o $@ $(OBJS) $(LDFLAGS) $(DUMP): $(ELF) @echo " OBJDUMP $@" $(V)$(OBJDUMP) -h -C -S $< > $@ dump: $(DUMP) clean: @echo " CLEAN" $(V)$(RM) $(ROM) $(DUMP) build $(SDIMAGE) sdimage: @echo " MKFATIMG $(SDIMAGE) $(SDROOT)" $(V)$(BLOCKSDS)/tools/mkfatimg/mkfatimg -t $(SDROOT) $(SDIMAGE) dldipatch: $(ROM) @echo " DLDIPATCH $(ROM)" $(V)$(BLOCKSDS)/tools/dldipatch/dldipatch patch \ $(BLOCKSDS)/sys/dldi_r4/r4tf.dldi $(ROM) # 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 $@ $< # Include dependency files if they exist # -------------------------------------- -include $(DEPS)