palib/PA_Makefile
2024-12-02 18:20:16 +00:00

440 lines
16 KiB
Plaintext

#---------------------------------------------------------------------------------
# PAlib Application Makefile
#---------------------------------------------------------------------------------
# Delete the default suffixes
.SUFFIXES:
#---------------------------------------------------------------------------------
# Environment variables & common settings
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITPRO)),)
$(error Please set DEVKITPRO in your environment)
endif
ifeq ($(strip $(DEVKITARM)),)
$(error Please set DEVKITARM in your environment)
endif
ifeq ($(strip $(MAKEFILE_VER)),)
$(error Your makefile is outdated. Please use the one at $(DEVKITPRO)/PAlib/template)
endif
ifeq ($(strip $(MAKEFILE_VER)),ver1)
$(error Your makefile is outdated. Please use the one at $(DEVKITPRO)/PAlib/template)
endif
ifneq ($(strip $(MAKEFILE_VER)),ver2)
$(error Your PAlib version is outdated. Please go to http://www.palib-dev.com to get the latest)
endif
PATH := $(DEVKITARM)/bin:$(PATH)
PAPATH = $(DEVKITPRO)/PAlib
include $(DEVKITARM)/base_rules
TEXT_TO_SAY_1 :=
TEXT_TO_SAY_2 :=
TEXT_TO_SAY_3 :=
TEXT_TO_SAY_4 :=
NL_AND_PAUSE :=
MSG_IS_ERROR :=
# ARM7BINs are broken, linking default arm7.
ARM7_IS_OK :=
ifeq ($(strip $(ARM7_SELECTED)),)
TEXT_TO_SAY_1 := You forgot to select an ARM7 core! ARM7_MP3 will be selected by default.
TEXT_TO_SAY_2 := To select an ARM7 core, uncomment the line of the makefile that specifies
TEXT_TO_SAY_3 := the ARM7 core you want.
NL_AND_PAUSE := YES
ARM7_SELECTED := ARM7_MP3
endif
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MP3)
ARM7BIN := $(PAPATH)/lib/arm7_mp3.elf
ARM7_IS_OK := YES
endif
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MP3_DSWIFI)
ARM7BIN := $(PAPATH)/lib/arm7_mp3_dswifi.elf
ARM7_IS_OK := YES
endif
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
ARM7BIN := $(PAPATH)/lib/arm7_maxmod_dswifi.elf
ARM7_IS_OK := YES
endif
ifeq ($(strip $(ARM7_IS_OK)),)
TEXT_TO_SAY_1 := The ARM7 core you selected is invalid: $(strip $(ARM7_SELECTED))
TEXT_TO_SAY_2 := ARM7_MP3 will be selected by default.
TEXT_TO_SAY_3 := To select a proper ARM7 core, uncomment the line of the makefile
TEXT_TO_SAY_4 := that specifies the ARM7 core you want.
NL_AND_PAUSE = YES
ARM7_SELECTED := ARM7_MP3
ARM7BIN := $(PAPATH)/lib/arm7_mp3.elf
endif
# Icon
ifeq ($(strip $(wildcard $(CURDIR)/../logo.bmp)),)
ICON := $(PAPATH)/lib/defaultlogo.bmp
else
ICON := $(CURDIR)/../logo.bmp
endif
#---------------------------------------------------------------------------------
# Options for code generation
#---------------------------------------------------------------------------------
# Processor settings - compile as THUMB with interworking enabled
ARCH := -march=armv5te -mtune=arm946e-s \
-mthumb -mthumb-interwork
# C compiler flags
CFLAGS := -g -Wall -O2 \
$(ARCH) -fomit-frame-pointer -ffast-math \
$(INCLUDE) -DARM9
# C++ compiler flags
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
# ASM flags
ASFLAGS := -g $(ARCH)
# Linker flags
LDFLAGS := -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MP3)
LIBS := -lfilesystem -lfat -lnds9
endif
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MP3_DSWIFI)
LIBS := -lfilesystem -lfat -lnds9 -ldswifi9
endif
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
LIBS := -lfilesystem -lfat -lnds9 -ldswifi9 -lmm9
endif
# The -lpa9 switch must be placed before other libraries.
LIBS := -lpa9 $(LIBS)
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MP3)
LIBDIRS := $(DEVKITPRO)/libnds
endif
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MP3_DSWIFI)
LIBDIRS := $(DEVKITPRO)/libnds
endif
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
LIBDIRS := $(DEVKITPRO)/libnds
endif
# Add the PAlib directory
LIBDIRS += $(PAPATH)
#---------------------------------------------------------------------------------
# Collect the things we need before building
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------
ifeq ($(strip $(RELEASEPATH)),)
OUTPATH := $(CURDIR)
else
OUTPATH := $(CURDIR)/$(RELEASEPATH)
endif
export OUTPUT := $(OUTPATH)/$(TARGET)
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
# Determine the name of the tools
PREFIX := arm-none-eabi-
export CC := $(PREFIX)gcc
export CXX := $(PREFIX)g++
export AR := $(PREFIX)gcc-ar
export AS := $(PREFIX)as
export OBJCOPY := arm-none-eabi-objcopy
# Collect source code files
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
# Use CXX to link C++ projects or CC for standard C
ifeq ($(strip $(CPPFILES)),)
export LD := $(CC) -z noexecstack
else
export LD := $(CXX) -z noexecstack
endif
# Collect resource files
BINFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.bin)))
PCXFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcx)))
PALFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pal)))
RAWFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.raw)))
MAPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.map)))
JPGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.jpg)))
GIFFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.gif)))
BMPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.bmp)))
MP3FILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mp3)))
# Collect audio files supported by Maxmod (mod, xm, s3m, it, wav)
ifeq ($(strip $(ARM7_SELECTED)), ARM7_MAXMOD_DSWIFI)
export AUDIOFILES := $(foreach file,$(notdir $(wildcard $(AUDIO)/*.mod)),$(CURDIR)/$(AUDIO)/$(file)) \
$(foreach file,$(notdir $(wildcard $(AUDIO)/*.s3m)),$(CURDIR)/$(AUDIO)/$(file)) \
$(foreach file,$(notdir $(wildcard $(AUDIO)/*.xm)),$(CURDIR)/$(AUDIO)/$(file)) \
$(foreach file,$(notdir $(wildcard $(AUDIO)/*.it)),$(CURDIR)/$(AUDIO)/$(file)) \
$(foreach file,$(notdir $(wildcard $(AUDIO)/*.wav)),$(CURDIR)/$(AUDIO)/$(file))
ifeq ($(strip $(AUDIOFILES)),)
TEXT_TO_SAY_2 := No Maxmod-compatible files were found in the audio folder.
TEXT_TO_SAY_3 := If you are loading the soundbank from the filesystem, ignore this message.
TEXT_TO_SAY_4 := " "
DONT_BUILD_MAXMOD_SOUNDBANK := YES
else
# Add the Maxmod soundbank to the list of bin files
BINFILES += soundbank_bin.bin
endif
endif
# Object files
export OFILES := $(BINFILES:.bin=.o) $(PCXFILES:.pcx=.o) $(PALFILES:.pal=.o) \
$(RAWFILES:.raw=.o) $(MAPFILES:.map=.o) $(JPGFILES:.jpg=.o) \
$(GIFFILES:.gif=.o) $(BMPFILES:.bmp=.o) $(MP3FILES:.mp3=.o) \
$(CFILES:.c=.o) $(CPPFILES:.cpp=.o) $(SFILES:.s=.o)
# Include paths
export INCLUDE := -I$(CURDIR)/$(BUILD) \
$(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include/nds) \
-I$(PAPATH)/include/nds
# Library paths
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
# Header dependencies path (.d files)
export DEPSDIR := $(CURDIR)/$(BUILD)
# Filesystem
ifneq ($(strip $(wildcard $(CURDIR)/filesystem)),)
export FILESYSTEM := -d $(CURDIR)/filesystem
else
export FILESYSTEM :=
endif
.PHONY: $(BUILD) clean
#---------------------------------------------------------------------------------
# Main build routine
#---------------------------------------------------------------------------------
$(BUILD):
#---------------------------------------------------------------------------------
# Before compiling, show any warning messages that might have detected
ifneq ($(strip $(TEXT_TO_SAY_1)),)
ifeq ($(strip $(MSG_IS_ERROR)),)
@echo " ===================================="
@echo "/ PAlib Project Compilation Warning /"
@echo "==================================== "
else
@echo " =================================="
@echo "/ PAlib Project Compilation Error /"
@echo "================================== "
endif
@echo
@echo $(TEXT_TO_SAY_1)
endif
ifneq ($(strip $(TEXT_TO_SAY_2)),)
@echo $(TEXT_TO_SAY_2)
endif
ifneq ($(strip $(TEXT_TO_SAY_3)),)
@echo $(TEXT_TO_SAY_3)
endif
ifneq ($(strip $(TEXT_TO_SAY_4)),)
@echo $(TEXT_TO_SAY_4)
endif
ifneq ($(strip $(NL_AND_PAUSE)),)
@echo
ifeq ($(strip $(MSG_IS_ERROR)),)
@read -n 1 -p "Press any key to continue the compilation..."
@echo
else
@read -n 1 -p "Press any key to exit..."
endif
@echo
endif
ifeq ($(strip $(MSG_IS_ERROR)),)
@echo Build process start for project \"$(TARGET)\"...
@echo
@[ -d $@ ] || mkdir -p $@
@[ -d $(OUTPATH) ] || mkdir -p $(OUTPATH)
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
endif
#---------------------------------------------------------------------------------
# Clean routine
#---------------------------------------------------------------------------------
clean:
#---------------------------------------------------------------------------------
@echo Clean... $(TARGET)
@rm -fr $(BUILD) $(OUTPUT).nds
#---------------------------------------------------------------------------------
# Rules to build files
#---------------------------------------------------------------------------------
else
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
# Main targets
#---------------------------------------------------------------------------------
$(OUTPUT).nds: $(OUTPUT).bin
$(OUTPUT).bin: $(OUTPUT).elf
$(OUTPUT).elf: $(OFILES)
#---------------------------------------------------------------------------------
# Rule to build the soundbank from audio files
#---------------------------------------------------------------------------------
soundbank_bin.bin: $(AUDIOFILES)
#---------------------------------------------------------------------------------
ifneq ($(strip $(DONT_BUILD_MAXMOD_SOUNDBANK)), YES)
@echo "Generating soundbank..."
@echo
@mmutil $^ -d -osoundbank_bin.bin -hsoundbank.h
endif
#---------------------------------------------------------------------------------
%.nds: %.bin
#---------------------------------------------------------------------------------
@ndstool -c $@ -9 $(TARGET).elf -7 $(ARM7BIN) -b $(ICON) "$(TEXT1);$(TEXT2);$(TEXT3)" $(FILESYSTEM) > /dev/null
@echo
@echo Built: $(notdir $@)
@echo
#---------------------------------------------------------------------------------
%.bin: %.elf
#---------------------------------------------------------------------------------
@$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin
#---------------------------------------------------------------------------------
%.elf:
#---------------------------------------------------------------------------------
@echo
@echo Linking...
@$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $(TARGET).elf
#---------------------------------------------------------------------------------
# Rules to build source files
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
%.o: %.cpp
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -c $< -o $@
#---------------------------------------------------------------------------------
%.o: %.c
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@
#---------------------------------------------------------------------------------
%.o: %.s
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(ASFLAGS) -x assembler-with-cpp -c $< -o $@
#---------------------------------------------------------------------------------
# bin2o macro - slightly changed for the PAlib naming conventions of resources
# which doesn't append the file extension to the resource name
#---------------------------------------------------------------------------------
define bin2o
cp $< $*
(bin2s $* && echo $('' $($@)))| $(AS) -o $@
rm $*
echo "extern const u8" $*"[];" > $*.h
echo "extern const u32" $*_size";" >> $*.h
endef
#---------------------------------------------------------------------------------
# Rules to build resource files
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
%.o: %.bin
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.pcx
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.pal
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.raw
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.map
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.jpg
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.gif
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.bmp
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%.o: %.mp3
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
# Header file dependencies
#---------------------------------------------------------------------------------
-include $(DEPSDIR)/*.d
#---------------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------------