Since nobody has decided what the hell to use yet, there's three types of paths supported here:
* root=clusterfuck (default) - What you're used to. Clutter on the root.
* root=shadowhand - @RShadowhand style paths - jailed in /homebrew/3ds.
* root=cruel - @Cruel style paths - CFW relevant data in /3ds/apps folder and transient and user-supplied data in /3ds/appdata
# If unset, the primary folder is /corbenik.
fw_folder ?= corbenik
+# Other valid options:
+# shadowhand
+# cruel
+root ?= clusterfuck
+
+ifeq "$(root)" "clusterfuck"
+ PATHARGS := -DPATH_ROOT=\"\"
+ PATHARGS += -DPATH_DATA=\"/$(fw_folder)\"
+else ifeq "$(root)" "cruel"
+ PATHARGS := -DPATH_ROOT=\"/3ds/apps\"
+ PATHARGS += -DPATH_DATA=\"/3ds/appdata/$(fw_folder)\"
+else ifeq "$(root)" "shadowhand"
+ PATHARGS := -DPATH_ROOT=\"/homebrew/3ds\"
+ PATHARGS += -DPATH_DATA=\"/homebrew/3ds/$(fw_folder)\"
+endif
+
dir_source := source
dir_data := data
dir_build := build
CHAINLOADER ?= 1
CROSS_ASFLAGS := -mlittle-endian -mcpu=arm946e-s -march=armv5te
-CROSS_CFLAGS := -MMD -MP -Wall -Wextra -Werror -fomit-frame-pointer -Os $(ASFLAGS) -fshort-wchar -fno-builtin -std=gnu11 -DVERSION=\"$(REVISION)\" -DREL=\"$(REL)\" -DCHAINLOADER=$(CHAINLOADER) -DPATH_CFW=\"/$(fw_folder)\" -DFW_NAME=\"$(fw_name)\"
+CROSS_CFLAGS := -MMD -MP -Wall -Wextra -Werror -fomit-frame-pointer -Os $(ASFLAGS) -fshort-wchar -fno-builtin -std=gnu11 -DVERSION=\"$(REVISION)\" -DREL=\"$(REL)\" -DCHAINLOADER=$(CHAINLOADER) -DPATH_CFW=\"/$(fw_folder)\" -DFW_NAME=\"$(fw_name)\" $(PATHARGS)
CROSS_FLAGS := dir_out=$(abspath $(dir_out)) --no-print-directory
CROSS_LDFLAGS := -nostdlib -Wl,-z,defs -lgcc -Wl,-Map,$(dir_build)/link.map
.PHONY: hosttools
hosttools:
- make -C host/bdfe dir_out=$(dir_out) fw_folder=$(fw_folder)
+ make -C host/bdfe dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root)
.PHONY: font
font: hosttools
.PHONY: contrib
contrib:
- make -C contrib dir_out=$(dir_out) fw_name=$(fw_name) fw_folder=$(fw_folder)
+ make -C contrib dir_out=$(dir_out) fw_name=$(fw_name) fw_folder=$(fw_folder) root=$(root)
.PHONY: external
external:
- make -C external dir_out=$(dir_out) fw_name=$(fw_name) fw_folder=$(fw_folder) CHAINLOADER=$(CHAINLOADER)
+ make -C external dir_out=$(dir_out) fw_name=$(fw_name) fw_folder=$(fw_folder) CHAINLOADER=$(CHAINLOADER) root=$(root)
.PHONY: patch
patch:
- make -C patch dir_out=$(dir_out) fw_name=$(fw_name) fw_folder=$(fw_folder)
+ make -C patch dir_out=$(dir_out) fw_name=$(fw_name) fw_folder=$(fw_folder) root=$(root)
.PHONY: a9lh
a9lh: $(dir_out)/arm9loaderhax.bin
.PHONY: clean
clean:
rm -f host/{font-emit,font.h,font_prop.h,termfont.bin}
- make -C external dir_out=$(dir_out) fw_folder=$(fw_folder) clean
- make -C patch dir_out=$(dir_out) fw_folder=$(fw_folder) clean
- make -C host/bdfe dir_out=$(dir_out) fw_folder=$(fw_folder) clean
+ make -C external dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root) clean
+ make -C patch dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root) clean
+ make -C host/bdfe dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root) clean
rm -rf $(dir_out) $(dir_build)
.PHONY: $(dir_out)/arm9loaderhax.bin
.PHONY: loader
loader:
- make -C loader
+ make -C loader dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root)
.PHONY: bits
bits:
- make -C bits
+ make -C bits dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root)
.PHONY: screeninit
screeninit:
- make -C screeninit
+ make -C screeninit dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root)
.PHONY: clean_loader
clean_loader:
- make -C loader clean
+ make -C loader dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root) clean
.PHONY: clean_bits
clean_bits:
- make -C bits clean
+ make -C bits dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root) clean
.PHONY: clean_screeninit
screeninit_clean:
- make -C screeninit clean
+ make -C screeninit dir_out=$(dir_out) fw_folder=$(fw_folder) root=$(root) clean
TOPDIR ?= $(CURDIR)
MAKEROM ?= makerom
-PYTHON ?= python3
+PYTHON ?= python2
include $(DEVKITARM)/3ds_rules
+ifeq "$(root)" "clusterfuck"
+ PATHARGS := -DPATH_ROOT=\"\"
+ PATHARGS += -DPATH_DATA=\"/$(fw_folder)\"
+else ifeq "$(root)" "cruel"
+ PATHARGS := -DPATH_ROOT=\"/3ds/apps\"
+ PATHARGS += -DPATH_DATA=\"/3ds/appdata/$(fw_folder)\"
+else ifeq "$(root)" "shadowhand"
+ PATHARGS := -DPATH_ROOT=\"/homebrew/3ds\"
+ PATHARGS += -DPATH_DATA=\"/homebrew/3ds/$(fw_folder)\"
+endif
+
#---------------------------------------------------------------------------------
# TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed
-fomit-frame-pointer -ffunction-sections -fdata-sections -fshort-wchar \
$(ARCH)
-CFLAGS += $(INCLUDE) -DARM11 -D_3DS -DLOADER=1 -DPATH_CFW=\"/$(fw_folder)\"
+CFLAGS += $(INCLUDE) -DARM11 -D_3DS -DLOADER=1 -DPATH_CFW=\"/$(fw_folder)\" $(PATHARGS)
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu99
#define PATCH_DISABLED (1 << 2) // Do not allow changing this patch's status. With PATCH_MANDATORY,
// this prevents disabling it.
+#ifndef PATH_ROOT
+#define PATH_ROOT "" // Root "storage" directory. Nothing by default (e.g. root clutter mode)
+#endif
+
// You can redefine this in the Makefile, if you'd like.
// Recommended names for being silly:
// Windows
// system
-#ifndef PATH_CFW
-#define PATH_CFW "/corbenik" // CFW root directory.
-#endif
-#define PATH_CONFIG_DIR PATH_CFW "/config" // Config file directory.
-#define PATH_CONFIG PATH_CONFIG_DIR "/main.conf" // Config file.
-#define PATH_CPU_CFG PATH_CONFIG_DIR "/cpu.conf" // CPU settings config
+//#ifndef PATH_CFW
+//#define PATH_CFW "/corbenik" // CFW root directory.
+//#endif
+
+//#ifndef PATH_DATA
+//#define PATH_DATA PATH_ROOT PATH_CFW // Data "storage" directory. Nothing by default (e.g. root clutter mode)
+//#endif
-#define PATH_LOCEMU PATH_CFW "/locale" // Locale emulation config
+#define PATH_MODULES PATH_ROOT PATH_CFW "/module" // Sysmodule location
+#define PATH_PATCHES PATH_ROOT PATH_CFW "/patch" // Patch binary folder.
-#define PATH_PATCHES PATH_CFW "/patch" // Patch binary folder.
-#define PATH_FIRMWARES PATH_CFW "/firmware" // Firmware folder.
-#define PATH_MODULES PATH_CFW "/module" // Sysmodule location
+#define PATH_BITS PATH_ROOT PATH_CFW "/bits" // Path to misc bits we need (emunand code, reboot code, etc)
+
+#define PATH_EMUNAND_CODE PATH_BITS "/emunand.bin" // Emunand hook.
+#define PATH_SCREENINIT_CODE PATH_BITS "/screeninit.bin" // Screeninit code (ARM11)
+#define PATH_BACKDOOR PATH_BITS "/backdoor.bin" // svcBackdoor
+#define PATH_REBOOT_HOOK PATH_BITS "/reboot_hook.bin" // Reboot hook
+#define PATH_REBOOT_CODE PATH_BITS "/reboot_code.bin" // Reboot entry code
-#define PATH_CHAINS PATH_CFW "/chain"
+#define PATH_CHAINS PATH_DATA "/chain"
-#define PATH_TEMP PATH_CFW "/cache" // Files that are transient and used to speed operation
+#define PATH_TEMP PATH_DATA "/cache" // Files that are transient and used to speed operation
#define PATH_LOADER_CACHE PATH_TEMP "/loader" // Cached patch bytecode for loader.
+#define PATH_LOCEMU PATH_DATA "/locale" // Locale emulation config
+#define PATH_FIRMWARES PATH_DATA "/firmware" // Firmware folder.
+
+#define PATH_CONFIG_DIR PATH_DATA "/config" // Config file directory.
+#define PATH_CONFIG PATH_CONFIG_DIR "/main.conf" // Config file.
+#define PATH_CPU_CFG PATH_CONFIG_DIR "/cpu.conf" // CPU settings config
+
#define PATH_NATIVE_P PATH_TEMP "/p_native"
#define PATH_AGB_P PATH_TEMP "/p_agb"
#define PATH_TWL_P PATH_TEMP "/p_twl"
-#define PATH_KEYS PATH_CFW "/keys" // Keyfiles will be loaded from this dir, and
+#define PATH_KEYS PATH_DATA "/keys" // Keyfiles will be loaded from this dir, and
// additionally the root if not found.
-#define PATH_EXEFS PATH_CFW "/exe" // ExeFS overrides/dumps, named by titleid
+#define PATH_EXEFS PATH_DATA "/exe" // ExeFS overrides/dumps, named by titleid
#define PATH_EXEFS_TEXT PATH_EXEFS "/text" // Text segment overrides/dumps, named by titleid
#define PATH_EXEFS_RO PATH_EXEFS "/ro" // RO segment overrides/dumps, named by titleid
#define PATH_EXEFS_DATA PATH_EXEFS "/data" // Data segment overrides/dumps, named by titleid
-#define PATH_BITS PATH_CFW "/bits" // Path to misc bits we need (emunand code, reboot code, etc)
-
-#define PATH_EMUNAND_CODE PATH_BITS "/emunand.bin" // Emunand hook.
-#define PATH_SCREENINIT_CODE PATH_BITS "/screeninit.bin" // Screeninit code (ARM11)
-#define PATH_BACKDOOR PATH_BITS "/backdoor.bin" // svcBackdoor
-#define PATH_REBOOT_HOOK PATH_BITS "/reboot_hook.bin" // Reboot hook
-#define PATH_REBOOT_CODE PATH_BITS "/reboot_code.bin" // Reboot entry code
-
#define PATH_NATIVE_F PATH_FIRMWARES "/native"
#define PATH_AGB_F PATH_FIRMWARES "/agb"
#define PATH_TWL_F PATH_FIRMWARES "/twl"