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-12-12#$
15# $Rev: 9649 $
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
118ifndef	USE_MY_RULE_BIN
119#special rule for %bin
120#$(BINDIR)/%.bin $(BINDIR)/%.srl: $(OBJS) $(MAKEFILE) $(LDEPENDS_NEF) $(EDEPENDS_NEF) $(ALIBRARIES) $(LDRES_FILE) $(CW_LIBCXX) $(LCFILE_AUTOGEN)
121#	$(LD) $(LDFLAGS) $(LIBRARY_DIRS) @$(LDRES_FILE) $(LCFILE) -o $@
122
123$(BINDIR)/%.bin $(BINDIR)/%.$(INT_ROM_EXT) $(BINDIR)/%.srl:	$(SDEPENDS_BIN) $(ROM_SPEC) $(LDEPENDS_BIN) $(EDEPENDS_BIN)
124ifdef SILENT
125	echo $(TWLSDK_MSG_MAKE_SRL) $(notdir $@)
126endif
127	$(MAKEROM) $(MAKEROM_FLAGS) $(MAKEROM_DEFS) $(ROM_SPEC_M) $(call empath,$@)
128endif	# -USE_MY_RULE_BIN
129
130$(BINDIR)/$(TARGET_SIGN_BIN): $(BINDIR)/$(TARGET_BIN)
131ifdef SILENT
132	echo $(TWLSDK_MSG_SIGN) $(notdir $@)
133endif
134	$(ATTACHSIGN) -D $(addprefix $(BINDIR)/,$(TARGET_BIN))
135
136else	# !TWL_MAKEROM
137#
138# ELFTOBIN
139#
140ifndef	USE_MY_RULE_BIN
141ifeq	($(CODEGEN_PROC),ARM9)
142$(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.$(TWL_ELF_EXT) $(LDEPENDS_BIN) $(EDEPENDS_BIN)
143	$(ELFTOBIN) $< $(ELFTOBIN_ARM7) $(ELFTOBIN_ROMHEADER) -o $@
144else	# !ARM9
145$(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.$(TWL_ELF_EXT) $(LDEPENDS_BIN) $(EDEPENDS_BIN)
146	$(ELFTOBIN) $(ELFTOBIN_ARM9) $< $(ELFTOBIN_ROMHEADER) -o $@
147endif	# -ARM9
148endif	# -USE_MY_RULE_BIN
149endif	# -TWL_MAKEROM
150
151endif	# -FORCE_BUILD
152
153# .bnr .bsf
154%.bnr:		%.bsf
155ifdef SILENT
156	echo $(TWLSDK_MSG_MAKE_BNR) $(notdir $@)
157endif
158		$(MAKEBANNER) $(MAKEBANNER_FLAGS) $< $@
159
160%.nbfs %.nbfc %.nbfp:	%.bmp
161		$(NTEXCONV) -no -bg -bgb -bgnc $(NTEXCONV_FLAGS) $< >/dev/null
162
163%.ban:	$(BANNERCVTR_SRCS)
164	$(BANNERCVTR) -o $@ $<
165
166# rsf rules
167
168ifneq	($(ROM_SPEC),$(DEFAULT_ROM_SPEC))
169ifneq	($(ROM_SPEC_TEMPLATE),)
170ifneq	($(ROM_SPEC_PARAM),)
171
172LDIRT_CLEAN		+=	$(ROM_SPEC)
173
174$(ROM_SPEC): $(ROM_SPEC_TEMPLATE) $(MAKERSF) $(MAKEFILE)
175ifdef SILENT
176	echo " make rsf:" $@
177endif
178	$(MAKERSF) $< $@ $(ROM_SPEC_PARAM)
179
180endif	# ifneq	($(ROM_SPEC_PARAM),)
181endif	# ifneq	($(ROM_SPEC_TEMPLATE),)
182endif	# ifneq	($(ROM_SPEC),$(DEFAULT_ROM_SPEC))
183
184
185# .sbin
186# The SBIN files are created by the linker at the same time as $(TWL_ELF_EXT)
187%.TWL.FLX.sbin:			%.$(TWL_ELF_EXT);
188%_defs.TWL.FLX.sbin:	%.$(TWL_ELF_EXT);
189%_table.TWL.FLX.sbin:	%.$(TWL_ELF_EXT);
190%.TWL.LTD.sbin:			%.$(TWL_ELF_EXT);
191%_defs.TWL.LTD.sbin:	%.$(TWL_ELF_EXT);
192%_table.TWL.LTD.sbin:	%.$(TWL_ELF_EXT);
193
194#----------------------------------------------------------------------------
195#  MAKE TARGETS
196#----------------------------------------------------------------------------
197
198%_for_ltd_arm   %_for_hyb_arm:   CODEGEN_ARCH=
199%_for_ltd_arm   %_for_hyb_arm:   BUILD_CODEGEN=ARM
200%_for_ltd_thumb %_for_hyb_thumb: CODEGEN_ARCH=.thumb
201%_for_ltd_thumb %_for_hyb_thumb: BUILD_CODEGEN=THUMB
202%_for_ltd_arm   %_for_ltd_thumb: ARCHGEN_TYPE=.LTD
203%_for_ltd_arm   %_for_ltd_thumb: BUILD_ARCHGEN=LIMITED
204%_for_hyb_arm   %_for_hyb_thumb: ARCHGEN_TYPE=.HYB
205%_for_hyb_arm   %_for_hyb_thumb: BUILD_ARCHGEN=HYBRID
206
207# In the case of a nightly build, also build LIMITED ROMs that use the ferret component
208ifeq	($(SDK_NIGHTLY_BUILD),TRUE)
209%_for_ltd_ferret_arm   %_for_ltd_ferret_thumb: ARCHGEN_TYPE=.LTD
210%_for_ltd_ferret_arm   %_for_ltd_ferret_thumb: COMP_TYPE=.ferret
211%_for_ltd_ferret_arm   %_for_ltd_ferret_thumb: BUILD_ARCHGEN=LIMITED_ferret
212%_for_ltd_ferret_arm:                          CODEGEN_ARCH=
213%_for_ltd_ferret_arm:                          BUILD_CODEGEN=ARM
214%_for_ltd_ferret_thumb:                        CODEGEN_ARCH=.thumb
215%_for_ltd_ferret_thumb:                        BUILD_CODEGEN=THUMB
216endif
217#----------------------------------------------------------------------------
218#  Make build
219#----------------------------------------------------------------------------
220.PHONY: do-build build_and_install
221.PHONY: build_for_% build_platform
222
223ifeq	($(PARALLEL_BUILD),TRUE)
224build_platform:      build_for_hyb_thumb  build_for_hyb_arm build_for_ltd_thumb build_for_ltd_arm
225else
226build_platform:      build_for_hyb_thumb
227build_for_hyb_thumb: build_for_hyb_arm
228build_for_hyb_arm:   build_for_ltd_thumb
229build_for_ltd_thumb: build_for_ltd_arm
230endif
231
232ifeq	($(SDK_NIGHTLY_BUILD),TRUE)
233ifeq	($(PARALLEL_BUILD),TRUE)
234build_platform:      build_for_ltd_ferret_arm build_for_ltd_ferret_thumb
235else
236build_for_ltd_arm:          build_for_ltd_ferret_arm
237build_for_ltd_ferret_arm:   build_for_ltd_ferret_thumb
238endif
239endif
240
241build_for_%:
242	+$(if $(filter $(BUILD_CODEGEN),$(TARGET_CODEGEN_LIST)),	\
243		$(if $(filter $(BUILD_ARCHGEN),$(TWL_ARCHGEN_LIST)),	\
244			@$(ECHO_CURDIR)										\
245			$(DO_MAKEDIR)										\
246			$(REMAKE) TWL_ARCHGEN=$(BUILD_ARCHGEN) TARGET_CODEGEN=$(BUILD_CODEGEN) SKIP_SUBDIR=TRUE INSTALL_DEPENDS=do-build INSTALL_FOR=$* build_and_install ))
247
248build_and_install: install_for_$(INSTALL_FOR)
249
250#----------------------------------------------------------------------------
251#  Make install
252#----------------------------------------------------------------------------
253
254.PHONY: install_for_% install_platform
255
256ifeq	($(PARALLEL_BUILD),TRUE)
257install_platform:      install_for_hyb_thumb install_for_hyb_arm install_for_ltd_thumb install_for_ltd_arm
258else
259install_platform:      install_for_hyb_thumb
260install_for_hyb_thumb: install_for_hyb_arm
261install_for_hyb_arm:   install_for_ltd_thumb
262install_for_ltd_thumb: install_for_ltd_arm
263endif
264
265ifeq	($(SDK_NIGHTLY_BUILD),TRUE)
266ifeq	($(PARALLEL_BUILD),TRUE)
267install_platform:      install_for_ltd_ferret_arm install_for_ltd_ferret_thumb
268else
269install_for_ltd_arm:          install_for_ltd_ferret_arm
270install_for_ltd_ferret_arm:   install_for_ltd_ferret_thumb
271endif
272endif
273
274install_for_%: $(INSTALL_DEPENDS)
275	+$(if $(filter $(BUILD_CODEGEN),$(TARGET_CODEGEN_LIST)),	\
276		$(if $(filter $(BUILD_ARCHGEN),$(TWL_ARCHGEN_LIST)),	\
277			$(if $(INSTALL_TARGETS),							\
278				@$(ECHO_CURDIR)									\
279				$(DO_INSTALL) )))
280
281#----------------------------------------------------------------------------
282#  Autotest using IS-TWL-EMULATOR
283#----------------------------------------------------------------------------
284ifdef	IS_TWL_DIR
285
286AUTOTESTLOG	:= $(ROOT)/autotest.log
287
288.PHONY: 	autotest do-autotest do-autotest-test
289
290autotest:
291	@+$(REMAKE) clobber
292	@+$(REMAKE) build TWL_AUTOTEST=TRUE
293	@$(RM) $(AUTOTESTLOG)
294	@+$(REMAKE) do-autotest
295	@$(SED) -e 's/\r//g;s/$$/\r/g;' $(AUTOTESTLOG) > $(AUTOTESTLOG).tmp
296	@$(MV)  $(AUTOTESTLOG).tmp $(AUTOTESTLOG)
297
298do-autotest: make-sub
299	@$(ECHO_CURDIR)
300ifneq	($(TARGET_ROM),)
301	@+$(REMAKE) test-run
302endif
303endif
304
305
306#----------------------------------------------------------------------------
307#  Make clobber & clean
308#----------------------------------------------------------------------------
309.PHONY: 	clobber-installed
310.PHONY:		clobber_for_%
311
312clobber-installed:     clobber_for_hyb_thumb
313clobber_for_hyb_thumb: clobber_for_hyb_arm
314clobber_for_hyb_arm:   clobber_for_ltd_thumb
315clobber_for_ltd_thumb: clobber_for_ltd_arm
316
317clobber_for_%:
318	+-$(if $(filter $(BUILD_CODEGEN),$(TARGET_CODEGEN_LIST)),	\
319		$(if $(filter $(BUILD_ARCHGEN),$(TWL_ARCHGEN_LIST)),	\
320			$(RM) $(GDIRT_INSTALLED) ))
321
322#----------------------------------------------------------------------------
323
324
325#----------------------------------------------------------------------------
326#  Source file dependencies
327#----------------------------------------------------------------------------
328
329#
330# Dynamic dependency generation
331#   Like as $(OBJDIR)/main.o: main.c
332#
333DEP_SRCS_ALL = $(SRCS) $(SRCS_AUTOLOAD) $(SRCS_OVERLAY) $(SRCS_LTDAUTOLOAD) $(SRCS_LTDOVERLAY)
334
335define RuleCtoObj
336$$(OBJDIR)/$$(notdir $$(basename $(1))).o: $(1)
337
338endef
339endif	# TWLSDK_MODULERULES_
340
341# Put this sentence out of include-guard to avoid $(eval xxx) limitation
342$(foreach FILE,$(DEP_SRCS_ALL),$(eval $(call RuleCtoObj,$(FILE))))
343
344
345ifndef	TWLSDK_MODULERULES_
346#
347# Include dependencies file
348#
349ifneq	($(filter build_and_install,$(MAKECMDGOALS)),)
350ifdef	SRCS
351-include $(DEPENDDIR)/*.d
352endif
353endif
354
355#----------------------------------------------------------------------------
356#  For IS-TWL-EMULATOR
357#----------------------------------------------------------------------------
358ifdef	IS_TWL_DIR
359-include $(TWL_BUILDTOOLSDIR)/modulerules.emtype.IS
360endif
361
362#----------------------------------------------------------------------------
363#  Load add-ins' modulerules
364#----------------------------------------------------------------------------
365-include $(TWL_BUILDTOOLSDIR)/modulerules.add-ins.*
366
367#----------------------------------------------------------------------------
368TWLSDK_MODULERULES_ = TRUE
369endif	# TWLSDK_MODULERULES_
370#----- End of modulerules -----
371