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