1###############################################################################
2# Makefile for modules - building and installing
3#
4# Copyright 2005 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###############################################################################
14#
15# This makefile can support one library per module, and any number of
16# executables.
17# The library is specified by the following variables in the module makefile:
18#   LIBNAME     - name of the library, with no suffix
19#   CLIBSRCS    - c sources to be included in library
20#   ASMLIBSRCS	- assembly sources to be included in library
21#
22# Executables rely on the following:
23#   BINNAMES    - names of all executables, with no suffix
24#   CSRCS       - all c sources to be built
25#   ASMSRCS     - all assembly sources to be built
26# Finally to show dependencies, each BINNAME should have its own rule at the
27# bottom of the module makefile, such as :
28# $(FULLBIN_ROOT)/cachedemo$(BINSUFFIX): cachedemo.o \
29#		      	$(REVOLUTION_LIBS)
30# If a linker command file is required, define the variable:
31#   LCF_FILE = myLCFfile.lcf
32#
33# The following pre-defined variables are relied upon :
34# FULLBIN_ROOT - a pointer to the binary directory of this module
35# BINSUFFIX    - the suffix of the binary (e.g. "D" if debug version, ".elf" if
36#                an EPPC binary
37# REVOLUTION_LIBS  - list of all Dolphin libraries appropriate for this target.
38#
39###############################################################################
40
41MKDIRP := mkdir -p
42
43# first, figure out which directory tree we are in, and set PROJ_ROOT
44# accordingly.
45ifdef CPBUILD
46ifeq ($(DEMO),TRUE)
47PROJ_ROOT	= $(CP_DEMO_ROOT)
48endif
49
50ifeq ($(LIB),TRUE)
51PROJ_ROOT	= $(CP_LIB_ROOT)
52endif
53
54else # CPBUILD
55ifeq ($(DEMO),TRUE)
56PROJ_ROOT	= $(DEMO_ROOT)
57endif
58
59ifeq ($(LIB),TRUE)
60PROJ_ROOT	= $(LIB_ROOT)
61endif
62endif # CPBUILD
63
64ifeq ($(TEST), TRUE)
65PROJ_ROOT	= $(TEST_ROOT)
66endif
67
68ifeq ($(SAMPLE), TRUE)
69PROJ_ROOT	= $(SAMPLE_ROOT)
70endif
71
72ifeq ($(CHAR_PIPELINE), TRUE)
73PROJ_ROOT	= $(CHAR_PIPELINE_ROOT)
74endif
75
76ifeq ($(BUILD_TOOL), TRUE)
77PROJ_ROOT	= $(MAKE_ROOT)
78endif
79
80# Paths relevant to this module - they are all based off of PROJ_ROOT
81
82# BINOBJ AND BINLIB MUST BE LOCAL BECAUSE OF BUG IN COMPILERS...they
83# cannot take absolute output path
84# however, the dependency code DOES generate full paths, so we need those
85# for pattern matching
86MODULE_ROOT	    = $(PROJ_ROOT)/$(MODULENAME)
87FULLSRC_ROOT    = $(MODULE_ROOT)/src
88
89BINOBJ_ROOT     = obj/$(ARCH_TARGET)/$(BUILD_TARGET)
90DEP_ROOT        = depend/$(ARCH_TARGET)/$(BUILD_TARGET)
91#FULLBINOBJ_ROOT = $(MODULE_ROOT)/$(BINOBJ_ROOT)
92FULLBINOBJ_ROOT = $(BINOBJ_ROOT)
93FULLDEP_ROOT    = $(MODULE_ROOT)/$(DEP_ROOT)
94
95BINLIB_ROOT     = lib/$(ARCH_TARGET)
96FULLBINLIB_ROOT = $(MODULE_ROOT)/$(BINLIB_ROOT)
97#FULLBIN_ROOT    = $(MODULE_ROOT)/bin/$(ARCH_TARGET)
98FULLBIN_ROOT    = bin/$(ARCH_TARGET)
99BIN_ROOT        = bin/$(ARCH_TARGET)
100VPATH           = $(FULLBIN_ROOT):$(FULLBINOBJ_ROOT)
101
102# Suffix rules
103.SUFFIXES:
104.SUFFIXES: .s .h .c .o .cpp
105
106###############################################################################
107#
108#   Generate lists of objects to be built
109#
110###############################################################################
111
112ALLCSRCS    = $(CSRCS) $(CLIBSRCS)
113ALLCPPSRCS  = $(CPPSRCS) $(CPPLIBSRCS)
114ALLASMSRCS  = $(ASMSRCS) $(ASMLIBSRCS)
115
116ifdef CSRCS
117OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(CSRCS:.c=.o))
118endif
119ifdef CPPSRCS
120OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(CPPSRCS:.cpp=.o))
121endif
122ifdef ASMSRCS
123OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(ASMSRCS:.s=.o))
124endif
125ifdef CLIBSRCS
126LIBOBJECTS  += $(addprefix $(FULLBINOBJ_ROOT)/, $(CLIBSRCS:.c=.o))
127endif
128ifdef CPPLIBSRCS
129LIBOBJECTS  += $(addprefix $(FULLBINOBJ_ROOT)/, $(CPPLIBSRCS:.cpp=.o))
130endif
131ifdef ASMLIBSRCS
132LIBOBJECTS  += $(addprefix $(FULLBINOBJ_ROOT)/, $(ASMLIBSRCS:.s=.o))
133endif
134
135ALLOBJECTS  = $(OBJECTS) $(LIBOBJECTS)
136
137# if we're building debug versions, need to change names of built libs/bins
138ifdef LIBNAME
139TARGET_LIB	= $(FULLBINLIB_ROOT)/$(LIBNAME)$(LIBSUFFIX)
140endif
141
142ifdef BINNAMES
143TARGET_BINS	= $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(BINSUFFIX), $(BINNAMES)))
144endif
145
146ifdef PLFNAMES
147TARGET_PLFS     = $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(PLFSUFFIX), $(PLFNAMES)))
148endif
149
150ifdef RELNAMES
151TARGET_PLFS     = $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(PLFSUFFIX), $(RELNAMES)))
152TARGET_PREPLFS  = $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(PREPLFSUFFIX), $(RELNAMES)))
153endif
154
155ifdef PUBLISHARGS
156PUBLISH_TARGET	:= $(subst $(comma),$(space),$(PUBLISHARGS))
157endif
158
159###############################################################################
160#
161#   Generic building rules
162#
163###############################################################################
164
165# GENERIC ASM FILE BUILDING
166$(FULLBINOBJ_ROOT)/%.o: src/%.s
167	@if [ ! -d $(@D) ] ; then \
168		echo ">>> Creating $(@D)" ; \
169		$(MKDIRP) $(@D) ; \
170	fi
171	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
172		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
173		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
174	fi
175	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
176	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
177		$(MKDIRP) $(MODULE_ROOT)/include ; \
178	fi
179	@echo ""
180	@echo "$< --> $@"
181ifdef EPPC
182	$(AS) $(ASFLAGS) $(INCLUDES) -c $< -o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
183ifndef SNSYS
184	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d
185	@sed -f "$(REVOLUTION_SDK_ROOT)/build/buildtools/eppccleandepend.sed" $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d
186	@rm -f $(notdir $*).d
187else # SNSYS
188# 	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d
189endif # SNSYS
190else # EPPC
191# 	$(AS) $(ASFLAGS) $(INCLUDES) -c $< -o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@)
192endif # EPPC
193
194
195# GENERIC C FILE BUILDING
196$(FULLBINOBJ_ROOT)/%.o: src/%.c
197	@if [ ! -d $(@D) ] ; then \
198		echo ">>> Creating $(@D)" ; \
199		$(MKDIRP) $(@D) ; \
200	fi
201	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
202		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
203		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
204	fi
205	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
206	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
207		$(MKDIRP) $(MODULE_ROOT)/include ; \
208	fi
209	@echo ""
210	@echo ">> $< --> $(BINOBJ_ROOT)/$(subst $(FULLBINOBJ_ROOT)/,,$@)"
211ifdef EPPC
212	$(CC) $(CCFLAGS) $(INCLUDES) $(PREFIX_FILE) $(COMPILE) $< \
213		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
214ifndef SNSYS
215	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d
216	@sed -f "$(REVOLUTION_SDK_ROOT)/build/buildtools/eppccleandepend.sed" $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d
217	@rm -f $(notdir $*).d
218else # SNSYS
219# 	@echo "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d
220endif # SNSYS
221else # EPPC
222# 	$(CC) $(CCFLAGS) $(INCLUDES) $(COMPILE) $< \
223# 		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@)
224endif # EPPC
225
226
227# GENERIC CXX FILE BUILDING
228$(FULLBINOBJ_ROOT)/%.o: src/%.cpp
229	@if [ ! -d $(@D) ] ; then \
230		echo ">>> Creating $(@D)" ; \
231		$(MKDIRP) $(@D) ; \
232	fi
233	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
234		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
235		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
236	fi
237	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
238	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
239		$(MKDIRP) $(MODULE_ROOT)/include ; \
240	fi
241	@echo ""
242	@echo ">> $< --> $(BINOBJ_ROOT)/$(subst $(FULLBINOBJ_ROOT)/,,$@)"
243ifdef EPPC
244	$(CC) $(CCFLAGS) $(INCLUDES) $(COMPILE) $< \
245		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
246ifndef SNSYS
247	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d
248	@sed -f "$(REVOLUTION_SDK_ROOT)/build/buildtools/eppccleandepend.sed" $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d
249	@rm -f $(notdir $*).d
250else # SNSYS
251# 		echo "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d
252endif # SNSYS
253else # EPPC
254# 	$(CC) $(CCFLAGS) $(INCLUDES) $(COMPILE) $< \
255# 		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@)
256endif # EPPC
257
258# GENERIC .elf/executable BUILDING
259# linker command file is used whenever LCF_FILE is defined.
260# Note it is only used when linking executables.
261
262ifdef LCF_FILE
263LDFLAGS += -lcf $(LCF_FILE)
264endif # LCF_FILE
265
266$(FULLBIN_ROOT)/%$(BINSUFFIX):
267	@echo ""
268	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
269	$(LD) $(filter-out %.lcf %.dol, $+) $(LDFLAGS) -o $@
270
271
272
273# Generate .wad (for NAND application)
274ifdef CNT_IDX
275DVD_ROOT = $(shell cygpath -m $(word 2, $(shell getndenv)))
276ARC_DIR = archives
277CONTENT_INDEX = $(subst $(comma),$(space),$(CNT_IDX))
278CNT_FILES = $(foreach val,$(CONTENT_INDEX),$(DVD_ROOT)/content$(val)/content$(val).arc)
279WAD_CNT = $(subst $(space),$(comma), \
280			$(foreach val,$(CONTENT_INDEX),$(DVD_ROOT)/$(ARC_DIR)/content$(val).arc))
281endif # CNT_IDX
282ifdef CNT_ARG
283CNT_FILES += $(subst $(comma),$(space),$(CNT_ARG))
284WAD_CNT := $(WAD_CNT)$(comma)$(CNT_ARG)
285endif # CNT_ARG
286
287ifdef NANDAPP
288ifndef NOEXPORT
289NANDAPP_TARGET = $(foreach val, $(BINNAMES), $(val)$(REGION_SUFFIX)$(WADSUFFIX))
290endif
291endif #NANDAPP
292
293ifdef NANDAPP
294ifdef WAD_APP
295%$(REGION_SUFFIX)$(WADSUFFIX): $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) $(CNT_FILES)
296ifdef COUNTRY_REGION
297	setcountrycode $(COUNTRY_REGION)
298endif
299ifdef PARENTAL_CONTROL_ID_LIST
300	setnparentalcontrol $(PARENTAL_CONTROL_ID_LIST)
301endif
302ifndef NOCOMPRESS
303	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
304		echo "NADK is not installed. Exiting..."; \
305	else \
306		echo ""; \
307		echo ">> $(WAD_APP)$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
308		echo makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
309		makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
310		echo "ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)"; \
311		ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
312		echo makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
313		makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
314		echo mv $(WAD_APP)$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
315		mv $(WAD_APP)$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
316	fi
317else
318	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
319		echo "NADK is not installed. Exiting..."; \
320	else \
321		echo ""; \
322		echo ">> $(WAD_APP)$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
323		echo makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
324		echo makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
325		makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
326		makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
327		echo mv $(WAD_APP)$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
328		mv $(WAD_APP)$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
329	fi
330endif # NOCOMPRESS
331else
332%$(REGION_SUFFIX)$(WADSUFFIX): $(FULLBIN_ROOT)/%$(BINSUFFIX) $(CNT_FILES)
333ifdef COUNTRY_REGION
334	setcountrycode $(COUNTRY_REGION)
335endif
336ifdef PARENTAL_CONTROL_ID_LIST
337	setnparentalcontrol $(PARENTAL_CONTROL_ID_LIST)
338endif
339ifndef NOCOMPRESS
340	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
341		echo "NADK is not installed. Exiting..."; \
342	else \
343		echo ""; \
344		echo ">> $*$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
345		echo makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
346		makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
347		echo "ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$*$(DOLSUFFIX)"; \
348		ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
349		echo makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
350		makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
351		echo mv $*$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
352		mv $*$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
353	fi
354else
355	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
356		echo "NADK is not installed. Exiting..."; \
357	else \
358		echo ""; \
359		echo ">> $*$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
360		echo makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
361		echo makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
362		makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
363		makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
364		echo mv $*$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
365		mv $*$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
366	fi
367endif # NOCOMPRESS
368endif # WAD_APP
369endif # NANDAPP
370
371
372ifndef CNT_IDX
373%.arc:
374else
375$(DVD_ROOT)/content%.arc:
376endif
377	@if [ ! -d $(DVD_ROOT)/$(ARC_DIR) ] ; then \
378		echo ""; \
379	    echo ">>> Creating $(DVD_ROOT)/$(ARC_DIR)" ;\
380		echo ""; \
381		$(MKDIRP) $(DVD_ROOT)/$(ARC_DIR) ; \
382	fi
383	@if [ ! -d $(@D) ] ; then \
384	    echo "$(@D) is not exist!" ; \
385	else \
386		echo "------------------------------------------------------------------" ; \
387		echo "Archiving $(@D)"; \
388		cd $(@D); \
389		darch -c * $(@F); \
390		darch -t $(@F); \
391		echo "$(DVD_ROOT)/archives/$(@F)"; \
392		mv $(@F) $(DVD_ROOT)/$(ARC_DIR); \
393	fi
394
395
396
397
398# Generate .plf (partial link file)
399ifdef EPPC
400$(FULLBIN_ROOT)/%$(PLFSUFFIX):
401	@echo ""
402	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
403ifdef SNSYS
404# 	$(LD) $+ -Wl,-r  -o $@
405else # SNSYS
406ifdef REL_LCF_FILE
407	$(LD) $(filter-out %.lcf,$+) $(REL_LDFLAGS) -lcf $(REL_LCF_FILE) -o $@
408else # REL_LCF_FILE
409# obsolete (for compatibility with 4/3/01 SDK)
410ifdef LCF_FILE
411	$(LD) $(filter-out %.lcf,$+) $(REL_LDFLAGS) -lcf $(LCF_FILE)     -o $@
412else # LCF_FILE
413	$(LD) $(filter-out %.lcf,$+) $(REL_LDFLAGS)                      -o $@
414endif # LCF_FILE
415endif # REL_LCF_FILE
416endif # SNSYS
417endif # EPPC
418
419# Generate .preplf (partial link file)
420ifdef EPPC
421$(FULLBIN_ROOT)/%$(PREPLFSUFFIX):
422	@echo ""
423	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
424ifdef SNSYS
425# 	$(LD) $+ -Wl,-r -o $@
426else # SNSYS
427ifdef PREREL_LCF_FILE
428	$(LD) $(filter-out %.lcf,$+) $(PREREL_LDFLAGS) -lcf $(PREREL_LCF_FILE) -o $@
429else # PREREL_LCF_FILE
430	$(LD) $(filter-out %.lcf,$+) $(PREREL_LDFLAGS) -o $@
431endif # PREREL_LCF_FILE
432endif # SNSYS
433endif # EPPC
434
435# Generate .dol
436ifdef EPPC
437$(FULLBIN_ROOT)/%$(DOLSUFFIX): $(FULLBIN_ROOT)/%$(BINSUFFIX)
438	@echo ""
439	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
440	"$(ROOT)/X86/bin/makedol.exe" -f $< -d $@
441endif
442
443# GENERIC dependency building
444ifdef X86
445
446$(FULLDEP_ROOT)/%$(DEPSUFFIX): src/%.c
447	@if [ ! -d $(@D) ] ; then \
448		echo ">>> Creating $(@D)" ; \
449		$(MKDIRP) $(@D) ; \
450	fi
451	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
452	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
453		$(MKDIRP) $(MODULE_ROOT)/include ; \
454	fi
455	@echo "Refreshing dependency $@"
456	@rm -f $@
457	@echo -n "$(FULLBINOBJ_ROOT)/$*.o " > $@
458	@$(CC) $(CCFLAGS) $(INCLUDES) -MM $(MODULE_ROOT)/$< | tr -d '\r' >> $@
459
460endif
461
462
463
464# GENERIC LIBRARY LINKING
465$(TARGET_LIB): $(LIBOBJECTS)
466	@echo ""
467	@echo ">> New $(notdir $?) --> linking $@"
468ifdef SNSYS
469# 	$(AR) $(ARFLAGS) $(TARGET_LIB) $(LIBOBJECTS)
470else # SNSYS
471	$(AR) $(ARFLAGS) $(LIBOBJECTS) -o $(TARGET_LIB)
472endif # SNSYS
473
474###############################################################################
475#
476#   Miscellaneous targets - cleaning and setup
477#
478###############################################################################
479
480SETUP_ROOTS = $(BINOBJ_ROOT) $(INSTALL_ROOT) $(BINLIB_ROOT) $(BIN_ROOT)
481
482setup:	$(SETUP_ROOTS)
483
484$(INSTALL_ROOT):
485	@echo "Creating $(INSTALL_ROOT)" ; \
486	rm -rf $(INSTALL_ROOT) ; \
487	$(MKDIRP) $(BASEINSTALL_ROOT) ; \
488	$(MKDIRP) $(BASEINSTALL_ROOT)/$(ARCH_TARGET) ; \
489	$(MKDIRP) $(INSTALL_ROOT)/include ; \
490	$(MKDIRP) $(INSTALL_ROOT)/lib ; \
491	$(MKDIRP) $(INSTALL_ROOT)/bin
492
493$(BINOBJ_ROOT):
494	@echo "Creating $(BINOBJ_ROOT)" ; \
495	$(MKDIRP) $(MODULE_ROOT)/obj ; \
496	$(MKDIRP)  $(MODULE_ROOT)/obj/$(ARCH_TARGET) ; \
497	$(MKDIRP)  $(MODULE_ROOT)/obj/$(ARCH_TARGET)/DEBUG ; \
498	$(MKDIRP)  $(MODULE_ROOT)/obj/$(ARCH_TARGET)/NDEBUG
499
500$(BINLIB_ROOT):
501	@echo "Creating $(BINLIB_ROOT)" ; \
502	$(MKDIRP) $(MODULE_ROOT)/lib ; \
503	$(MKDIRP) $(BINLIB_ROOT)
504
505$(BIN_ROOT):
506	@echo "Creating $(BIN_ROOT)" ; \
507	$(MKDIRP) $(MODULE_ROOT)/bin ; \
508	$(MKDIRP) $(BIN_ROOT)
509
510build:	setup $(NANDAPP_TARGET)
511
512ifdef MULTIPROCESSOR
513	@$(MAKE) -j X86=$(X86) PLATFORM=$(PLATFORM) INCLUDEDEPS=TRUE dobuild
514else
515	@$(MAKE) X86=$(X86) PLATFORM=$(PLATFORM) INCLUDEDEPS=TRUE dobuild
516endif
517
518dobuild: $(OBJECTS) $(TARGET_LIB) $(TARGET_BINS) $(TARGET_DOLS) $(TARGET_PLFS) $(TARGET_PREPLFS)
519
520cleandep:
521	rm -rf depend/$(ARCH_TARGET)/DEBUG/*
522	rm -rf depend/$(ARCH_TARGET)/NDEBUG/*
523
524cleantilde:
525	rm -f $(addprefix src/, $(ALLCSRCS:.c=.c~))
526	rm -f $(addprefix src/, $(ALLCSRCS:.c=.BAK))
527	rm -f *~ *.BAK
528	rm -f include/*~ include/*.BAK
529
530clobberdemoinstall:
531ifdef DEMO
532ifdef MODULENAME
533	rm -rf $(INSTALL_ROOT)/bin/demos/$(MODULENAME)/*
534endif
535endif
536
537clobbertest:
538ifdef TEST
539ifdef MODULENAME
540	rm -rf $(INSTALL_ROOT)/bin/tests/$(MODULENAME)/*
541endif
542endif
543
544clobberlib:
545	rm -rf $(BINLIB_ROOT)/*
546ifdef LIBNAME
547	rm -f $(INSTALL_ROOT)/lib/$(LIBNAME)$(LIBSUFFIX)
548endif
549
550cleanidb:
551ifdef MAC
552# 	rm -f $(BIN_ROOT)/*.idb
553endif
554
555cleandis:
556	rm -f src/*.c.s
557
558cleanobj:
559	rm -rf obj/$(ARCH_TARGET)/DEBUG/*
560	rm -rf obj/$(ARCH_TARGET)/NDEBUG/*
561
562clobberbin:
563	rm -rf $(BIN_ROOT)/*
564	rm -f *.MAP
565
566cleanuser:
567ifdef CLEANFILES
568	rm -rf $(CLEANFILES)
569endif
570
571clean:		cleanobj cleandep cleantilde cleanidb cleandis cleanuser
572
573clobber:	clean clobberbin clobberlib clobberdemoinstall clobbertest
574
575superclobber: clobber
576	rm -rf bin
577	rm -rf obj
578	rm -rf lib
579	rm -rf depend
580
581###############################################################################
582#
583# Module installation - copy binaries and libraries to appropriate locations
584# All libraries are installed.
585# Only demo binaries are installed.
586#
587###############################################################################
588
589install: build
590ifndef SNSYS
591	@echo -n "$(MODULE_ROOT) - ";
592	@if [ `ls lib/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
593		echo -n "No libs to export..." ; \
594	else \
595		echo -n "Exporting libs..." ; \
596		if [ ! -d $(INSTALL_ROOT)/lib ] ; then \
597			echo -n "Creating $(INSTALL_ROOT)/lib..." ; \
598			$(MKDIRP) $(INSTALL_ROOT)/lib ; \
599		fi ; \
600		cp -uR lib/$(ARCH_TARGET)/* $(INSTALL_ROOT)/lib ; \
601		chmod +w $(INSTALL_ROOT)/lib/*  ; \
602	fi
603ifdef DEMO
604	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
605		echo -n "No binaries to export..." ; \
606	else \
607		echo -n "Exporting binaries..." ; \
608		if [ ! -d $(INSTALL_ROOT)/bin/demos/$(MODULENAME) ] ; then \
609			echo -n "Creating $(INSTALL_ROOT)/bin/demos/$(MODULENAME)..." ; \
610			$(MKDIRP) $(INSTALL_ROOT)/bin/demos ; \
611			$(MKDIRP) $(INSTALL_ROOT)/bin/demos/$(MODULENAME) ; \
612		fi ; \
613		cp -uR bin/$(ARCH_TARGET)/* $(INSTALL_ROOT)/bin/demos/$(MODULENAME)/ ; \
614		chmod +w $(INSTALL_ROOT)/bin/demos/$(MODULENAME)/*  ; \
615	fi
616endif
617ifdef TEST
618	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
619		echo -n "No binaries to export..." ; \
620	else \
621		echo -n "Exporting binaries..." ; \
622		if [ ! -d $(INSTALL_ROOT)/bin/tests/$(MODULENAME) ] ; then \
623			echo -n "Creating $(INSTALL_ROOT)/bin/tests/$(MODULENAME)..." ; \
624			$(MKDIRP) $(INSTALL_ROOT)/bin/tests ; \
625			$(MKDIRP) $(INSTALL_ROOT)/bin/tests/$(MODULENAME) ; \
626		fi ; \
627		cp -uR bin/$(ARCH_TARGET)/* $(INSTALL_ROOT)/bin/tests/$(MODULENAME)/ ; \
628		chmod +w $(INSTALL_ROOT)/bin/tests/$(MODULENAME)/*  ; \
629	fi
630endif
631ifdef APPLOADER
632	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
633		echo -n "No binaries to export..." ; \
634	else \
635		echo -n "Exporting apploader binaries..." ; \
636		if [ ! -d $(INSTALL_ROOT)/boot ] ; then \
637			echo -n "Creating $(INSTALL_ROOT)/boot..." ; \
638			$(MKDIRP) $(INSTALL_ROOT)/boot ; \
639		fi ; \
640		cp -u bin/$(ARCH_TARGET)/apploader$(IMGSUFFIX) $(INSTALL_ROOT)/boot/ ; \
641		chmod +w $(INSTALL_ROOT)/boot/*  ; \
642	fi
643endif
644ifdef TOOL
645	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
646		echo -n "No binaries to export..." ; \
647	else \
648		echo -n "Exporting makedol binaries..." ; \
649		if [ ! -d $(INSTALL_ROOT)/bin ] ; then \
650			echo -n "Creating $(INSTALL_ROOT)/bin..." ; \
651			$(MKDIRP) $(INSTALL_ROOT)/bin ; \
652		fi ; \
653		cp -uR bin/$(ARCH_TARGET)/* $(INSTALL_ROOT)/bin/ ; \
654		chmod +w $(INSTALL_ROOT)/bin/*  ; \
655	fi
656endif
657	@echo ""
658endif # SNSYS
659
660# Generate dependency files
661ifdef INCLUDEDEPS
662ifneq (,$(firstword $(ALLASMSRCS)))
663-include $(addprefix $(FULLDEP_ROOT)/, $(ALLASMSRCS:.s=$(DEPSUFFIX)))
664endif
665ifneq (,$(firstword $(ALLCSRCS)))
666-include $(addprefix $(FULLDEP_ROOT)/, $(ALLCSRCS:.c=$(DEPSUFFIX)))
667endif
668ifneq (,$(firstword $(ALLCPPSRCS)))
669-include $(addprefix $(FULLDEP_ROOT)/, $(ALLCPPSRCS:.cpp=$(DEPSUFFIX)))
670endif
671endif
672
673