#! make -f
#----------------------------------------------------------------------------
# Project:  TwlSDK
# File:     modulerules
#
# Copyright 2007-2008 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:: 2008-10-29#$
# $Rev: 9146 $
# $Author: okubata_ryoma $
#----------------------------------------------------------------------------
ifndef TWLSDK_TOP_MODULERULES_
TWLSDK_TOP_MODULERULES_ = TRUE

ifdef TWLSDK_TOP_COMMONDEFS_
#----------------------------------------------------------------------------

-include $(BUILDTOOLSDIR)/commondefs.compat.post

#----------------------------------------------------------------------------
# Implicit RULES
#----------------------------------------------------------------------------
.SUFFIXES:	# Delete all suffix rules


TWLSDK_MSG_ASSEMBLE		= " assemble:"
TWLSDK_MSG_COMPILE		= "  compile:"
TWLSDK_MSG_ARCHIVE		= "  archive:"
TWLSDK_MSG_LINK			= "     link:"
TWLSDK_MSG_MAKE_LCF		= " make lcf:"
TWLSDK_MSG_MAKE_MCH		= " make mch:"
TWLSDK_MSG_MAKE_SRL		= " make srl:"
TWLSDK_MSG_SIGN			= "     sign:"
TWLSDK_MSG_MAKE_BNR		= " make bnr:"
TWLSDK_MSG_VERSION		= " make ver:"

ifneq	($(FORCE_BUILD),)
VPATH				= $(SRCDIR)

SSRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS)))
ASRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_AUTOLOAD)))
VSRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_OVERLAY)))
LASRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_LTDAUTOLOAD)))
LVSRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_LTDOVERLAY)))

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))
LAOBJS_CC			= $(filter %.o,$(LASRCFILES:.c=.o))
LAOBJS_AS			= $(filter %.o,$(LASRCFILES:.s=.o))
LAOBJS_CXX			= $(filter %.o,$(LASRCFILES:.cpp=.o))
LVOBJS_CC			= $(filter %.o,$(LVSRCFILES:.c=.o))
LVOBJS_AS			= $(filter %.o,$(LVSRCFILES:.s=.o))
LVOBJS_CXX			= $(filter %.o,$(LVSRCFILES:.cpp=.o))

