1#! make -f
2#----------------------------------------------------------------------------
3# Project:  TwlSDK
4# File:     modulerules
5#
6# Copyright 2007-2008 Nintendo.  All rights reserved.
7#
8# These coded instructions, statements, and computer programs contain
9# proprietary information of Nintendo of America Inc. and/or Nintendo
10# Company Ltd., and are protected by Federal copyright law.  They may
11# not be disclosed to third parties or copied or duplicated in any form,
12# in whole or in part, without the prior written consent of Nintendo.
13#
14# $Date:: 2008-10-29#$
15# $Rev: 9146 $
16# $Author: okubata_ryoma $
17#----------------------------------------------------------------------------
18ifndef TWLSDK_TOP_MODULERULES_
19TWLSDK_TOP_MODULERULES_ = TRUE
20
21ifdef TWLSDK_TOP_COMMONDEFS_
22#----------------------------------------------------------------------------
23
24-include $(BUILDTOOLSDIR)/commondefs.compat.post
25
26#----------------------------------------------------------------------------
27# Implicit RULES
28#----------------------------------------------------------------------------
29.SUFFIXES:	# Delete all suffix rules
30
31
32TWLSDK_MSG_ASSEMBLE		= " assemble:"
33TWLSDK_MSG_COMPILE		= "  compile:"
34TWLSDK_MSG_ARCHIVE		= "  archive:"
35TWLSDK_MSG_LINK			= "     link:"
36TWLSDK_MSG_MAKE_LCF		= " make lcf:"
37TWLSDK_MSG_MAKE_MCH		= " make mch:"
38TWLSDK_MSG_MAKE_SRL		= " make srl:"
39TWLSDK_MSG_SIGN			= "     sign:"
40TWLSDK_MSG_MAKE_BNR		= " make bnr:"
41TWLSDK_MSG_VERSION		= " make ver:"
42
43ifneq	($(FORCE_BUILD),)
44VPATH				= $(SRCDIR)
45
46SSRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS)))
47ASRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_AUTOLOAD)))
48VSRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_OVERLAY)))
49LASRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_LTDAUTOLOAD)))
50LVSRCFILES			= $(addprefix $(OBJDIR)/,$(notdir $(SRCS_LTDOVERLAY)))
51
52SOBJS_CC			= $(filter %.o,$(SSRCFILES:.c=.o))
53SOBJS_AS			= $(filter %.o,$(SSRCFILES:.s=.o))
54SOBJS_CXX			= $(filter %.o,$(SSRCFILES:.cpp=.o))
55AOBJS_CC			= $(filter %.o,$(ASRCFILES:.c=.o))
56AOBJS_AS			= $(filter %.o,$(ASRCFILES:.s=.o))
57AOBJS_CXX			= $(filter %.o,$(ASRCFILES:.cpp=.o))
58VOBJS_CC			= $(filter %.o,$(VSRCFILES:.c=.o))
59VOBJS_AS			= $(filter %.o,$(VSRCFILES:.s=.o))
60VOBJS_CXX			= $(filter %.o,$(VSRCFILES:.cpp=.o))
61LAOBJS_CC			= $(filter %.o,$(LASRCFILES:.c=.o))
62LAOBJS_AS			= $(filter %.o,$(LASRCFILES:.s=.o))
63LAOBJS_CXX			= $(filter %.o,$(LASRCFILES:.cpp=.o))
64LVOBJS_CC			= $(filter %.o,$(LVSRCFILES:.c=.o))
65LVOBJS_AS			= $(filter %.o,$(LVSRCFILES:.s=.o))
66LVOBJS_CXX			= $(filter %.o,$(LVSRCFILES:.cpp=.o))
67
68OBJS_CC				= $(SOBJS_CC)  $(AOBJS_CC)  $(VOBJS_CC)  $(LAOBJS_CC)  $(LVOBJS_CC)
69OBJS_AS				= $(SOBJS_AS)  $(AOBJS_AS)  $(VOBJS_AS)  $(LAOBJS_AS)  $(LVOBJS_AS)
70OBJS_CXX			= $(SOBJS_CXX) $(AOBJS_CXX) $(VOBJS_CXX) $(LAOBJS_CXX) $(LVOBJS_CXX)
71OBJS_STATIC			= $(SOBJS_CC)  $(SOBJS_AS) $(SOBJS_CXX) $(EXT_OBJS)
72OBJS_AUTOLOAD		= $(AOBJS_CC)  $(AOBJS_AS) $(AOBJS_CXX) $(EXT_OBJS_AUTOLOAD)
73OBJS_OVERLAY		= $(VOBJS_CC)  $(VOBJS_AS) $(VOBJS_CXX) $(EXT_OBJS_OVERLAY)
74OBJS_LTDAUTOLOAD	= $(LAOBJS_CC) $(LAOBJS_AS) $(LAOBJS_CXX) $(EXT_OBJS_LTDAUTOLOAD)
75OBJS_LTDOVERLAY		= $(LVOBJS_CC) $(LVOBJS_AS) $(LVOBJS_CXX) $(EXT_OBJS_LTDOVERLAY)
76OBJS				+= $(OBJS_STATIC) $(OBJS_AUTOLOAD) $(OBJS_OVERLAY) $(OBJS_LTDAUTOLOAD) $(OBJS_LTDOVERLAY)
77
78PCHDR_CACHE		 	?= $(ROOT)/cache/include
79GDIRT_CLOBBER		+= $(PCHDR_CACHE)/*.h* \
80                       $(BUILDTOOLSDIR)/*/verinfo.*
81endif
82
83
84#============================================================================
85#
86#  common rules
87#
88#============================================================================
89
90.PHONY: dirs
91
92dirs:
93#	@echo codegen=$(NITRO_CODEGEN), arch=$(ARCHGEN_TYPE)
94	@$(DO_MAKEDIR)
95
96
97#----------------------------------------------------------------------------
98#  make platform
99#----------------------------------------------------------------------------
100
101.PHONY: build build-nitro build-twl
102
103ifeq	($(PARALLEL_BUILD),TRUE)
104build: build-nitro build-twl
105else
106build: build-nitro
107build-nitro: build-twl
108endif
109
110build-nitro: make-sub
111build-twl: make-sub
112
113build-nitro:
114	@+$(if $(filter NITRO,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=NITRO build_platform)
115
116build-twl:
117	@+$(if $(filter TWL,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=TWL build_platform)
118
119
120
121.PHONY: install install-nitro install-twl
122
123ifeq	($(PARALLEL_BUILD),TRUE)
124install: install-nitro install-twl
125else
126install: install-nitro
127install-nitro: install-twl
128endif
129
130install-nitro: make-sub
131install-twl: make-sub
132
133install-nitro:
134	@+$(if $(filter NITRO,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=NITRO install_platform)
135
136install-twl:
137	@+$(if $(filter TWL,$(TARGET_PLATFORM_LIST)), $(REMAKE) REMAKE_TWLSDK_PLATFORM=TWL install_platform)
138
139
140#----------------------------------------------------------------------------
141#  make targets
142#----------------------------------------------------------------------------
143
144.PHONY:	all default build install clean clobber full super-full
145
146BUILDCMDS = all default build
147
148#----------------------------------------------------------------------------
149
150ifdef SILENT
151DO_INSTALL_FILES_ECHO		= $(ECHO) "  install: $(notdir $(FILE)) -> $(subst $(subst \,/,$(TWLSDK_ROOT)),,$(1))"
152else
153DO_INSTALL_FILES_ECHO		= $(ECHO) "  install: $(FILE) -> $(1)"
154endif
155
156ifdef INSTALL_WORKAROUND
157define CMD_INSTALL
158install $(1) $(2) && touch -m -r $(1) $(2)
159endef
160else
161define CMD_INSTALL
162$(INSTALL) $(1) $(2)
163endef
164endif
165
166
167define DO_INSTALL_FILES
168	$(INSTALL) -d $(1) $(AND)							\
169	$(foreach FILE, $(2),								\
170		if [ ! -e $(1)/$(notdir $(FILE)) -o				\
171			$(FILE) -nt $(1)/$(notdir $(FILE)) ];		\
172		then 											\
173			$(call DO_INSTALL_FILES_ECHO,$(1)) $(AND)	\
174			$(call CMD_INSTALL,$(FILE),$(1)/$(notdir $(FILE)));	\
175		fi $(AND) ) $(TRUE)
176endef
177
178DO_INSTALL	= $(call DO_INSTALL_FILES,$(INSTALL_DIR),$(INSTALL_TARGETS))
179
180INSTALL_INDEX_SRC	= $(firstword $(INSTALL_TARGETS))
181INSTALL_INDEX_DEST	= $(INSTALL_DIR)/$(notdir $(INSTALL_INDEX_SRC))
182
183define DO_INSTALL_WILDCARD
184	$(INSTALL) -d $(INSTALL_DIR) $(AND)								\
185	if [ ! -e $(INSTALL_INDEX_DEST) -o 								\
186			$(INSTALL_INDEX_SRC) -nt $(INSTALL_INDEX_DEST) ];		\
187	then															\
188		$(foreach FILE, $(INSTALL_TARGETS),							\
189			$(call DO_INSTALL_FILES_ECHO,$(INSTALL_DIR)) $(AND)		\
190			$(INSTALL) $(FILE) $(INSTALL_DIR) $(AND) ) $(TRUE);		\
191	fi
192endef
193
194
195#----------------------------------------------------------------------------
196#  make parallelly
197#----------------------------------------------------------------------------
198
199.PHONY:	make-subdir-p-% make-submake-p-% make-sub make-sub-p-pre make-sub-p
200
201SUBDIRS_PREFIX   = make-subdir-p-
202SUBDIRS_PARALLEL = $(addprefix $(SUBDIRS_PREFIX),$(SUBDIRS_P))
203
204SUBMAKES_PREFIX   = make-submake-p-
205SUBMAKES_PARALLEL = $(addprefix $(SUBMAKES_PREFIX),$(SUBMAKES_P))
206
207$(SUBDIRS_PARALLEL):$(SUBDIRS_PREFIX)%: make-sub-p-pre
208	@+$(MAKE) $(SUBDIR_FLAGS) -C $* $(MAKECMDGOALS)
209
210$(SUBMAKES_PARALLEL):$(SUBMAKES_PREFIX)%: make-sub-p-pre
211	@+$(MAKE) $(SUBDIR_FLAGS) -C $(*D) -f $(*F) $(MAKECMDGOALS)
212
213make-sub-p-pre:
214	@+$(foreach DIR,$(SUBDIRS),$(MAKE) $(SUBDIR_FLAGS) -C $(DIR) $(MAKECMDGOALS) $(AND)) $(TRUE)
215	@+$(foreach FILE,$(SUBMAKES),$(MAKE) $(SUBDIR_FLAGS) -C $(dir $(FILE)) -f $(notdir $(FILE)) $(MAKECMDGOALS) $(AND)) $(TRUE)
216
217make-sub-p: make-sub-p-pre $(SUBDIRS_PARALLEL)	$(SUBMAKES_PARALLEL)
218
219ifneq	($(SKIP_SUBDIR),TRUE)
220make-sub: make-sub-p
221else
222make-sub:
223endif
224
225#============================================================================
226#
227#  platform specific rules
228#
229#============================================================================
230
231ifneq	($(filter TWL,$(TARGET_PLATFORM_LIST)),)
232include $(TWL_BUILDTOOLSDIR)/modulerules
233else
234ifneq	($(filter NITRO,$(TARGET_PLATFORM_LIST)),)
235include $(NITRO_BUILDTOOLSDIR)/modulerules
236else
237include $(BUILDTOOLSDIR)/modulerules.skip
238endif
239endif
240
241
242#----------------------------------------------------------------------------
243#  make full
244#----------------------------------------------------------------------------
245
246define makefull
247	@echo [[[ make full $(1) $(CURDIR) ]]]
248	@+unset NITRO_DEBUG NITRO_RELEASE NITRO_FINALROM TWL_DEBUG TWL_RELEASE TWL_FINALROM;	\
249		$(foreach a,DEBUG RELEASE FINALROM,													\
250			date "+::: %Y/%m/%d %H:%M:%S $a" $(AND)											\
251			$(REMAKE) TARGET_$a=TRUE DEFAULT_CODEGEN=ALL DEFAULT_ARCHGEN=ALL DEFAULT_TARGET_PLATFORM=ALL $(1) $(AND)	\
252		) $(TRUE)
253endef
254
255full:
256	$(call makefull,build)
257
258full-install:
259	$(call makefull,install)
260
261#----------------------------------------------------------------------------
262#  make testsrl
263#----------------------------------------------------------------------------
264
265define maketestsrl
266	@echo [[[ make testsrl $(1) $(CURDIR) ]]]
267	@+unset NITRO_DEBUG NITRO_RELEASE NITRO_FINALROM TWL_DEBUG TWL_RELEASE TWL_FINALROM;	\
268		$(foreach a,DEBUG RELEASE,															\
269			date "+::: %Y/%m/%d %H:%M:%S $a" $(AND)											\
270			$(REMAKE) TARGET_$a=TRUE DEFAULT_CODEGEN=ALL DEFAULT_ARCHGEN=ALL DEFAULT_TARGET_PLATFORM=ALL $(1) $(AND)	\
271		) $(TRUE)
272endef
273
274testsrl:
275	$(call maketestsrl,build)
276
277testsrl-install:
278	$(call maketestsrl,install)
279
280#----------------------------------------------------------------------------
281#  make super-full
282#----------------------------------------------------------------------------
283
284define makesuperfull
285	@echo [[[ make super-full $(1) $(CURDIR) ]]]
286	@+unset NITRO_DEBUG NITRO_RELEASE NITRO_FINALROM TWL_DEBUG TWL_RELEASE TWL_FINALROM;	\
287		$(foreach b,TS TEG,																	\
288		    $(foreach a,DEBUG RELEASE FINALROM,												\
289			    date "+::: %Y/%m/%d %H:%M:%S $a-$b" $(AND)									\
290			    $(REMAKE) TARGET_$a=TRUE TWL_PLATFORM=$b NITRO_PLATFORM=$b DEFAULT_CODEGEN=ALL DEFAULT_ARCHGEN=ALL DEFAULT_TARGET_PLATFORM=ALL $(1) $(AND) \
291		    ) \
292		) $(TRUE)
293endef
294
295super-full:
296	$(call makesuperfull,build)
297
298super-full-install:
299	$(call makesuperfull,install)
300
301#----------------------------------------------------------------------------
302#  make clobber & clean
303#----------------------------------------------------------------------------
304
305clobber: make-sub
306	@$(ECHO_CURDIR)
307	-$(RM) $(GDIRT_CLEAN)   $(LDIRT_CLEAN)   $(EDIRT_CLEAN)\
308               $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER)
309ifneq	($(GDIRT_INSTALLED),)
310ifneq	($(FORCE_BUILD),)
311	$(call makefull,clobber-installed)
312else
313	@+$(REMAKE) clobber-installed
314endif
315endif
316
317
318super-clobber: make-sub
319	@$(ECHO_CURDIR)
320	-$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER)
321ifneq	($(GDIRT_INSTALLED),)
322	$(call makesuperfull,clobber-installed)
323endif
324
325#----------------------------------------------------------------------------
326
327clean: make-sub
328	@$(ECHO_CURDIR)
329	-$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN)
330#----------------------------------------------------------------------------
331endif	# TWLSDK_TOP_COMMONDEFS_
332
333endif	# TWLSDK_TOP_MODULERULES_
334#----- End of modulerules -----
335