1###############################################################################
2# Top level makefile for build system
3#
4# Copyright 2006 Nintendo.  All rights reserved.
5#
6# These coded instructions, statements, and computer programs contain
7# proprietary information of Nintendo of America Inc. and/or Nintendo
8# Company Ltd., and are protected by Federal copyright law.  They may
9# not be disclosed to third parties or copied or duplicated in any form,
10# in whole or in part, without the prior written consent of Nintendo.
11###############################################################################
12
13# Valid targets
14# "make" by itself builds and installs everything listed in LIBS, DEMOS and
15# TESTS.  Default target is HW1 DEBUG
16# "make clean" cleans everything listed in LIBS, DEMOS and
17# TESTS.  Only MACOS DEBUG versions are cleaned
18# "make NDEBUG=TRUE" builds nondebug versions.
19# "make NDEBUG=TRUE clean" cleans only nondebug versions.
20
21include buildtools/commondefs
22
23###############################################################################
24# Dependencies
25###############################################################################
26
27# THE ORDER OF THE LIBRARIES LISTED IS ALSO THE LIBRARY BUILD ORDER
28
29# XXX All libraries that are included in commondefs->REVOLUTION_LIBS must be listed
30# XXX here under $(LIBS), or else executables will fail to link
31
32ifdef EPPC
33###################
34# EPPC BUILDS
35###################
36LIBS     =  ai           \
37            amcnotstub   \
38            amcstubs     \
39            odemustubs   \
40            odenotstub   \
41            ax           \
42            base         \
43            card         \
44            cx           \
45            dsp          \
46            dvd          \
47            exi          \
48            fa           \
49            faw          \
50            gx           \
51            kmpls        \
52            kpad         \
53            kpadOld      \
54            mem          \
55            midi         \
56            mtx          \
57            os           \
58            pad          \
59            si           \
60            vi           \
61            G2D          \
62            axart        \
63            axfx         \
64            demo         \
65            gd           \
66            mix          \
67            perf         \
68            sample       \
69            seq          \
70            sp           \
71            syn          \
72            thp          \
73            tpl          \
74            nand         \
75            sc           \
76            euart        \
77            ipc          \
78            hio2         \
79            sdi          \
80            socket       \
81            usb          \
82            arc          \
83            dvdvideo     \
84            wud          \
85            bte          \
86            enc          \
87            cnt          \
88            fnt          \
89            esp          \
90            usbcmn       \
91            scutil       \
92            kbd          \
93            kpr          \
94            darch        \
95            hid          \
96            ga           \
97            pd           \
98            vsm          \
99            wbc          \
100            wpadGtr      \
101            wpadTrn      \
102            wpadDrm      \
103            wpadTbl      \
104            wpadTko      \
105            wpadBlk      \
106            autotest     \
107            lint         \
108            wpad         \
109            ven          \
110            usbmic       \
111            shopsd       \
112            pmic         \
113            cntsd        \
114            ntdtest      \
115            db           \
116
117ifdef RVLDWC_ROOT
118LIBS +=     vct          \
119
120endif
121
122
123LIBS_INTERNAL = wk        \
124                oslog     \
125                wkmc      \
126                sdwp      \
127                simplekit \
128                es        \
129                wad       \
130                cunit     \
131                fs        \
132                iprof     \
133                cntcache  \
134
135LIBS += ${LIBS_INTERNAL}
136
137DEMOS    =  axdemo        \
138            dvddemo       \
139            fademo        \
140            gxdemo        \
141            kpaddemo      \
142            kpadOlddemo   \
143            memdemo       \
144            osdemo        \
145            sample        \
146            spdemo        \
147            videmo        \
148            wpaddemo      \
149            nanddemo      \
150            reldemo       \
151            paddemo       \
152            thpdemo       \
153            scprivatedemo \
154            scdemo        \
155            carddemo      \
156            gddemo        \
157            hio2demo      \
158            arcdemo       \
159            darchdemo     \
160            encdemo       \
161            cxdemo        \
162            fntdemo       \
163            kbddemo       \
164            kprdemo       \
165            mididemo      \
166            limitdemo     \
167            launchdemo    \
168            discnanddemo  \
169            rsodemo       \
170            hiddemo       \
171            cntdemo       \
172            pddemo        \
173            wbcdemo       \
174            usbmicdemo    \
175            pmicdemo      \
176            cntsddemo     \
177            oslogdemo     \
178            jpegdemo      \
179
180ifdef RVLDWC_ROOT
181DEMOS +=     vctdemo       \
182
183endif
184
185TESTS    =  os        \
186            card      \
187            sample    \
188            exi       \
189            sdwp      \
190            nand      \
191            pad       \
192            sc        \
193            dvd       \
194            di        \
195            fs        \
196            es        \
197            sdi       \
198            socket    \
199            usb       \
200            wpad      \
201            abuse     \
202            Nmenu     \
203            enc       \
204            installer \
205            cx        \
206            updatecheck \
207            sdkchecker \
208            autotest  \
209            cntcache  \
210            cntsd     \
211            dummyviewer \
212            cnt       \
213            deleteSharedCnt \
214
215AUTOTESTS = fa/fa_sync  \
216            fa/fa_async \
217            fa/fa_format_test \
218            fa/valid_test \
219            sdi \
220
221TESTS    += ${AUTOTESTS}
222
223endif # EPPC
224
225ifdef X86
226
227HOST_LIBS =  gd         \
228             hio2Host
229
230HOST_DEMOS = gddemo     \
231             hio2demo
232
233HOST_TOOLS = sample       \
234             dls1wt       \
235             dspadpcm     \
236             dsptool      \
237             sndconv      \
238             soundfile    \
239             thpaudio     \
240             thpcore      \
241             thputilities \
242             THPConv      \
243             darch        \
244             ntcompress
245
246endif # X86
247
248LIBDIRS      = $(addprefix $(LIB_ROOT)/,$(LIBS))
249TESTDIRS     = $(addprefix $(TEST_ROOT)/,$(TESTS))
250DEMODIRS     = $(addprefix $(DEMO_ROOT)/,$(DEMOS))
251AUTOTESTDIRS = $(addprefix $(TEST_ROOT)/,$(AUTOTESTS))
252
253HOSTLIBDIRS  = $(addprefix $(LIB_ROOT)/,$(HOST_LIBS))
254HOSTDEMODIRS = $(addprefix $(DEMO_ROOT)/,$(HOST_DEMOS))
255ADPCMLIBDIRS = $(addprefix $(LIB_ROOT)/,$(ADPCMLIB))
256SOUNDFILELIBDIRS = $(addprefix $(LIB_ROOT)/,$(SOUNDFILELIB))
257HOSTTOOLDIRS = $(addprefix $(TOOL_ROOT)/,$(HOST_TOOLS))
258
259# NOTE: the order of these directories determines build order.
260# In this case, we want libs first, tests second, demos last
261SUBDIRS     = $(addprefix $(LIB_ROOT)/,$(LIBS)) 	\
262              $(addprefix $(TEST_ROOT)/,$(TESTS))	\
263              $(addprefix $(DEMO_ROOT)/,$(DEMOS))	\
264              $(addprefix $(LIB_ROOT)/,$(HOST_LIBS))	\
265              $(addprefix $(DEMO_ROOT)/,$(HOST_DEMOS))	\
266              $(addprefix $(LIB_ROOT)/,$(SOUNDFILELIB))	\
267              $(addprefix $(LIB_ROOT)/,$(ADPCMLIB))
268
269# The following changes the Makefile include path to include a
270# definition of which architecture we're building for
271ARCH_PATH	= $(MAKE_ROOT)/$(ARCH_TARGET)
272
273all:
274	$(MAKE) setup
275	$(MAKE) subdirectories
276
277setup:
278	@if [ ! -d $(INSTALL_ROOT) ] ; then \
279		echo "Creating $(INSTALL_ROOT)" ; \
280		rm -rf $(INSTALL_ROOT) ; \
281		mkdir $(BASEINSTALL_ROOT) ; \
282		mkdir $(BASEINSTALL_ROOT)/$(ARCH_TARGET) ; \
283		mkdir $(INSTALL_ROOT)/lib ; \
284		mkdir $(INSTALL_ROOT)/bin ; \
285	else \
286		echo "Install directory ready" ;\
287	fi
288
289# the following lines build up the flags for the recursive make commands
290BUILDFLAGS	= X86=$(X86) PLATFORM=$(PLATFORM) DBREL="$(DBREL)" BUILDTOOLS_ROOT=$(MAKE_ROOT)
291
292ifdef NDEBUG
293BUILDFLAGS	+= NDEBUG=TRUE
294else
295BUILDFLAGS	+= DEBUG=TRUE
296endif
297
298ifdef BUILD
299BUILDFLAGS	+= build
300endif
301
302ifdef INSTALL
303BUILDFLAGS	+= install
304endif
305
306.PHONY: alllibs libraries demos tests hostlibs hostdemos adpcmlib
307
308subdirectories:
309	@for d in $(SUBDIRS) ; do \
310		echo "------------------------------------------------------------------" ; \
311		echo "Building $$d" ; \
312		if [ ! -d $$d ] ; then \
313			echo "Module $$d is missing...skipping" ; \
314		else \
315			$(MAKE) -C $$d $(BUILDFLAGS) ; \
316		fi ; \
317	done ;
318
319alllibs: libraries hostlibs
320
321libraries:
322	@for d in $(LIBDIRS) ; do \
323		echo "------------------------------------------------------------------" ; \
324		echo "Building $$d" ; \
325		if [ ! -d $$d ] ; then \
326			echo "Module $$d is missing...skipping" ; \
327		else \
328			$(MAKE) -C $$d $(BUILDFLAGS) ; \
329		fi ; \
330	done ;
331
332libraries.%:
333	@echo "------------------------------------------------------------------" ; \
334	echo "Building libraries/$*" ; \
335	$(MAKE) -C $(LIB_ROOT)/$* $(BUILDFLAGS)
336
337hostlibs:
338	@for d in $(HOSTLIBDIRS) ; do \
339		echo "------------------------------------------------------------------" ; \
340		echo "Building $$d" ; \
341		if [ ! -d $$d ] ; then \
342			echo "Module $$d is missing...skipping" ; \
343		else \
344			$(MAKE) -C $$d $(BUILDFLAGS) ; \
345		fi ; \
346	done ;
347
348hostlibs.%:
349	@echo "------------------------------------------------------------------" ; \
350	echo "Building libraries/$*" ; \
351	$(MAKE) -C $(LIB_ROOT)/$* $(BUILDFLAGS)
352
353demos:
354	@for d in $(DEMODIRS) ; do \
355		echo "------------------------------------------------------------------" ; \
356		echo "Building $$d" ; \
357		if [ ! -d $$d ] ; then \
358			echo "Module $$d is missing...skipping" ; \
359		else \
360			$(MAKE) -C $$d $(BUILDFLAGS) ; \
361		fi ; \
362	done ;
363
364demos.%:
365	@echo "------------------------------------------------------------------" ; \
366	echo "Building demos/$*" ; \
367	$(MAKE) -C $(DEMO_ROOT)/$* $(BUILDFLAGS)
368
369hostdemos:
370	@for d in $(HOSTDEMODIRS) ; do \
371		echo "------------------------------------------------------------------" ; \
372		echo "Building $$d" ; \
373		if [ ! -d $$d ] ; then \
374			echo "Module $$d is missing...skipping" ; \
375		else \
376			$(MAKE) -C $$d $(BUILDFLAGS) ; \
377		fi ; \
378	done ;
379
380hostdemos.%:
381	@echo "------------------------------------------------------------------" ; \
382	echo "Building demos/$*" ; \
383	$(MAKE) -C $(DEMO_ROOT)/$* $(BUILDFLAGS)
384
385hosttools:
386	@for d in $(HOSTTOOLDIRS) ; do \
387		echo "------------------------------------------------------------------" ; \
388		echo "Building $$d" ; \
389		if [ ! -d $$d ] ; then \
390			echo "Module $$d is missing...skipping" ; \
391		else \
392			$(MAKE) -C $$d $(BUILDFLAGS) ; \
393		fi ; \
394	done ;
395
396hosttools.%:
397	@echo "------------------------------------------------------------------" ; \
398	echo "Building demos/$*" ; \
399	$(MAKE) -C $(TOOL_ROOT)/$* $(BUILDFLAGS)
400
401tests:
402	@for d in $(TESTDIRS) ; do \
403		echo "------------------------------------------------------------------" ; \
404		echo "Building $$d" ; \
405		if [ ! -d $$d ] ; then \
406			echo "Module $$d is missing...skipping" ; \
407		else \
408			$(MAKE) -C $$d $(BUILDFLAGS) ; \
409		fi ; \
410	done ;
411
412tests.%:
413	@echo "------------------------------------------------------------------" ; \
414	echo "Building tests/$*" ; \
415	$(MAKE) -C $(TEST_ROOT)/$* $(BUILDFLAGS)
416
417adpcmlib:
418	@for d in $(ADPCMLIBDIRS) ; do \
419		echo "------------------------------------------------------------------" ; \
420		echo "Building $$d" ; \
421		if [ ! -d $$d ] ; then \
422			echo "Module $$d is missing...skipping" ; \
423		else \
424			$(MAKE) -C $$d $(BUILDFLAGS) ; \
425		fi ; \
426	done ;
427
428update:
429	@if [ ! -f $(SS) ] ; then \
430		echo "SourceSafe is not installed!  Please go to \\ntd-pdc\Vss\Dolphin Readme" ; \
431		exit 1; \
432	fi
433	@echo "Changing Sourcesafe project to $(SSROOT), performing full GET."
434	@$(SS) cp $(SSROOT) -I-Y -y$(SSUSER)
435	@cd $(ROOT)
436	@$(SS) get \*.\* -R -I-Y -y$(SSUSER) -r -gf
437
438clean clobber superclobber:
439	@echo ">>> Cleaning $(ARCH_TARGET) target" ;
440	@for d in $(SUBDIRS) ; do \
441		echo "------------------------------------------------------------------" ; \
442		echo "Cleaning $$d" ; \
443		if [ ! -d $$d ] ; then \
444			echo "Module $$d is missing...skipping" ; \
445		else \
446			$(MAKE) -C $$d $@ $(BUILDFLAGS) ; \
447		fi ; \
448	done ;
449
450clean_libraries:
451	@echo ">>> Cleaning $(ARCH_TARGET) target" ;
452	@for d in $(LIBDIRS) ; do \
453		echo "------------------------------------------------------------------" ; \
454		echo "Cleaning $$d" ; \
455		if [ ! -d $$d ] ; then \
456			echo "Module $$d is missing...skipping" ; \
457		else \
458			$(MAKE) -C $$d clean $(BUILDFLAGS) ; \
459		fi ; \
460	done ;
461
462autotest_setdvdroot:
463	@echo ""
464	@setndenv DvdRoot "$(AUTOTEST_DVDROOT)"
465	@ if [ ! -f $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf ] || [ ! -f $(AUTOTEST_DVDROOT)/autotest.dol ] ; then \
466	  echo ">>> Building autotest module" ; \
467	  make -C $(AUTOTEST_MAKEPATH) NDEBUG=TRUE; \
468	fi
469
470autotest_targets:
471	@for d in $(AUTOTESTDIRS) ; do \
472		echo "------------------------------------------------------------------" ; \
473		echo "Installing $$d for autotest" ; \
474		if [ ! -d $$d ] ; then \
475			echo "Module $$d is missing...skipping" ; \
476		else \
477			$(MAKE) -C $$d autotest_targets $(BUILDFLAGS) ; \
478		fi ; \
479	done ;
480
481autotest: autotest_targets autotest_setdvdroot
482	@ if [ -e "$(ROOT)/build/tests/autotest_modules.txt" ] ; then \
483	  cp $(ROOT)/build/tests/autotest_modules.txt $(AUTOTEST_DVDROOT_TESTS)/autotest_modules.txt; \
484	else \
485	  echo no $(ROOT)/build/tests/autotest_modules.txt; \
486	fi
487	@ if [ "$(ARGS)" != "" ] ; then \
488	  ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a $(ARGS); \
489	else \
490	  ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf; \
491	fi
492	@ echo "Opening serial port..."; \
493	  AUTOTEST_LOG=autotest_`date +%y%m%d%H%M`.txt; \
494	  if [ "$(TIMEOUT)" != "" ] ; then \
495	    uterm "" $$AUTOTEST_LOG "" "" $(TIMEOUT); \
496	  else \
497	    uterm "" $$AUTOTEST_LOG "" "" 900; \
498	  fi; \
499	  if [ $$? -ne 0 ] ; then \
500	    ndstop; \
501	    echo error; \
502	  else \
503	    echo ok; \
504	  fi; \
505	  grep -i 'AutoTest: ' $$AUTOTEST_LOG; \
506	  grep -i 'Failed' $$AUTOTEST_LOG; \
507	  echo "Log: $$AUTOTEST_LOG"
508
509autotest_rvm: autotest_targets autotest_setdvdroot
510	@ if [ -e "$(ROOT)/build/tests/autotest_modules.txt" ] ; then \
511	  cp $(ROOT)/build/tests/autotest_modules.txt $(AUTOTEST_DVDROOT_TESTS)/autotest_modules.txt; \
512	else \
513	  echo no $(ROOT)/build/tests/autotest_modules.txt; \
514	fi
515	@ setsmem2size 64
516#	@ setcountrycode jp       # developer must set up country code manually
517#	@ setfirmware 53          # developer must set up firmware version manually
518	@ ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a -manual
519	@ makemasterNF $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).dlf $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).rvm
520
521# Below does not build and install the $(TESTDOL) because we don't know what module it is in.
522# It is better to call this from module's makefile to run one so $(TESTDOL) is dependent on build + install
523autotest_runone: autotest_setdvdroot
524	ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a -runone $(TESTDOL) $(ARGS)
525	@ echo "Opening serial port..."; \
526	  AUTOTEST_LOG=autotest_`date +%y%m%d%H%M`.txt; \
527	  if [ "$(TIMEOUT)" != "" ] ; then \
528	    uterm "" $$AUTOTEST_LOG "" "" $(TIMEOUT); \
529	  else \
530	    uterm "" $$AUTOTEST_LOG "" "" 900; \
531	  fi; \
532	  if [ $$? -ne 0 ] ; then \
533	    ndstop; \
534	    echo error; \
535	  else \
536	    echo ok; \
537	  fi; \
538	  grep -i 'AutoTest: ' $$AUTOTEST_LOG; \
539	  grep -i 'Failed' $$AUTOTEST_LOG; \
540	  echo "Log: $$AUTOTEST_LOG"
541
542autotest_manual: autotest_setdvdroot
543	@ if [ "$(ARGS)" != "" ] ; then \
544	  ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a $(ARGS); \
545	else \
546	  ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a -manual; \
547	fi
548
549autotest_clean:
550	rm -rf $(AUTOTEST_DVDROOT_TESTS); \
551	rm -rf $(AUTOTEST_DVDROOT_IMPORT)
552