Add Switch build support, clean up and document variables.

This commit is contained in:
Steveice10
2018-05-15 15:28:00 -07:00
parent bc0e4023c7
commit e76c10e126
3 changed files with 192 additions and 283 deletions
+182 -26
View File
@@ -1,10 +1,99 @@
# Make Variables
#
# TARGET: Optional; Platform to build for.
# - Supported values: NATIVE, NATIVE32, NATIVE64, WIN32, WIN64, MAC32, MAC64, LINUX32, LINUX64, 3DS, WIIU, SWITCH
# - Default value: NATIVE
# LIBRARY: Optional; Whether to output a library.
# - Supported values: 0, 1
# - Default value: 0
#
# All:
# - NAME: Project name.
# - INCLUDE_DIRS: Directories containing include headers.
# - SOURCE_DIRS: Directories containing source files to compile.
# - BUILD_DIR: Directory to store build files in.
# - OUTPUT_DIR: Directory to output the final results to.
# - LIBRARY_DIRS: Optional; Directories containing libraries to compile against.
# - LIBRARIES: Optional; Libraries to compile against.
# - EXTRA_OUTPUT_FILES: Optional; Extra files to copy to the output directory.
# - BUILD_FLAGS: Optional; Shared build flags.
# - BUILD_FLAGS_CC: Optional; C build flags.
# - BUILD_FLAGS_CXX: Optional; C++ build flags.
# - RUN_FLAGS: Optional; Flags to pass when running output executables.
# - VERSION_MAJOR: Optional; Major version number.
# - Default value: 0
# - VERSION_MINOR: Optional; Minor version number.
# - Default value: 0
# - VERSION_MICRO: Optional; Micro version number.
# - Default value: 0
#
# 3DS/Wii U/Switch:
# - TITLE: Optional; Formal application title, used in metadata.
# - Default value: NAME stripped of spaces.
# - AUTHOR: Optional; Application author.
# - Default value: "Unknown"
# - REMOTE_IP: Optional; IP to send executable to when running on hardware. Intended to be set in command line.
# - Default value: 127.0.0.1
#
# 3DS/Wii U:
# - DESCRIPTION: Optional; Application description.
# - Default value: "No description."
#
# 3DS:
# - PRODUCT_CODE: CIA/3DS product code.
# - UNIQUE_ID: CIA/3DS unique ID.
# - BANNER_AUDIO: Audio file to use in the CIA/3DS banner.
# - Supported file types: WAV, CWAV
# - BANNER_IMAGE: Graphics to use in the CIA/3DS banner.
# - Supported file types: 256x128 PNG, CGFX
# - ICON: Application icon.
# - Supported file types: 48x48 PNG
# - Category: Optional; CIA/3DS category.
# - Supported values: Application, SystemApplication, Applet, Firmware, Base, DlpChild, Demo, Contents, SystemContents, SharedContents, AddOnContents, Patch, AutoUpdateContents
# - Default value: Application
# - USE_ON_SD: Optional; Whether the CIA/3DS should be installed to the SD card.
# - Supported values: true, false
# - Default value: true
# - MEMORY_TYPE: Optional; CIA/3DS application memory layout.
# - Supported values: Application, System, Base
# - Default value: Application
# - SYSTEM_MODE: Optional; CIA/3DS legacy system mode.
# - Supported values: 32MB, 64MB, 72MB, 80MB, 96MB
# - Default value: 64MB
# - SYSTEM_MODE_EXT: Optional; CIA/3DS extended system mode.
# - Supported values: Legacy, 124MB, 178MB
# - Default value: Legacy
# - CPU_MODE: Optional; CIA/3DS CPU frequency. 804MHz is N3DS-only.
# - Supported values: 268MHz, 804MHz
# - Default value: 268MHz
# - ENABLE_L2_CACHE: Optional; Whether the CIA/3DS should use the N3DS L2 cache.
# - Supported values: true, false
# - Default value: false
# - ICON_FLAGS: Optional; Flags to pass to bannertool when making an SMDH icon.
# - ROMFS_DIR: Optional; Directory containing RomFS files.
# - LOGO: Optional; Logo animation to use when launching the CIA/3DS.
# - Supported file types: BCMA.LZ
#
# Wii U:
# - ICON: Application icon.
# - Supported file types: 256x96 PNG
# - LONG_DESCRIPTION: Optional; Long version of the description field.
# - Default value: Value of DESCRIPTION.
#
# Switch:
# - TITLE_ID: Optional; Application title ID.
# - ICON: Optional; Application icon.
# - Supported file types: 256x256 JPEG
# PROLOGUE #
TARGET ?= NATIVE
LIBRARY ?= 0
ALL_PC_TARGETS := WIN32 WIN64 MAC32 MAC64 LINUX32 LINUX64
ALL_SPECIFIC_TARGETS := $(ALL_PC_TARGETS) 3DS WIIU
ALL_SPECIFIC_TARGETS := $(ALL_PC_TARGETS) 3DS WIIU SWITCH
ALL_TARGETS := NATIVE NATIVE32 NATIVE64 $(ALL_SPECIFIC_TARGETS)
TARGET ?= NATIVE
TARGETS :=
ifneq (1,$(words $(TARGET)))
@@ -27,21 +116,27 @@ ifneq ($(MAKECMDGOALS),clean)
$(info Building for $(TARGET)...)
endif
ifeq ($(TARGET),$(filter $(TARGET),3DS WIIU))
ifeq ($(TARGET),$(filter $(TARGET),3DS WIIU SWITCH))
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro")
endif
endif
ifeq ($(TARGET),3DS)
ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
ifeq ("$(wildcard $(DEVKITARM))","")
$(error "Please set a valid DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
endif
endif
ifeq ($(TARGET),WIIU)
ifeq ($(strip $(DEVKITPPC)),)
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC")
ifeq ("$(wildcard $(DEVKITPPC))","")
$(error "Please set a valid DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC")
endif
endif
ifeq ($(TARGET),SWITCH)
ifeq ("$(wildcard $(DEVKITA64))","")
$(error "Please set a valid DEVKITA64 in your environment. export DEVKITA64=<path to>devkitA64")
endif
endif
@@ -128,6 +223,9 @@ else ifeq ($(TARGET),3DS)
else ifeq ($(TARGET),WIIU)
TARGET_OS := wiiu
TARGET_ARCH := ppc
else ifeq ($(TARGET),SWITCH)
TARGET_OS := switch
TARGET_ARCH := aarch64
else
$(error "Unknown target. Supported targets: $(ALL_TARGETS)")
endif
@@ -165,6 +263,7 @@ endif
LD_FLAGS := $(patsubst %,-L%/lib,$(LIBRARY_DIRS)) $(patsubst %,-l%,$(LIBRARIES))
COMMON_CC_FLAGS := $(sort $(foreach dir,$(SOURCE_DIRS),$(patsubst %,-I$(TARGET_BUILD_DIR)/%,$(dir $(call rwildcard,$(dir),*))))) $(patsubst %,-I%,$(INCLUDE_DIRS)) $(patsubst %,-I%/include,$(LIBRARY_DIRS)) -g -Wall -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_MICRO=$(VERSION_MICRO) $(BUILD_FLAGS)
COMMON_CXX_FLAGS :=
ifeq ($(findstring -O,$(BUILD_FLAGS)),)
COMMON_CC_FLAGS += -O2
@@ -179,6 +278,13 @@ endif
# TARGET SETUP #
REMOTE_IP ?= 127.0.0.1 # User-defined
TITLE ?= $(NAME)
AUTHOR ?= "Unknown"
DESCRIPTION ?= "No description."
LONG_DESCRIPTION ?= $(DESCRIPTION)
ifeq ($(TARGET_OS),windows)
ifeq ($(HOST_OS),windows)
AR := ar
@@ -282,23 +388,11 @@ else ifeq ($(TARGET_OS),3ds)
OBJECT_FILES := $(filter-out $(BUILT_FILTER),$(OBJECT_FILES))
REMOTE_IP ?= 127.0.0.1 # User-defined
TITLE ?= $(NAME)
CATEGORY ?= Application
USE_ON_SD ?= true
MEMORY_TYPE ?= Application
CPU_SPEED ?= 268MHz
ENABLE_L2_CACHE ?= true
AR := $(DEVKITARM)/bin/arm-none-eabi-ar
AS := $(DEVKITARM)/bin/arm-none-eabi-as
CC := $(DEVKITARM)/bin/arm-none-eabi-gcc
CXX := $(DEVKITARM)/bin/arm-none-eabi-g++
SERVEFILES := python $(BUILDTOOLS_DIR)/3ds/servefiles.py
ifeq ($(LIBRARY),1)
OUTPUT_FILES := $(TARGET_OUTPUT_DIR)/lib/$(STRIPPED_NAME).a
else
@@ -308,6 +402,16 @@ else ifeq ($(TARGET_OS),3ds)
LD_FLAGS += -specs=3dsx.specs
COMMON_CC_FLAGS += -mword-relocations -ffast-math -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft -DARM11 -D_3DS
SERVEFILES := python $(BUILDTOOLS_DIR)/3ds/servefiles.py
CATEGORY ?= Application
USE_ON_SD ?= true
MEMORY_TYPE ?= Application
SYSTEM_MODE ?= 64MB
SYSTEM_MODE_EXT ?= Legacy
CPU_SPEED ?= 268MHz
ENABLE_L2_CACHE ?= false
_3DSXTOOL_FLAGS :=
COMMON_MAKEROM_FLAGS := -rsf $(BUILDTOOLS_DIR)/3ds/template.rsf -target t -exefslogo -icon $(TARGET_BUILD_DIR)/icon.icn -banner $(TARGET_BUILD_DIR)/banner.bnr -major $(VERSION_MAJOR) -minor $(VERSION_MINOR) -micro $(VERSION_MICRO) -DAPP_TITLE="$(TITLE)" -DAPP_PRODUCT_CODE="$(PRODUCT_CODE)" -DAPP_UNIQUE_ID="$(UNIQUE_ID)" -DAPP_SYSTEM_MODE="$(SYSTEM_MODE)" -DAPP_SYSTEM_MODE_EXT="$(SYSTEM_MODE_EXT)" -DAPP_CATEGORY="$(CATEGORY)" -DAPP_USE_ON_SD="$(USE_ON_SD)" -DAPP_MEMORY_TYPE="$(MEMORY_TYPE)" -DAPP_CPU_SPEED="$(CPU_SPEED)" -DAPP_ENABLE_L2_CACHE="$(ENABLE_L2_CACHE)" -DAPP_VERSION_MAJOR="$(VERSION_MAJOR)"
@@ -334,15 +438,11 @@ else ifeq ($(TARGET_OS),3ds)
BANNER_AUDIO_ARG := -a
endif
else ifeq ($(TARGET_OS),wiiu)
REMOTE_IP ?= 127.0.0.1 # User-defined
AR := $(DEVKITPPC)/bin/powerpc-eabi-ar
AS := $(DEVKITPPC)/bin/powerpc-eabi-as
CC := $(DEVKITPPC)/bin/powerpc-eabi-gcc
CXX := $(DEVKITPPC)/bin/powerpc-eabi-g++
WIILOAD_BIN := $(DEVKITPPC)/bin/wiiload
ifeq ($(LIBRARY),1)
OUTPUT_FILES := $(TARGET_OUTPUT_DIR)/lib/$(STRIPPED_NAME).a
else
@@ -351,6 +451,33 @@ else ifeq ($(TARGET_OS),wiiu)
LD_FLAGS += -Wl,-d,--gc-sections
COMMON_CC_FLAGS += -mwup -mcpu=750 -meabi -mhard-float -ffast-math -DESPRESSO -DWIIU
else ifeq ($(TARGET_OS),switch)
AR := $(DEVKITA64)/bin/aarch64-none-elf-ar
AS := $(DEVKITA64)/bin/aarch64-none-elf-as
CC := $(DEVKITA64)/bin/aarch64-none-elf-gcc
CXX := $(DEVKITA64)/bin/aarch64-none-elf-g++
ifeq ($(LIBRARY),1)
OUTPUT_FILES := $(TARGET_OUTPUT_DIR)/lib/$(STRIPPED_NAME).a
else
OUTPUT_FILES := $(TARGET_OUTPUT_DIR)/$(STRIPPED_NAME).elf $(TARGET_OUTPUT_DIR)/switch/$(STRIPPED_NAME).nro
endif
LD_FLAGS += -specs=$(DEVKITPRO)/libnx/switch.specs
COMMON_CC_FLAGS += -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -D__SWITCH__
COMMON_CXX_FLAGS += -fno-rtti -fno-exceptions
NRO_FLAGS :=
ifneq ("$(wildcard $(ICON))","")
NRO_FLAGS += --icon=$(ICON)
endif
NACP_FLAGS :=
ifneq ($(TITLE_ID),)
NACP_FLAGS += --titleid=$(TITLE_ID)
endif
endif
# FINAL COMMON SETUP #
@@ -368,10 +495,10 @@ ifeq ($(CLANG_CXX_EXISTS),0)
endif
CC_FLAGS := $(COMMON_CC_FLAGS) $(BUILD_FLAGS_CC)
CXX_FLAGS := $(COMMON_CC_FLAGS) $(BUILD_FLAGS_CXX)
CXX_FLAGS := $(COMMON_CC_FLAGS) $(COMMON_CXX_FLAGS) $(BUILD_FLAGS_CXX)
ifeq ($(findstring -std,$(BUILD_FLAGS_CC)),)
CC_FLAGS += -std=gnu99
CC_FLAGS += -std=gnu11
endif
ifeq ($(findstring -std,$(BUILD_FLAGS_CXX)),)
@@ -478,7 +605,7 @@ else
runhw: $(OUTPUT_ZIP_FILE)
@echo "Running..."
@WIILOAD=tcp:$(REMOTE_IP) $(WIILOAD_BIN) $(TARGET_OUTPUT_DIR)/wiiu/apps/$(STRIPPED_NAME)/$(STRIPPED_NAME).elf $(RUN_FLAGS)
@WIILOAD=tcp:$(REMOTE_IP) wiiload $(TARGET_OUTPUT_DIR)/wiiu/apps/$(STRIPPED_NAME)/$(STRIPPED_NAME).elf $(RUN_FLAGS)
endif
@@ -496,6 +623,35 @@ $(TARGET_OUTPUT_DIR)/wiiu/apps/$(STRIPPED_NAME)/icon.png:
@echo $@
@cp $(ICON) $(TARGET_OUTPUT_DIR)/wiiu/apps/$(STRIPPED_NAME)/icon.png
else ifeq ($(TARGET_OS),switch)
ifeq ($(LIBRARY),1)
install: $(OUTPUT_ZIP_FILE)
@mkdir -p $(DEVKITPRO)/$(STRIPPED_NAME)
@cp -r $(TARGET_OUTPUT_DIR)/* $(DEVKITPRO)/$(STRIPPED_NAME)
@echo "Installed."
else
run: $(OUTPUT_ZIP_FILE)
@echo "Running..."
@yuzu-cmd $(RUN_FLAGS) $(TARGET_OUTPUT_DIR)/switch/$(STRIPPED_NAME).nro
runhw: $(OUTPUT_ZIP_FILE)
@echo "Running..."
@nxlink --address $(REMOTE_IP) $(TARGET_OUTPUT_DIR)/switch/$(STRIPPED_NAME).nro
endif
%.nacp:
@echo $@
@nacptool --create "$(TITLE)" "$(AUTHOR)" "$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_MICRO)" $@ $(NACP_FLAGS)
$(TARGET_OUTPUT_DIR)/switch/%.nro: $(TARGET_OUTPUT_DIR)/%.elf $(TARGET_BUILD_DIR)/meta.nacp
@echo $@
@elf2nro $< $@ --nacp=$(word 2,$^) $(NRO_FLAGS)
else ifeq ($(TARGET_OS),windows)
ifeq ($(HOST_OS),$(filter $(HOST_OS),linux mac))
ifneq ($(LIBRARY),1)