mirror of
https://github.com/AntonioND/palib.git
synced 2025-06-18 14:45:43 -04:00
364 lines
10 KiB
Plaintext
364 lines
10 KiB
Plaintext
# SPDX-License-Identifier: CC0-1.0
|
|
#
|
|
# SPDX-FileContributor: Antonio Niño Díaz, 2023-2024
|
|
|
|
export BLOCKSDS ?= /opt/blocksds/core
|
|
export BLOCKSDSEXT ?= /opt/blocksds/external
|
|
|
|
export WONDERFUL_TOOLCHAIN ?= /opt/wonderful
|
|
ARM_NONE_EABI_PATH ?= $(WONDERFUL_TOOLCHAIN)/toolchain/gcc-arm-none-eabi/bin/
|
|
|
|
# User config
|
|
# ===========
|
|
|
|
NAME ?= $(shell basename $(CURDIR))
|
|
|
|
GAME_TITLE ?= PAlib Project
|
|
GAME_SUBTITLE ?= Change this text
|
|
GAME_AUTHOR ?= for your project!
|
|
GAME_ICON ?= $(BLOCKSDSEXT)/palib/defaultlogo.bmp
|
|
|
|
ARM7ELF ?= $(BLOCKSDSEXT)/palib/sys/arm7_maxmod_dswifi.elf
|
|
|
|
# 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
|
|
|
|
# Source code paths
|
|
# -----------------
|
|
|
|
SOURCEDIRS ?= source gfx/bin
|
|
INCLUDEDIRS ?= gfx
|
|
GFXDIRS ?=
|
|
BINDIRS ?= gfx/bin
|
|
AUDIODIRS ?=
|
|
NITROFSDIR ?=
|
|
|
|
# Defines passed to all files
|
|
# ---------------------------
|
|
|
|
DEFINES := -DPA_NO_DEPRECATION
|
|
|
|
# Libraries
|
|
# ---------
|
|
|
|
LIBS := -lmm9 -lnds9 -ldswifi9 -lpa9
|
|
LIBDIRS := $(BLOCKSDS)/libs/maxmod \
|
|
$(BLOCKSDS)/libs/dswifi \
|
|
$(BLOCKSDS)/libs/libnds \
|
|
$(BLOCKSDSEXT)/palib
|
|
|
|
# Build artifacts
|
|
# ---------------
|
|
|
|
BUILDDIR := build/$(NAME)
|
|
ELF := build/$(NAME).elf
|
|
DUMP := build/$(NAME).dump
|
|
MAP := build/$(NAME).map
|
|
ROM := $(NAME).nds
|
|
|
|
# If NITROFSDIR is set, the soundbank created by mmutil will be saved to NitroFS
|
|
SOUNDBANKINFODIR := $(BUILDDIR)/maxmod
|
|
ifeq ($(strip $(NITROFSDIR)),)
|
|
SOUNDBANKDIR := $(BUILDDIR)/maxmod
|
|
else
|
|
SOUNDBANKDIR := $(BUILDDIR)/maxmod_nitrofs
|
|
endif
|
|
|
|
# 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
|
|
# ------------
|
|
|
|
ifneq ($(BINDIRS),)
|
|
SOURCES_BIN_BIN := $(shell find -L $(BINDIRS) -name "*.bin")
|
|
SOURCES_BIN_BMP := $(shell find -L $(BINDIRS) -name "*.bmp")
|
|
SOURCES_BIN_JPG := $(shell find -L $(BINDIRS) -name "*.jpg")
|
|
SOURCES_BIN_PNG := $(shell find -L $(BINDIRS) -name "*.png")
|
|
SOURCES_BIN_GIF := $(shell find -L $(BINDIRS) -name "*.gif")
|
|
SOURCES_BIN_RAW := $(shell find -L $(BINDIRS) -name "*.raw")
|
|
SOURCES_BIN_MP3 := $(shell find -L $(BINDIRS) -name "*.mp3")
|
|
SOURCES_BIN_MOD := $(shell find -L $(BINDIRS) -name "*.mod")
|
|
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 += $(SOUNDBANKINFODIR)
|
|
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
|
|
# -------------------------
|
|
|
|
ARCH := -mthumb -mcpu=arm946e-s+nofp
|
|
|
|
SPECS := $(BLOCKSDS)/sys/crts/ds_arm9.specs
|
|
|
|
WARNFLAGS := -Wall
|
|
|
|
ifeq ($(SOURCES_CPP),)
|
|
LIBS += -lc
|
|
else
|
|
LIBS += -lstdc++ -lc
|
|
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 $(INCLUDEFLAGS) $(DEFINES) \
|
|
$(ARCH) -ffunction-sections -fdata-sections \
|
|
-specs=$(SPECS)
|
|
|
|
CFLAGS += -std=gnu17 $(WARNFLAGS) $(INCLUDEFLAGS) $(DEFINES) \
|
|
$(ARCH) -O2 -ffunction-sections -fdata-sections \
|
|
-specs=$(SPECS)
|
|
|
|
CXXFLAGS += -std=gnu++17 $(WARNFLAGS) $(INCLUDEFLAGS) $(DEFINES) \
|
|
$(ARCH) -O2 -ffunction-sections -fdata-sections \
|
|
-fno-exceptions -fno-rtti \
|
|
-specs=$(SPECS)
|
|
|
|
LDFLAGS := $(ARCH) $(LIBDIRSFLAGS) -Wl,-Map,$(MAP) $(DEFINES) \
|
|
-Wl,--start-group $(LIBS) -Wl,--end-group -specs=$(SPECS)
|
|
|
|
# Intermediate build files
|
|
# ------------------------
|
|
|
|
OBJS_ASSETS := $(patsubst %.bin,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_BIN))) \
|
|
$(patsubst %.bmp,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_BMP))) \
|
|
$(patsubst %.jpg,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_JPG))) \
|
|
$(patsubst %.png,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_PNG))) \
|
|
$(patsubst %.gif,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_GIF))) \
|
|
$(patsubst %.raw,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_RAW))) \
|
|
$(patsubst %.mp3,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_MP3))) \
|
|
$(patsubst %.mod,%.o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_MOD))) \
|
|
$(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_PNG)))
|
|
|
|
HEADERS_ASSETS := $(patsubst %.bin,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_BIN))) \
|
|
$(patsubst %.bmp,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_BMP))) \
|
|
$(patsubst %.jpg,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_JPG))) \
|
|
$(patsubst %.png,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_PNG))) \
|
|
$(patsubst %.gif,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_GIF))) \
|
|
$(patsubst %.raw,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_RAW))) \
|
|
$(patsubst %.mp3,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_MP3))) \
|
|
$(patsubst %.mod,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN_MOD))) \
|
|
$(patsubst %.png,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_PNG)))
|
|
|
|
ifneq ($(SOURCES_AUDIO),)
|
|
ifeq ($(strip $(NITROFSDIR)),)
|
|
OBJS_ASSETS += $(SOUNDBANKDIR)/soundbank.c.o
|
|
endif
|
|
HEADERS_ASSETS += $(SOUNDBANKINFODIR)/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 $(NITROFSDIR)),)
|
|
# Additional arguments for ndstool
|
|
NDSTOOL_ARGS := -d $(NITROFSDIR)
|
|
|
|
ifneq ($(SOURCES_AUDIO),)
|
|
NDSTOOL_ARGS += -d $(SOUNDBANKDIR)
|
|
endif
|
|
|
|
# Make the NDS ROM depend on the filesystem only if it is needed
|
|
$(ROM): $(NITROFSDIR)
|
|
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 $(ARM7ELF) -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 $@ $<
|
|
|
|
$(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)/%.o $(BUILDDIR)/%.h : %.bin
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.c
|
|
|
|
$(BUILDDIR)/%.o $(BUILDDIR)/%.h : %.bmp
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.c
|
|
|
|
$(BUILDDIR)/%.o $(BUILDDIR)/%.h : %.jpg
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.c
|
|
|
|
$(BUILDDIR)/%.o $(BUILDDIR)/%.h : %.gif
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.c
|
|
|
|
$(BUILDDIR)/%.o $(BUILDDIR)/%.h : %.raw
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.c
|
|
|
|
$(BUILDDIR)/%.o $(BUILDDIR)/%.h : %.mp3
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.c
|
|
|
|
$(BUILDDIR)/%.o $(BUILDDIR)/%.h : %.mod
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.c
|
|
|
|
$(BUILDDIR)/%.o $(BUILDDIR)/%.h : %.png
|
|
@echo " BIN2C $<"
|
|
@$(MKDIR) -p $(@D)
|
|
$(V)$(BLOCKSDS)/tools/bin2c/bin2c --noext $< $(@D)
|
|
$(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.o $(BUILDDIR)/$*.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
|
|
|
|
ifneq ($(SOURCES_AUDIO),)
|
|
|
|
$(SOUNDBANKINFODIR)/soundbank.h: $(SOURCES_AUDIO)
|
|
@echo " MMUTIL $^"
|
|
@$(MKDIR) -p $(SOUNDBANKDIR)
|
|
@$(MKDIR) -p $(SOUNDBANKINFODIR)
|
|
@$(BLOCKSDS)/tools/mmutil/mmutil $^ -d \
|
|
-o$(SOUNDBANKDIR)/soundbank.bin -h$(SOUNDBANKINFODIR)/soundbank.h
|
|
|
|
ifeq ($(strip $(NITROFSDIR)),)
|
|
$(SOUNDBANKDIR)/soundbank.c.o: $(SOUNDBANKINFODIR)/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
|
|
endif
|
|
|
|
endif
|
|
|
|
# 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)
|