1###############################################################################
2# vim:noexpandtab
3# Makefile for all modules
4#
5# Copyright 2010 Nintendo.  All rights reserved.
6#
7# These coded instructions, statements, and computer programs contain
8# proprietary information of Nintendo of America Inc. and/or Nintendo
9# Company Ltd., and are protected by Federal copyright law.  They may
10# not be disclosed to third parties or copied or duplicated in any form,
11# in whole or in part, without the prior written consent of Nintendo.
12#
13###############################################################################
14
15###############################################################################
16#
17# This makefile can support one library per module, and any number of
18# executables.
19#
20# Module must specify:
21#   MODULE_DEPTH    - depth to parent build directory using relative path (i.e. ../..)
22#
23# The library is specified by the following variables in the module makefile:
24#   LIB := TRUE
25#   CLIBSRCS        - c sources to be included in library
26#   CPPLIBSRCS      - cpp sources to be included in library
27#   ASMLIBSRCS	    - assembly sources to be included in library
28#
29#
30# A kernel library is specified by the following variables in the module makefile:
31#   KERNELLIB := TRUE
32#   CLIBSRCS        - c sources to be included in library
33#   CPPLIBSRCS      - cpp sources to be included in library
34#   ASMLIBSRCS	    - assembly sources to be included in library
35#
36# A loader library is specified by the following variables in the module makefile:
37#   LOADERLIB := TRUE
38#   CLIBSRCS        - c sources to be included in library
39#   CPPLIBSRCS      - cpp sources to be included in library
40#   ASMLIBSRCS	    - assembly sources to be included in library
41#
42# A kernel debugger library is specified by the following variables in the module makefile:
43#   KDEBUGLIB := TRUE
44#   CLIBSRCS        - c sources to be included in library
45#   CPPLIBSRCS      - cpp sources to be included in library
46#   ASMLIBSRCS	    - assembly sources to be included in library
47#
48# Executables and RPLs are specified by the following variables in the module makefile:
49#   CSRCS           - all c sources to be built
50#   CPPSRCS         - all cpp sources to be built
51#   ASMSRCS         - all assembly sources to be built
52#   BINNAMES        - names of all executables, with no suffix
53#   MODULE_LIBNAMES - library names that should be linked to specifically for this module
54#   LCF_FILE        - linker command file
55#
56# RPLs can have the following additional variables
57#   DEF_FILE        - exports definition file
58#   NOT_RPL         - (TRUE/not present) specifies if the file is processed as an RPL
59#   RPLNAME         - defines the name of an RPL (this being set indicates NOT an RPX)
60#                     used to define IMPORT_LIB
61#   BUILDING_RPL    - overrides default determiniation of RPX vs RPL which is based on RPLNAME
62#
63# To show dependencies, each BINNAME should have its own rule at the
64# bottom of the module makefile, such as :
65#   $(BIN_DIR)/app$(BINSUFFIX): $(OBJ_DIR)/app.o $(LIBS)
66#
67# The following pre-defined variables are relied upon:
68#   BIN_DIR         - a pointer to the binary directory of this module
69#   BINSUFFIX       - the suffix of the binary (e.g. .elf)
70#   OBJ_DIR         - a pointer to the object and dependency directory of this module
71#   LIBS            - full path to all libraries for link to module executables
72#                     this includes common and module-specific libraries
73#
74###############################################################################
75
76ifndef MODULE_DEPTH
77$(error Please specify MODULE_DEPTH in $(CURDIR)/makefile)
78endif
79
80#
81# if using GCC for ARM elf, then do not use GHS build rules
82#
83ifdef ARM_ELF_GCC_VERSION
84USE_GHS := 0
85endif
86
87# FIRST TARGET: Default to parallel build of default target
88include $(MODULE_DEPTH)/build/make/target_fast.mk
89
90# Module makefiles should not specify any targets before including modulerules.mk.
91.PHONY: default
92
93###############################################################################
94ifeq ($(USE_GHS),1)
95
96ifneq ($(NOT_RPL),TRUE)
97###############################################################################
98#  RPL processing
99###############################################################################
100ELF_TARGET_FILE = $(BIN_DIR)/$(basename $(notdir $@))$(BINSUFFIX)
101RPX_TARGET_FILE = $(BIN_DIR)/$(basename $(notdir $@))$(RPXSUFFIX)
102RPL_TARGET_FILE = $(BIN_DIR)/$(basename $(notdir $@))$(RPLSUFFIX)
103
104ifneq ($(RPLNAME),)
105    BUILDING_RPL := 1
106endif
107ifeq ($(BUILD_TARGET),NDEBUG)
108-include rplpad.mk
109endif
110ifeq ($(BUILDING_RPL),1)
111    BINNAMES :=
112    COMMON_LIBNAMES := rpl
113    LCF_FILE := $(RPL_LCF_FILE)
114    ifdef MAKERPL_PAD
115        MAKERPL_FLAGS += -checknosda $(MAKERPL_PAD)
116    else
117        MAKERPL_FLAGS += -checknosda
118    endif
119    RPL_ENTRY_SPEC ?= -e __rpl_crt
120else
121    RPL_ENTRY_SPEC := -e _start
122    ifdef MAKERPL_PAD
123        MAKERPL_FLAGS += -f $(MAKERPL_PAD)
124    else
125        MAKERPL_FLAGS += -f
126    endif
127endif
128
129# embed build type, sdk version and sdk revision infomations to rpx/rpl
130MAKERPL_FLAGS += -t BUILD_TYPE=$(BUILD_TYPE)
131ifeq ($(CAFE_GHS_SUPPORTS_MAKERPL_DBG_SOURCE_ROOT),TRUE)
132    MAKERPL_FLAGS += $(DBG_SOURCE_ROOT)
133endif
134
135MAKERPL_TARGET_LIB ?= $(LIB_DIR)/$(basename $(notdir $@))$(LIBSUFFIX)
136
137DUMPRPL_FLAGS += -padinfo
138
139LDFLAGS += $(RPL_ENTRY_SPEC)
140
141ifneq ($(KEEP_UNUSED_FUNC),TRUE)
142    LDFLAGS += -delete
143endif
144
145ifneq ($(DEF_FILE),)
146    SPECIFY_DEF_FILE = -x $(DEF_FILE)
147endif
148
149EXPORT_OBJECT_NAME ?= $(OBJ_DIR)/$(basename $(notdir $@))_rpl_export.o
150
151ifeq ($(BUILD_TARGET),NDEBUG)
152# provide a convenient way for developers to get call stack function names with
153# non-shipping NDEBUG builds by exporting SUPPRESS_STRIP=TRUE
154ifneq ($(SUPPRESS_STRIP),TRUE)
155    MAKERPL_FLAGS += -s
156endif
157endif
158
159ifeq ($(CAFE_FORCE_DYNAMIC),TRUE)
160    MAKERPL_FLAGS += -d
161endif
162
163else
164###############################################################################
165#  *NOT* RPL
166###############################################################################
167EXPORT_OBJECT_NAME :=
168ELF_TARGET_FILE = $@
169
170endif
171
172else
173ELF_TARGET_FILE = $@
174endif
175###############################################################################
176
177LIB_FILTER := $(filter $(MODULE_LIBNAMES),$(COMMON_LIBNAMES))
178ifneq ($(words $(LIB_FILTER)),0)
179$(info MODULE_LIBNAMES: $(MODULE_LIBNAMES))
180$(info COMMON_LIBNAMES: $(COMMON_LIBNAMES))
181$(error MODULE_LIBNAMES duplicated with COMMON_LIBNAMES.)
182endif
183
184ifneq ($(INIT_STACK_SIZE), )
185STACK_SIZE_OVERRIDE := -stack $(INIT_STACK_SIZE)
186else
187STACK_SIZE_OVERRIDE :=
188endif
189
190ifeq ($(LIB),TRUE)
191default: headers install
192else
193ifeq ($(KERNELLIB),TRUE)
194default: headers install
195else
196ifeq ($(LOADERLIB),TRUE)
197default: headers install
198else
199ifeq ($(KDEBUGLIB),TRUE)
200default: headers install
201else
202ifeq ($(RPLLIB),TRUE)
203default: headers install
204else
205ifeq ($(IS_IOP), STARTS_WITH_IOP)
206default: headers install
207else
208ifeq ($(BUILD_PARALLEL), TRUE)
209default: headers install
210else
211default: install
212endif
213endif
214endif
215endif
216endif
217endif
218endif
219
220
221###############################################################################
222#
223#  help
224#
225###############################################################################
226
227.PHONY: help
228
229help:
230	$(_@)echo "------------------------------------------------------------------" ; \
231	 echo "Usage:" ; \
232	 echo "" ; \
233	 echo "  To build" ; \
234	 echo "    make                      - build debug version" ; \
235	 echo "    make NDEBUG=TRUE          - build non-debug version" ; \
236	 echo "    make OS_SECURITY_LEVEL=<n> - build security level OS with level n between 0-255"; \
237	 echo "    make default              - build in serial (without parallel jobs) with compiler+linker output" ; \
238	 echo "    make clean                - remove object and dependency files" ; \
239	 echo "    make clobber              - return to checkout state" ; \
240	 echo "    export CAFE_MAKE_JOBS=<n> - set maximum number of parallel jobs" ; \
241	 echo "" ; \
242	 echo "  To build subset" ; \
243	 echo "    make -j <n> headers       - pass 1" ; \
244	 echo "    make -j <n> install       - pass 2" ; \
245	 echo "    make BINNAMES=<>          - build just 1 binary (if module has multiple binaries)" ; \
246	 echo "" ; \
247	 echo "  To run" ; \
248	 echo "    make run                  - build and run" ; \
249	 echo "    make rerun                - just run" ; \
250	 echo "    make [re]run BINNAMES=<>  - build and run just 1 binary of many (choose by name)" ; \
251	 echo "    make [re]multirun         - build, run, and debug with GHS multi user interface" ; \
252	 echo "    make srun                 - build and run using soft launch" ; \
253	 echo "    make kernelrun            - run using kernel mode" ; \
254	 echo "    make run2multi            - build, run, and launch multi if crash or OSDebug()" ; \
255
256###############################################################################
257#
258# Paths relevant to this module
259#
260###############################################################################
261
262# Create list of all libraries to link to the module
263MODULE_LIBS = $(addprefix $(LIB_DIR)/,$(addsuffix $(LIBSUFFIX), $(MODULE_LIBNAMES)))
264
265KERNEL_LIBS = $(addprefix $(KERNELLIB_DIR)/,$(addsuffix $(LIBSUFFIX), $(KERNEL_LIBNAMES)))
266
267LOADER_LIBS = $(addprefix $(LOADERLIB_DIR)/,$(addsuffix $(LIBSUFFIX), $(LOADER_LIBNAMES)))
268
269KDEBUG_LIBS = $(addprefix $(KDEBUGLIB_DIR)/,$(addsuffix $(LIBSUFFIX), $(KDEBUG_LIBNAMES)))
270
271ifeq ($(USE_GHS),1)
272
273CORE_SRC_LIB    = $(addprefix $(LIB_DIR)/,$(addsuffix $(LIBSUFFIX), core_src))
274CORE_DYN_LIB    = $(addprefix $(LIB_DIR)/,$(addsuffix $(LIBSUFFIX), coredyn))
275COS_DEF_MALLOC_LIB = $(addprefix $(LIB_DIR)/,$(addsuffix $(OBJSUFFIX),cos_def_malloc))
276
277ifneq ($(CAFE_NO_COMMON_LIBS),TRUE)
278
279    ifeq ($(BUILDING_RPL),1)
280        ifneq ($(COS_DONT_USE_DEF_MALLOC),TRUE)
281            COMMON_LIBS += $(COS_DEF_MALLOC_LIB)
282        endif
283    endif
284
285    ifneq ($(RPLNAME),)
286        ifneq ($(CAFE_RPL_USES_CORE_DYN),FALSE)
287            CORE_LIBS   = $(CORE_DYN_LIB)
288        endif
289    else
290        CORE_LIBS   = $(CORE_DYN_LIB)
291    endif
292
293    COMMON_LIBS += $(COMMON_DYNAMIC_LIBS)
294
295    ifneq ($(RPLNAME),coredyn)
296# CORE_DYN_LIB is added last because we need CORE_DYN_LIB just before the
297# GHS libs so that it can override certain GHS symbols.
298        LIBS        = $(MODULE_LIBS) $(COMMON_LIBS) $(CORE_LIBS)
299    else
300        LIBS        = $(OS_DYN_LIB) $(MODULE_LIBS)
301    endif
302
303else
304    LIBS        = $(MODULE_LIBS)
305endif
306
307else
308
309LIBS        = $(COMMON_LIBS) $(MODULE_LIBS)
310
311endif
312
313# Suffix rules
314.SUFFIXES:
315.SUFFIXES: .h .c .o .cpp .s .cp
316
317###############################################################################
318#
319#  Generate lists of objects to be built
320#
321###############################################################################
322
323ALLCSRCS    = $(CSRCS) $(CLIBSRCS)
324ALLCPPSRCS  = $(CPPSRCS) $(CPPLIBSRCS)
325ALLCPSRCS   = $(CPSRCS) $(CPLIBSRCS)
326ALLASMSRCS  = $(ASMSRCS) $(ASMLIBSRCS)
327
328ifdef ASMSRCS
329  OBJECTS       += $(addprefix $(OBJ_DIR)/, $(ASMSRCS:.s=.o))
330endif
331ifdef CSRCS
332  OBJECTS       += $(addprefix $(OBJ_DIR)/, $(CSRCS:.c=.o))
333endif
334ifdef CPPSRCS
335  OBJECTS       += $(addprefix $(OBJ_DIR)/, $(CPPSRCS:.cpp=.o))
336endif
337ifdef CPSRCS
338  OBJECTS       += $(addprefix $(OBJ_DIR)/, $(CPSRCS:.cp=.o))
339endif
340ifdef ASMLIBSRCS
341  LIBOBJECTS    += $(addprefix $(OBJ_DIR)/, $(ASMLIBSRCS:.s=.o))
342  XLIBOBJECTS   += $(ASMLIBSRCS:.s=.o)
343endif
344ifdef CLIBSRCS
345  LIBOBJECTS    += $(addprefix $(OBJ_DIR)/, $(CLIBSRCS:.c=.o))
346  XLIBOBJECTS   += $(CLIBSRCS:.c=.o)
347endif
348ifdef CPPLIBSRCS
349  LIBOBJECTS    += $(addprefix $(OBJ_DIR)/, $(CPPLIBSRCS:.cpp=.o))
350  XLIBOBJECTS   += $(CPPLIBSRCS:.cpp=.o)
351endif
352ifdef CPLIBSRCS
353  LIBOBJECTS    += $(addprefix $(OBJ_DIR)/, $(CPLIBSRCS:.cp=.o))
354  XLIBOBJECTS   += $(CPLIBSRCS:.cp=.o)
355endif
356
357ALLOBJECTS       = $(OBJECTS) $(LIBOBJECTS)
358
359ifeq ($(LIB),TRUE)
360  # If LIBNAME isn't set, set it to the directory name
361  ifeq ($(LIBNAME),)
362    LIBNAME        = $(notdir $(MODULE_DIR))
363  endif
364ifeq ($(USE_GHS),1)
365ifeq ($(filter $(LIBNAME), $(CORE_SRC_LIBNAMES)),$(LIBNAME))
366  TARGET_LIB     = $(LIB_DIR)/core/$(LIBNAME)$(LIBSUFFIX)
367else
368  TARGET_LIB     = $(LIB_DIR)/$(LIBNAME)$(LIBSUFFIX)
369endif
370else
371  TARGET_LIB     = $(LIB_DIR)/$(LIBNAME)$(LIBSUFFIX)
372endif
373endif
374
375ifeq ($(KERNELLIB),TRUE)
376# Name of library must be same as the name of the directory
377  LIBNAME        = $(notdir $(MODULE_DIR))
378  TARGET_LIB     = $(KERNELLIB_DIR)/$(LIBNAME)$(LIBSUFFIX)
379endif
380
381ifeq ($(LOADERLIB),TRUE)
382# Name of library must be same as the name of the directory
383  LIBNAME        = $(notdir $(MODULE_DIR))
384  TARGET_LIB     = $(LOADERLIB_DIR)/$(LIBNAME)$(LIBSUFFIX)
385endif
386
387ifeq ($(KDEBUGLIB),TRUE)
388# Name of library must be same as the name of the directory
389  LIBNAME        = $(notdir $(MODULE_DIR))
390  TARGET_LIB     = $(KDEBUGLIB_DIR)/$(LIBNAME)$(LIBSUFFIX)
391endif
392
393ifdef BINNAMES
394  TARGET_BINS    = $(addprefix $(BIN_DIR)/,$(addsuffix $(BINSUFFIX), $(BINNAMES)))
395ifeq ($(USE_GHS),1)
396ifeq ($(NOT_RPL),)
397# Do not make TARGET_RPXS a build target simultaneous with TARGET_BINS,
398# since there is only one rule that builds them both; a parallel build
399# would try to run that rule twice for both targets at once.
400  TARGET_RPXS    = $(addprefix $(BIN_DIR)/,$(addsuffix $(RPXSUFFIX), $(BINNAMES)))
401endif
402endif
403endif
404
405# We can build more than one RPLNAME (even though the name is singular),
406# unless you are building the import library.
407ifdef RPLNAME
408  TARGET_BINS    :=
409  TARGET_RPXS    :=
410  TARGET_RPLS     = $(addprefix $(BIN_DIR)/,$(addsuffix $(RPLSUFFIX), $(RPLNAME)))
411endif
412
413###############################################################################
414#
415#  include rules for header dependencies on existing object files
416#
417###############################################################################
418
419INCLUDEDEPS=TRUE
420ifdef INCLUDEDEPS
421    ifneq (,$(firstword $(ALLASMSRCS)))
422        -include $(addprefix $(OBJ_DIR)/, $(ALLASMSRCS:.s=$(DEPSUFFIX)))
423    endif
424    ifneq (,$(firstword $(ALLCSRCS)))
425        -include $(addprefix $(OBJ_DIR)/, $(ALLCSRCS:.c=$(DEPSUFFIX)))
426    endif
427    ifneq (,$(firstword $(ALLCPPSRCS)))
428        -include $(addprefix $(OBJ_DIR)/, $(ALLCPPSRCS:.cpp=$(DEPSUFFIX)))
429    endif
430    ifneq (,$(firstword $(ALLCPSRCS)))
431        -include $(addprefix $(OBJ_DIR)/, $(ALLCPSRCS:.cp=$(DEPSUFFIX)))
432    endif
433endif
434
435###############################################################################
436#
437#  Generic make directory rules
438#
439###############################################################################
440$(OBJ_DIR):
441	     $(MKDIRP) $(OBJ_DIR)
442
443$(BIN_DIR):
444	     $(MKDIRP) $(BIN_DIR)
445
446$(BIN_DIR_NO_TARGET):
447	     $(MKDIRP) $(BIN_DIR_NO_TARGET)
448
449
450###############################################################################
451#
452#  Generic compile rules & dependency creation
453#
454###############################################################################
455
456CLEAN_DEPEND       := sed -f "$(BUILDMAKE_ROOT)/eppccleandepend_cygwin.sed"
457PATH_CYGWIN_TO_DOS := sed 's_/cygdrive/\([a-zA-Z]\+\)/_\U\1:/_g'
458#   Note: PATH_CYGWIN_TO_DOS current implementation means $CAFE_ROOT must exist
459#         outside of CYGWIN_PATH directory.  Proper implementation is using
460#         cygpath, but need to pick out paths correctly from compiler command-line.
461
462# Take each dependency and add it as a target; see http://mad-scientist.net/make/autodep.html
463ADD_DEPEND := sed -f "$(BUILDMAKE_ROOT)/eppccleandepend_cygwin.sed" -f "$(BUILDMAKE_ROOT)/eppcadddepend_cygwin.sed"
464
465define CLEAN_DEPENDS
466	$(_@)$(CLEAN_DEPEND) $(@:.o=.d) >  $(@:.o=$(DEPSUFFIX))
467	$(_@)$(ADD_DEPEND) < $(@:.o=.d) >> $(@:.o=$(DEPSUFFIX))
468endef
469
470# asm
471$(OBJ_DIR)/%.o: %.s
472	$(call MOD_RULES_STEP, "\n>> Compiling $*")
473	$(MKDIRP) $(dir $@)
474ifdef ASM_PREPROCESS
475	$(CC) -E $(ASFLAGS) -D_ASSEMBLER -U__cplusplus $(INCLUDES) -c $< > $(OBJ_DIR)/$*.preprocessed.s
476	$(AS) $(ASFLAGS) $(INCLUDES) -c $(OBJ_DIR)/$*.preprocessed.s -o $@ $(MAKE_DEPEPENDENCY_OPTION)
477else
478	$(AS) $(ASFLAGS) $(INCLUDES) -c $< -o $@ $(MAKE_DEPEPENDENCY_OPTION)
479endif
480	$(CLEAN_DEPENDS)
481
482# c
483$(OBJ_DIR)/%.o: %.c
484	$(call MOD_RULES_STEP,"\n>> Compiling $*")
485	$(MKDIRP) $(dir $@)
486	$(CC) $(CCFLAGS) -D_LANGUAGE_C $(INCLUDES) $(PREFIX_FILE) $(COMPILE) $< -o $@ $(MAKE_DEPEPENDENCY_OPTION)
487	$(CLEAN_DEPENDS)
488
489# cpp
490$(OBJ_DIR)/%.o: %.cpp
491	$(call MOD_RULES_STEP,"\n>> Compiling $*")
492	$(MKDIRP) $(dir $@)
493	$(CC) $(CCFLAGS) $(CXXFLAGS) $(INCLUDES) $(PREFIX_FILE) $(COMPILE) $< -o $@ $(MAKE_DEPEPENDENCY_OPTION)
494	$(CLEAN_DEPENDS)
495
496# cp
497$(OBJ_DIR)/%.o: %.cp
498	$(call MOD_RULES_STEP,"\n>> Compiling $*")
499	$(MKDIRP) $(dir $@)
500	$(CC) $(CCFLAGS) $(INCLUDES) $(PREFIX_FILE) $(COMPILE) $< -o $@ $(MAKE_DEPEPENDENCY_OPTION)
501	$(CLEAN_DEPENDS)
502
503###############################################################################
504#
505#  Generic linking rules
506#
507#  linker command file is always used for EOS applications
508#  user can override if there are special requirements
509#
510###############################################################################
511
512LCFFLAGS            :=
513ifdef LCF_FILE
514	DOS_LCF_FILE	:= $(shell cygpath -m "$(LCF_FILE)")
515	LCFFLAGS        := $(SPECIFY_LCF_OPTION) $(DOS_LCF_FILE)
516endif
517
518ifdef REL_LCF_FILE
519	REL_LCF_FILE    := $(shell cygpath -m "$(REL_LCF_FILE)")
520	REL_LDFLAGS     += $(SPECIFY_LCF_OPTION) $(REL_LCF_FILE)
521endif
522ifdef PREREL_LCF_FILE
523	PREREL_LCF_FILE := $(shell cygpath -m "$(PREREL_LCF_FILE)")
524	PREREL_LDFLAGS  += $(SPECIFY_LCF_OPTION) $(PREREL_LCF_FILE)
525endif
526
527# elf - static library creation
528$(TARGET_LIB): $(LIBOBJECTS)
529	$(call MOD_RULES_STEP,"\n>> Creating Library \"$(notdir $@)\" <-- $(notdir $?)")
530	$(MKDIRP) $(dir $@)
531ifdef INSTALL_OBJ_TO_LIB_DIR
532	cp -p $(LIBOBJECTS) $(LIB_DIR)
533endif
534ifndef INSTALL_OBJ_TO_LIB_DIR
535ifdef COMPILER_REQUIRES_DOS_ARGUMENTS
536ifdef OBJ_SEARCH_PATHS
537	$(AR) $(shell echo '$(ARFLAGS) -o $(TARGET_LIB) $(notdir $(LIBOBJECTS))' | $(PATH_CYGWIN_TO_DOS))
538else
539ifeq ($(USE_OBJ_DIR),FALSE)
540	$(AR) $(shell echo '$(ARFLAGS) -o $(TARGET_LIB) $(LIBOBJECTS)' | $(PATH_CYGWIN_TO_DOS))
541else
542	( cd $(OBJ_DIR); $(AR) $(shell echo '$(ARFLAGS) -o $(TARGET_LIB) $(XLIBOBJECTS)' | $(PATH_CYGWIN_TO_DOS)) )
543endif
544endif
545else
546ifdef OBJ_SEARCH_PATHS
547	$(AR) $(notdir $(LIBOBJECTS)) $(ARFLAGS) -o $(TARGET_LIB)
548else
549	$(AR) $(LIBOBJECTS) $(ARFLAGS) -o $(TARGET_LIB)
550endif
551endif
552endif
553
554# elf, rpx/rpl linking
555ifneq ($(USE_PREPRPL_IMPORT_LIB),TRUE)
556ifeq ($(USE_GHS),1)
557$(BIN_DIR)/%$(RPLSUFFIX) $(BIN_DIR)/%$(RPXSUFFIX) $(BIN_DIR)/%$(BINSUFFIX):
558else
559$(BIN_DIR)/%$(BINSUFFIX):
560endif # USE_GHS==1
561	 $(MKDIRP) $(dir $@)
562ifeq ($(USE_GHS),1)
563ifneq ($(NOT_RPL),TRUE)
564ifeq ($(BUILDING_RPL),1)
565	$(call MOD_RULES_STEP,"\n>> Create RPL \"$(basename $(notdir $@))\" <-- $(notdir $?)")
566else
567	$(call MOD_RULES_STEP,"\n>> Create RPX \"$(basename $(notdir $@))\" <-- $(notdir $?)")
568endif
569else
570	$(call MOD_RULES_STEP,"\n>> Create \"$(notdir $@)\" <-- $(notdir $?)")
571endif
572ifneq ($(NOT_RPL),TRUE)
573	$(MKDIRP) $(dir $(EXPORT_OBJECT_NAME)) ; \
574	$(PREPRPL) $(shell echo '$(SPECIFY_DEF_FILE) $(RPL_ENTRY_SPEC) $(PREPRPL_FLAGS) -o $(EXPORT_OBJECT_NAME) $(filter-out %.def %.lcf,$^)' | $(PATH_CYGWIN_TO_DOS))
575endif # NOT_RPL!=TRUE
576else
577	$(call MOD_RULES_STEP,"\n>> Linking ELF \"$(subst $(BIN_DIR)/,,$@)\" <-- $(notdir $?)")
578endif # USE_GHS==1
579ifdef COMPILER_REQUIRES_DOS_ARGUMENTS
580ifdef OBJ_SEARCH_PATHS
581	$(LD) $(shell echo '$(EXPORT_OBJECT_NAME) $(notdir $(filter-out %.def %.lcf,$+)) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)' | $(PATH_CYGWIN_TO_DOS))
582else
583	$(LD) $(shell echo '$(EXPORT_OBJECT_NAME) $(filter-out %.def %.lcf,$^) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)' | $(PATH_CYGWIN_TO_DOS))
584endif # OBJ_SEARCH_PATHS
585else
586ifdef OBJ_SEARCH_PATHS
587	$(LD) $(EXPORT_OBJECT_NAME) $(notdir $(filter-out %.def %.lcf,$+)) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)
588else
589	$(LD) $(EXPORT_OBJECT_NAME) $(filter-out %.def %.lcf,$+) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)
590endif # OBJ_SEARCH_PATHS
591endif # COMPILER_REQUIRES_DOS_ARGUMENTS
592ifeq ($(USE_GHS),1)
593ifneq ($(NOT_RPL),TRUE)
594	$(MAKERPL) $(shell echo '$(ELF_TARGET_FILE) $(STACK_SIZE_OVERRIDE) $(MAKERPL_FLAGS) -l $(MAKERPL_TARGET_LIB)' | $(PATH_CYGWIN_TO_DOS))
595ifeq ($(RPLLIMITS),TRUE)
596ifeq ($(BUILDING_RPL),1)
597	$(DUMPRPL) $(shell echo '$(RPL_TARGET_FILE) $(DUMPRPL_FLAGS)' | $(PATH_CYGWIN_TO_DOS)) > $(BIN_DIR)/rpllimits.txt
598else
599	$(DUMPRPL) $(shell echo '$(RPX_TARGET_FILE) $(DUMPRPL_FLAGS)' | $(PATH_CYGWIN_TO_DOS)) > $(BIN_DIR)/rpllimits.txt
600endif
601endif
602endif # NOT_RPL!=TRUE
603endif # USE_GHS==1
604endif # USE_PREPRPL_IMPORT_LIB!=TRUE
605
606
607###############################################################################
608#
609#  import library
610#
611# NOTE: special rules as in this case the RPL/RPX build step must depend on the
612# export object file, but that messes up the default rule for building ELF
613###############################################################################
614
615ifeq ($(BUILDING_RPL),1)
616ifeq ($(USE_PREPRPL_IMPORT_LIB),TRUE)
617
618ifneq ($(RPLNAME),)
619ifneq ($(words $(RPLNAME)),1)
620$(error More than one RPLNAME not allowed.)
621endif
622IMPORT_LIB := $(LIB_DIR)/$(RPLNAME).a
623
624$(IMPORT_LIB): $(OBJ_DIR)/$(RPLNAME)_rpl_export.o
625
626$(OBJ_DIR)/$(RPLNAME)_rpl_export.o: $(DEF_FILE)
627	$(MKDIRP) $(OBJ_DIR) $(LIB_DIR)
628	$(PREPRPL) -q -x $< $(PREPRPL_FLAGS) -o $(shell echo '$(OBJ_DIR)/$(RPLNAME)_rpl_export.o -l $(IMPORT_LIB)' | $(PATH_CYGWIN_TO_DOS)) -r $(RPLNAME)
629else
630# This rule is to allow multiple RPLs build in the same makefile
631# Note this form should not be used on System RPLs because
632# it does not define IMPORT_LIB and does not install
633# the import library when installing the headers
634# useful for building tests
635$(OBJ_DIR)/%_rpl_export.o $(LIB_DIR)/%.a: %.def
636	$(MKDIRP) $(OBJ_DIR) $(LIB_DIR)
637	$(PREPRPL) -q -x $< $(PREPRPL_FLAGS) -o $(shell echo '$(OBJ_DIR)/$*_rpl_export.o -l $(LIB_DIR)/$*.a' | $(PATH_CYGWIN_TO_DOS)) -r $*
638endif # RPLNAME!=""
639
640#rpx/rpl linking
641# NOTE: adding the %_rpl_export.o adds the export object to the $+/$^ variables
642# also $+/$^ includes the dependencies from any other rules for the .rpx/rpl
643# need to filter out the .def file (to allow us to track .def dependencies)
644$(BIN_DIR)/%$(RPLSUFFIX) $(BIN_DIR)/%$(RPXSUFFIX): $(OBJ_DIR)/%_rpl_export.o
645	$(MKDIRP) $(dir $@) $(dir $(EXPORT_OBJECT_NAME))
646	$(call MOD_RULES_TOOL,"\n>> Linking RPX/RPL \"$(subst $(BIN_DIR)/,,$@)\" <-- $(notdir $?)")
647ifdef COMPILER_REQUIRES_DOS_ARGUMENTS
648ifdef OBJ_SEARCH_PATHS
649	$(LD) $(shell echo '$(notdir $(filter-out %.def %.lcf,$+)) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)' | $(PATH_CYGWIN_TO_DOS))
650else
651	$(LD) $(shell echo '$(filter-out %.def %.lcf,$^) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)' | $(PATH_CYGWIN_TO_DOS))
652endif
653else
654ifdef OBJ_SEARCH_PATHS
655	$(LD) $(notdir $(filter-out %.def %.lcf,$+)) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)
656else
657	$(LD) $(filter-out %.def %.lcf,$+) $(LDFLAGS) $(LCFFLAGS) -o $(ELF_TARGET_FILE)
658endif
659endif # COMPILER_REQUIRES_DOS_ARGUMENTS
660	$(MAKERPL) $(shell echo '$(ELF_TARGET_FILE) $(STACK_SIZE_OVERRIDE) $(MAKERPL_FLAGS) -f -nolib' | $(PATH_CYGWIN_TO_DOS))
661
662ifeq ($(RPLLIMITS),TRUE)
663ifeq ($(BUILDING_RPL),1)
664	$(DUMPRPL) $(shell echo '$(RPL_TARGET_FILE) $(DUMPRPL_FLAGS)' | $(PATH_CYGWIN_TO_DOS)) > $(BIN_DIR)/rpllimits.txt
665else
666	$(DUMPRPL) $(shell echo '$(RPX_TARGET_FILE) $(DUMPRPL_FLAGS)' | $(PATH_CYGWIN_TO_DOS)) > $(BIN_DIR)/rpllimits.txt
667endif
668endif
669else # from USE_PREPRPL_IMPORT_LIB==TRUE
670IMPORT_LIB :=
671$(IMPORT_LIB):
672
673endif # USE_PREPRPL_IMPORT_LIB==TRUE
674endif # BUILDING_RPL==1
675
676
677###############################################################################
678#
679#  headers
680#
681###############################################################################
682
683.PHONY: headers print_module_header
684
685print_module_headers:
686	$(call MOD_RULES_PHASE, "Installing headers $(MODULE_PATH_FROM_SRC)")
687
688HEADER_DIR := headers
689HEADERS    := $(shell if [ -d $(HEADER_DIR) ] ; then find $(HEADER_DIR) -iname "*.h" -type f | sed 's;^$(HEADER_DIR);$(INCLUDE_DIR);g' ; fi)
690
691$(INCLUDE_DIR)/%: $(HEADER_DIR)/%
692	$(MACRO_INSTALL_FILE) $< $@
693
694headers: print_module_headers $(HEADERS) $(MODULE_HEADERS) $(IMPORT_LIB)
695
696###############################################################################
697#
698#  install
699#
700###############################################################################
701
702.PHONY: print_module_install install
703
704print_module_install:
705	$(call MOD_RULES_PHASE,"Building/Installing $(MODULE_PATH_FROM_SRC) $(BUILD_TYPE) $(MODULE_COMMENT)")
706
707# TARGET_RPXS removed from here to prevent issues with parallel build
708install: print_module_install $(OBJECTS) $(TARGET_LIB) $(TARGET_BINS) $(TARGET_RPLS)
709
710###############################################################################
711#
712#  run / rerun
713#
714#  "make run"   builds/installs then runs
715#  "make rerun" just runs
716#
717###############################################################################
718
719.PHONY: run rerun rerun_binary debug_binary
720
721run: install rerun
722
723# Determine which binary to run
724ifeq ($(words $(BINNAMES)), 0)
725    # No binaries or rpl in this module
726rerun:
727	$(_@)echo "Nothing to run"
728else
729ifeq ($(words $(BINNAMES)), 1)
730    # Only 1 binary in this module
731rerun:
732	$(_@)$(MAKE) rerun_binary RUN_BINARY=$(TARGET_RPXS)
733else
734    # Multiple binaries in this module.  Ask user which one
735    # TODO: Automate which binary if user specifies number or binary name
736rerun:
737	$(_@)echo "Choose which binary to run:" ; \
738	PS3='number? ' ; \
739	select n in $(notdir $(TARGET_RPXS)) ; do \
740	  if [[ -n $$n ]] ; then \
741	    $(MAKE) rerun_binary RUN_BINARY="$(dir $(firstword $(TARGET_RPXS)))$$n" ; \
742	  fi ; \
743	  break ; \
744	done
745endif
746endif
747
748.PHONY: multirun remultirun gdbrun regdbrun gdbtuirun regdbtuirun srun resrun bgrun run2multi
749
750# run the binary using kernelmode
751kernelrun:
752	$(_@)$(MAKE) run DEBUG_RUN="-K"
753
754bgrun:
755	$(_@)$(MAKE) run DEBUG_RUN="-g 0x100"
756
757rwrun:
758	$(_@)$(MAKE) run DEBUG_RUN="-g 0x40000000"
759
760shrun:
761	$(_@)$(MAKE) run MACRO_RUN_OPTIONS="-n"
762
763erun:
764	$(_@)$(MAKE) run MACRO_RUN_OPTIONS="-g 0x00008000"
765
766multirun:
767	$(_@)$(MAKE) run MULTI_DEBUG=1 DEBUG_RUN="-d multi"
768
769multishrun:
770	$(_@)$(MAKE) run MULTI_DEBUG=1 DEBUG_RUN="-d multi" MACRO_RUN_OPTIONS="-n"
771
772remultirun:
773	$(_@)$(MAKE) rerun MULTI_DEBUG=1 DEBUG_RUN="-d multi"
774
775gdbrun:
776	$(_@)$(MAKE) run DEBUG_RUN="-d gdb"
777
778regdbrun:
779	$(_@)$(MAKE) rerun DEBUG_RUN="-d gdb"
780
781gdbtuirun:
782	$(_@)$(MAKE) run DEBUG_RUN="-d gdbtui"
783
784regdbtuirun:
785	$(_@)$(MAKE) rerun DEBUG_RUN="-d gdbtui"
786
787srun:
788	$(_@)$(MAKE) run MACRO_RUN_OPTIONS="-s"
789
790resrun:
791	$(_@)$(MAKE) rerun MACRO_RUN_OPTIONS="-s"
792
793run2multi:
794	$(_@)$(MAKE) run MULTI_DEBUG=1 DEBUG_RUN="-R -d multi"
795
796# Run the binary (depends on the os, as defined in commondefs.<os>.*.mk")
797ifeq ($(MULTI_DEBUG),1)
798    MULTI_DEBUG_BINARY = -k $(BIN_DIR)/$(basename $(notdir $(RUN_BINARY)))$(BINSUFFIX)
799endif
800
801ifeq ($(BUILD_TARGET), DEBUG)
802    OS_VER_OPTION=-b
803endif
804ifeq ($(BUILD_TARGET), FDEBUG)
805    OS_VER_OPTION=-u
806endif
807ifeq ($(BUILD_TARGET), OS_SECURITY_LEVEL)
808    OS_VER_OPTION=-C
809endif
810
811rerun_binary:
812	$(_@)if [ ! -e $(RUN_BINARY) ] ; then \
813        echo "Can't find $(RUN_BINARY)" ; \
814        exit 1 ; \
815	 fi ; \
816	echo "------------------------------------------------------------------"
817	$(MACRO_RUN)
818
819###############################################################################
820#
821#  import
822#
823###############################################################################
824
825.PHONY: import import_binary
826
827# Determine which binary to run
828ifeq ($(words $(BINNAMES)), 0)
829    # No binaries or rpl in this module
830import:
831	$(_@)echo "Nothing to import"
832else
833ifeq ($(words $(BINNAMES)), 1)
834    # Only 1 binary in this module
835import:
836	$(MAKE) import_binary IMPORT_BINARY=$(TARGET_RPXS)
837else
838    # Multiple binaries in this module.  Ask user which one
839    # TODO: Automate which binary if user specifies number or binary name
840import:
841	$(_@)echo "Choose which binary to import:" ; \
842	PS3='number? ' ; \
843	select n in $(notdir $(TARGET_RPXS)) ; do \
844	  if [[ -n $$n ]] ; then \
845	    $(MAKE) import_binary IMPORT_BINARY="$(dir $(firstword $(TARGET_RPXS)))$$n" ; \
846	  fi ; \
847	  break ; \
848	done
849endif
850endif
851
852import_binary:
853	$(_@)if [ -z "$(IMPORT_BINARY)" ] ; then \
854	    echo "Can't find $(IMPORT_BINARY)" ; \
855	    exit 1 ; \
856	 fi ; \
857	 if [ -z "$(IMPORT_TID)" ] ; then \
858	    echo "Please call make import IMPORT_TID=<tid>" ; \
859	    exit 1 ; \
860	 fi ; \
861	echo "------------------------------------------------------------------"
862	cafeinstall $(IMPORT_BINARY) $(IMPORT_TID)
863
864###############################################################################
865#
866#  clean
867#
868###############################################################################
869
870.PHONY: print_module_clean cleanobj cleandis cleanuser clean
871
872print_module_clean:
873	$(_@)echo "------------------------------------------------------------------" ; \
874	 echo "Cleaning $(MODULE_PATH_FROM_SRC)"
875
876cleanobj:
877ifneq ($(TOP_CLOBBER_DONE),TRUE)
878	rm -Rf $(dir $(OBJ_DIR))
879endif
880
881cleanuser:
882ifdef CLEANFILES
883	rm -Rf $(CLEANFILES)
884endif
885
886clean: print_module_clean cleanobj cleanuser
887
888###############################################################################
889#
890#  clobber
891#
892###############################################################################
893
894.PHONY: call_cafestop print_module_clobber clobber
895
896# release FSEmul's locks in CAFE_CONTENT_DIR if FSEmul is still running
897call_cafestop:
898ifneq ($(TOP_CLOBBER_DONE),TRUE)
899	$(_@)if [ -f "$(CAFE_ROOT)/system/bin/tool/cafestop" -a -n "`ps | grep FSEmul`" ]; then \
900	    echo "Releasing file locks..." ; \
901	    $(CAFE_ROOT)/system/bin/tool/cafestop ; \
902	fi
903endif
904
905print_module_clobber:
906	$(_@)echo "------------------------------------------------------------------" ; \
907	 echo "Clobbering $(MODULE_PATH_FROM_SRC) $(MODULE_COMMENT)"
908
909clobber: clean print_module_clobber call_cafestop
910ifneq ($(TOP_CLOBBER_DONE),TRUE)
911ifeq ($(LIB),TRUE)
912	rm -Rf $(dir $(LIB_DIR))DEBUG/$(LIBNAME)$(LIBSUFFIX)
913	rm -Rf $(dir $(LIB_DIR))NDEBUG/$(LIBNAME)$(LIBSUFFIX)
914ifdef INSTALL_OBJ_TO_LIB_DIR
915	rm -Rf $(dir $(LIB_DIR))DEBUG/$(LIBNAME)$(OBJSUFFIX)
916	rm -Rf $(dir $(LIB_DIR))NDEBUG/$(LIBNAME)$(OBJSUFFIX)
917endif # INSTALL_OBJ_TO_LIB_DIR
918else
919ifeq ($(KERNELLIB),TRUE)
920	rm -Rf $(dir $(KERNELLIB_DIR))DEBUG/$(LIBNAME)$(LIBSUFFIX)
921	rm -Rf $(dir $(KERNELLIB_DIR))NDEBUG/$(LIBNAME)$(LIBSUFFIX)
922else
923ifeq ($(LOADERLIB),TRUE)
924	rm -Rf $(dir $(LOADERLIB_DIR))DEBUG/$(LIBNAME)$(LIBSUFFIX)
925	rm -Rf $(dir $(LOADERLIB_DIR))NDEBUG/$(LIBNAME)$(LIBSUFFIX)
926else
927ifeq ($(KDEBUGLIB),TRUE)
928	rm -Rf $(dir $(KDEBUGLIB_DIR))DEBUG/$(LIBNAME)$(LIBSUFFIX)
929	rm -Rf $(dir $(KDEBUGLIB_DIR))NDEBUG/$(LIBNAME)$(LIBSUFFIX)
930else
931	rm -Rf $(dir $(BIN_DIR))
932endif # ($(KDEBUGLIB),TRUE)
933endif # ($(LOADERLIB),TRUE)
934endif # ($(KERNELLIB),TRUE)
935endif # ($(LIB),TRUE)
936	$(_@)if [ -d $(HEADER_DIR) ] ; then \
937	    echo "rm -f $(HEADERS)" ; \
938	    rm -Rf $(HEADERS) ; \
939	fi
940	$(_@)if [ -n "$(MODULE_HEADERS)" ] ; then \
941	    echo "rm -f $(MODULE_HEADERS)" ; \
942	    rm -f $(MODULE_HEADERS) ; \
943	fi
944endif # ($(TOP_CLOBBER_DONE),TRUE)
945
946