.SUFFIXES: #--------------------------------------------------------------------------------- # Environment Setup #--------------------------------------------------------------------------------- ifeq ($(strip $(DEVKITPRO)),) $(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPRO") endif ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") endif include $(DEVKITARM)/3ds_rules #--------------------------------------------------------------------------------- # Directory Setup #--------------------------------------------------------------------------------- BUILD := build OUTPUT := output RESOURCES := resources DATA := data ROMFS := romfs SOURCES := source INCLUDES := $(SOURCES) include #--------------------------------------------------------------------------------- # Resource Setup #--------------------------------------------------------------------------------- APP_INFO := $(RESOURCES)/AppInfo BANNER_AUDIO := $(RESOURCES)/audio BANNER_IMAGE := $(RESOURCES)/banner ICON := $(RESOURCES)/icon.png #--------------------------------------------------------------------------------- # Build Setup #--------------------------------------------------------------------------------- ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard COMMON_FLAGS := -g -Wall -Wno-strict-aliasing -O3 -mword-relocations -fomit-frame-pointer -ffast-math $(ARCH) $(INCLUDE) -DARM11 -D_3DS $(BUILD_FLAGS) -fpermissive CFLAGS := $(COMMON_FLAGS) -std=gnu99 CXXFLAGS := $(COMMON_FLAGS) -std=c++11 ifeq ($(ENABLE_EXCEPTIONS),) CXXFLAGS += -fno-rtti -fno-exceptions endif ASFLAGS := -g $(ARCH) LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) LIBS := -lctru -lm LIBDIRS := $(PORTLIBS) $(CTRULIB) ./lib #--------------------------------------------------------------------------------- ifneq ($(BUILD),$(notdir $(CURDIR))) #--------------------------------------------------------------------------------- #--------------------------------------------------------------------------------- # Build Variable Setup #--------------------------------------------------------------------------------- recurse = $(shell find $2 -type $1 -name '$3' 2> /dev/null) CFILES := $(foreach dir,$(SOURCES),$(notdir $(call recurse,f,$(dir),*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(call recurse,f,$(dir),*.cpp))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(call recurse,f,$(dir),*.s))) PICAFILES := $(foreach dir,$(SOURCES),$(notdir $(call recurse,f,$(dir),*.pica))) BINFILES := $(foreach dir,$(DATA),$(notdir $(call recurse,f,$(dir),*.*))) export OFILES := $(addsuffix .o,$(BINFILES)) $(PICAFILES:.pica=.shbin.o) $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) $(foreach dir,$(LIBDIRS),-I$(dir)/include) -I$(CURDIR)/$(BUILD) export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) ifeq ($(strip $(CPPFILES)),) export LD := $(CC) else export LD := $(CXX) endif export DEPSDIR := $(CURDIR)/$(BUILD) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir) $(call recurse,d,$(CURDIR)/$(dir),*)) $(foreach dir,$(DATA),$(CURDIR)/$(dir) $(call recurse,d,$(CURDIR)/$(dir),*)) export TOPDIR := $(CURDIR) .PHONY: $(BUILD) clean all #--------------------------------------------------------------------------------- # Initial Targets #--------------------------------------------------------------------------------- all: $(BUILD) $(BUILD): @[ -d $@ ] || mkdir -p $@ @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile clean: @echo clean ... @rm -fr $(BUILD) $(OUTPUT) #--------------------------------------------------------------------------------- else #--------------------------------------------------------------------------------- #--------------------------------------------------------------------------------- # Build Information Setup #--------------------------------------------------------------------------------- DEPENDS := $(OFILES:.o=.d) include $(TOPDIR)/$(APP_INFO) APP_TITLE := $(shell echo "$(APP_TITLE)" | cut -c1-128) APP_DESCRIPTION := $(shell echo "$(APP_DESCRIPTION)" | cut -c1-256) APP_AUTHOR := $(shell echo "$(APP_AUTHOR)" | cut -c1-128) APP_PRODUCT_CODE := $(shell echo $(APP_PRODUCT_CODE) | cut -c1-16) APP_UNIQUE_ID := $(shell echo $(APP_UNIQUE_ID) | cut -c1-7) ifneq ("$(wildcard $(TOPDIR)/$(BANNER_IMAGE).cgfx)","") BANNER_IMAGE_FILE := $(TOPDIR)/$(BANNER_IMAGE).cgfx BANNER_IMAGE_ARG := -ci $(BANNER_IMAGE_FILE) else BANNER_IMAGE_FILE := $(TOPDIR)/$(BANNER_IMAGE).png BANNER_IMAGE_ARG := -i $(BANNER_IMAGE_FILE) endif ifneq ("$(wildcard $(TOPDIR)/$(BANNER_AUDIO).cwav)","") BANNER_AUDIO_FILE := $(TOPDIR)/$(BANNER_AUDIO).cwav BANNER_AUDIO_ARG := -ca $(BANNER_AUDIO_FILE) else BANNER_AUDIO_FILE := $(TOPDIR)/$(BANNER_AUDIO).wav BANNER_AUDIO_ARG := -a $(BANNER_AUDIO_FILE) endif EMPTY := SPACE := $(EMPTY) $(EMPTY) OUTPUT_NAME := $(subst $(SPACE),,$(APP_TITLE)) OUTPUT_DIR := $(TOPDIR)/$(OUTPUT) OUTPUT_FILE := $(OUTPUT_DIR)/$(OUTPUT_NAME) APP_ICON := $(TOPDIR)/$(ICON) APP_ROMFS := $(TOPDIR)/$(ROMFS) RSF := $(TOPDIR)/tools/template.rsf COMMON_MAKEROM_PARAMS := -rsf $(RSF) -target t -exefslogo -elf $(OUTPUT_FILE).elf -icon icon.icn -banner banner.bnr -DAPP_TITLE="$(APP_TITLE)" -DAPP_PRODUCT_CODE="$(APP_PRODUCT_CODE)" -DAPP_UNIQUE_ID="$(APP_UNIQUE_ID)" -DAPP_ROMFS="$(APP_ROMFS)" -DAPP_SYSTEM_MODE="64MB" -DAPP_SYSTEM_MODE_EXT="Legacy" ifeq ($(OS),Windows_NT) MAKEROM = $(TOPDIR)/tools/makerom.exe BANNERTOOL = $(TOPDIR)/tools/bannertool.exe else UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) MAKEROM = $(TOPDIR)/tools/makerom-linux BANNERTOOL = $(TOPDIR)/tools/bannertool-linux endif ifeq ($(UNAME_S),Darwin) MAKEROM = $(TOPDIR)/tools/makerom-mac BANNERTOOL = $(TOPDIR)/tools/bannertool-mac endif endif ifeq ($(OS),Windows_NT) ZIP_CMD = $(TOPDIR)/tools/7za.exe a -tzip $(OUTPUT_FILE).zip $(OUTPUT_NAME).elf $(OUTPUT_NAME).3ds $(OUTPUT_NAME).cia DEL_CMD = rm -r $(TOPDIR)/output/3ds else ZIP_CMD = zip -r $(OUTPUT_FILE).zip $(OUTPUT_NAME).elf $(OUTPUT_NAME).3ds $(OUTPUT_NAME).cia 3ds > /dev/null; \ DEL_CMD = rm -r 3ds endif _3DSXFLAGS += --smdh=$(OUTPUT_FILE).smdh ifneq ("$(wildcard $(TOPDIR)/$(ROMFS))","") _3DSXFLAGS += --romfs=$(TOPDIR)/$(ROMFS) endif #--------------------------------------------------------------------------------- # Main Targets #--------------------------------------------------------------------------------- .PHONY: all all: $(OUTPUT_FILE).zip $(OUTPUT_DIR): @[ -d $@ ] || mkdir -p $@ banner.bnr: $(BANNER_IMAGE_FILE) $(BANNER_AUDIO_FILE) @$(BANNERTOOL) makebanner $(BANNER_IMAGE_ARG) $(BANNER_AUDIO_ARG) -o banner.bnr > /dev/null icon.icn: $(TOPDIR)/$(ICON) @$(BANNERTOOL) makesmdh -s "$(APP_TITLE)" -l "$(APP_TITLE)" -p "$(APP_AUTHOR)" -i $(TOPDIR)/$(ICON) -o icon.icn > /dev/null $(OUTPUT_FILE).elf: $(OFILES) $(OUTPUT_FILE).3dsx: $(OUTPUT_FILE).elf $(OUTPUT_FILE).3ds: $(OUTPUT_FILE).elf banner.bnr icon.icn @$(MAKEROM) -f cci -o $(OUTPUT_FILE).3ds -DAPP_ENCRYPTED=true $(COMMON_MAKEROM_PARAMS) @echo "built ... $(notdir $@)" $(OUTPUT_FILE).cia: $(OUTPUT_FILE).elf banner.bnr icon.icn @$(MAKEROM) -f cia -o $(OUTPUT_FILE).cia -DAPP_ENCRYPTED=false $(COMMON_MAKEROM_PARAMS) @echo "built ... $(notdir $@)" $(OUTPUT_FILE).zip: $(OUTPUT_DIR) $(OUTPUT_FILE).elf $(OUTPUT_FILE).smdh $(OUTPUT_FILE).3dsx $(OUTPUT_FILE).3ds $(OUTPUT_FILE).cia @cd $(OUTPUT_DIR); \ mkdir -p 3ds/$(OUTPUT_NAME); \ cp $(OUTPUT_FILE).3dsx 3ds/$(OUTPUT_NAME); \ cp $(OUTPUT_FILE).smdh 3ds/$(OUTPUT_NAME); \ $(ZIP_CMD) $(DEL_CMD) @echo "built ... $(notdir $@)" #--------------------------------------------------------------------------------- # Binary Data Rules #--------------------------------------------------------------------------------- %.bin.o: %.bin @echo $(notdir $<) @$(bin2o) %.shbin.o: %.pica @echo $(notdir $<) $(eval CURBIN := $(patsubst %.pica,%.shbin,$(notdir $<))) $(eval CURH := $(patsubst %.pica,%.psh.h,$(notdir $<))) @picasso -h $(CURH) -o $(CURBIN) $< @bin2s $(CURBIN) | $(AS) -o $@ @echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(CURBIN) | tr . _)`.h @echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(CURBIN) | tr . _)`.h @echo "extern const u32" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(CURBIN) | tr . _)`.h -include $(DEPENDS) #--------------------------------------------------------------------------------- endif #---------------------------------------------------------------------------------