Switch Homebrew 开发 Makefile 指南
#--------------------------------------------------------------------------------- .SUFFIXES: #---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITPRO)),)
$(error 'Please set DEVKITPRO in your environment. export DEVKITPRO=
TOPDIR ?= $(CURDIR) include $(DEVKITPRO)/libnx/switch_rules
#---------------------------------------------------------------------------------
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
DATA is a list of directories containing data files
INCLUDES is a list of directories containing header files
ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional)
NO_ICON: if set to anything, do not use icon.
NO_NACP: if set to anything, no .nacp file is generated.
APP_TITLE is the name of the app stored in the .nacp file (Optional)
APP_AUTHOR is the author of the app stored in the .nacp file (Optional)
APP_VERSION is the version of the app stored in the .nacp file (Optional)
APP_TITLEID is the titleID of the app stored in the .nacp file (Optional)
ICON is the filename of the icon (.jpg), relative to the project folder.
If not set, it attempts to use one of the following (in this order):
- .jpg
- icon.jpg
- /default_icon.jpg
CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder.
If not set, it attempts to use one of the following (in this order):
- .json
- config.json
If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead
of a homebrew executable (.nro). This is intended to be used for sysmodules.
NACP building is skipped as well.
#--------------------------------------------------------------------------------- TARGET := $(notdir $(CURDIR)) BUILD := build SOURCES := source DATA := data INCLUDES := include #ROMFS := romfs
#---------------------------------------------------------------------------------
options for code generation
#--------------------------------------------------------------------------------- ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
CFLAGS := -g -Wall -O2 -ffunction-sections
$(ARCH) $(DEFINES)
CFLAGS += $(INCLUDE) -D__SWITCH__
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
ASFLAGS := -g $(ARCH) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
LIBS := -lnx
#---------------------------------------------------------------------------------
list of directories containing libraries, this must be the top level containing
include and lib
#--------------------------------------------------------------------------------- LIBDIRS := $(PORTLIBS) $(LIBNX)
#---------------------------------------------------------------------------------
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 TOPDIR := $(CURDIR)
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))
$(foreach dir,$(DATA),$(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))) 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_BIN := $(addsuffix .o,$(BINFILES)) export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) export OFILES := $(OFILES_BIN) $(OFILES_SRC) export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES)))
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)
ifeq ($(strip $(CONFIG_JSON)),) jsons := $(wildcard *.json) ifneq (,$(findstring $(TARGET).json,$(jsons))) export APP_JSON := $(TOPDIR)/$(TARGET).json else ifneq (,$(findstring config.json,$(jsons))) export APP_JSON := $(TOPDIR)/config.json endif endif else export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) endif
ifeq ($(strip $(ICON)),) icons := $(wildcard *.jpg) ifneq (,$(findstring $(TARGET).jpg,$(icons))) export APP_ICON := $(TOPDIR)/$(TARGET).jpg else ifneq (,$(findstring icon.jpg,$(icons))) export APP_ICON := $(TOPDIR)/icon.jpg endif endif else export APP_ICON := $(TOPDIR)/$(ICON) endif
ifeq ($(strip $(NO_ICON)),) export NROFLAGS += --icon=$(APP_ICON) endif
ifeq ($(strip $(NO_NACP)),) export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp endif
ifneq ($(APP_TITLEID),) export NACPFLAGS += --titleid=$(APP_TITLEID) endif
ifneq ($(ROMFS),) export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) endif
.PHONY: $(BUILD) clean all
#--------------------------------------------------------------------------------- all: $(BUILD)
$(BUILD): @[ -d $@ ] || mkdir -p $@ @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
#--------------------------------------------------------------------------------- clean: @echo clean ... ifeq ($(strip $(APP_JSON)),) @rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf else @rm -fr $(BUILD) $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf endif
#--------------------------------------------------------------------------------- else .PHONY: all
DEPENDS := $(OFILES:.o=.d)
#---------------------------------------------------------------------------------
main targets
#--------------------------------------------------------------------------------- ifeq ($(strip $(APP_JSON)),)
all : $(OUTPUT).nro
ifeq ($(strip $(NO_NACP)),) $(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp else $(OUTPUT).nro : $(OUTPUT).elf endif
else
all : $(OUTPUT).nsp
$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm
$(OUTPUT).nso : $(OUTPUT).elf
endif
$(OUTPUT).elf : $(OFILES)
$(OFILES_SRC) : $(HFILES_BIN)
#---------------------------------------------------------------------------------
you need a rule like this for each extension you use as binary data
#--------------------------------------------------------------------------------- %.bin.o %_bin.h : %.bin #--------------------------------------------------------------------------------- @echo $(notdir $<) @$(bin2o)
-include $(DEPENDS)
#--------------------------------------------------------------------------------------- endif #---------------------------------------------------------------------------------------
原文地址: https://www.cveoy.top/t/topic/nJBg 著作权归作者所有。请勿转载和采集!