#--------------------------------------------------------------------------------- .SUFFIXES: #--------------------------------------------------------------------------------- ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") endif TOPDIR ?= $(CURDIR) include $(DEVKITARM)/3ds_rules #--------------------------------------------------------------------------------- # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code # DATA is a list of directories containing data files # INCLUDES is a list of directories containing header files # GRAPHICS is a list of directories containing graphics files # GFXBUILD is the directory where converted graphics files will be placed # If set to $(BUILD), it will statically link in the converted # files as if they were data files. # # NO_SMDH: if set to anything, no SMDH file is generated. # ROMFS is the directory which contains the RomFS, relative to the Makefile (Optional) # APP_TITLE is the name of the app stored in the SMDH file (Optional) # APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) # APP_AUTHOR is the author of the app stored in the SMDH file (Optional) # ICON is the filename of the icon (.png), relative to the project folder. # If not set, it attempts to use one of the following (in this order): # - .png # - icon.png # - /default_icon.png #--------------------------------------------------------------------------------- TARGET := $(notdir $(CURDIR)) BUILD := build SOURCES := source DATA := data INCLUDES := include GRAPHICS := gfx GFXBUILD := $(BUILD) ROMFS := romfs #GFXBUILD := $(ROMFS)/gfx APP_TITLE := day APP_DESCRIPTION := aoc 2025 APP_AUTHOR := Candy #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft # There used to be -mword-allocations here but swiftc doesn't like it # I removed it and it works but may break something later... CFLAGS := -g -Wall -O2 \ -ffunction-sections \ $(ARCH) CFLAGS += $(INCLUDE) -D__3DS__ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 ASFLAGS := -g $(ARCH) LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -L../../Shared/lib LIBS := -lctru -lm -lShared #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib #--------------------------------------------------------------------------------- LIBDIRS := $(CTRULIB) #--------------------------------------------------------------------------------- # swift-specific bits #--------------------------------------------------------------------------------- SWIFTC := ~/.local/share/swiftly/bin/swiftc SWIFTFLAGS := -wmo -parse-as-library -enable-experimental-feature Embedded \ -target armv6-none-none-eabi -import-objc-header ../$(INCLUDES)/BridgingHeader.h \ -I $(DEVKITPRO)/devkitARM/include -I $(DEVKITPRO)/devkitARM/arm-none-eabi/include -Ounchecked %.o: %.swift @echo $(notdir $<) $(ADD_COMPILE_COMMAND) add $(SWIFTC) $(SWIFTFLAGS) "$(addprefix -Xcc , $(C_FLAGS)) -c $< -o $@" $< $(SILENTCMD)$(SWIFTC) $(SWIFTFLAGS) $(addprefix -Xcc , $(CFLAGS)) -c $< -o $@ $(ERROR_FILTER) #--------------------------------------------------------------------------------- # no real need to edit anything past this point unless you need to add additional # rules for different file extensions #--------------------------------------------------------------------------------- ifneq ($(BUILD),$(notdir $(CURDIR))) #--------------------------------------------------------------------------------- export OUTPUT := $(CURDIR)/$(TARGET) export TOPDIR := $(CURDIR) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ $(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir)) \ $(foreach dir,$(DATA),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/$(BUILD) CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) SWIFTFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.swift))) PICAFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.v.pica))) SHLISTFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.shlist))) GFXFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.t3s))) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C #--------------------------------------------------------------------------------- ifeq ($(strip $(CPPFILES)),) #--------------------------------------------------------------------------------- export LD := $(CC) #--------------------------------------------------------------------------------- else #--------------------------------------------------------------------------------- export LD := $(CXX) #--------------------------------------------------------------------------------- endif #--------------------------------------------------------------------------------- #--------------------------------------------------------------------------------- ifeq ($(GFXBUILD),$(BUILD)) #--------------------------------------------------------------------------------- export T3XFILES := $(GFXFILES:.t3s=.t3x) #--------------------------------------------------------------------------------- else #--------------------------------------------------------------------------------- export ROMFS_T3XFILES := $(patsubst %.t3s, $(GFXBUILD)/%.t3x, $(GFXFILES)) export T3XHFILES := $(patsubst %.t3s, $(BUILD)/%.h, $(GFXFILES)) #--------------------------------------------------------------------------------- endif #--------------------------------------------------------------------------------- export OFILES_SOURCES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) $(SWIFTFILES:.swift=.o) export OFILES_BIN := $(addsuffix .o,$(BINFILES)) \ $(PICAFILES:.v.pica=.shbin.o) $(SHLISTFILES:.shlist=.shbin.o) \ $(addsuffix .o,$(T3XFILES)) export OFILES := $(OFILES_BIN) $(OFILES_SOURCES) export HFILES := $(PICAFILES:.v.pica=_shbin.h) $(SHLISTFILES:.shlist=_shbin.h) \ $(addsuffix .h,$(subst .,_,$(BINFILES))) \ $(GFXFILES:.t3s=.h) 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) export _3DSXDEPS := $(if $(NO_SMDH),,$(OUTPUT).smdh) ifeq ($(strip $(ICON)),) icons := $(wildcard *.png) ifneq (,$(findstring $(TARGET).png,$(icons))) export APP_ICON := $(TOPDIR)/$(TARGET).png else ifneq (,$(findstring icon.png,$(icons))) export APP_ICON := $(TOPDIR)/icon.png endif endif else export APP_ICON := $(TOPDIR)/$(ICON) endif ifeq ($(strip $(NO_SMDH)),) export _3DSXFLAGS += --smdh=$(CURDIR)/$(TARGET).smdh endif ifneq ($(ROMFS),) export _3DSXFLAGS += --romfs=$(CURDIR)/$(ROMFS) endif .PHONY: all clean #--------------------------------------------------------------------------------- all: $(BUILD) $(GFXBUILD) $(DEPSDIR) $(ROMFS_T3XFILES) $(T3XHFILES) @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile $(BUILD): @mkdir -p $@ ifneq ($(GFXBUILD),$(BUILD)) $(GFXBUILD): @mkdir -p $@ endif ifneq ($(DEPSDIR),$(BUILD)) $(DEPSDIR): @mkdir -p $@ endif #--------------------------------------------------------------------------------- clean: @echo clean ... @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf $(GFXBUILD) #--------------------------------------------------------------------------------- $(GFXBUILD)/%.t3x $(BUILD)/%.h : %.t3s #--------------------------------------------------------------------------------- @echo $(notdir $<) @tex3ds -i $< -H $(BUILD)/$*.h -d $(DEPSDIR)/$*.d -o $(GFXBUILD)/$*.t3x #--------------------------------------------------------------------------------- else #--------------------------------------------------------------------------------- # main targets #--------------------------------------------------------------------------------- $(OUTPUT).3dsx : $(OUTPUT).elf $(_3DSXDEPS) $(OFILES_SOURCES) : $(HFILES) $(OUTPUT).elf : $(OFILES) #--------------------------------------------------------------------------------- # you need a rule like this for each extension you use as binary data #--------------------------------------------------------------------------------- %.bin.o %_bin.h : %.bin #--------------------------------------------------------------------------------- @echo $(notdir $<) @$(bin2o) #--------------------------------------------------------------------------------- .PRECIOUS : %.t3x %.shbin #--------------------------------------------------------------------------------- %.t3x.o %_t3x.h : %.t3x #--------------------------------------------------------------------------------- $(SILENTMSG) $(notdir $<) $(bin2o) #--------------------------------------------------------------------------------- %.shbin.o %_shbin.h : %.shbin #--------------------------------------------------------------------------------- $(SILENTMSG) $(notdir $<) $(bin2o) -include $(DEPSDIR)/*.d #--------------------------------------------------------------------------------------- endif #---------------------------------------------------------------------------------------