diff --git a/Makefile b/Makefile index 66eb52f..b49b4b4 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,33 @@ -.PHONY: all clean +.SUFFIXES: -all: code9.bin code11.bin firm.bin +TARGET := fastboot3ds.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 + +$(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) clean: - make clean -f Makefile.arm9 - make clean -f Makefile.arm11 - rm -fr firm.bin + @$(MAKE) --no-print-directory -f Makefile.arm9 clean + @$(MAKE) --no-print-directory -f Makefile.arm11 clean + @rm -rf $(TARGET) -code9.bin: - make -f Makefile.arm9 -code11.bin: - make -f Makefile.arm11 -firm.bin: - firm_builder firm.bin 0x08000054 0x1FF85040 0x08000040 0 code9.bin 0x1FF85000 1 code11.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) diff --git a/Makefile.arm11 b/Makefile.arm11 index 2c40a3f..df3f201 100644 --- a/Makefile.arm11 +++ b/Makefile.arm11 @@ -1,140 +1,100 @@ -#--------------------------------------------------------------------------------- .SUFFIXES: -#--------------------------------------------------------------------------------- ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") endif -include $(DEVKITARM)/3ds_rules +# Sources and defines +TARGET := code11 +BUILD := build11 +INCLUDES := include +SOURCES := source source/arm11 +DEFINES := -DARM11 -D_3DS +DATA := -#--------------------------------------------------------------------------------- -# 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 -# INCLUDES is a list of directories containing extra header files -# DATA is a list of directories containing binary files embedded using bin2o -# GRAPHICS is a list of directories containing image files to be converted with grit -#--------------------------------------------------------------------------------- -TARGET := code11 -BUILD := build11 -SOURCES := source source/arm11 -INCLUDES := include -DATA := -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -DEFINES := +# 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 -LDNAME := arm11.ld +PREFIX := arm-none-eabi- +CC := $(PREFIX)gcc +CXX := $(PREFIX)g++ +AS := $(PREFIX)as +OBJCOPY := $(PREFIX)objcopy -ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mthumb-interwork -DBGWARM := -Wextra -Wcast-align -Wcast-qual -Wdisabled-optimization \ - -Wformat=2 -Wlogical-op -Wmissing-include-dirs -Wredundant-decls \ - -Wshadow -Wsign-conversion -fstrict-overflow -Wstrict-overflow=5 \ - -Wswitch-default -Wundef +# Do not change anything after this +VPATH := $(DATA) $(SOURCES) -CFLAGS := -Wall $(DBGWARM) -fstrict-aliasing -Wstrict-aliasing -std=c11 -g -O2 \ - -mword-relocations -fomit-frame-pointer -ffast-math -ffunction-sections $(ARCH) +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))) -CFLAGS += $(INCLUDE) -DARM11 -D_3DS $(DEFINES) -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++11 +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)) -ASFLAGS := -g $(INCLUDE) $(ARCH) -DARM11 -D_3DS $(DEFINES) -LDFLAGS = -nostartfiles -T../$(LDNAME) $(CFLAGS) -Wl,-Map,$(notdir $*.map),--use-blx,--gc-sections +INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) -I$(BUILD) -#--------------------------------------------------------------------------------- -# any extra libraries we wish to link with the project (order is important) -#--------------------------------------------------------------------------------- -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) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ - $(foreach dir,$(GRAPHICS),$(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))) -PNGFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.png))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- + LD := $(CC) else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- + LD := $(CXX) endif -#--------------------------------------------------------------------------------- -export OFILES := $(addsuffix .o,$(BINFILES)) \ - $(PNGFILES:.png=.o) \ - $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) - -export INCLUDE := $(foreach dir,$(INCLUDES),-iquote $(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) $(TARGET).elf $(TARGET).bin -#--------------------------------------------------------------------------------- -else - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- +ifneq ($(strip $(NO_DEBUG)),) + DEFINES += -DNDEBUG +endif -$(OUTPUT).bin : $(OUTPUT).elf + +.PHONY: clean release + +# Main target +$(TARGET).bin: $(TARGET).elf @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) -$(OUTPUT).elf : $(OFILES) - -#--------------------------------------------------------------------------------- -%.bin.o : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - $(bin2o) +$(TARGET).elf: $(BUILD) $(OFILES) --include $(DEPSDIR)/*.d - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- +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) + +%.elf: + @echo linking $(notdir $@) + $(LD) $(LDFLAGS) $(OFILES) -o $@ + +$(BUILD)/%.bin.o: %.bin + @echo $(notdir $<) + bin2s $< | $(AS) -o $(@) + echo "extern const u8" `(echo $( $(BUILD)/`(echo $(> $(BUILD)/`(echo $(> $(BUILD)/`(echo $(devkitARM") endif -include $(DEVKITARM)/3ds_rules +# 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 -#--------------------------------------------------------------------------------- -# 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 -# INCLUDES is a list of directories containing extra header files -# DATA is a list of directories containing binary files embedded using bin2o -# GRAPHICS is a list of directories containing image files to be converted with grit -#--------------------------------------------------------------------------------- -TARGET := code9 -BUILD := build9 -SOURCES := source source/arm9 thirdparty/fatfs thirdparty/fatfs/option -INCLUDES := include thirdparty -DATA := data -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -DEFINES := +# 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 := $(DEFINES) -DNDEBUG + DEFINES += -DNDEBUG endif -LDNAME := arm9.ld - -ARCH := -march=armv5te -mtune=arm946e-s -mfloat-abi=soft -marm -mthumb-interwork - -DBGWARM := -Wextra -Wcast-align -Wcast-qual -Wdisabled-optimization \ - -Wformat=2 -Wlogical-op -Wmissing-include-dirs -Wredundant-decls \ - -Wshadow -fstrict-overflow \ - -Wswitch-default -Wundef - -CFLAGS := -Wall $(DBGWARM) -fstrict-aliasing -Wstrict-aliasing -std=c11 -g -O2 \ - -mword-relocations -fomit-frame-pointer -ffast-math -ffunction-sections $(ARCH) - -CFLAGS += $(INCLUDE) -DARM9 $(DEFINES) -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++11 - -ASFLAGS := -g $(INCLUDE) $(ARCH) -DARM9 $(DEFINES) -LDFLAGS = -nostartfiles -T../$(LDNAME) $(CFLAGS) -Wl,-Map,$(notdir $*.map),--use-blx,--gc-sections - -#--------------------------------------------------------------------------------- -# any extra libraries we wish to link with the project (order is important) -#--------------------------------------------------------------------------------- -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) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ - $(foreach dir,$(GRAPHICS),$(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))) -PNGFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.png))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- +ifeq ($(strip $(NO_COMMIT_HASH)),) + DEFINES += -DCOMMIT_HASH="\" $(shell git rev-parse --short=8 HEAD)\"" else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- + DEFINES += -DCOMMIT_HASH=\"\" endif -#--------------------------------------------------------------------------------- -export OFILES := $(addsuffix .o,$(BINFILES)) \ - $(PNGFILES:.png=.o) \ - $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) - -export INCLUDE := $(foreach dir,$(INCLUDES),-iquote $(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) $(TARGET).elf $(TARGET).bin -#--------------------------------------------------------------------------------- -else - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- +.PHONY: clean release -$(OUTPUT).bin : $(OUTPUT).elf +# Main target +$(TARGET).bin: $(TARGET).elf @$(OBJCOPY) -O binary $< $@ @echo built ... $(notdir $@) -$(OUTPUT).elf : $(OFILES) - -#--------------------------------------------------------------------------------- -%.bin.o : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - $(bin2o) +$(TARGET).elf: $(BUILD) $(OFILES) --include $(DEPSDIR)/*.d - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- +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 $( $(BUILD)/`(echo $(> $(BUILD)/`(echo $(> $(BUILD)/`(echo $(>16, BOOTLOADER_VERSION & 0xFFFFu); uiPrintTextAt(1, 4, "Model: %s", bootInfo.model);