.SUFFIXES: ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM") endif # Sources and defines TARGET := code9 BUILD := build9 INCLUDES := include thirdparty SOURCES := source source/arm9 thirdparty/fatfs thirdparty/fatfs/option DEFINES := -DARM9 -D_3DS DATA := data # Compiler settings ARCH := -march=armv5te -mtune=arm946e-s -mfloat-abi=soft -marm -mthumb-interwork CFLAGS := $(ARCH) -std=c11 -O2 -g -fstrict-aliasing -mword-relocations -fomit-frame-pointer \ -ffast-math -ffunction-sections -Wall -Wextra CXXFLAGS := $(ARCH) -std=c++11 -O2 -g -fstrict-aliasing -mword-relocations -fomit-frame-pointer \ -ffast-math -ffunction-sections -Wall -Wextra ASFLAGS := LDFLAGS := $(CFLAGS) -Wl,--use-blx,--gc-sections -nostartfiles -T arm9.ld PREFIX := arm-none-eabi- CC := $(PREFIX)gcc CXX := $(PREFIX)g++ AS := $(PREFIX)as OBJCOPY := $(PREFIX)objcopy # Do not change anything after this VPATH := $(DATA) $(SOURCES) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) OFILES := $(foreach file,$(BINFILES),$(BUILD)/$(file).o) \ $(foreach file,$(CFILES:.c=.o),$(BUILD)/$(file)) \ $(foreach file,$(CPPFILES:.cpp=.o),$(BUILD)/$(file)) \ $(foreach file,$(SFILES:.s=.o),$(BUILD)/$(file)) INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) -I$(BUILD) ifeq ($(strip $(CPPFILES)),) LD := $(CC) else LD := $(CXX) endif ifneq ($(strip $(NO_DEBUG)),) DEFINES += -DNDEBUG endif ifeq ($(strip $(NO_COMMIT_HASH)),) DEFINES += -DCOMMIT_HASH="\"-$(shell git rev-parse --short=8 HEAD)\"" else DEFINES += -DCOMMIT_HASH=\"\" endif VERSION_STR := $(shell git describe --tags --match v[0-9]*) DEFINES += -DVER_MAJOR=$(shell echo $(VERSION_STR) | sed -e 's/v//i' -e 's/\.[0-g-]*//i') DEFINES += -DVER_MINOR=$(shell echo $(VERSION_STR) | sed -e 's/v[0-9]*\.//i' -e 's/-[0-g-]*//i') .PHONY: clean release # Main target $(TARGET).bin: $(TARGET).elf @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) $(TARGET).elf: $(BUILD) $(OFILES) clean: @echo clean ... @rm -rf $(BUILD) $(TARGET).bin $(TARGET).elf release: @$(MAKE) --no-print-directory -f Makefile.arm9 NO_DEBUG=1 NO_COMMIT_HASH=1 $(BUILD): @mkdir -p $(BUILD) %.elf: @echo linking $(notdir $@) $(LD) $(LDFLAGS) $(OFILES) -o $@ $(BUILD)/%.bin.o: %.bin @echo $(notdir $<) bin2s $< | $(AS) -o $(@) echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > $(BUILD)/`(echo $(<F) | tr . _)`.h echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> $(BUILD)/`(echo $(<F) | tr . _)`.h echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> $(BUILD)/`(echo $(<F) | tr . _)`.h $(BUILD)/%.o: %.c @echo $(notdir $<) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDE) -c $< -o $@ $(BUILD)/%.o: %.cpp @echo $(notdir $<) $(CXX) $(CXXFLAGS) $(DEFINES) $(INCLUDE) -c $< -o $@ $(BUILD)/%.o: %.s @echo $(notdir $<) $(CC) $(CFLAGS) -x assembler-with-cpp $(DEFINES) $(INCLUDE) -c $< -o $@