OBJS_CC				= $(SOBJS_CC)  $(AOBJS_CC)  $(VOBJS_CC)  $(LAOBJS_CC)  $(LVOBJS_CC)
OBJS_AS				= $(SOBJS_AS)  $(AOBJS_AS)  $(VOBJS_AS)  $(LAOBJS_AS)  $(LVOBJS_AS)
OBJS_CXX			= $(SOBJS_CXX) $(AOBJS_CXX) $(VOBJS_CXX) $(LAOBJS_CXX) $(LVOBJS_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_LTDAUTOLOAD	= $(LAOBJS_CC) $(LAOBJS_AS) $(LAOBJS_CXX) $(EXT_OBJS_LTDAUTOLOAD)
OBJS_LTDOVERLAY		= $(LVOBJS_CC) $(LVOBJS_AS) $(LVOBJS_CXX) $(EXT_OBJS_LTDOVERLAY)
OBJS				+= $(OBJS_STATIC) $(OBJS_AUTOLOAD) $(OBJS_OVERLAY) $(OBJS_LTDAUTOLOAD) $(OBJS_LTDOVERLAY)

PCHDR_CACHE		 	?= $(ROOT)/cache/include
GDIRT_CLOBBER		+= $(PCHDR_CACHE)/*.h* \
                       $(BUILDTOOLSDIR)/*/verinfo.*
endif


#============================================================================
#
#  common rules
#
#============================================================================

.PHONY: dirs

dirs:
#	@echo codegen=$(NITRO_CODEGEN), arch=$(ARCHGEN_TYPE)
	@$(DO_MAKEDIR)


#----------------------------------------------------------------------------
#  make platform
#----------------------------------------------------------------------------

.PHONY: build build-nitro build-twl

ifeq	($(PARALLEL_BUILD),TRUE)
build: build-nitro build-twl
else
build: build-nitro 
build-nitro: build-twl
endif

build-nitro: make-sub
build-twl: make-sub

build-nitro:
	@+$(if $(filter NITRO,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=NITRO build_platform)
	
build-twl:
	@+$(if $(filter TWL,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=TWL build_platform)



.PHONY: install install-nitro install-twl

ifeq	($(PARALLEL_BUILD),TRUE)
install: install-nitro install-twl
else
install: install-nitro 
install-nitro: install-twl
endif

install-nitro: make-sub
install-twl: make-sub

install-nitro:
	@+$(if $(filter NITRO,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=NITRO install_platform)
	
install-twl:
	@+$(if $(filter TWL,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=TWL install_platform)


#----------------------------------------------------------------------------
#  make targets
#----------------------------------------------------------------------------

.PHONY:	all default build install clean clobber full super-full

BUILDCMDS = all default build

#----------------------------------------------------------------------------

ifdef SILENT
DO_INSTALL_FILES_ECHO		= $(ECHO) "  install: $(notdir $(FILE)) -> $(subst $(subst \,/,$(TWLSDK_ROOT)),,$(1))"
else
DO_INSTALL_FILES_ECHO		= $(ECHO) "  install: $(FILE) -> $(1)"
endif

ifdef INSTALL_WORKAROUND
define CMD_INSTALL
install $(1) $(2) && touch -m -r $(1) $(2)
endef
else
define CMD_INSTALL
$(INSTALL) $(1) $(2)
endef
endif


define DO_INSTALL_FILES
	$(INSTALL) -d $(1) $(AND)							\
	$(foreach FILE, $(2),								\
		if [ ! -e $(1)/$(notdir $(FILE)) -o				\
			$(FILE) -nt $(1)/$(notdir $(FILE)) ];		\
		then 											\
			$(call DO_INSTALL_FILES_ECHO,$(1)) $(AND)	\
			$(call CMD_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),							\
			$(call DO_INSTALL_FILES_ECHO,$(INSTALL_DIR)) $(AND)		\
			$(INSTALL) $(FILE) $(INSTALL_DIR) $(AND) ) $(TRUE);		\
	fi
endef


#----------------------------------------------------------------------------
#  make parallelly
#----------------------------------------------------------------------------

.PHONY:	make-subdir-p-% make-submake-p-% make-sub make-sub-p-pre make-sub-p

SUBDIRS_PREFIX   = make-subdir-p-
SUBDIRS_PARALLEL = $(addprefix $(SUBDIRS_PREFIX),$(SUBDIRS_P))

SUBMAKES_PREFIX   = make-submake-p-
SUBMAKES_PARALLEL = $(addprefix $(SUBMAKES_PREFIX),$(SUBMAKES_P))

$(SUBDIRS_PARALLEL):$(SUBDIRS_PREFIX)%: make-sub-p-pre
	@+$(MAKE) $(SUBDIR_FLAGS) -C $* $(MAKECMDGOALS)

$(SUBMAKES_PARALLEL):$(SUBMAKES_PREFIX)%: make-sub-p-pre
	@+$(MAKE) $(SUBDIR_FLAGS) -C $(*D) -f $(*F) $(MAKECMDGOALS)

make-sub-p-pre:
	@+$(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)

make-sub-p: make-sub-p-pre $(SUBDIRS_PARALLEL)	$(SUBMAKES_PARALLEL)

ifneq	($(SKIP_SUBDIR),TRUE)
make-sub: make-sub-p
else
make-sub:
endif

#============================================================================
#
#  platform specific rules
#
#============================================================================

ifneq	($(filter TWL,$(TARGET_PLATFORM_LIST)),)
include $(TWL_BUILDTOOLSDIR)/modulerules
else
ifneq	($(filter NITRO,$(TARGET_PLATFORM_LIST)),)
include $(NITRO_BUILDTOOLSDIR)/modulerules
else
include $(BUILDTOOLSDIR)/modulerules.skip
endif
endif


#----------------------------------------------------------------------------
#  make full
#----------------------------------------------------------------------------

define makefull
	@echo [[[ make full $(1) $(CURDIR) ]]]
	@+unset NITRO_DEBUG NITRO_RELEASE NITRO_FINALROM TWL_DEBUG TWL_RELEASE TWL_FINALROM;	\
		$(foreach a,DEBUG RELEASE FINALROM,													\
			date "+::: %Y/%m/%d %H:%M:%S $a" $(AND)											\
			$(REMAKE) TARGET_$a=TRUE DEFAULT_CODEGEN=ALL DEFAULT_ARCHGEN=ALL DEFAULT_TARGET_PLATFORM=ALL $(1) $(AND)	\
		) $(TRUE)
endef

full:
	$(call makefull,build)

full-install:
	$(call makefull,install)

#----------------------------------------------------------------------------
#  make testsrl
#----------------------------------------------------------------------------

define maketestsrl
	@echo [[[ make testsrl $(1) $(CURDIR) ]]]
	@+unset NITRO_DEBUG NITRO_RELEASE NITRO_FINALROM TWL_DEBUG TWL_RELEASE TWL_FINALROM;	\
		$(foreach a,DEBUG RELEASE,															\
			date "+::: %Y/%m/%d %H:%M:%S $a" $(AND)											\
			$(REMAKE) TARGET_$a=TRUE DEFAULT_CODEGEN=ALL DEFAULT_ARCHGEN=ALL DEFAULT_TARGET_PLATFORM=ALL $(1) $(AND)	\
		) $(TRUE)
endef

testsrl:
	$(call maketestsrl,build)

testsrl-install:
	$(call maketestsrl,install)

#----------------------------------------------------------------------------
#  make super-full
#----------------------------------------------------------------------------

define makesuperfull
	@echo [[[ make super-full $(1) $(CURDIR) ]]]
	@+unset NITRO_DEBUG NITRO_RELEASE NITRO_FINALROM TWL_DEBUG TWL_RELEASE TWL_FINALROM;	\
		$(foreach b,TS TEG,																	\
		    $(foreach a,DEBUG RELEASE FINALROM,												\
			    date "+::: %Y/%m/%d %H:%M:%S $a-$b" $(AND)									\
			    $(REMAKE) TARGET_$a=TRUE TWL_PLATFORM=$b NITRO_PLATFORM=$b DEFAULT_CODEGEN=ALL DEFAULT_ARCHGEN=ALL DEFAULT_TARGET_PLATFORM=ALL $(1) $(AND) \
		    ) \
		) $(TRUE)
endef

super-full:
	$(call makesuperfull,build)

super-full-install:
	$(call makesuperfull,install)

#----------------------------------------------------------------------------
#  make clobber & clean
#----------------------------------------------------------------------------

clobber: make-sub
	@$(ECHO_CURDIR)
	-$(RM) $(GDIRT_CLEAN)   $(LDIRT_CLEAN)   $(EDIRT_CLEAN)\
               $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER)
ifneq	($(GDIRT_INSTALLED),)
ifneq	($(FORCE_BUILD),)
	$(call makefull,clobber-installed)
else
	@+$(REMAKE) clobber-installed
endif
endif


super-clobber: make-sub
	@$(ECHO_CURDIR)
	-$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER)
ifneq	($(GDIRT_INSTALLED),)
	$(call makesuperfull,clobber-installed)
endif

#----------------------------------------------------------------------------

clean: make-sub
	@$(ECHO_CURDIR)
	-$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN)
#----------------------------------------------------------------------------
endif	# TWLSDK_TOP_COMMONDEFS_

endif	# TWLSDK_TOP_MODULERULES_
#----- End of modulerules -----
