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-08-28#$
15# $Rev: 11023 $
16# $Author: okubata_ryoma $
17#----------------------------------------------------------------------------
18ifndef TWLSDK_MODULERULES_
19
20ifneq	($(FORCE_BUILD),)
21
22ifeq	($(filter clean clobber,$(MAKECMDGOALS)),)
23include $(BUILDTOOLSDIR)/modulerules.cctype.$(TWL_CCTYPE)
24include $(TWL_BUILDTOOLSDIR)/modulerules.cctype.$(TWL_CCTYPE)
25endif
26
27# Common Rules
28
29# .bin .srl
30ifdef	TWL_MAKEROM
31#
32# MAKEROM
33#
34
35ROM_SPEC			?= $(DEFAULT_ROM_SPEC)
36MAKEROM_ARM9		?= $(DEFAULT_MAKEROM_ARM9)
37MAKEROM_ARM7_BASE	?= $(DEFAULT_MAKEROM_ARM7_BASE)
38MAKEROM_ARM7		?= $(DEFAULT_MAKEROM_ARM7)
39MAKEROM_ROMROOT		?= $(DEFAULT_MAKEROM_ROMROOT)
40MAKEROM_ROMFILES	?= $(DEFAULT_MAKEROM_ROMFILES)
41MAKEROM_ROMSPEED	?= $(DEFAULT_MAKEROM_ROMSPEED)
42MAKEROM_FLAGS		?=
43MAKEROM_FLAGS		+= $(if $(TWL_FINALROM),,-F)
44
45MAKEROM_CERT_PRIV	?= $(DEFAULT_MAKEROM_CERT_PRIV)
46MAKEROM_CERT_PRIV_M	:= $(call cygpathm,$(MAKEROM_CERT_PRIV))
47
48# Convert Unix and Windows format paths
49ROOT_M				:= $(call empath,$(ROOT))
50MAKEROM_ROMROOT_M	:= $(call empath,$(MAKEROM_ROMROOT))
51BINDIR_M			:= $(call empath,$(BINDIR))
52TWL_COMPONENTSDIR_M	:= $(ROOT_M)/components
53
54MAKEROM_ARM7_BASE_M	:= $(call empath,$(MAKEROM_ARM7_BASE))
55MAKEROM_ARM7_M		:= $(call empath,$(basename $(MAKEROM_ARM7)))
56MAKEROM_ARM9_M		:= $(call empath,$(basename $(MAKEROM_ARM9)))
57ROM_SPEC_M			:= $(call empath,$(ROM_SPEC))
58
59MAKEROM_DEFS		 = -DTWLSDK_ROOT='$(ROOT_M)'						\
60					   -DTARGET_NAME='$(TARGET_NAME)'					\
61					   -DMAKEROM_ROMROOT='$(MAKEROM_ROMROOT_M)'			\
62					   -DMAKEROM_ROMFILES='$(MAKEROM_ROMFILES)'			\
63					   -DMAKEROM_ROMSPEED='$(MAKEROM_ROMSPEED)'			\
64					   -DBINDIR='$(BINDIR_M)'							\
65					   -DCOMPDIR='$(TWL_COMPONENTSDIR_M)'				\
66					   -DCOMPTYPE9='$(TWL_BUILDTYPE_ARM9)'				\
67					   -DCOMPTYPE7='$(TWL_BUILDTYPE_ARM7)'				\
68					   -DPROC='$(CODEGEN_PROC)'							\
69					   -DPLATFORM='$(TWL_PLATFORM)'						\
70					   -DCODEGEN='$(TWL_LIBSUFFIX)'						\
71					   -DARCHGEN='$(ARCHGEN_TYPE)'						\
72					   -DLIBSUFFIX='$(TWL_LIBSUFFIX)'					\
73					   -DBUILD='$(TWL_BUILD_DIR)'						\
74					   -DCOMPSUFFIX9='$(COMPSUFFIX)'					\
75					   -DCOMPSUFFIX7=''
76
77ifeq	($(TWL_ARCHGEN),HYBRID)
78MAKEROM_DEFS		+= -DTARGET_PLATFORM='TWL-HYB'					\
79					   -DMAKEROM_WRAM_MAPPING='MAP2_$(TWL_PLATFORM)_HYB'	\
80					   -DMAKEROM_CODEC_MODE=$(MAKEROM_CODEC_MODE)
81else
82ifeq	($(TWL_ARCHGEN),LIMITED)
83MAKEROM_DEFS		+= -DTARGET_PLATFORM='TWL-LTD'							\
84					   -DMAKEROM_WRAM_MAPPING='MAP2_$(TWL_PLATFORM)_LTD'	\
85					   -DMAKEROM_CODEC_MODE=$(MAKEROM_CODEC_MODE)
86else
87ifeq	($(TWL_ARCHGEN),LIMITED_ferret)
88MAKEROM_DEFS		+= -DTARGET_PLATFORM='TWL-LTD'							\
89					   -DMAKEROM_WRAM_MAPPING='MAP2_$(TWL_PLATFORM)_LTD'	\
90					   -DMAKEROM_CODEC_MODE=$(MAKEROM_CODEC_MODE)
91endif
92endif
93endif
94
95TARGET_ROM			 = $(strip $(findstring .srl,$(TARGET_BIN))			\
96					           $(findstring .bin,$(TARGET_BIN))			\
97					           $(findstring .tad,$(TARGET_BIN)) )
98
99ifneq	($(strip $(OBJS) $(LLIBRARIES)),)	# Any object?
100ifeq	($(CODEGEN_PROC),ARM9)
101SDEPENDS_BIN		 =	$(BINDIR)/%.$(TWL_ELF_EXT) $(MAKEROM_ARM7)
102MAKEROM_DEFS		+=	-DMAKEROM_ARM9='$(BINDIR)/$(TARGET_NAME)'	\
103						-DMAKEROM_ARM7_BASE='$(MAKEROM_ARM7_BASE_M)'	\
104						-DMAKEROM_ARM7='$(MAKEROM_ARM7_M)'
105else	# !ARM9
106SDEPENDS_BIN		 =	$(BINDIR)/%.$(TWL_ELF_EXT) $(MAKEROM_ARM9)
107MAKEROM_DEFS		+=	-DMAKEROM_ARM9='$(MAKEROM_ARM9_M)'					\
108						-DMAKEROM_ARM7_BASE='$(call empath,$(basename $@))'	\
109						-DMAKEROM_ARM7='$(call empath,$(basename $@))'
110endif	# -ARM9
111else	# !OBJS !LLIBRARIES
112SDEPENDS_BIN		 =	$(MAKEROM_ARM9) $(MAKEROM_ARM7)
113MAKEROM_DEFS		+=	-DMAKEROM_ARM9='$(MAKEROM_ARM9_M)'				\
114						-DMAKEROM_ARM7_BASE='$(MAKEROM_ARM7_BASE_M)'	\
115						-DMAKEROM_ARM7='$(MAKEROM_ARM7_M)'
116endif	# -OBJS -LLIBRARIES
117
118# Unnecessary during clean or clobber (supports make3.80)
119ifneq	($(filter clean clobber,$(MAKECMDGOALS)),)
120else
121ifndef	USE_MY_RULE_BIN
122#special rule for %bin
123#$(BINDIR)/%.bin $(BINDIR)/%.srl: $(OBJS) $(MAKEFILE) $(LDEPENDS_NEF) $(EDEPENDS_NEF) $(ALIBRARIES) $(LDRES_FILE) $(CW_LIBCXX) $(LCFILE_AUTOGEN)
124#	$(LD) $(LDFLAGS) $(LIBRARY_DIRS) @$(LDRES_FILE) $(LCFILE) -o $@
125
126$(BINDIR)/%.bin $(BINDIR)/%.$(INT_ROM_EXT) $(BINDIR)/%.srl:	$(SDEPENDS_BIN) $(ROM_SPEC) $(LDEPENDS_BIN) $(EDEPENDS_BIN)
127ifdef SILENT
128	echo $(TWLSDK_MSG_MAKE_SRL) $(notdir $@)
129endif
130	$(MAKEROM) $(MAKEROM_FLAGS) $(MAKEROM_DEFS) $(ROM_SPEC_M) $(call empath,$@)
131endif	# -USE_MY_RULE_BIN
132endif	# not clean/clobber
133
134$(BINDIR)/$(TARGET_SIGN_BIN): $(BINDIR)/$(TARGET_BIN)
135ifdef SILENT
136	echo $(TWLSDK_MSG_SIGN) $(notdir $@)
137endif
138	$(ATTACHSIGN) -D $(addprefix $(BINDIR)/,$(TARGET_BIN))
139
140else	# !TWL_MAKEROM
141#
142# ELFTOBIN
143#
144ifndef	USE_MY_RULE_BIN
145ifeq	($(CODEGEN_PROC),ARM9)
146$(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.$(TWL_ELF_EXT) $(LDEPENDS_BIN) $(EDEPENDS_BIN)
147	$(ELFTOBIN) $< $(ELFTOBIN_ARM7) $(ELFTOBIN_ROMHEADER) -o $@
148else	# !ARM9
149$(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.$(TWL_ELF_EXT) $(LDEPENDS_BIN) $(EDEPENDS_BIN)
150	$(ELFTOBIN) $(ELFTOBIN_ARM9) $< $(ELFTOBIN_ROMHEADER) -o $@
151endif	# -ARM9
152endif	# -USE_MY_RULE_BIN
153endif	# -TWL_MAKEROM
154
155ifeq	($(TWL_NANDAPP),TRUE)
156ifndef USE_MY_RULE_TAD
157.PRECIOUS: $(BINDIR)/%.$(INT_ROM_EXT)
158
159MAKETAD_OPTION	+= -v $(TITLE_VERSION_LO)
160
161ifeq	($(CODEGEN_PROC),ARM9)
162%.tad:	%.$(INT_ROM_EXT) $(MAKETAD)
163ifdef SILENT
164	echo $(TWLSDK_MSG_MAKE_TAD) $(notdir $@)
165endif
166	$(MAKETAD) $< $(MAKETAD_OPTION) -o $@
167endif	# -ARM9
168endif	# -USE_MY_RULE_TAD
169endif	# -TWL_NANDAPP
170
171endif	# -FORCE_BUILD
172
173# .bnr .bsf
174%.bnr:		%.bsf
175ifdef SILENT
176	echo $(TWLSDK_MSG_MAKE_BNR) $(notdir $@)
177endif
178		$(MAKEBANNER) $(MAKEBANNER_FLAGS) $< $@
179
180%.nbfs %.nbfc %.nbfp:	%.bmp
181		$(NTEXCONV) -no -bg -bgb -bgnc $(NTEXCONV_FLAGS) $< >/dev/null
182
183%.ban:	$(BANNERCVTR_SRCS)
184	$(BANNERCVTR) -o $@ $<
185
186# rsf rules
187
188ifneq	($(ROM_SPEC),$(DEFAULT_ROM_SPEC))
189ifneq	($(ROM_SPEC_TEMPLATE),)
190ifneq	($(ROM_SPEC_PARAM),)
191
192LDIRT_CLEAN		+=	$(ROM_SPEC)
193
194$(ROM_SPEC): $(ROM_SPEC_TEMPLATE) $(MAKERSF) $(MAKEFILE)
195ifdef SILENT
196	echo " make rsf:" $@
197endif
198	$(MAKERSF) $< $@ $(ROM_SPEC_PARAM)
199
200endif	# ifneq	($(ROM_SPEC_PARAM),)
201endif	# ifneq	($(ROM_SPEC_TEMPLATE),)
202endif	# ifneq	($(ROM_SPEC),$(DEFAULT_ROM_SPEC))
203
204
205# .sbin
206# The SBIN files are created by the linker at the same time as $(TWL_ELF_EXT)
207%.TWL.FLX.sbin:			%.$(TWL_ELF_EXT);
208%_defs.TWL.FLX.sbin:	%.$(TWL_ELF_EXT);
209%_table.TWL.FLX.sbin:	%.$(TWL_ELF_EXT);
210%.TWL.LTD.sbin:			%.$(TWL_ELF_EXT);
211%_defs.TWL.LTD.sbin:	%.$(TWL_ELF_EXT);
212%_table.TWL.LTD.sbin:	%.$(TWL_ELF_EXT);
213
214#----------------------------------------------------------------------------
215#  MAKE TARGETS
216#----------------------------------------------------------------------------
217
218%_for_ltd_arm   %_for_hyb_arm:   CODEGEN_ARCH=
219%_for_ltd_arm   %_for_hyb_arm:   BUILD_CODEGEN=ARM
220%_for_ltd_thumb %_for_hyb_thumb: CODEGEN_ARCH=.thumb
221%_for_ltd_thumb %_for_hyb_thumb: BUILD_CODEGEN=THUMB
222%_for_ltd_arm   %_for_ltd_thumb: ARCHGEN_TYPE=.LTD
223%_for_ltd_arm   %_for_ltd_thumb: BUILD_ARCHGEN=LIMITED
224%_for_hyb_arm   %_for_hyb_thumb: ARCHGEN_TYPE=.HYB
225%_for_hyb_arm   %_for_hyb_thumb: BUILD_ARCHGEN=HYBRID
226
227# In the case of a nightly build, also build LIMITED ROMs that use the ferret component
228ifeq	($(SDK_NIGHTLY_BUILD),TRUE)
229%_for_ltd_ferret_arm   %_for_ltd_ferret_thumb: ARCHGEN_TYPE=.LTD
230%_for_ltd_ferret_arm   %_for_ltd_ferret_thumb: COMP_TYPE=.ferret
231%_for_ltd_ferret_arm   %_for_ltd_ferret_thumb: BUILD_ARCHGEN=LIMITED_ferret
232%_for_ltd_ferret_arm:                          CODEGEN_ARCH=
233%_for_ltd_ferret_arm:                          BUILD_CODEGEN=ARM
234%_for_ltd_ferret_thumb:                        CODEGEN_ARCH=.thumb
235%_for_ltd_ferret_thumb:                        BUILD_CODEGEN=THUMB
236endif
237#----------------------------------------------------------------------------
238#  Make build
239#----------------------------------------------------------------------------
240.PHONY: do-build build_and_install
241.PHONY: build_for_% build_platform
242
243ifeq	($(PARALLEL_BUILD),TRUE)
244build_platform:      build_for_hyb_thumb  build_for_hyb_arm build_for_ltd_thumb build_for_ltd_arm
245else
246build_platform:      build_for_hyb_thumb
247build_for_hyb_thumb: build_for_hyb_arm
248build_for_hyb_arm:   build_for_ltd_thumb
249build_for_ltd_thumb: build_for_ltd_arm
250endif
251
252ifeq	($(SDK_NIGHTLY_BUILD),TRUE)
253ifeq	($(PARALLEL_BUILD),TRUE)
254build_platform:      build_for_ltd_ferret_arm build_for_ltd_ferret_thumb
255else
256build_for_ltd_arm:          build_for_ltd_ferret_arm
257build_for_ltd_ferret_arm:   build_for_ltd_ferret_thumb
258endif
259endif
260
261build_for_%:
262	+$(if $(filter $(BUILD_CODEGEN),$(TARGET_CODEGEN_LIST)),	\
263		$(if $(filter $(BUILD_ARCHGEN),$(TWL_ARCHGEN_LIST)),	\
264			@$(ECHO_CURDIR)										\
265			$(DO_MAKEDIR)										\
266			$(REMAKE) TWL_ARCHGEN=$(BUILD_ARCHGEN) TARGET_CODEGEN=$(BUILD_CODEGEN) SKIP_SUBDIR=TRUE INSTALL_DEPENDS=do-build INSTALL_FOR=$* build_and_install ))
267
268build_and_install: install_for_$(INSTALL_FOR)
269
270#----------------------------------------------------------------------------
271#  Make install
272#----------------------------------------------------------------------------
273
274.PHONY: install_for_% install_platform
275
276ifeq	($(PARALLEL_BUILD),TRUE)
277install_platform:      install_for_hyb_thumb install_for_hyb_arm install_for_ltd_thumb install_for_ltd_arm
278else
279install_platform:      install_for_hyb_thumb
280install_for_hyb_thumb: install_for_hyb_arm
281install_for_hyb_arm:   install_for_ltd_thumb
282install_for_ltd_thumb: install_for_ltd_arm
283endif
284
285ifeq	($(SDK_NIGHTLY_BUILD),TRUE)
286ifeq	($(PARALLEL_BUILD),TRUE)
287install_platform:      install_for_ltd_ferret_arm install_for_ltd_ferret_thumb
288else
289install_for_ltd_arm:          install_for_ltd_ferret_arm
290install_for_ltd_ferret_arm:   install_for_ltd_ferret_thumb
291endif
292endif
293
294install_for_%: $(INSTALL_DEPENDS)
295	+$(if $(filter $(BUILD_CODEGEN),$(TARGET_CODEGEN_LIST)),	\
296		$(if $(filter $(BUILD_ARCHGEN),$(TWL_ARCHGEN_LIST)),	\
297			$(if $(INSTALL_TARGETS),							\
298				@$(ECHO_CURDIR)									\
299				$(DO_INSTALL) )))
300
301#----------------------------------------------------------------------------
302#  Autotest using IS-TWL-EMULATOR
303#----------------------------------------------------------------------------
304ifdef	IS_TWL_DIR
305
306AUTOTESTLOG	:= $(ROOT)/autotest.log
307
308.PHONY: 	autotest do-autotest do-autotest-test
309
310autotest:
311	@+$(REMAKE) clobber
312	@+$(REMAKE) build TWL_AUTOTEST=TRUE
313	@$(RM) $(AUTOTESTLOG)
314	@+$(REMAKE) do-autotest
315	@$(SED) -e 's/\r//g;s/$$/\r/g;' $(AUTOTESTLOG) > $(AUTOTESTLOG).tmp
316	@$(MV)  $(AUTOTESTLOG).tmp $(AUTOTESTLOG)
317
318do-autotest: make-sub
319	@$(ECHO_CURDIR)
320ifneq	($(TARGET_ROM),)
321	@+$(REMAKE) test-run
322endif
323endif
324
325
326#----------------------------------------------------------------------------
327#  Make clobber & clean
328#----------------------------------------------------------------------------
329.PHONY: 	clobber-installed
330.PHONY:		clobber_for_%
331
332clobber-installed:     clobber_for_hyb_thumb
333clobber_for_hyb_thumb: clobber_for_hyb_arm
334clobber_for_hyb_arm:   clobber_for_ltd_thumb
335clobber_for_ltd_thumb: clobber_for_ltd_arm
336
337clobber_for_%:
338	+-$(if $(filter $(BUILD_CODEGEN),$(TARGET_CODEGEN_LIST)),	\
339		$(if $(filter $(BUILD_ARCHGEN),$(TWL_ARCHGEN_LIST)),	\
340			$(RM) $(GDIRT_INSTALLED) ))
341
342#----------------------------------------------------------------------------
343
344
345#----------------------------------------------------------------------------
346#  Source file dependencies
347#----------------------------------------------------------------------------
348
349#
350# Dynamic dependency generation
351#   Like as $(OBJDIR)/main.o: main.c
352#
353DEP_SRCS_ALL = $(SRCS) $(SRCS_AUTOLOAD) $(SRCS_OVERLAY) $(SRCS_LTDAUTOLOAD) $(SRCS_LTDOVERLAY)
354
355define RuleCtoObj
356$$(OBJDIR)/$$(notdir $$(basename $(1))).o: $(1)
357
358endef
359endif	# TWLSDK_MODULERULES_
360
361# Put this sentence out of include-guard to avoid $(eval xxx) limitation
362$(foreach FILE,$(DEP_SRCS_ALL),$(eval $(call RuleCtoObj,$(FILE))))
363
364
365ifndef	TWLSDK_MODULERULES_
366#
367# Include dependencies file
368#
369ifneq	($(filter build_and_install,$(MAKECMDGOALS)),)
370ifdef	SRCS
371-include $(DEPENDDIR)/*.d
372endif
373endif
374
375#----------------------------------------------------------------------------
376#  For IS-TWL-EMULATOR
377#----------------------------------------------------------------------------
378ifdef	IS_TWL_DIR
379-include $(TWL_BUILDTOOLSDIR)/modulerules.emtype.IS
380endif
381
382#----------------------------------------------------------------------------
383#  Load add-ins' modulerules
384#----------------------------------------------------------------------------
385-include $(TWL_BUILDTOOLSDIR)/modulerules.add-ins.*
386
387#----------------------------------------------------------------------------
388TWLSDK_MODULERULES_ = TRUE
389endif	# TWLSDK_MODULERULES_
390#----- End of modulerules -----
391