#! make -f #---------------------------------------------------------------------------- # Project: CtrFirm - modulerules - common rules for build system # File: modulerules # # Copyright 2008-2009 Nintendo. All rights reserved. # # These coded instructions, statements, and computer programs contain # proprietary information of Nintendo of America Inc. and/or Nintendo # Company Ltd., and are protected by Federal copyright law. They may # not be disclosed to third parties or copied or duplicated in any form, # in whole or in part, without the prior written consent of Nintendo. # # $Date:: $ # $Rev$ # $Author$ #---------------------------------------------------------------------------- ifndef CTRSDK_MODULERULES_ #---------------------------------------------------------------------------- # Implicit RULES #---------------------------------------------------------------------------- .SUFFIXES: # Delete all suffix rules ifneq ($(CTR_FORCE_BUILD),) #VPATH = $(SRCDIR) vpath %.c $(SRCDIR) vpath %.cpp $(SRCDIR) vpath %.cxx $(SRCDIR) vpath %.s $(SRCDIR) SSRCFILES = $(addprefix $(OBJDIR)/,$(notdir $(SRCS))) ASRCFILES = $(addprefix $(OBJDIR)/,$(notdir $(SRCS_AUTOLOAD))) VSRCFILES = $(addprefix $(OBJDIR)/,$(notdir $(SRCS_OVERLAY))) SOBJS_CC = $(filter %.o,$(SSRCFILES:.c=.o)) SOBJS_AS = $(filter %.o,$(SSRCFILES:.s=.o)) SOBJS_CXX = $(filter %.o,$(SSRCFILES:.cpp=.o)) AOBJS_CC = $(filter %.o,$(ASRCFILES:.c=.o)) AOBJS_AS = $(filter %.o,$(ASRCFILES:.s=.o)) AOBJS_CXX = $(filter %.o,$(ASRCFILES:.cpp=.o)) VOBJS_CC = $(filter %.o,$(VSRCFILES:.c=.o)) VOBJS_AS = $(filter %.o,$(VSRCFILES:.s=.o)) VOBJS_CXX = $(filter %.o,$(VSRCFILES:.cpp=.o)) OBJS_CC = $(SOBJS_CC) $(AOBJS_CC) $(VOBJS_CC) OBJS_AS = $(SOBJS_AS) $(AOBJS_AS) $(VOBJS_AS) OBJS_CXX = $(SOBJS_CXX) $(AOBJS_CXX) $(VOBJS_CXX) OBJS_STATIC = $(SOBJS_CC) $(SOBJS_AS) $(SOBJS_CXX) $(EXT_OBJS) OBJS_AUTOLOAD = $(AOBJS_CC) $(AOBJS_AS) $(AOBJS_CXX) $(EXT_OBJS_AUTOLOAD) OBJS_OVERLAY = $(VOBJS_CC) $(VOBJS_AS) $(VOBJS_CXX) $(EXT_OBJS_OVERLAY) OBJS = $(OBJS_STATIC) $(OBJS_AUTOLOAD) $(OBJS_OVERLAY) -include $(CTR_BUILDTOOLSDIR)/modulerules.cctype.$(CTR_CCTYPE) # Common Rules # .bin .srl ifdef CTR_MAKEROM # # MAKEROM # ROM_SPEC ?= $(DEFAULT_ROM_SPEC) MAKEROM_ARM11 ?= $(DEFAULT_MAKEROM_ARM11) MAKEROM_ARM9 ?= $(DEFAULT_MAKEROM_ARM9) MAKEROM_ROMROOT ?= $(DEFAULT_MAKEROM_ROMROOT) MAKEROM_ROMFILES ?= $(DEFAULT_MAKEROM_ROMFILES) MAKEROM_ROMSPEED ?= $(DEFAULT_MAKEROM_ROMSPEED) MAKEROM_FLAGS ?= MAKEROM_FLAGS += $(if $(CTR_FINALROM),,-F) MAKEROM_DEFS = -DCTRSDK_ROOT='$(ROOT)' \ -DTARGET_NAME='$(TARGET_NAME)' \ -DMAKEROM_ROMROOT='$(MAKEROM_ROMROOT)' \ -DMAKEROM_ROMFILES='$(MAKEROM_ROMFILES)' \ -DMAKEROM_ROMSPEED='$(MAKEROM_ROMSPEED)' \ -DBINDIR='$(BINDIR)' \ -DCOMPDIR='$(CTR_COMPONENTSDIR)' \ -DCOMPTYPE11='$(CTR_BUILDTYPE_ARM11)' \ -DCOMPTYPE9='$(CTR_BUILDTYPE_ARM9)' \ -DPROC='$(CODEGEN_PROC)' \ -DPLATFORM='$(CTR_PLATFORM)' \ -DCODEGEN='$(CODEGEN_ARCH)' \ -DBUILD='$(CTR_BUILD_DIR)' \ -DCOMPSUFFIX9='$(COMPSUFFIX)' \ -DCOMPSUFFIX7='' TARGET_ROM = $(strip $(findstring .srl,$(TARGET_BIN)) \ $(findstring .bin,$(TARGET_BIN))) ifneq ($(strip $(OBJS) $(LLIBRARIES)),) # any object? ifeq ($(CODEGEN_PROC),ARM11) SDEPENDS_BIN = $(BINDIR)/%.nef $(MAKEROM_ARM11) MAKEROM_DEFS += -DMAKEROM_ARM11='$(basename $@)' \ -DMAKEROM_ARM9='$(basename $(MAKEROM_ARM9))' else # !ARM11 SDEPENDS_BIN = $(BINDIR)/%.nef $(MAKEROM_ARM11) MAKEROM_DEFS += -DMAKEROM_ARM11='$(basename $(MAKEROM_ARM11))' \ -DMAKEROM_ARM9='$(basename $@)' endif # -ARM11 else # !OBJS !LLIBRARIES SDEPENDS_BIN = $(MAKEROM_ARM11) $(MAKEROM_ARM7) MAKEROM_DEFS += -DMAKEROM_ARM11='$(basename $(MAKEROM_ARM11))' \ -DMAKEROM_ARM9='$(basename $(MAKEROM_ARM9))' endif # -OBJS -LLIBRARIES ifndef USE_MY_RULE_BIN $(BINDIR)/%.bin $(BINDIR)/%.srl: $(SDEPENDS_BIN) $(ROM_SPEC) $(LDEPENDS_BIN) $(EDEPENDS_BIN) $(MAKEROM) $(MAKEROM_FLAGS) $(MAKEROM_DEFS) $(ROM_SPEC) $@ endif # -USE_MY_RULE_BIN $(BINDIR)/$(TARGET_SIGN_BIN): $(BINDIR)/$(TARGET_BIN) $(CTRSDK_ROOT)/tools/bin/attachsign.exe -D $(addprefix $(BINDIR)/,$(TARGET_BIN)) else # !CTR_MAKEROM # # ELFTOBIN # ifndef USE_MY_RULE_BIN ifeq ($(CODEGEN_PROC),ARM11) $(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.nef $(LDEPENDS_BIN) $(EDEPENDS_BIN) $(ELFTOBIN) $< $(ELFTOBIN_ARM7) $(ELFTOBIN_ROMHEADER) -o $@ else # !ARM11 $(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.nef $(LDEPENDS_BIN) $(EDEPENDS_BIN) $(ELFTOBIN) $(ELFTOBIN_ARM9) $< $(ELFTOBIN_ROMHEADER) -o $@ endif # -ARM11 endif # -USE_MY_RULE_BIN endif # -CTR_MAKEROM endif # -CTR_FORCE_BUILD # .bnr .bsf %.bnr: %.bsf $(MAKEBANNER) $(MAKEBANNER_FLAGS) $< $@ %.nbfc %.nbfp: %.bmp $(NTEXCONV) -no -bg -bgb -bgnc $< >/dev/null #---------------------------------------------------------------------------- # MAKE TARGETS #---------------------------------------------------------------------------- .PHONY: all default build install clean clobber full super-full BUILDCMDS = all default build #---------------------------------------------------------------------------- SUBDIR_FLAGS += $(if $(CTR_CODEGEN_ALL),CTR_CODEGEN_ALL=False) define MAKE_SUBDIR +$(foreach DIR,$(SUBDIRS),$(MAKE) $(SUBDIR_FLAGS) -C $(DIR) $(MAKECMDGOALS) $(AND)) true +$(foreach FILE,$(SUBMAKES),$(MAKE) $(SUBDIR_FLAGS) -C $(dir $(FILE)) -f $(notdir $(FILE)) $(MAKECMDGOALS) $(AND)) true endef ifeq ($(MAKEFILE),Makefile) MAKEFILE_ = else MAKEFILE_ = /$(MAKEFILE) endif define ECHO_CURDIR $(ECHO) "==== $(CURDIR)$(MAKEFILE_)"; endef define DO_INSTALL_FILES $(INSTALL) -d $(1) $(AND) \ $(foreach FILE, $(2), \ if [ ! -e $(1)/$(notdir $(FILE)) -o \ $(FILE) -nt $(1)/$(notdir $(FILE)) ]; \ then \ $(ECHO) " install: $(FILE) -> $(1)" $(AND) \ $(INSTALL) $(FILE) $(1)/$(notdir $(FILE)); \ fi $(AND) ) true endef DO_INSTALL = $(call DO_INSTALL_FILES,$(INSTALL_DIR),$(INSTALL_TARGETS)) INSTALL_INDEX_SRC = $(firstword $(INSTALL_TARGETS)) INSTALL_INDEX_DEST = $(INSTALL_DIR)/$(notdir $(INSTALL_INDEX_SRC)) define DO_INSTALL_WILDCARD $(INSTALL) -d $(INSTALL_DIR) $(AND) \ if [ ! -e $(INSTALL_INDEX_DEST) -o \ $(INSTALL_INDEX_SRC) -nt $(INSTALL_INDEX_DEST) ]; \ then \ $(foreach FILE, $(INSTALL_TARGETS), \ $(ECHO) " install: $(FILE) -> $(INSTALL_DIR)" $(AND) \ $(INSTALL) $(FILE) $(INSTALL_DIR) $(AND) ) true; \ fi endef #---------------------------------------------------------------------------- # make parallelly #---------------------------------------------------------------------------- SUBDIRS_PREFIX = make-subdir-p- SUBDIRS_PARALLEL = $(addprefix $(SUBDIRS_PREFIX),$(SUBDIRS_P)) $(SUBDIRS_PARALLEL):$(SUBDIRS_PREFIX)%: $(MAKE) -C $(*F) $(MAKECMDGOALS) #---------------------------------------------------------------------------- # make build #---------------------------------------------------------------------------- .PHONY: do-build build: @$(MAKE_SUBDIR) @$(ECHO_CURDIR) ifneq ($(strip $(NEWDIRS)),) @$(MKDIRP) $(NEWDIRS) endif @+$(REMAKE) do-build ifdef INSTALL_TARGETS @$(DO_INSTALL) endif ifeq ($(CTR_CODEGEN_ALL),True) ifeq ($(CTR_CODEGEN),ARM) @+$(REMAKE) CTR_CODEGEN_ALL=False CTR_CODEGEN=THUMB build endif endif #---------------------------------------------------------------------------- # make install #---------------------------------------------------------------------------- install: @$(MAKE_SUBDIR) @$(ECHO_CURDIR) ifdef INSTALL_TARGETS @$(DO_INSTALL) endif ifeq ($(CTR_CODEGEN_ALL),True) ifeq ($(CTR_CODEGEN),ARM) @+$(REMAKE) CTR_CODEGEN_ALL=False CTR_CODEGEN=THUMB install endif endif #---------------------------------------------------------------------------- # make full #---------------------------------------------------------------------------- define makefull @echo [[[ make full $(1) $(CURDIR) ]]] @+unset CTR_DEBUG CTR_RELEASE CTR_FINALROM CTR_CODEGEN_ALL; \ $(foreach b,FINALROM RELEASE DEBUG, \ $(foreach a,ARM THUMB, \ date "+::: %Y/%m/%d %H:%M:%S $a-$b" $(AND) \ $(REMAKE) CTR_$b=TRUE CTR_CODEGEN=$a CTR_CODEGEN_ALL=False $(1) $(AND) \ ) \ ) true endef full: $(call makefull,build) full-install: $(call makefull,install) #---------------------------------------------------------------------------- # make super-full #---------------------------------------------------------------------------- define makesuperfull @echo [[[ make super-full $(1) $(CURDIR) ]]] @+unset CTR_DEBUG CTR_RELEASE CTR_FINALROM CTR_CODEGEN_ALL; \ $(foreach p,TS TEG, \ $(foreach b,FINALROM RELEASE DEBUG, \ $(foreach a,ARM THUMB, \ date "+::: %Y/%m/%d %H:%M:%S $a-$b" $(AND) \ $(REMAKE) CTR_$b=TRUE CTR_PLATFORM=$p CTR_CODEGEN=$a CTR_CODEGEN_ALL=False $(1) $(AND) \ )\ )\ ) true endef super-full: $(call makesuperfull,build) super-full-install: $(call makesuperfull,install) #---------------------------------------------------------------------------- # Autotest using IS-NITRO-EMULATOR #---------------------------------------------------------------------------- ifdef IS_CTR_DIR AUTOTESTLOG := $(ROOT)/autotest.log .PHONY: autotest do-autotest do-autotest-test autotest: @+$(REMAKE) clobber @+$(REMAKE) build CTR_AUTOTEST=TRUE @$(RM) $(AUTOTESTLOG) @+$(REMAKE) do-autotest @$(SED) -e 's/\r//g;s/$$/\r/g;' $(AUTOTESTLOG) > $(AUTOTESTLOG).tmp @$(MV) $(AUTOTESTLOG).tmp $(AUTOTESTLOG) do-autotest: @$(MAKE_SUBDIR) @$(ECHO_CURDIR) ifneq ($(TARGET_ROM),) @+$(REMAKE) test-run endif endif #---------------------------------------------------------------------------- # make clobber & clean #---------------------------------------------------------------------------- .PHONY: clobber-installed clobber: @$(MAKE_SUBDIR) @$(ECHO_CURDIR) -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) -$(RM) $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER) ifneq ($(GDIRT_INSTALLED),) ifneq ($(CTR_FORCE_BUILD),) $(call makefull,clobber-installed) else @+$(REMAKE) clobber-installed endif endif clobber-installed: -$(RM) $(GDIRT_INSTALLED) #---------------------------------------------------------------------------- super-clobber: @$(MAKE_SUBDIR) @$(ECHO_CURDIR) -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) -$(RM) $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER) ifneq ($(GDIRT_INSTALLED),) $(call makesuperfull,clobber-installed) endif #---------------------------------------------------------------------------- clean: @$(MAKE_SUBDIR) @$(ECHO_CURDIR) -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) #---------------------------------------------------------------------------- # source file dependancies #---------------------------------------------------------------------------- # # dynamic dependancy generation # like as $(OBJDIR)/main.o: main.c # DEP_SRCS_ALL = $(SRCS) $(SRCS_AUTOLOAD) $(SRCS_OVERLAY) define RuleCtoObj $$(OBJDIR)/$$(notdir $$(basename $(1))).o: $(1) endef endif # CTRSDK_MODULERULES_ # Put this sentance out of include-guard to avoid $(eval xxx) limitation $(foreach FILE,$(DEP_SRCS_ALL),$(eval $(call RuleCtoObj,$(FILE)))) ifndef CTRSDK_MODULERULES_ # # include dependancies file # ifeq ($(MAKECMDGOALS),do-build) ifdef SRCS -include $(DEPENDDIR)/*.d endif endif #---------------------------------------------------------------------------- # for IS-NITRO-EMULATOR #---------------------------------------------------------------------------- ifdef IS_CTR_DIR -include $(CTR_BUILDTOOLSDIR)/modulerules.emtype.ISD endif #---------------------------------------------------------------------------- # Load add-ins' modulerules #---------------------------------------------------------------------------- -include $(CTR_BUILDTOOLSDIR)/modulerules.add-ins.* #---------------------------------------------------------------------------- CTRSDK_MODULERULES_ = TRUE endif # CTRSDK_MODULERULES_ #----- End of modulerules -----