diff --git a/Makefile b/Makefile index eddbccd..6c4018a 100644 --- a/Makefile +++ b/Makefile @@ -1,34 +1,63 @@ +#--------------------------------------------------------------------------------- .SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif -TARGET := firm.bin +export TARGET := firm ENTRY9 := 0x08000054 ENTRY11 := 0x1FF85040 SECTION0_ADR := 0x08000040 SECTION0_TYPE := 0 -SECTION0_FILE := code9.bin SECTION1_ADR := 0x1FF85000 SECTION1_TYPE := 1 -SECTION1_FILE := code11.bin -.PHONY: clean release +export VERS_STRING := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/i') -$(TARGET): - @$(MAKE) --no-print-directory -f Makefile.arm9 - @$(MAKE) --no-print-directory -f Makefile.arm11 - @firm_builder $(TARGET) $(ENTRY9) $(ENTRY11) $(SECTION0_ADR) $(SECTION0_TYPE) \ - $(SECTION0_FILE) $(SECTION1_ADR) $(SECTION1_TYPE) $(SECTION1_FILE) - @echo built ... $(TARGET) +export VERS_MAJOR := $(shell echo "$(VERS_STRING)" | sed 's/v\([0-9]*\)\..*/\1/i') +export VERS_MINOR := $(shell echo "$(VERS_STRING)" | sed 's/.*\.\([0-9]*\).*/\1/') + +.PHONY: checkarm9 checkarm11 clean release + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all: checkarm9 checkarm11 $(TARGET).bin + +#--------------------------------------------------------------------------------- +checkarm9: + @$(MAKE) -j4 --no-print-directory -f Makefile.arm9 + +#--------------------------------------------------------------------------------- +checkarm11: + @$(MAKE) -j4 --no-print-directory -f Makefile.arm11 + +#--------------------------------------------------------------------------------- +$(TARGET).bin: $(TARGET)9.bin $(TARGET)11.bin + firm_builder $(TARGET).bin $(ENTRY9) $(ENTRY11) $(SECTION0_ADR) $(SECTION0_TYPE) \ + $(TARGET)9.bin $(SECTION1_ADR) $(SECTION1_TYPE) $(TARGET)11.bin + +#--------------------------------------------------------------------------------- +$(TARGET)9.bin: + @$(MAKE) -j4 --no-print-directory -f Makefile.arm9 + +#--------------------------------------------------------------------------------- +$(TARGET)11.bin: + @$(MAKE) -j4 --no-print-directory -f Makefile.arm11 + +#--------------------------------------------------------------------------------- clean: @$(MAKE) --no-print-directory -f Makefile.arm9 clean @$(MAKE) --no-print-directory -f Makefile.arm11 clean - @rm -rf $(TARGET) + rm -f $(TARGET).bin -release: - @$(MAKE) --no-print-directory -f Makefile.arm9 release - @$(MAKE) --no-print-directory -f Makefile.arm11 release - @firm_builder $(TARGET) $(ENTRY9) $(ENTRY11) $(SECTION0_ADR) $(SECTION0_TYPE) \ - $(SECTION0_FILE) $(SECTION1_ADR) $(SECTION1_TYPE) $(SECTION1_FILE) - @echo built ... $(TARGET) - @7z a -mx -m0=ARM -m1=lzma2 fastboot3ds.7z $(TARGET) +release: clean + @$(MAKE) -j4 --no-print-directory -f Makefile.arm9 NO_DEBUG=1 + @$(MAKE) -j4 --no-print-directory -f Makefile.arm11 NO_DEBUG=1 + firm_builder $(TARGET).bin $(ENTRY9) $(ENTRY11) $(SECTION0_ADR) $(SECTION0_TYPE) \ + $(TARGET)9.bin $(SECTION1_ADR) $(SECTION1_TYPE) $(TARGET)11.bin + @7z a -mx -m0=ARM -m1=LZMA2 fastboot3DS$(VERS_STRING).7z $(TARGET).bin +# @7z u -mx -m0=LZMA2 fastboot3DS$(VERS_STRING).7z README.md diff --git a/Makefile.arm11 b/Makefile.arm11 index df3f201..bc0c0f2 100644 --- a/Makefile.arm11 +++ b/Makefile.arm11 @@ -1,100 +1,142 @@ +#--------------------------------------------------------------------------------- .SUFFIXES: - +#--------------------------------------------------------------------------------- ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") endif -# Sources and defines -TARGET := code11 -BUILD := build11 -INCLUDES := include -SOURCES := source source/arm11 -DEFINES := -DARM11 -D_3DS -DATA := +include $(DEVKITARM)/base_rules - -# Compiler settings -ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -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 arm11.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 - +#--------------------------------------------------------------------------------- +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +# DATA is a list of directories containing binary files +# all directories are relative to this makefile +#--------------------------------------------------------------------------------- +BUILD := build11 +SOURCES := source source/arm11 +INCLUDES := include +DEFINES := -DARM11 -D_3DS -DVERS_STRING=\"$(VERS_STRING)\" \ + -DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR) +DATA := +LDNAME := arm11.ld ifneq ($(strip $(NO_DEBUG)),) DEFINES += -DNDEBUG endif -.PHONY: clean release +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mthumb-interwork -# Main target -$(TARGET).bin: $(TARGET).elf +CFLAGS := $(ARCH) -std=c11 -O2 -g -fstrict-aliasing -mword-relocations -fomit-frame-pointer \ + -ffast-math -ffunction-sections -Wall -Wextra +CFLAGS += $(INCLUDE) $(DEFINES) + +CXXFLAGS := $(ARCH) -std=c11 -O2 -g -fno-rtti -fno-exceptions -fstrict-aliasing \ + -mword-relocations -fomit-frame-pointer -ffast-math -ffunction-sections -Wall -Wextra +CXXFLAGS += $(INCLUDE) $(DEFINES) + +ASFLAGS := $(ARCH) -g $(INCLUDE) $(DEFINES) + +LDFLAGS = $(ARCH) -g -Wl,--use-blx,--gc-sections,-Map,$(notdir $*.map) -nostartfiles -T ../$(LDNAME) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# 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)11 +export DEPSDIR := $(CURDIR)/$(BUILD) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(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))) +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 +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(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) + +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.arm11 + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) *.elf *.nds* *.bin + + +#--------------------------------------------------------------------------------- +else + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).bin : $(OUTPUT).elf @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) -$(TARGET).elf: $(BUILD) $(OFILES) +$(OUTPUT).elf : $(OFILES) -clean: - @echo clean ... - @rm -rf $(BUILD) $(TARGET).bin $(TARGET).elf - -release: - @$(MAKE) --no-print-directory -f Makefile.arm11 NO_DEBUG=1 - - -$(BUILD): - @mkdir -p $(BUILD) +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) %.elf: @echo linking $(notdir $@) - $(LD) $(LDFLAGS) $(OFILES) -o $@ + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) -$(BUILD)/%.bin.o: %.bin - @echo $(notdir $<) - bin2s $< | $(AS) -o $(@) - echo "extern const u8" `(echo $( $(BUILD)/`(echo $(> $(BUILD)/`(echo $(> $(BUILD)/`(echo $(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 +include $(DEVKITARM)/base_rules - -# 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 - +#--------------------------------------------------------------------------------- +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +# DATA is a list of directories containing binary files +# all directories are relative to this makefile +#--------------------------------------------------------------------------------- +BUILD := build9 +SOURCES := source source/arm9 thirdparty/fatfs +INCLUDES := include thirdparty +DEFINES := -DARM9 -D_3DS -DVERS_STRING=\"$(VERS_STRING)\" \ + -DVERS_MAJOR=$(VERS_MAJOR) -DVERS_MINOR=$(VERS_MINOR) +DATA := data +LDNAME := arm9.ld ifneq ($(strip $(NO_DEBUG)),) DEFINES += -DNDEBUG endif -ifeq ($(strip $(NO_COMMIT_HASH)),) - VERSION_STR := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/i') + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +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 +CFLAGS += $(INCLUDE) $(DEFINES) + +CXXFLAGS := $(ARCH) -std=c11 -O2 -g -fno-rtti -fno-exceptions -fstrict-aliasing \ + -mword-relocations -fomit-frame-pointer -ffast-math -ffunction-sections -Wall -Wextra +CXXFLAGS += $(INCLUDE) $(DEFINES) + +ASFLAGS := $(ARCH) -g $(INCLUDE) $(DEFINES) + +LDFLAGS = $(ARCH) -g -Wl,--use-blx,--gc-sections,-Map,$(notdir $*.map) -nostartfiles -T ../$(LDNAME) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# 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)9 +export DEPSDIR := $(CURDIR)/$(BUILD) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(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))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- else - VERSION_STR := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-.*//') +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- endif +#--------------------------------------------------------------------------------- -DEFINES += -DVER_STRING=\"$(VERSION_STR)\" -DEFINES += -DVER_MAJOR=$(shell echo "$(VERSION_STR)" | sed 's/v\([0-9]*\)\..*/\1/i') -DEFINES += -DVER_MINOR=$(shell echo "$(VERSION_STR)" | sed 's/.*\.\([0-9]*\).*/\1/') - - -.PHONY: clean release - -# Main target -$(TARGET).bin: $(TARGET).elf +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(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) + +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.arm9 + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) *.elf *.nds* *.bin + + +#--------------------------------------------------------------------------------- +else + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).bin : $(OUTPUT).elf @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) -$(TARGET).elf: $(BUILD) $(OFILES) +$(OUTPUT).elf : $(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) +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) %.elf: @echo linking $(notdir $@) - $(LD) $(LDFLAGS) $(OFILES) -o $@ + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) -$(BUILD)/%.bin.o: %.bin - @echo $(notdir $<) - bin2s $< | $(AS) -o $(@) - echo "extern const u8" `(echo $( $(BUILD)/`(echo $(> $(BUILD)/`(echo $(> $(BUILD)/`(echo $(