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