mirror of
https://github.com/knightfox75/nds_nflib.git
synced 2025-06-19 01:05:34 -04:00
266 lines
6.7 KiB
Makefile
266 lines
6.7 KiB
Makefile
# SPDX-License-Identifier: CC0-1.0
|
||
#
|
||
# SPDX-FileContributor: Antonio Niño Díaz, 2023
|
||
|
||
BLOCKSDS ?= /opt/blocksds/core
|
||
BLOCKSDSEXT ?= /opt/blocksds/external
|
||
|
||
# User config
|
||
# ===========
|
||
|
||
NAME := $(shell basename $(CURDIR))
|
||
GAME_TITLE := $(shell basename $(CURDIR)).nds
|
||
GAME_SUBTITLE := NightFox’s lib example
|
||
GAME_AUTHOR := github.com/knightfox75/nds_nflib
|
||
GAME_ICON := $(BLOCKSDS)/sys/icon.bmp
|
||
|
||
# Source code paths
|
||
# -----------------
|
||
|
||
SOURCEDIRS ?= source
|
||
NITROFATDIR ?= nitrofiles
|
||
|
||
# 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
|
||
|
||
# Libraries
|
||
# ---------
|
||
|
||
LIBS += -lnflib -ldswifi9 -lnds9 -lc
|
||
LIBDIRS += $(BLOCKSDSEXT)/nflib \
|
||
$(BLOCKSDS)/libs/dswifi \
|
||
$(BLOCKSDS)/libs/libnds
|
||
|
||
# Build artifacts
|
||
# ---------------
|
||
|
||
BUILDDIR := build
|
||
ELF := build/$(NAME).elf
|
||
DUMP := build/$(NAME).dump
|
||
NITROFAT_IMG := build/nitrofat.bin
|
||
MAP := build/$(NAME).map
|
||
SOUNDBANKDIR := $(BUILDDIR)/maxmod
|
||
ROM := $(NAME).nds
|
||
|
||
# Tools
|
||
# -----
|
||
|
||
PREFIX := arm-none-eabi-
|
||
CC := $(PREFIX)gcc
|
||
CXX := $(PREFIX)g++
|
||
OBJDUMP := $(PREFIX)objdump
|
||
MKDIR := mkdir
|
||
RM := rm -rf
|
||
|
||
# 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
|
||
ifneq ($(AUDIODIRS),)
|
||
SOURCES_AUDIO := $(shell find -L $(AUDIODIRS) -regex '.*\.\(it\|mod\|s3m\|wav\|xm\)')
|
||
ifneq ($(SOURCES_AUDIO),)
|
||
INCLUDEDIRS += $(SOUNDBANKDIR)
|
||
endif
|
||
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
|
||
|
||
ifeq ($(SOURCES_CPP),)
|
||
LD := $(CC)
|
||
else
|
||
LD := $(CXX)
|
||
endif
|
||
|
||
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) $(ARCH) \
|
||
-mthumb -mthumb-interwork $(INCLUDEFLAGS) \
|
||
-ffunction-sections -fdata-sections
|
||
|
||
CFLAGS += -std=gnu11 $(WARNFLAGS) $(DEFINES) $(ARCH) \
|
||
-mthumb -mthumb-interwork $(INCLUDEFLAGS) -O2 \
|
||
-ffunction-sections -fdata-sections \
|
||
-fomit-frame-pointer
|
||
|
||
CXXFLAGS += -std=gnu++14 $(WARNFLAGS) $(DEFINES) $(ARCH) \
|
||
-mthumb -mthumb-interwork $(INCLUDEFLAGS) -O2 \
|
||
-ffunction-sections -fdata-sections \
|
||
-fno-exceptions -fno-rtti \
|
||
-fomit-frame-pointer
|
||
|
||
LDFLAGS := -mthumb -mthumb-interwork $(LIBDIRSFLAGS) \
|
||
-Wl,-Map,$(MAP) -Wl,--gc-sections -nostdlib \
|
||
-T$(BLOCKSDS)/sys/crts/ds_arm9.mem \
|
||
-T$(BLOCKSDS)/sys/crts/ds_arm9.ld \
|
||
-Wl,--no-warn-rwx-segments \
|
||
-Wl,--start-group $(LIBS) -lgcc -Wl,--end-group
|
||
|
||
# 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)))
|
||
|
||
ifneq ($(SOURCES_AUDIO),)
|
||
OBJS_ASSETS += $(SOUNDBANKDIR)/soundbank.c.o
|
||
HEADERS_ASSETS += $(SOUNDBANKDIR)/soundbank.h
|
||
endif
|
||
|
||
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 dump dldipatch sdimage
|
||
|
||
all: $(ROM)
|
||
|
||
ifneq ($(strip $(NITROFATDIR)),)
|
||
# Additional arguments for ndstool
|
||
NDSTOOL_FAT := -F $(NITROFAT_IMG)
|
||
|
||
$(NITROFAT_IMG): $(NITROFATDIR)
|
||
@echo " MKFATIMG $@ $(NITROFATDIR)"
|
||
$(V)$(BLOCKSDS)/tools/mkfatimg/mkfatimg $(NITROFATDIR) $@ 0
|
||
#$(V)$(BLOCKSDS)/tools/mkfatimg/mkfatimg -t $(NITROFATDIR) $@ 0
|
||
|
||
# Make the NDS ROM depend on the filesystem image only if it is needed
|
||
$(ROM): $(NITROFAT_IMG)
|
||
endif
|
||
|
||
# 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_FAT)
|
||
|
||
$(ELF): $(OBJS)
|
||
@echo " LD $@"
|
||
$(V)$(LD) -o $@ $(OBJS) $(BLOCKSDS)/sys/crts/ds_arm9_crt0.o $(LDFLAGS)
|
||
|
||
$(DUMP): $(ELF)
|
||
@echo " OBJDUMP $@"
|
||
$(V)$(OBJDUMP) -h -C -S $< > $@
|
||
|
||
dump: $(DUMP)
|
||
|
||
clean:
|
||
@echo " CLEAN"
|
||
$(V)$(RM) $(ROM) $(DUMP) $(BUILDDIR) $(SDIMAGE)
|
||
|
||
sdimage:
|
||
@echo " MKFATIMG $(SDIMAGE) $(SDROOT)"
|
||
$(V)$(BLOCKSDS)/tools/mkfatimg/mkfatimg -t $(SDROOT) $(SDIMAGE) 0
|
||
|
||
dldipatch: $(ROM)
|
||
@echo " DLDITOOL $(ROM)"
|
||
$(V)$(BLOCKSDS)/tools/dlditool/dlditool \
|
||
$(BLOCKSDS)/tools/dldi/r4tfv2.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)/%.cpp.o : %.cpp
|
||
@echo " CXX $<"
|
||
@$(MKDIR) -p $(@D)
|
||
$(V)$(CXX) $(CXXFLAGS) -MMD -MP -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
|
||
|
||
$(SOUNDBANKDIR)/soundbank.h: $(SOURCES_AUDIO)
|
||
@echo " MMUTIL $^"
|
||
@$(MKDIR) -p $(@D)
|
||
@$(BLOCKSDS)/tools/mmutil/mmutil $^ -d \
|
||
-o$(SOUNDBANKDIR)/soundbank.bin -h$(SOUNDBANKDIR)/soundbank.h
|
||
|
||
$(SOUNDBANKDIR)/soundbank.c.o: $(SOUNDBANKDIR)/soundbank.h
|
||
@echo " BIN2C soundbank.bin"
|
||
$(V)$(BLOCKSDS)/tools/bin2c/bin2c $(SOUNDBANKDIR)/soundbank.bin \
|
||
$(SOUNDBANKDIR)
|
||
@echo " CC.9 soundbank_bin.c"
|
||
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(SOUNDBANKDIR)/soundbank.c.o \
|
||
$(SOUNDBANKDIR)/soundbank_bin.c
|
||
|
||
# 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)
|
||
|