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
43ifdef MAKE_ON_CYGWIN
44CLEAN_DEPEND := sed -f "$(REVOLUTION_SDK_ROOT)/build/buildtools/eppccleandepend.sed"
45endif
46
47CYGPATH := sed -e 'sX\/cygdrive\/\([a-zA-Z]\+\)\/X\1:\/Xg'
48
49# first, figure out which directory tree we are in, and set PROJ_ROOT
50# accordingly.
51ifdef CPBUILD
52ifeq ($(DEMO),TRUE)
53PROJ_ROOT	= $(CP_DEMO_ROOT)
54endif
55
56ifeq ($(LIB),TRUE)
57PROJ_ROOT	= $(CP_LIB_ROOT)
58endif
59
60else # CPBUILD
61ifeq ($(DEMO),TRUE)
62PROJ_ROOT	= $(DEMO_ROOT)
63endif
64
65ifeq ($(LIB),TRUE)
66PROJ_ROOT	= $(LIB_ROOT)
67endif
68endif # CPBUILD
69
70ifeq ($(TEST), TRUE)
71PROJ_ROOT	= $(TEST_ROOT)
72endif
73
74ifeq ($(SAMPLE), TRUE)
75PROJ_ROOT	= $(SAMPLE_ROOT)
76endif
77
78ifeq ($(CHAR_PIPELINE), TRUE)
79PROJ_ROOT	= $(CHAR_PIPELINE_ROOT)
80endif
81
82ifeq ($(BUILD_TOOL), TRUE)
83PROJ_ROOT	= $(MAKE_ROOT)
84endif
85
86# Paths relevant to this module - they are all based off of PROJ_ROOT
87
88# BINOBJ AND BINLIB MUST BE LOCAL BECAUSE OF BUG IN COMPILERS...they
89# cannot take absolute output path
90# however, the dependency code DOES generate full paths, so we need those
91# for pattern matching
92MODULE_ROOT	    = $(PROJ_ROOT)/$(MODULENAME)
93FULLSRC_ROOT    = $(MODULE_ROOT)/src
94
95BINOBJ_ROOT     = obj/$(ARCH_TARGET)/$(BUILD_TARGET)
96DEP_ROOT        = depend/$(ARCH_TARGET)/$(BUILD_TARGET)
97FULLBINOBJ_ROOT = $(BINOBJ_ROOT)
98FULLDEP_ROOT    = $(MODULE_ROOT)/$(DEP_ROOT)
99
100BINLIB_ROOT     = lib/$(ARCH_TARGET)
101FULLBINLIB_ROOT = $(MODULE_ROOT)/$(BINLIB_ROOT)
102FULLBIN_ROOT    = bin/$(ARCH_TARGET)
103BIN_ROOT        = bin/$(ARCH_TARGET)
104VPATH           = $(FULLBIN_ROOT):$(FULLBINOBJ_ROOT)
105
106# Suffix rules
107.SUFFIXES:
108.SUFFIXES: .s .h .c .o .cpp
109
110###############################################################################
111#
112#   Generate lists of objects to be built
113#
114###############################################################################
115
116ALLCSRCS    = $(CSRCS) $(CLIBSRCS)
117ALLCPPSRCS  = $(CPPSRCS) $(CPPLIBSRCS)
118ALLASMSRCS  = $(ASMSRCS) $(ASMLIBSRCS)
119
120ifdef CSRCS
121OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(CSRCS:.c=.o))
122ifdef WADNAMES
123OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(CSRCS:.c=$(NANDAPPSUFFIX).o))
124endif
125endif
126ifdef CPPSRCS
127OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(CPPSRCS:.cpp=.o))
128ifdef WADNAMES
129OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(CPPSRCS:.cpp=$(NANDAPPSUFFIX).o))
130endif
131endif
132ifdef ASMSRCS
133OBJECTS     += $(addprefix $(FULLBINOBJ_ROOT)/, $(ASMSRCS:.s=.o))
134endif
135ifdef CLIBSRCS
136LIBOBJECTS  += $(addprefix $(FULLBINOBJ_ROOT)/, $(CLIBSRCS:.c=.o))
137endif
138ifdef CPPLIBSRCS
139LIBOBJECTS  += $(addprefix $(FULLBINOBJ_ROOT)/, $(CPPLIBSRCS:.cpp=.o))
140endif
141ifdef ASMLIBSRCS
142LIBOBJECTS  += $(addprefix $(FULLBINOBJ_ROOT)/, $(ASMLIBSRCS:.s=.o))
143endif
144
145ALLOBJECTS  = $(OBJECTS) $(LIBOBJECTS)
146
147# if we're building debug versions, need to change names of built libs/bins
148ifdef LIBNAME
149TARGET_LIB	= $(FULLBINLIB_ROOT)/$(LIBNAME)$(LIBSUFFIX)
150endif
151
152ifdef BINNAMES
153TARGET_BINS	= $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(BINSUFFIX), $(BINNAMES)))
154endif
155
156ifdef WADNAMES
157TARGET_WADS	= $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(WADSUFFIX), $(WADNAMES)))
158endif
159
160ifdef PLFNAMES
161TARGET_PLFS     = $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(PLFSUFFIX), $(PLFNAMES)))
162endif
163
164ifdef RELNAMES
165TARGET_PLFS     = $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(PLFSUFFIX), $(RELNAMES)))
166TARGET_PREPLFS  = $(addprefix $(FULLBIN_ROOT)/,$(addsuffix $(PREPLFSUFFIX), $(RELNAMES)))
167endif
168
169ifdef PUBLISHARGS
170PUBLISH_TARGET	:= $(subst $(comma),$(space),$(PUBLISHARGS))
171endif
172
173###############################################################################
174#
175#   Generic building rules
176#
177###############################################################################
178
179# GENERIC ASM FILE BUILDING
180$(FULLBINOBJ_ROOT)/%.o: src/%.s
181	@if [ ! -d $(@D) ] ; then \
182		echo ">>> Creating $(@D)" ; \
183		$(MKDIRP) $(@D) ; \
184	fi
185	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
186		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
187		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
188	fi
189	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
190	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
191		$(MKDIRP) $(MODULE_ROOT)/include ; \
192	fi
193	@echo ""
194	@echo "$< --> $@"
195ifdef EPPC
196	$(AS) $(ASFLAGS) $(INCLUDES) -c $< -o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
197ifndef SNSYS
198	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d ;\
199	$(CLEAN_DEPEND) $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d ;\
200	rm -f $(notdir $*).d
201else # SNSYS
202endif # SNSYS
203else # EPPC
204endif # EPPC
205
206
207# GENERIC C FILE BUILDING
208$(FULLBINOBJ_ROOT)/%.o: src/%.c
209	@if [ ! -d $(@D) ] ; then \
210		echo ">>> Creating $(@D)" ; \
211		$(MKDIRP) $(@D) ; \
212	fi
213	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
214		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
215		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
216	fi
217	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
218	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
219		$(MKDIRP) $(MODULE_ROOT)/include ; \
220	fi
221	@echo ""
222	@echo ">> $< --> $(BINOBJ_ROOT)/$(subst $(FULLBINOBJ_ROOT)/,,$@)"
223ifdef EPPC
224	$(CC) $(CCFLAGS) $(INCLUDES) $(PREFIX_FILE) $(COMPILE) $< \
225		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
226ifndef SNSYS
227	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d ;\
228	$(CLEAN_DEPEND) $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d ;\
229	rm -f $(notdir $*).d
230else # SNSYS
231endif # SNSYS
232else # EPPC
233endif # EPPC
234
235# GENERIC C FILE BUILDING FOR NANDAPP
236$(FULLBINOBJ_ROOT)/%$(NANDAPPSUFFIX).o: src/%.c
237	@if [ ! -d $(@D) ] ; then \
238		echo ">>> Creating $(@D)" ; \
239		$(MKDIRP) $(@D) ; \
240	fi
241	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
242		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
243		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
244	fi
245	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
246	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
247		$(MKDIRP) $(MODULE_ROOT)/include ; \
248	fi
249	@echo ""
250	@echo ">> $< --> $(BINOBJ_ROOT)/$(subst $(FULLBINOBJ_ROOT)/,,$@)"
251ifdef EPPC
252	$(CC) $(CCFLAGS) -DNANDAPP=TRUE $(INCLUDES) $(PREFIX_FILE) $(COMPILE) $< \
253		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
254ifndef SNSYS
255	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d ;\
256	$(CLEAN_DEPEND) $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d ;\
257	rm -f $(notdir $*).d
258else # SNSYS
259endif # SNSYS
260else # EPPC
261endif # EPPC
262
263# GENERIC CXX FILE BUILDING
264$(FULLBINOBJ_ROOT)/%.o: src/%.cpp
265	@if [ ! -d $(@D) ] ; then \
266		echo ">>> Creating $(@D)" ; \
267		$(MKDIRP) $(@D) ; \
268	fi
269	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
270		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
271		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
272	fi
273	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
274	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
275		$(MKDIRP) $(MODULE_ROOT)/include ; \
276	fi
277	@echo ""
278	@echo ">> $< --> $(BINOBJ_ROOT)/$(subst $(FULLBINOBJ_ROOT)/,,$@)"
279ifdef EPPC
280	$(CC) $(CCFLAGS) $(INCLUDES) $(COMPILE) $< \
281		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
282ifndef SNSYS
283	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d ;\
284	$(CLEAN_DEPEND) $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d ;\
285	rm -f $(notdir $*).d
286else # SNSYS
287endif # SNSYS
288else # EPPC
289endif # EPPC
290
291# GENERIC CXX FILE BUILDING FOR NANDAPP
292$(FULLBINOBJ_ROOT)/%$(NANDAPPSUFFIX).o: src/%.cpp
293	@if [ ! -d $(@D) ] ; then \
294		echo ">>> Creating $(@D)" ; \
295		$(MKDIRP) $(@D) ; \
296	fi
297	@if [ ! -d $(dir $(FULLDEP_ROOT)/$*) ] ; then \
298		echo ">>> Creating $(dir $(FULLDEP_ROOT)/$*)" ; \
299		$(MKDIRP) $(dir $(FULLDEP_ROOT)/$*) ; \
300	fi
301	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
302	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
303		$(MKDIRP) $(MODULE_ROOT)/include ; \
304	fi
305	@echo ""
306	@echo ">> $< --> $(BINOBJ_ROOT)/$(subst $(FULLBINOBJ_ROOT)/,,$@)"
307ifdef EPPC
308	$(CC) $(CCFLAGS) -DNANDAPP=TRUE $(INCLUDES) $(COMPILE) $< \
309		-o $(subst $(FULLBINOBJ_ROOT)/,$(BINOBJ_ROOT)/,$@) -MD
310ifndef SNSYS
311	@echo -n "$(FULLBINOBJ_ROOT)/$*.o: " > $(FULLDEP_ROOT)/$*.d ;\
312	$(CLEAN_DEPEND) $(notdir $*).d >> $(FULLDEP_ROOT)/$*.d ;\
313	rm -f $(notdir $*).d
314else # SNSYS
315endif # SNSYS
316else # EPPC
317endif # EPPC
318
319# GENERIC .elf/executable BUILDING
320# linker command file is used whenever LCF_FILE is defined.
321# Note it is only used when linking executables.
322
323ifdef LCF_FILE
324LDFLAGS += -lcf $(LCF_FILE)
325endif # LCF_FILE
326
327$(FULLBIN_ROOT)/%$(BINSUFFIX):
328	@echo ""
329	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
330ifdef MAKE_ON_CYGWIN
331	$(LD) $(shell echo $(filter-out %.lcf %.dol, $+) |$(CYGPATH)) $(LDFLAGS) -o $(shell echo $@ |$(CYGPATH))
332else
333	$(LD) $(filter-out %.lcf %.dol, $+) $(LDFLAGS) -o $@
334endif # MAKE_ON_CYGWIN
335
336# Generate .wad (for NAND application)
337ifdef CNT_IDX
338ifdef MAKE_ON_CYGWIN
339DVD_ROOT = $(shell cygpath -m $(word 2, $(shell getndenv)))
340else
341DVD_ROOT = $(shell echo $(word 2, $(shell getndenv)))
342endif
343ARC_DIR = archives
344CONTENT_INDEX = $(subst $(comma),$(space),$(CNT_IDX))
345CNT_FILES = $(foreach val,$(CONTENT_INDEX),$(DVD_ROOT)/content$(val)/content$(val).arc)
346WAD_CNT = $(subst $(space),$(comma), \
347			$(foreach val,$(CONTENT_INDEX),$(DVD_ROOT)/$(ARC_DIR)/content$(val).arc))
348endif # CNT_IDX
349ifdef CNT_ARG
350CNT_FILES += $(subst $(comma),$(space),$(CNT_ARG))
351WAD_CNT := $(WAD_CNT)$(comma)$(CNT_ARG)
352endif # CNT_ARG
353
354ifdef NANDAPP
355ifndef NOEXPORT
356NANDAPP_TARGET = $(foreach val, $(BINNAMES), $(val)$(REGION_SUFFIX)$(WADSUFFIX))
357endif
358endif #NANDAPP
359
360ifdef NANDAPP
361ifdef WAD_APP
362%$(REGION_SUFFIX)$(WADSUFFIX): $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) $(CNT_FILES)
363ifdef COUNTRY_REGION
364	setcountrycode $(COUNTRY_REGION)
365endif
366ifdef PARENTAL_CONTROL_ID_LIST
367	setnparentalcontrol $(PARENTAL_CONTROL_ID_LIST)
368endif
369ifndef NOCOMPRESS
370	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
371		echo "NADK is not installed. Exiting..."; \
372	else \
373		echo ""; \
374		echo ">> $(WAD_APP)$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
375		echo makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
376		makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
377		echo "ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)"; \
378		ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
379		echo makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
380		makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
381		echo mv $(WAD_APP)$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
382		mv $(WAD_APP)$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
383	fi
384else
385	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
386		echo "NADK is not installed. Exiting..."; \
387	else \
388		echo ""; \
389		echo ">> $(WAD_APP)$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
390		echo makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
391		echo makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
392		makedol -f $(FULLBIN_ROOT)/$(WAD_APP)$(BINSUFFIX) -d $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX); \
393		makeWad -n $(WAD_APP)$(ASUFFIX) -l $(FULLBIN_ROOT)/$(WAD_APP)$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
394		echo mv $(WAD_APP)$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
395		mv $(WAD_APP)$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
396	fi
397endif # NOCOMPRESS
398else
399%$(REGION_SUFFIX)$(WADSUFFIX): $(FULLBIN_ROOT)/%$(BINSUFFIX) $(CNT_FILES)
400ifdef COUNTRY_REGION
401	setcountrycode $(COUNTRY_REGION)
402endif
403ifdef PARENTAL_CONTROL_ID_LIST
404	setnparentalcontrol $(PARENTAL_CONTROL_ID_LIST)
405endif
406ifndef NOCOMPRESS
407	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
408		echo "NADK is not installed. Exiting..."; \
409	else \
410		echo ""; \
411		echo ">> $*$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
412		echo makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
413		makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
414		echo "ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$*$(DOLSUFFIX)"; \
415		ntcompress -lex -A32 -o $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX) $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
416		echo makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
417		makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(LZ77SUFFIX)$(WAD_CNT) $(WAD_OPTION); \
418		echo mv $*$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
419		mv $*$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
420	fi
421else
422	@if [ ! -f $(ROOT)/X86/bin/makeWad.exe ] ; then \
423		echo "NADK is not installed. Exiting..."; \
424	else \
425		echo ""; \
426		echo ">> $*$(BINSUFFIX) $(notdir $(CNT_FILES)) --> $@"; \
427		echo makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
428		echo makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
429		makedol -f $(FULLBIN_ROOT)/$*$(BINSUFFIX) -d $(FULLBIN_ROOT)/$*$(DOLSUFFIX); \
430		makeWad -n $*$(ASUFFIX) -l $(FULLBIN_ROOT)/$*$(DOLSUFFIX)$(WAD_CNT) $(WAD_OPTION); \
431		echo mv $*$(WADSUFFIX) -> $(FULLBIN_ROOT)/$@; \
432		mv $*$(WADSUFFIX) $(FULLBIN_ROOT)/$@; \
433	fi
434endif # NOCOMPRESS
435endif # WAD_APP
436endif # NANDAPP
437
438
439ifndef CNT_IDX
440%.arc:
441else
442$(DVD_ROOT)/content%.arc:
443endif
444	@if [ ! -d $(DVD_ROOT)/$(ARC_DIR) ] ; then \
445		echo ""; \
446	    echo ">>> Creating $(DVD_ROOT)/$(ARC_DIR)" ;\
447		echo ""; \
448		$(MKDIRP) $(DVD_ROOT)/$(ARC_DIR) ; \
449	fi
450	@if [ ! -d $(@D) ] ; then \
451	    echo "$(@D) is not exist!" ; \
452	else \
453		echo "------------------------------------------------------------------" ; \
454		echo "Archiving $(@D)"; \
455		cd $(@D); \
456		darch -c * $(@F); \
457		darch -t $(@F); \
458		echo "$(DVD_ROOT)/archives/$(@F)"; \
459		mv $(@F) $(DVD_ROOT)/$(ARC_DIR); \
460	fi
461
462
463
464
465# Generate .plf (partial link file)
466ifdef EPPC
467$(FULLBIN_ROOT)/%$(PLFSUFFIX):
468	@echo ""
469	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
470ifdef MAKE_ON_CYGWIN
471ifdef REL_LCF_FILE
472	$(LD) $(shell echo $(filter-out %.lcf,$+) |$(CYGPATH)) $(REL_LDFLAGS) -lcf $(REL_LCF_FILE) -o $(shell echo $@ |$(CYGPATH))
473else # REL_LCF_FILE
474# obsolete (for compatibility with 4/3/01 SDK)
475ifdef LCF_FILE
476	$(LD) $(shell echo $(filter-out %.lcf,$+) |$(CYGPATH)) $(REL_LDFLAGS) -lcf $(LCF_FILE) -o $(shell echo $@ |$(CYGPATH))
477else # LCF_FILE
478	$(LD) $(shell echo $(filter-out %.lcf,$+) |$(CYGPATH)) $(REL_LDFLAGS) -o $(shell echo $@ |$(CYGPATH))
479endif # LCF_FILE
480endif # REL_LCF_FILE
481else # MAKE_ON_CYGWIN
482ifdef REL_LCF_FILE
483	$(LD) $(filter-out %.lcf,$+) $(REL_LDFLAGS) -lcf $(REL_LCF_FILE) -o $@
484else # REL_LCF_FILE
485# obsolete (for compatibility with 4/3/01 SDK)
486ifdef LCF_FILE
487	$(LD) $(filter-out %.lcf,$+) $(REL_LDFLAGS) -lcf $(LCF_FILE)     -o $@
488else # LCF_FILE
489	$(LD) $(filter-out %.lcf,$+) $(REL_LDFLAGS)                      -o $@
490endif # LCF_FILE
491endif # REL_LCF_FILE
492endif # MAKE_ON_CYGWIN
493endif # EPPC
494
495# Generate .preplf (partial link file)
496ifdef EPPC
497$(FULLBIN_ROOT)/%$(PREPLFSUFFIX):
498	@echo ""
499	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
500ifdef MAKE_ON_CYGWIN
501ifdef PREREL_LCF_FILE
502	$(LD) $(shell echo $(filter-out %.lcf,$+) |$(CYGPATH)) $(PREREL_LDFLAGS) -lcf $(PREREL_LCF_FILE) -o $(shell echo $@ |$(CYGPATH))
503else # PREREL_LCF_FILE
504	$(LD) $(shell echo $(filter-out %.lcf,$+) |$(CYGPATH)) $(PREREL_LDFLAGS)) -o $(shell echo $@ |$(CYGPATH))
505endif # PREREL_LCF_FILE
506else # MAKE_ON_CYGWIN
507ifdef PREREL_LCF_FILE
508	$(LD) $(filter-out %.lcf,$+) $(PREREL_LDFLAGS) -lcf $(PREREL_LCF_FILE) -o $@
509else # PREREL_LCF_FILE
510	$(LD) $(filter-out %.lcf,$+) $(PREREL_LDFLAGS) -o $@
511endif # PREREL_LCF_FILE
512endif # MAKE_ON_CYGWIN
513endif # EPPC
514
515# Generate .dol
516ifdef EPPC
517$(FULLBIN_ROOT)/%$(DOLSUFFIX): $(FULLBIN_ROOT)/%$(BINSUFFIX)
518	@echo ""
519	@echo ">> $(notdir $+) --> $(subst $(FULLBIN_ROOT)/,,$@)"
520	"$(ROOT)/X86/bin/makedol.exe" -f $< -d $@
521endif
522
523# GENERIC dependency building
524ifdef X86
525
526$(FULLDEP_ROOT)/%$(DEPSUFFIX): src/%.c
527	@if [ ! -d $(@D) ] ; then \
528		echo ">>> Creating $(@D)" ; \
529		$(MKDIRP) $(@D) ; \
530	fi
531	@if [ ! -d $(MODULE_ROOT)/include ] ; then \
532	    echo ">>> Creating $(MODULE_ROOT)/include" ;\
533		$(MKDIRP) $(MODULE_ROOT)/include ; \
534	fi
535	@echo "Refreshing dependency $@"
536	@rm -f $@
537	@echo -n "$(FULLBINOBJ_ROOT)/$*.o " > $@
538	@$(CC) $(CCFLAGS) $(INCLUDES) -MM $(MODULE_ROOT)/$< | tr -d '\r' >> $@
539
540endif
541
542
543
544# GENERIC LIBRARY LINKING
545$(TARGET_LIB): $(LIBOBJECTS)
546	@echo ""
547	@echo ">> New $(notdir $?) --> linking $@"
548ifdef MAKE_ON_CYGWIN
549	$(AR) $(ARFLAGS) $(LIBOBJECTS) -o $(shell echo $(TARGET_LIB) |$(CYGPATH))
550else # MAKE_ON_CYGWIN
551	$(AR) $(ARFLAGS) $(LIBOBJECTS) -o $(TARGET_LIB)
552endif # MAKE_ON_CYGWIN
553
554###############################################################################
555#
556#   Miscellaneous targets - cleaning and setup
557#
558###############################################################################
559
560SETUP_ROOTS = $(BINOBJ_ROOT) $(INSTALL_ROOT) $(BINLIB_ROOT) $(BIN_ROOT)
561
562setup: $(SETUP_ROOTS)
563
564$(INSTALL_ROOT):
565	@echo "Creating $(INSTALL_ROOT)" ; \
566	rm -rf $(INSTALL_ROOT) ; \
567	$(MKDIRP) $(BASEINSTALL_ROOT) ; \
568	$(MKDIRP) $(BASEINSTALL_ROOT)/$(ARCH_TARGET) ; \
569	$(MKDIRP) $(INSTALL_ROOT)/include ; \
570	$(MKDIRP) $(INSTALL_ROOT)/lib ; \
571	$(MKDIRP) $(INSTALL_ROOT)/bin
572
573$(BINOBJ_ROOT):
574	@echo "Creating $(BINOBJ_ROOT)" ; \
575	$(MKDIRP) $(MODULE_ROOT)/obj ; \
576	$(MKDIRP)  $(MODULE_ROOT)/obj/$(ARCH_TARGET) ; \
577	$(MKDIRP)  $(MODULE_ROOT)/obj/$(ARCH_TARGET)/DEBUG ; \
578	$(MKDIRP)  $(MODULE_ROOT)/obj/$(ARCH_TARGET)/NDEBUG
579
580$(BINLIB_ROOT):
581	@echo "Creating $(BINLIB_ROOT)" ; \
582	$(MKDIRP) $(MODULE_ROOT)/lib ; \
583	$(MKDIRP) $(BINLIB_ROOT)
584
585$(BIN_ROOT):
586	@echo "Creating $(BIN_ROOT)" ; \
587	$(MKDIRP) $(MODULE_ROOT)/bin ; \
588	$(MKDIRP) $(BIN_ROOT)
589
590build: setup $(NANDAPP_TARGET)
591# ifdef MULTIPROCESSOR
592# 	@$(MAKE) -j X86=$(X86) PLATFORM=$(PLATFORM) INCLUDEDEPS=TRUE dobuild
593# else
594	@$(MAKE) X86=$(X86) PLATFORM=$(PLATFORM) INCLUDEDEPS=TRUE dobuild
595#endif
596
597dobuild: $(OBJECTS) $(TARGET_LIB) $(TARGET_BINS) $(TARGET_DOLS) $(TARGET_WADS) $(TARGET_PLFS) $(TARGET_PREPLFS)
598
599cleandep:
600	rm -rf depend/$(ARCH_TARGET)/DEBUG/*
601	rm -rf depend/$(ARCH_TARGET)/NDEBUG/*
602
603cleantilde:
604	rm -f $(addprefix src/, $(ALLCSRCS:.c=.c~))
605	rm -f $(addprefix src/, $(ALLCSRCS:.c=.BAK))
606	rm -f *~ *.BAK
607	rm -f include/*~ include/*.BAK
608
609clobberdemoinstall:
610ifdef DEMO
611ifdef MODULENAME
612	rm -rf $(INSTALL_ROOT)/bin/demos/$(MODULENAME)/*
613endif
614endif
615
616clobbertest:
617ifdef TEST
618ifdef MODULENAME
619	rm -rf $(INSTALL_ROOT)/bin/tests/$(MODULENAME)/*
620endif
621endif
622
623clobberlib:
624	rm -rf $(BINLIB_ROOT)/*
625ifdef LIBNAME
626	rm -f $(INSTALL_ROOT)/lib/$(LIBNAME)$(LIBSUFFIX)
627endif
628
629cleanidb:
630ifdef MAC
631# 	rm -f $(BIN_ROOT)/*.idb
632endif
633
634cleandis:
635	rm -f src/*.c.s
636
637cleanobj:
638	rm -rf obj/$(ARCH_TARGET)/DEBUG/*
639	rm -rf obj/$(ARCH_TARGET)/NDEBUG/*
640
641clobberbin:
642	rm -rf $(BIN_ROOT)/*
643	rm -f *.MAP
644
645cleanuser:
646ifdef CLEANFILES
647	rm -rf $(CLEANFILES)
648endif
649
650clean:		cleanobj cleandep cleantilde cleanidb cleandis cleanuser
651
652clobber:	clean clobberbin clobberlib clobberdemoinstall clobbertest
653
654superclobber: clobber
655	rm -rf bin
656	rm -rf obj
657	rm -rf lib
658	rm -rf depend
659
660###############################################################################
661#
662# Module installation - copy binaries and libraries to appropriate locations
663# All libraries are installed.
664# Only demo binaries are installed.
665#
666###############################################################################
667
668install: build
669ifndef SNSYS
670	@echo -n "$(MODULE_ROOT) - ";
671	@if [ `ls lib/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
672		echo -n "No libs to export..." ; \
673	else \
674		echo -n "Exporting libs..." ; \
675		if [ ! -d $(INSTALL_ROOT)/lib ] ; then \
676			echo -n "Creating $(INSTALL_ROOT)/lib..." ; \
677			$(MKDIRP) $(INSTALL_ROOT)/lib ; \
678		fi ; \
679		cp -uR lib/$(ARCH_TARGET)/* $(INSTALL_ROOT)/lib ; \
680		chmod +w $(INSTALL_ROOT)/lib/*  ; \
681	fi
682ifdef DEMO
683	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
684		echo -n "No binaries to export..." ; \
685	else \
686		echo -n "Exporting binaries..." ; \
687		if [ ! -d $(INSTALL_ROOT)/bin/demos/$(MODULENAME) ] ; then \
688			echo -n "Creating $(INSTALL_ROOT)/bin/demos/$(MODULENAME)..." ; \
689			$(MKDIRP) $(INSTALL_ROOT)/bin/demos ; \
690			$(MKDIRP) $(INSTALL_ROOT)/bin/demos/$(MODULENAME) ; \
691		fi ; \
692		cp -uR bin/$(ARCH_TARGET)/* $(INSTALL_ROOT)/bin/demos/$(MODULENAME)/ ; \
693		chmod +w $(INSTALL_ROOT)/bin/demos/$(MODULENAME)/*  ; \
694	fi
695endif
696ifdef TEST
697	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
698		echo -n "No binaries to export..." ; \
699	else \
700		echo -n "Exporting binaries..." ; \
701		if [ ! -d $(INSTALL_ROOT)/bin/tests/$(MODULENAME) ] ; then \
702			echo -n "Creating $(INSTALL_ROOT)/bin/tests/$(MODULENAME)..." ; \
703			$(MKDIRP) $(INSTALL_ROOT)/bin/tests ; \
704			$(MKDIRP) $(INSTALL_ROOT)/bin/tests/$(MODULENAME) ; \
705		fi ; \
706		cp -uR bin/$(ARCH_TARGET)/* $(INSTALL_ROOT)/bin/tests/$(MODULENAME)/ ; \
707		chmod +w $(INSTALL_ROOT)/bin/tests/$(MODULENAME)/*  ; \
708	fi
709endif
710ifdef APPLOADER
711	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
712		echo -n "No binaries to export..." ; \
713	else \
714		echo -n "Exporting apploader binaries..." ; \
715		if [ ! -d $(INSTALL_ROOT)/boot ] ; then \
716			echo -n "Creating $(INSTALL_ROOT)/boot..." ; \
717			$(MKDIRP) $(INSTALL_ROOT)/boot ; \
718		fi ; \
719		cp -u bin/$(ARCH_TARGET)/apploader$(IMGSUFFIX) $(INSTALL_ROOT)/boot/ ; \
720		chmod +w $(INSTALL_ROOT)/boot/*  ; \
721	fi
722endif
723ifdef TOOL
724	@if [ `ls bin/$(ARCH_TARGET) 2> /dev/null | wc -l` = "0" ] ; then \
725		echo -n "No binaries to export..." ; \
726	else \
727		echo -n "Exporting makedol binaries..." ; \
728		if [ ! -d $(INSTALL_ROOT)/bin ] ; then \
729			echo -n "Creating $(INSTALL_ROOT)/bin..." ; \
730			$(MKDIRP) $(INSTALL_ROOT)/bin ; \
731		fi ; \
732		cp -uR bin/$(ARCH_TARGET)/* $(INSTALL_ROOT)/bin/ ; \
733		chmod +w $(INSTALL_ROOT)/bin/*  ; \
734	fi
735endif
736	@echo ""
737endif # SNSYS
738
739###############################################################################
740#
741# Module autotest - convert binaries to dol/wad and copy to dvdroot
742#
743###############################################################################
744
745ifdef EPPC
746
747AUTOTEST_DVDROOT_MODULE   = $(AUTOTEST_DVDROOT_TESTS)/$(MODULENAME)
748AUTOTEST_MODULE_TESTDOLS  = $(addprefix $(AUTOTEST_DVDROOT_MODULE)/,$(addsuffix $(DOLSUFFIX), $(BINNAMES_AUTOTEST)))
749AUTOTEST_MODULE_TESTWADS  = $(addprefix $(AUTOTEST_DVDROOT_MODULE)/,$(addsuffix $(REGION_SUFFIX)$(WADSUFFIX), $(WADNAMES_AUTOTEST)))
750
751$(FULLBIN_ROOT)/%$(REGION_SUFFIX)$(WADSUFFIX): $(FULLBIN_ROOT)/%$(NANDAPPSUFFIX)$(BINSUFFIX)
752	@$(MAKE) $*$(NANDAPPSUFFIX)$(REGION_SUFFIX)$(WADSUFFIX) NANDAPP=TRUE WAD_OPTION=$(WAD_OPTION_$*)
753	rm -rf $(FULLBIN_ROOT)/$*$(NANDAPPSUFFIX)$(REGION_SUFFIX)$(DOLSUFFIX) $(FULLBIN_ROOT)/$*$(NANDAPPSUFFIX)$(REGION_SUFFIX)$(DOLSUFFIX)$(LZ77SUFFIX)
754	mv $(FULLBIN_ROOT)/$*$(NANDAPPSUFFIX)$(REGION_SUFFIX)$(WADSUFFIX) $@
755
756.PHONY: autotest_setdvdroot autotest_targets_dvdroot autotest_targets autotest autotest_runone autotest_manual autotest_clean
757
758$(AUTOTEST_DVDROOT_MODULE) $(AUTOTEST_DVDROOT_IMPORT) $(AUTOTEST_DVDROOT_DATA_ARC):
759	@ if [ ! -d $@ ] ; then \
760	    echo ">>> Creating $@" ; \
761	    $(MKDIRP) $@ ; \
762	  fi
763
764$(AUTOTEST_DVDROOT_MODULE)/%$(DOLSUFFIX): $(FULLBIN_ROOT)/%$(DOLSUFFIX) $(AUTOTEST_DVDROOT_MODULE)
765	@ cp -upv $< $@
766
767$(AUTOTEST_DVDROOT_MODULE)/%$(REGION_SUFFIX)$(WADSUFFIX): $(FULLBIN_ROOT)/%$(REGION_SUFFIX)$(WADSUFFIX) $(AUTOTEST_DVDROOT_MODULE)
768	@ cp -upv $< $@
769
770ifdef AUTOTEST_DATATITLE_GAMECODE
771CCFLAGS += -DAUTOTEST_DATATITLE_GAMECODE=\"$(AUTOTEST_DATATITLE_GAMECODE)\"
772
773$(AUTOTEST_DVDROOT_IMPORT)/$(AUTOTEST_DATATITLE_GAMECODE).wad: $(AUTOTEST_DVDROOT_IMPORT) $(AUTOTEST_DVDROOT_DATA_ARC)
774	@ if [ -d $(AUTOTEST_DVDROOT_DATA)/$(AUTOTEST_DATATITLE_GAMECODE)/content1 ] ; then \
775	  echo ">>> Packaging files into datatitle" ; \
776	  echo "    $(notdir $(AUTOTEST_DVDROOT_DATA))/$(AUTOTEST_DATATITLE_GAMECODE)/content1/* -> $(notdir $(AUTOTEST_DVDROOT_IMPORT))/$(AUTOTEST_DATATITLE_GAMECODE).wad" ; \
777	  cd $(AUTOTEST_DVDROOT_DATA)/$(AUTOTEST_DATATITLE_GAMECODE)/content1; \
778	  darchD -c * $(AUTOTEST_DVDROOT_DATA_ARC)/$(AUTOTEST_DATATITLE_GAMECODE).arc; \
779	  darchD -tv $(AUTOTEST_DVDROOT_DATA_ARC)/$(AUTOTEST_DATATITLE_GAMECODE).arc; \
780	  cd $(AUTOTEST_DVDROOT_DATA_ARC); \
781	  makeWad -f -n $(AUTOTEST_DATATITLE_GAMECODE) -l $(AUTOTEST_DVDROOT_DATA_ARC)/$(AUTOTEST_DATATITLE_GAMECODE).arc -gc $(AUTOTEST_DATATITLE_GAMECODE) -E 0x00000000 -e 0xffffffff; \
782	  mv $(AUTOTEST_DATATITLE_GAMECODE).wad $(AUTOTEST_DVDROOT_IMPORT); \
783	fi
784
785autotest: $(AUTOTEST_DVDROOT_IMPORT)/$(AUTOTEST_DATATITLE_GAMECODE).wad
786endif
787
788autotest_setdvdroot:
789	@echo ""
790	@setndenv DvdRoot "$(AUTOTEST_DVDROOT)"
791	@ if [ ! -f $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf ] || [ ! -f $(AUTOTEST_DVDROOT)/autotest.dol ] ; then \
792	  echo ">>> Building autotest module" ; \
793	  $(MAKE) -C $(AUTOTEST_MAKEPATH) NDEBUG=TRUE; \
794	fi
795
796autotest_targets_dvdroot: $(AUTOTEST_MODULE_TESTDOLS) $(AUTOTEST_MODULE_TESTWADS)
797
798# This must be 2 separate make commands below.  This is so this target works after fresh checkout/superclobber
799autotest_targets:
800	@$(MAKE) build
801	@$(MAKE) autotest_targets_dvdroot
802	@ if [ -e "autotest_config.txt" ] ; then \
803	    cp autotest_config.txt $(AUTOTEST_DVDROOT_MODULE)/autotest_config.txt; \
804	  else \
805	    echo no $(AUTOTEST_DVDROOT_MODULE)/autotest_config.txt; \
806	  fi; \
807
808# uterm timeout set non-zero so that it can be auto-terminated by EOF "\004" in serial output
809# autotest_stub -> autotest.dol -> test1.dol -> autotest.dol -> test2.dol -> ...
810autotest: autotest_targets autotest_setdvdroot
811	ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a -runmodule $(MODULENAME) $(ARGS)
812	@ echo "Opening serial port..."; \
813	  AUTOTEST_LOG=autotest_`date +%y%m%d%H%M`.txt; \
814	  if [ "$(TIMEOUT)" != "" ] ; then \
815	    uterm "" $$AUTOTEST_LOG "" "" $(TIMEOUT); \
816	  else \
817	    uterm "" $$AUTOTEST_LOG "" "" 900; \
818	  fi; \
819	  if [ $$? -ne 0 ] ; then \
820	    ndstop; \
821	    echo error; \
822	  else \
823	    echo ok; \
824	  fi; \
825	  grep -i 'AutoTest: ' $$AUTOTEST_LOG; \
826	  grep -i 'Failed' $$AUTOTEST_LOG; \
827	  echo "Log: $$AUTOTEST_LOG"
828
829autotest_runone: $(addprefix $(AUTOTEST_DVDROOT_MODULE)/, $(TESTDOL)) autotest_setdvdroot
830	ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a -runone $(TESTDOL) $(ARGS)
831	@ echo "Opening serial port..."; \
832	  AUTOTEST_LOG=autotest_`date +%y%m%d%H%M`.txt; \
833	  if [ "$(TIMEOUT)" != "" ] ; then \
834	    uterm "" $$AUTOTEST_LOG "" "" $(TIMEOUT); \
835	  else \
836	    uterm "" $$AUTOTEST_LOG "" "" 900; \
837	  fi; \
838	  if [ $$? -ne 0 ] ; then \
839	    ndstop; \
840	    echo error; \
841	  else \
842	    echo ok; \
843	  fi; \
844	  grep -i 'AutoTest: ' $$AUTOTEST_LOG; \
845	  grep -i 'Failed' $$AUTOTEST_LOG; \
846	  echo "Log: $$AUTOTEST_LOG"
847
848autotest_manual: autotest_setdvdroot
849	@ if [ "$(ARGS)" != "" ] ; then \
850	  ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a $(ARGS); \
851	else \
852	  ndrun $(AUTOTEST_STUB_PATH)/$(AUTOTEST_STUB).elf -a -manual; \
853	fi
854
855autotest_clean:
856	rm -rf $(AUTOTEST_DVDROOT_TESTS)
857	rm -rf $(AUTOTEST_DVDROOT_IMPORT)
858
859endif # EPPC
860
861# Generate dependency files
862ifdef INCLUDEDEPS
863ifneq (,$(firstword $(ALLASMSRCS)))
864-include $(addprefix $(FULLDEP_ROOT)/, $(ALLASMSRCS:.s=$(DEPSUFFIX)))
865endif
866ifneq (,$(firstword $(ALLCSRCS)))
867-include $(addprefix $(FULLDEP_ROOT)/, $(ALLCSRCS:.c=$(DEPSUFFIX)))
868endif
869ifneq (,$(firstword $(ALLCPPSRCS)))
870-include $(addprefix $(FULLDEP_ROOT)/, $(ALLCPPSRCS:.cpp=$(DEPSUFFIX)))
871endif
872endif