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