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