# ProjectBuilder Jambase # Copyright (c) 1999,2000 Apple Computer, Inc. # All rights reserved. CROSS_ROOT default = "" ; JAMBASE_DIR default = $(JAMBASE:D) ; OS default = macos ; if $(OS) = MACOS { OS = macos ; } if OS != "" { include $(JAMBASE_DIR)/platform-$(OS).jam ; } # Copyright (c) 1999,2000,2001 Apple Computer, Inc. # All rights reserved. # This file defines various functions for transforming text and # manipulating variables / default = / ; # NonObjectFiles : # Returns only files not in $(OBJECT_FILES) or $(OBJECT_FILES_$(ARCH)) # for ARCH in $(ARCHS) rule NonObjectFiles { $(1) = ; for X in $(2) { if ! $(X) in $(OBJECT_FILES) { REJECT = ; for ARCH in $(ARCHS) { if $(X) in $(OBJECT_FILES_$(ARCH)) { REJECT = YES ; } } if ! $(REJECT) { $(1) += $(X) ; } } } } # # RemovePrefixPath : : # removes the given prefix from the path and puts the result # in the given variable # rule RemovePrefixPath { local newname = $(3:BS) ; local newdir = $(3:D) ; local INDEX ; if $(2) != "." { for INDEX in 1 2 3 4 5 6 7 8 9 10 { if $(newdir) != $(2) { newname = $(newdir:BS)/$(newname) ; newdir = $(newdir:D) ; } } } else { newname = $(3) ; } $(1) = $(newname) ; } # Copyright (c) 1999-2002 Apple Computer, Inc. # All rights reserved. # Built-in definitions of common build settings. These can be # overridden by any higher layer (project-level, target-level, # build-phase-level, command-line etc). # the four 'root' directories export deferred SRCROOT = $(PWD) ; export deferred OBJROOT = $(SYMROOT) ; export deferred SYMROOT = $(SRCROOT)/build ; export deferred DSTROOT = /tmp/$(PROJECT_NAME).dst ; # synonyms for the above export deferred SOURCE_ROOT = $(SRCROOT) ; export deferred TEMP_ROOT = $(OBJROOT) ; export deferred BUILD_ROOT = $(SYMROOT) ; export deferred INSTALL_ROOT = $(DSTROOT) ; # more specific directoies inside the TEMP_ROOT export deferred TEMP_DIR = $(OBJROOT)/$(PROJECT_NAME).build/$(TARGET_NAME).build ; export deferred DERIVED_FILE_DIR = $(TEMP_DIR)/DerivedSources ; deferred OBJECT_FILE_DIR = $(TEMP_DIR)/Objects ; deferred CLASS_FILE_DIR = $(TEMP_DIR)/JavaClasses ; deferred FILE_LIST = $(OBJECT_FILE_DIR)/LinkFileList ; deferred PRECOMP_TRUSTFILE = $(TEMP_DIR)/TrustedPrecomps.txt ; # more specific directories inside the BUILD_ROOT export deferred BUILD_DIR = $(SYMROOT) ; # install-in-place directories to select which build directory to use export deferred TARGET_PRODUCT_DIR = $(BUILD_DIR) ; export deferred BUILT_PRODUCTS_DIR = $(BUILD_DIR) ; # more specific directories inside the INSTALL_ROOT export deferred INSTALL_DIR = $(DSTROOT)/$(INSTALL_PATH) ; # installation parameters export deferred INSTALL_OWNER = $(USER) ; export deferred INSTALL_GROUP = $(GROUP) ; export deferred INSTALL_MODE_FLAG = "a-w,a+rX" ; deferred STRIP_INSTALLED_PRODUCT = YES ; # language-independent code generation settings deferred OPTIMIZATION_LEVEL = 0 ; deferred DEBUGGING_SYMBOLS = YES ; deferred PROFILING_CODE = NO ; deferred PREBINDING = YES ; # Java-specific (some are marginally obsolete) deferred JAVA_ARCHIVE_CLASSES = YES ; deferred JAVA_ARCHIVE_TYPE = JAR ; deferred JAVA_APP_STUB = $(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub ; deferred JAVA_JAR_FLAGS = cv ; deferred JAVA_SOURCE_SUBDIR = . ; deferred JAVA_FRAMEWORK_RESOURCES_DIRS = Resources ; deferred JAVA_FRAMEWORK_JARS = ; deferred JAVA_USE_DEPENDENCIES = YES ; deferred JAVA_ZIP_FLAGS = -urg ; deferred JAVAC_SOURCE_FILE_ENCODING = MacRoman ; # miscellaneous export deferred DEVELOPMENT_LANGUAGE = English ; export deferred FRAMEWORK_VERSION = A ; deferred REMOVE_CVS_FROM_RESOURCES = YES ; deferred COPY_PHASE_STRIP = YES ; deferred CLONE_HEADERS = YES ; deferred KEEP_PRIVATE_EXTERNS = YES ; # this currently affects the master.o file only # Copyright (c) 1999,2000,2001 Apple Computer, Inc. # All rights reserved. # Maps legacy Makefile variables to modern Jambase variables # Set global C flags, architectures, and architecture flags for linking GLOBAL_CFLAGS default = $(RC_NONARCH_CFLAGS) ; ARCHITECTURES default = $(RC_ARCHS) ; SUPPORTED_ARCHITECTURES = i386 ppc ; VALID_ARCHS default = i386 ppc ; for ARCH in $(SUPPORTED_ARCHITECTURES) { if $(RC_$(ARCH)) = YES { $(ARCH) = YES ; } } # More compatibility definitions for things that we have # renamed that we had already told external users about. export deferred TEMP_FILES_DIR = $(TEMP_DIR) ; export deferred DERIVED_SOURCES_DIR = $(DERIVED_FILE_DIR) ; export deferred BUILD_PATH = $(BUILD_ROOT) ; export deferred PROJECT = $(PROJECT_NAME) ; export deferred TARGETNAME = $(TARGET_NAME) ; # (the following four are build settings to the generated package files # written by PBXCore -- the new names have underscores to indicate that # they are private, and they have more consistent names -- we should # be able to remove the old compatibility settings soon) export deferred PRODUCT_SETTINGS_PATH = $(_INFO_PLIST_FILE_PATH) ; export deferred PKGINFO_FILE_PATH = $(_PKGINFO_FILE_PATH) ; export deferred VERSION_SETTINGS_PATH = $(_VERSION_PLIST_FILE_PATH) ; export deferred DEVELOPMENT_SETTINGS_PATH = $(_PBDEVELOPMENT_PLIST_FILE_PATH) ; # Copyright (c) 1999-2002 Apple Computer, Inc. # All rights reserved. # !!!cmolick:20000821 hardcoded tool paths because variables not set yet APPLE_INTERNAL_TOOLS default = /AppleInternal/Developer/Tools ; SYSTEM_DEVELOPER_TOOLS default = /Developer/Tools ; PBXCORE_TOOLS_DIR = /System/Library/PrivateFrameworks/PBXCore.framework/Resources ; # Variables for invoking commands using explict paths # except where built in shell functions should be used ASM default = /usr/bin/as ; BRIDGET default = /usr/bin/bridget ; # !!!:anders:20020110 The following has been moved to the BeginProduct rule, so that # definitions of USE_GCC3 in the target or build style can take effect. # CC default = /usr/bin/cc ; CD default = cd ; CHMOD default = /bin/chmod ; CHOWN default = /usr/sbin/chown ; CP default = /bin/cp ; ECHO default = echo ; EGREP default = /usr/bin/egrep ; FASTCP default = /usr/lib/fastcp ; FIXPRECOMPS default = /usr/bin/fixPrecomps ; FIND default = /usr/bin/find ; GATHERHEADERDOC default = /usr/bin/gatherHeaderDoc ; HEADERDOC2HTML default = /usr/bin/headerdoc2html ; INTERFACER default = $(APPLE_INTERNAL_TOOLS)/Interfacer ; JAR default = /usr/bin/jar ; export JAVA_COMPILER default = /usr/bin/javac ; export JAVACONFIG default = /usr/bin/javaconfig ; # !!!:anders:20020110 The following has been moved to the BeginProduct rule, so that # definitions of USE_GCC3 in the target or build style can take effect. # LD default = /usr/bin/cc ; LEX default = /usr/bin/lex ; LIBTOOL default = /usr/bin/libtool ; LN default = /bin/ln ; MAKEPSEUDOLIB default = $(APPLE_INTERNAL_TOOLS)/MakePseudoLibrary ; MERGEINFO default = /usr/lib/mergeInfo ; MKDIR default = /bin/mkdir ; MIG default = /usr/bin/mig ; MV default = /bin/mv ; NMEDIT default = /usr/bin/nmedit ; OSAC default = /usr/bin/osacompile ; OSAL default = /usr/bin/osalang ; OSAS default = /usr/bin/osascript ; PAX default = /bin/pax ; RANLIB default = /usr/bin/ranlib ; REGGEN default = reggen ; RESMERGER default = $(SYSTEM_DEVELOPER_TOOLS)/ResMerger ; RESOURCE_PRESERVING_CP default = $(SYSTEM_DEVELOPER_TOOLS)/CpMac ; REZ default = $(SYSTEM_DEVELOPER_TOOLS)/Rez ; RM default = /bin/rm ; RPCGEN default = /usr/bin/rpcgen ; SED default = /usr/bin/sed ; SETFILE default = $(SYSTEM_DEVELOPER_TOOLS)/SetFile ; SH default = /bin/sh ; STRIP default = /usr/bin/strip ; TOUCH default = /usr/bin/touch ; UNZIP default = /usr/bin/unzip ; XARGS default = /usr/bin/xargs ; YACC default = /usr/bin/yacc ; ZIP default = /usr/bin/zip ; # Basic operations: # Rm # Removes from the filesystem. Note that the actions are only # executed once, no matter how many times the rule is invoked. actions together piecemeal Rm { $(RM) -r "$(1)" } # RelativeRm : # Removes from after removing grist. actions together piecemeal RelativeRm { $(RM) -rf "$(2)$(/)$(1:G=)" } # Mkdir # Creates rule Mkdir { # Only existence of the directory matters NOUPDATE $(1) ; } actions together piecemeal Mkdir { $(MKDIR) -p "$(1)" } # MkEmptyDir # Makes a directory if necessary, and insures it is empty actions together MkEmptyDir { ( $(MKDIR) -p "$(1)" && $(CD) "$(1)" && $(RM) -rf "*" ) } # SymLink : # Makes a symbolic link to the path indicated. # Link target is treated as a nonfile to preserve the value rule SymLink { NOTFILE $(2) ; } actions SymLink { $(LN) -sf "$(2)" "$(1)" } # Touch # Touches files in the filesystem. actions Touch { $(TOUCH) "$(1)" } # TouchConditionally : # Touches a file in the filesystem if is newer. rule TouchConditionally { DEPENDS $(1) : $(2) ; } actions TouchConditionally { $(TOUCH) "$(1:G=)" } # Echo : # Echoes text into a file. rule Echo { local FILE ; NOTFILE $(2) ; Echo.remove $(1) ; for FILE in $(2) { Echo.append $(1) : $(FILE) ; } } actions together piecemeal quietly Echo.remove { $(RM) -rf "$(1)" } actions quietly Echo.append { $(ECHO) "$(2)" >> "$(1)" } # ChangeOwnerAndGroup and ChangeMode to use when installing files # All these use the -H option to avoid traversing bad symbolic links rule ChangeOwnerAndGroup { if $(INSTALL_OWNER) { if $(INSTALL_GROUP) { ChangeOwnerAndGroup.Action $(1) ; } else { ChangeOwner.Action $(1) ; } } } actions ChangeOwnerAndGroup.Action { if [ -e "$(1)" ] then $(CHOWN) -RH $(INSTALL_OWNER):$(INSTALL_GROUP) "$(1)" fi } actions ChangeOwner.Action { if [ -e "$(1)" ] then $(CHOWN) -RH $(INSTALL_OWNER) "$(1)" fi } actions ChangeMode { if [ -e "$(1)" ] then $(CHMOD) -RH $(INSTALL_MODE_FLAG) "$(1)" fi } # Strip : # Runs strip to remove debugging symbols from the executable of the target rule Strip { DEPENDS $(1) : $(2) ; } actions Strip { $(STRIP) $(STRIPFLAGS) "$(2)" } # SetFile # Appends type and creator to a file rule SetFile { local MACOS_TYPE_ARG ; local MACOS_CREATOR_ARG ; if $(MACOS_TYPE) { MACOS_TYPE_ARG = "-t" "'$(MACOS_TYPE)'" ; } if $(MACOS_CREATOR) { MACOS_CREATOR_ARG = "-c" "'$(MACOS_CREATOR)'" ; } SETFILEFLAGS on $(1) = $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) "$(OTHER_SETFILEFLAGS)" ; } actions SetFile { $(SETFILE) $(SETFILEFLAGS) "$(1)" } # Rez : # Appends resource fork data to a file rule Rez { local MACOS_TYPE_ARG ; local MACOS_CREATOR_ARG ; DEPENDS $(1) : $(2) ; if $(MACOS_TYPE) { MACOS_TYPE_ARG = "-t" "'$(MACOS_TYPE)'" ; } if $(MACOS_CREATOR) { MACOS_CREATOR_ARG = "-c" "'$(MACOS_CREATOR)'" ; } REZFLAGS on $(1) = -append -d SystemSevenOrLater=1 $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) $(OTHER_REZFLAGS) ; if ! $(REZ_EXECUTABLE) = "YES" { # by default use data forks REZFLAGS on $(1) += -useDF ; } } actions Rez { $(REZ) "$(2)" "$(REZFLAGS)" -o "$(1)" } # ResMerge : # Merges the resources from binary resource file 'rsrc file' into 'fork file' rule ResMerge { local MACOS_TYPE_ARG ; local MACOS_CREATOR_ARG ; DEPENDS $(1) : $(2) ; if $(MACOS_TYPE) { MACOS_TYPE_ARG = "-fileType" "'$(MACOS_TYPE)'" ; } if $(MACOS_CREATOR) { MACOS_CREATOR_ARG = "-fileCreator" "'$(MACOS_CREATOR)'" ; } RESMERGEFLAGS on $(1) = -append $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) $(OTHER_RESMERGERFLAGS) ; if ! $(REZ_EXECUTABLE) = "YES" { # by default use data forks RESMERGEFLAGS on $(1) += -dstIs DF ; } } actions ResMerge { $(RESMERGER) "$(2)" "$(RESMERGEFLAGS)" -o "$(1)" } # RezCollector and ResMergerCollector either compile # resource manager resources together, or split compiles # by file with the first compile being treated differently. # This code assumes collectors will be declared product files # only after the first Collector rule evaluation. rule RezCollector { DEPENDS $(1) : $(2) ; REZFLAGS on $(1) = -d SystemSevenOrLater=1 -useDF $(OTHER_REZFLAGS) ; if $(REZ_TOGETHER) = YES { RezCollector.together $(1) : $(2) ; } else { if ! $(1) in $(PRODUCT_FILES) { RezCollector.initial $(1) : $(2) ; } else { RezCollector.append $(1) : $(2) ; } } } actions together piecemeal RezCollector.together { if [ -f "$(1)" ]; then _appendoption=-append fi $(REZ) -o "$(1)" $_appendoption "$(REZFLAGS)" "$(2)" } actions RezCollector.initial { $(RM) -f "$(1)" && \ $(REZ) -o "$(1)" "$(REZFLAGS)" "$(2)" } actions RezCollector.append { $(REZ) -o "$(1)" -append "$(REZFLAGS)" "$(2)" } rule ResMergerCollector { DEPENDS $(1) : $(2) ; RESMERGEFLAGS on $(1) = -dstIs DF $(OTHER_RESMERGERFLAGS) ; if $(REZ_TOGETHER) = YES { ResMergerCollector.together $(1) : $(2) ; } else { if ! $(1) in $(PRODUCT_FILES) { ResMergerCollector.initial $(1) : $(2) ; } else { ResMergerCollector.append $(1) : $(2) ; } } } actions together piecemeal ResMergerCollector.together { if [ -f "$(1)" ]; then _appendoption=-append fi $(RESMERGER) -o "$(1)" $_appendoption "$(RESMERGEFLAGS)" "$(2)" } actions ResMergerCollector.initial { $(RM) -f "$(1)" && \ $(RESMERGER) -o "$(1)" "$(RESMERGEFLAGS)" "$(2)" } actions ResMergerCollector.append { $(RESMERGER) -o "$(1)" -append "$(RESMERGEFLAGS)" "$(2)" } # ResMergerProduct - used to transfer collector resources to final destination rule ResMergerProduct { local MACOS_TYPE_ARG ; local MACOS_CREATOR_ARG ; DEPENDS $(1) : $(2) ; if $(MACOS_TYPE) { MACOS_TYPE_ARG = -fileType '$(MACOS_TYPE)' ; } if $(MACOS_CREATOR) { MACOS_CREATOR_ARG = -fileCreator '$(MACOS_CREATOR)' ; } RESMERGEFLAGS on $(1) = $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) -srcIs DF $(OTHER_RESMERGERFLAGS) ; if $(REZ_EXECUTABLE) = "YES" { ResMergerProductResourceFork $(1) : $(2) ; } else { RESMERGEFLAGS on $(1) += -dstIs DF ; ResMergerProductDataFork $(1) : $(2) ; } } actions ResMergerProductResourceFork { $(REZ) -o "$(1)" < /dev/null && \ $(RESMERGER) "$(2)" $(RESMERGEFLAGS) -o "$(1)" } actions ResMergerProductDataFork { $(RM) -f "$(1)" && \ $(RESMERGER) "$(2)" $(RESMERGEFLAGS) -o "$(1)" } # Fixprecomps :
# Ensures that the precompiled header is up to date if $(FIXPRECOMPS) { rule Fixprecomps { DEPENDS $(1) : $(2) ; } actions Fixprecomps { $(FIXPRECOMPS) -precomps "$(1)" } } else { rule Fixprecomps { # if we don't have a fixprecomps command, we'll just # quietly do nothing NOTFILE $(1) ; } } # Copy operations: # Cp : # Reliably copies files only. # Leaf names of the source and destination are expected to match. rule Cp { DEPENDS $(1) : $(2) ; if $(2) != $(JAVA_APP_STUB) { CPFLAGS on $(1) default = -fRP ; } } actions together piecemeal Cp { $(CP) "$(CPFLAGS)" "$(2)" "$(1)" } # RobustCp : # RobustCp is like Cp, but is made more robust by first removing # any previous copy results and then conditionally removing CVS # directories from the destination. rule RobustCp { if ! $(ACTION) = installhdrs { DEPENDS $(1) : $(2) ; } if $(REMOVE_CVS_FROM_RESOURCES) = YES { RobustCp.CleanBeforeAndAfter $(1) : $(2) ; } else { RobustCP.CleanBefore $(1) : $(2) ; } if $(COPY_PHASE_STRIP) = YES && ! $(ACTION) = installhdrs { StripBinaries $(1) ; } } actions RobustCp.CleanBeforeAndAfter { if [ -d "$(1)" ] then $(RM) -r "$(1)" fi if [ -e "$(2)" ] then $(CP) -fRP "$(2)" "$(1)" if [ -d "$(2)" ] then $(FIND) "$(1)" -name CVS -type d -prune -print0 | $(XARGS) -0 rm -r fi fi } actions RobustCp.CleanBefore { if [ -d "$(1)" ] then $(RM) -r "$(1)" fi if [ -e "$(2)" ] then $(CP) -fRP "$(2)" "$(1)" fi } # StripBinaries # Uses find to run strip -s on all binaries starting from a file or directory actions StripBinaries { if [ -f "$(1)" ]; then filetype=`file "$(1)"` macho=`echo $filetype | fgrep Mach-O | sed 's/:.*//'` ararch=`echo $filetype | fgrep ar\ archive | sed 's/:.*//'` if [ "x$macho" != "x" ]; then $(STRIP) -S "$macho" fi if [ "x$ararch" != "x" ]; then $(STRIP) -S "$ararch" fi else machos=`cd "$(1)"; $(FIND) . -type f -print0 | xargs -0 file | fgrep Mach-O | sed 's/:.*//'` ararchs=`cd "$(1)"; $(FIND) . -type f -print0 | xargs -0 file | fgrep ar\ archive | sed 's/:.*//'` if [ "x$machos" != "x" ]; then cd "$(1)"; origIFS=$IFS IFS=" " for curbinary in $machos ; do $(STRIP) -S "$curbinary" done IFS=$oldIFS fi if [ "x$ararchs" != "x" ]; then cd "$(1)"; origIFS=$IFS IFS=" " for curbinary in $ararchs ; do $(STRIP) -S "$curbinary" done IFS=$oldIFS fi fi } # ResourcePreservingCp : # where the leaf names of and are the same # and CpMac is to be used to insure resources are preserved. # Although CpMac is invoked with -r, this command is only reliable # for individual file copies becaues there is no preremove of # a directory destination which could cause nesting of the copy. rule ResourcePreservingCp { DEPENDS $(1) : $(2) ; } actions together piecemeal ResourcePreservingCp { $(RESOURCE_PRESERVING_CP) -r "$(2)" "$(1)" } # ResourcePreservingMv : : # where the leaf names of and are the same # and CpMac is to be used to insure resources are preserved. # The is removed after copying. rule ResourcePreservingMv { DEPENDS $(1) : $(2) ; } actions together piecemeal ResourcePreservingMv { $(RESOURCE_PRESERVING_CP) -r "$(2)" "$(1)" } # BulkCopy : rule BulkCopy { # this turns out to be redundant and causes complications with implicitly created wrappers # DEPENDS $(1) : $(2) ; } actions ignore BulkCopy { if [ -e "$(2)" ] then cd "$(2:P)" && ($(PAX) -pe -rw "$(2:BS)" "$(1:P:G=)" | fgrep -v 'pax: Unable to set file uid/gid') fi } # CloneHeader :
: # Writes in the target directory a stub clone of the header # which contains only an #import directive with the path # to the real header in quotes. # Individual header clones depend on the PROJECT_HEADER_CLONE # nonfile target which is depended on by the product and object files. rule CloneHeader { # derive name of header clone and find full path to header local HEADER_CLONE ; if $(3) = $(PUBLIC_HEADER_CLONE_DIR) { HEADER_CLONE = $(2:BSG=PublicHeaderClone) ; } else { if $(3) = $(PRIVATE_HEADER_CLONE_DIR) { HEADER_CLONE = $(2:BSG=PrivateHeaderClone) ; } else { HEADER_CLONE = $(2:BSG=ProjectHeaderClone) ; } } local HEADER_PATH ; if AbsolutePath in $($(2:G=)_ATTRIBUTES) { HEADER_PATH = $(2:G=) ; } else { HEADER_PATH = $(SOURCE_ROOT)$(/)$(2:G=) ; } LOCATE on $(HEADER_CLONE) = $(3) ; DEPENDS $(HEADER_CLONE) : $(3) ; if ! $(3) in $(PRODUCT_FILES) { Mkdir $(3) ; ProductFile $(3) ; } if $(3) = $(PRIVATE_HEADER_CLONE_DIR) && $(PRIVATE_HEADER_CLONE_LINK) { DEPENDS $(HEADER_CLONE) : $(PRIVATE_HEADER_CLONE_LINK) ; if ! $(PRIVATE_HEADER_CLONE_LINK) in $(PRODUCT_FILES) { SymLink $(PRIVATE_HEADER_CLONE_LINK) : $(PRIVATE_HEADER_CLONE_LINK_PATH) ; ProductFile $(PRIVATE_HEADER_CLONE_LINK) ; } } if $(3) = $(PUBLIC_HEADER_CLONE_DIR) && $(PUBLIC_HEADER_CLONE_LINK) { DEPENDS $(HEADER_CLONE) : $(PUBLIC_HEADER_CLONE_LINK) ; if ! $(PUBLIC_HEADER_CLONE_LINK) in $(PRODUCT_FILES) { SymLink $(PUBLIC_HEADER_CLONE_LINK) : $(PUBLIC_HEADER_CLONE_LINK_PATH) ; ProductFile $(PUBLIC_HEADER_CLONE_LINK) ; } } # make clone and record as build phase product ImportStub $(HEADER_CLONE) : $(HEADER_PATH) ; ProductFile $(HEADER_CLONE) ; LOCATE on $(HEADER_CLONE) = $(3) ; # if $(__BUILD_PHASING) = YES { # BUILD_PHASE_PRODUCTS += $(HEADER_CLONE) ; # } } # ImportStub : # Generates a file with one line which is an #import directive # and the second parameter quoted which should be a full path # to the real file to be imported. rule ImportStub { DEPENDS $(1) : $(2) ; NOUPDATE $(1) ; } actions ImportStub { echo "#import" \""$(2)"\" > "$(1)" } # AbsolutePathImportStub : # Generates a file with one line which is an #import directive # and the second parameter quoted which should be a full path # to the real file to be imported. # If $2 is not an absolute path, $(SRCROOT) will be prepended to make it absolute. rule AbsolutePathImportStub { DEPENDS $(1) : $(2) ; NOUPDATE $(1) ; } actions AbsolutePathImportStub { firstChar=`echo "$(2)" | colrm 2` if [ z$firstChar = z"/" -o z$firstChar = z"~" ] ; then includePath="$(2)" else includePath="$(SRCROOT)/$(2)" fi echo "#include" \""${includePath}"\" > "$(1)" } # HeaderDoc :
rule HeaderDoc { DEPENDS $(1) : $(2) ; } actions HeaderDoc { $(HEADERDOC2HTML) -o "$(HEADERDOC_DIR)" "$(2)" } # GatheredHeaderDoc rule GatheredHeaderDoc { } actions GatheredHeaderDoc { $(GATHERHEADERDOC) "$(HEADERDOC_DIR)" } # Source derivation operations: # Lex .{c|m} : .l[m] # Runs lex to generate .c or .m based on scanner input rule Lex { DEPENDS $(1) : $(2) ; } actions Lex { $(LEX) $(LEXFLAGS) "-o$(1)" "$(2)" } # Yacc .h .{c|m} : .y[m] # Uses yacc to generate parser from description rule Yacc { DEPENDS $(1) : $(2) ; } actions Yacc # Generate result by noting location, going to derived source directory, # running yacc, then copying the results to what is desired. { origin=`/bin/pwd` && $(CD) "$(1[1]:D)" && $(YACC) $(YACCFLAGS) -d "$origin/$(2)" && $(CP) y.tab.h "$(1[1])" && $(CP) y.tab.c "$(1[2])" } # RPCGen .h _xdr.c : .x # Generates RPC stubs from specifications # rule RPCGen { DEPENDS $(1) : $(2) ; } # Generate header and C code with two calls to rpcgen actions RPCGen { $(RPCGEN) $(RPCGENFLAGS) -h -o "$(1[1])" "$(2)" $(RPCGEN) $(RPCGENFLAGS) -c -o "$(1[2])" "$(2)" } # Mig .h User.c : .defs OR # Mig Server.h Server.c : .defs # Runs mig to create client and server files from a definition file. rule Mig { DEPENDS $(1) : $(2) ; if Server in $($(2)_ATTRIBUTES) { Mig.server $(1) : $(2) ; } else { Mig.client $(1) : $(2) ; } } actions Mig.client { origin=`pwd` && $(CD) "$(1[1]:D)" && $(MIG) $(OTHER_MIGFLAGS) "$origin/$(2)" } actions Mig.server { origin=`pwd` && $(CD) "$(1[1]:D)" && $(MIG) $(OTHER_MIGFLAGS) -sheader "$(2:B)Server.h" "$origin/$(2)" } # Bridget : rule Bridget { # set up common settings and paths needed for any bridget usage JAVA_HEADERS default = /Developer/Java/Headers /System/Library/Frameworks/JavaVM.framework/Headers ; if ! $(BRIDGET_FILES_DIR) { BRIDGET_FILES_DIR = $(DERIVED_FILE_DIR)$(/)JavaBridgeFiles ; Mkdir $(BRIDGET_FILES_DIR) ; ProductFile $(BRIDGET_FILES_DIR) ; } if $(BRIDGE_JAVA) = YES { # produce the file list draft # conditionally update the file list from the draft BRIDGET_DERIVED_JAVA_FILE_LIST = $(FILE_LIST:G=BridgetDerivedJavaFileList)BridgetDerivedJavaFileList ; NOTFILE $(BRIDGET_DERIVED_JAVA_FILE_LIST) ; DEPENDS $(1) : $(BRIDGET_DERIVED_JAVA_FILE_LIST) ; DEPENDS $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(2) ; DEPENDS $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(BRIDGET_FILES_DIR) ; DEPENDS $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(OBJECT_FILE_DIR) ; Bridget.UpdateJavaFileList $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(2) ; # derive files using file list # compile derived files (nonfile target?) BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG = $(FILE_LIST:G=BridgetDeriveAndCompileJavaTag)BridgetDeriveAndCompileJavaTag ; ProductFile $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) ; DEPENDS $(1) : $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(BRIDGET_DERIVED_JAVA_FILE_LIST) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(BRIDGET_FILES_DIR) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(CLASS_FILE_DIR) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(2) ; if $(JAVA_COMPILER:B) = jikes { Bridget. DeriveAndCompileJava.jikes $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(2) ; } else { Bridget.DeriveAndCompileJava.javac $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(2) ; } } if $(BRIDGE_OBJC) = YES { # Produce the derived C file list draft # and conditionally update the file list from the draft. BRIDGET_DERIVED_C_FILE_LIST = $(FILE_LIST:G=BridgetDerivedCFileList)BridgetDerivedCFileList ; NOTFILE $(BRIDGET_DERIVED_C_FILE_LIST) ; DEPENDS $(1) : $(BRIDGET_DERIVED_C_FILE_LIST) ; DEPENDS $(BRIDGET_DERIVED_C_FILE_LIST) : $(2) ; DEPENDS $(BRIDGET_DERIVED_C_FILE_LIST) : $(BRIDGET_FILES_DIR) ; DEPENDS $(BRIDGET_DERIVED_C_FILE_LIST) : $(OBJECT_FILE_DIR) ; Bridget.UpdateCFileList $(BRIDGET_DERIVED_C_FILE_LIST) : $(2) ; BRIDGET_DERIVE_AND_COMPILE_C_TAG = $(FILE_LIST:G=BridgetDeriveAndCompileCTag)BridgetDeriveAndCompileCTag ; ProductFile $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) ; DEPENDS $(1) : $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(BRIDGET_DERIVED_C_FILE_LIST) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(BRIDGET_FILES_DIR) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(OBJECT_FILE_DIR) ; DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(2) ; # derive files using file list # compile derived files (nonfile target?) BRIDGET_FILE_LIST default = $(FILE_LIST)Bridget ; BRIDGET_CFLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ; BRIDGET_CFLAGS on $(1) += -pipe ; # seed search paths with target-wide values HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ; # We must compile with the extension-specific build flags BRIDGET_CFLAGS on $(1) += $($(2:S)_CFLAGS) ; # Add debug flags, if appropriate. if $(DEBUGGING_SYMBOLS) = YES { BRIDGET_CFLAGS on $(1) += -g ; } # Add profiling flags, if appropriate. if $(PROFILING_CODE) = YES { BRIDGET_CFLAGS on $(1) += -pg ; } # Pass the trusted-precomp file name to the compiler to keep track # of which precompiled headers it has already sanity checked. if $(OS) in MACOS DARWIN { BRIDGET_CFLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ; } if $(CPP_HEADERMAP_FILE) { BRIDGET_CFLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ; } if YES in $(GENERATE_CPP_ILOG_FILES) { local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)$(/)$(ARCH)$(/)$(1:DB).ilog ; BRIDGET_CFLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ; } if $(PREFIX_HEADER) { PREFIX_HEADER_CFLAGS on $(1) += -include $(PREFIX_HEADER) ; } Bridget.DeriveAndCompileC $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(2) ; } } # Bridget.UpdateJavaFileList generates draft # and updates definitive list if it is missing or out of date actions Bridget.UpdateJavaFileList { $(BRIDGET) -listjava "-I$(BRIDGET_FILES_DIR)" "-I$(SOURCE_ROOT)" "-I$(HEADER_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(JAVA_HEADERS_DIR)" "$(BRIDGETFLAGS)" "$(OTHER_BRIDGETFLAGS)" "$(2)" >> "$(1:G=)Draft" && \ if [ ! -e "$(1:G=)" ]; then cp "$(1:G=)Draft" "$(1:G=)" else _file_list_diffs=`diff --brief "$(1:G=)Draft" "$(1:G=)"` if [ "x$_file_list_diffs" != "x" ]; then cp "$(1:G=)Draft" "$(1:G=)" fi fi } actions Bridget.DeriveAndCompileJava.javac { $(BRIDGET) -java -o "$(BRIDGET_FILES_DIR)" "-I$(BRIDGET_FILES_DIR)" "-I$(SOURCE_ROOT)" "-I$(HEADER_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(JAVA_HEADERS_DIR)" "$(BRIDGETFLAGS)" "$(OTHER_BRIDGETFLAGS)" "$(2)" && \ frameworkjars="" && \ for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done && \ classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath` && \ cd "$(BRIDGET_FILES_DIR)" && \ $(JAVA_COMPILER) $(JAVAC_FLAGS) -sourcepath "$(JAVA_SOURCE_PATH)" -classpath "$classpath" -d "$(CLASS_FILE_DIR)" @"$(BRIDGET_DERIVED_JAVA_FILE_LIST:G=)" && \ /usr/bin/touch "$(1:G=)" } actions Bridget.DeriveAndCompileJava.jikes { $(BRIDGET) -java -o "$(BRIDGET_FILES_DIR)" "-I$(BRIDGET_FILES_DIR)" "-I$(SOURCE_ROOT)" "-I$(HEADER_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(JAVA_HEADERS_DIR)" "$(BRIDGETFLAGS)" "$(OTHER_BRIDGETFLAGS)" "$(2)" && \ frameworkjars="" && \ for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done && \ classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath` && \ cd "$(BRIDGET_FILES_DIR)" && \ $(JAVA_COMPILER) +E $(JAVAC_FLAGS) -classpath "$classpath" -d "$(CLASS_FILE_DIR)" `cat "$(BRIDGET_DERIVED_JAVA_FILE_LIST:G=)"` && \ /usr/bin/touch "$(1:G=)" } # Bridget.CompileC.UpdateFileList generates draft # and updates definitive list if it is missing or out of date actions Bridget.UpdateCFileList { $(BRIDGET) -listobjc "-I$(BRIDGET_FILES_DIR)" "-I$(SOURCE_ROOT)" "-I$(HEADER_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(JAVA_HEADERS_DIR)" "$(BRIDGETFLAGS)" "$(OTHER_BRIDGETFLAGS)" "$(2)" >> "$(1:G=)Draft" && \ if [ ! -e "$(1:G=)" ]; then cp "$(1:G=)Draft" "$(1:G=)" else _file_list_diffs=`diff --brief "$(1:G=)Draft" "$(1:G=)"` if [ "x$_file_list_diffs" != "x" ]; then cp "$(1:G=)Draft" "$(1:G=)" fi fi } actions Bridget.DeriveAndCompileC { $(BRIDGET) -stub -init -o "$(BRIDGET_FILES_DIR)" "-I$(BRIDGET_FILES_DIR)" "-I$(SOURCE_ROOT)" "-I$(HEADER_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(JAVA_HEADERS_DIR)" "$(BRIDGETFLAGS)" "$(OTHER_BRIDGETFLAGS)" "$(2)" && \ cd "$(BRIDGET_FILES_DIR)" && \ $(CC) -c $(ARCH_FLAGS) -O -fno-common -no-cpp-precomp -dynamic "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "-I$(HEADER_SEARCH_PATHS)" "-I$(JAVA_HEADERS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(BUILD_DIR)/$(PUBLIC_HEADER_DIR:G=)" "-I$(BUILD_DIR)/$(PRIVATE_HEADER_DIR:G=)" "$(BRIDGET_CFLAGS)" $(PREFIX_HEADER_CFLAGS) `cat "$(BRIDGET_DERIVED_C_FILE_LIST:G=)"` && \ find "$(BRIDGET_FILES_DIR)" -type f -name '*.o' -print > "$(BRIDGET_FILE_LIST:G=)" && \ /usr/bin/touch "$(1:G=)" } # GenerateVectorLibraryIntermediates : # Generates and compiles vector stub rule GenerateVectorLibraryIntermediates { DEPENDS $(1) : $(2) ; VECTOR_STUB on $(1) = $(VECTOR_STUB) ; VECTOR_OBJECT_FILE on $(1) = $(VECTOR_OBJECT_FILE) ; VECTOR_FRAGMENT_NAME on $(1) = $(VECTOR_FRAGMENT_NAME) ; DYLIB_INSTALLED_NAME on $(1) = $(DYLIB_INSTALLED_NAME) ; DEPENDS $(VECTOR_STUB) : $(DERIVED_FILE_DIR) ; } actions GenerateVectorLibraryIntermediates { "$(MAKEPSEUDOLIB)" "$(2)" -strip -fragname "$(VECTOR_FRAGMENT_NAME)" -vector "$(VECTOR_STUB)" -dylibpath "$(DYLIB_INSTALLED_NAME)" && \ $(CC) -Wa,-L -c $(ARCH_FLAGS) -O -fno-common -no-cpp-precomp -dynamic "$(FLAGS)" $(GLOBAL_CFLAGS) -o "$(VECTOR_OBJECT_FILE)" "$(VECTOR_STUB)" } MASTER_INTERFACES default = /AppleInternal/Carbon/interfaces ; # !!!:cmolick:20010412 Apple internal RC_ settings nonempty in offical builds INTERFACER_TARGET_UPDATE default = \"$(RC_ProjectName)-$(RC_ProjectSourceVersion)~$(RC_ProjectBuildVersion)\" ; rule InterfacerHeaders { INTERFACER_CACHE default = $(TEMP_DIR)$(/)InterfacerCache ; local BUILD_DIR_AND_SEPARATOR = $(BUILD_DIR)$(/) ; INTERFACER_HEADERS = $(1:G=InterfacerHeaders) ; if $(INTERFACER_TARGET_UPDATE) { INTERFACER_HEADER_OPTIONS += -externalHeader $(INTERFACER_TARGET_UPDATE) ; } FULL_PUBLIC_HEADER_DIR = $(BUILD_DIR_AND_SEPARATOR)$(PUBLIC_HEADER_DIR:G=) ; FULL_PUBLIC_HEADER_DIR on $(INTERFACER_HEADERS) = $(FULL_PUBLIC_HEADER_DIR) ; FULL_PRIVATE_HEADER_DIR = $(BUILD_DIR_AND_SEPARATOR)$(PRIVATE_HEADER_DIR:G=) ; FULL_PRIVATE_HEADER_DIR on $(INTERFACER_HEADERS) = $(FULL_PRIVATE_HEADER_DIR) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(INTERFACER_HEADERS) ; } DEPENDS $(INTERFACER_HEADERS) : $(FULL_PUBLIC_HEADER_DIR) ; DEPENDS $(INTERFACER_HEADERS) : $(FULL_PRIVATE_HEADER_DIR) ; DEPENDS $(INTERFACER_HEADERS) : $(BUILD_DIR_AND_SEPARATOR)$(PUBLIC_HEADER_DIR:G=) ; DEPENDS $(INTERFACER_HEADERS) : $(BUILD_DIR_AND_SEPARATOR)$(PRIVATE_HEADER_DIR:G=) ; Mkdir $(FULL_PUBLIC_HEADER_DIR) ; SymLink $(BUILD_DIR_AND_SEPARATOR)$(PUBLIC_HEADER_LINK:G=) : $(PUBLIC_HEADER_LINK_PATH) ; Mkdir $(FULL_PRIVATE_HEADER_DIR) ; SymLink $(BUILD_DIR_AND_SEPARATOR)$(PRIVATE_HEADER_LINK:G=) : $(PRIVATE_HEADER_LINK_PATH) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(FULL_PUBLIC_HEADER_DIR) ; BUILD_PHASE_PRODUCTS += $(FULL_PRIVATE_HEADER_DIR) ; BUILD_PHASE_PRODUCTS += $(BUILD_DIR_AND_SEPARATOR)$(PUBLIC_HEADER_LINK:G=) ; BUILD_PHASE_PRODUCTS += $(BUILD_DIR_AND_SEPARATOR)$(PRIVATE_HEADER_LINK:G=) ; } Interfacer.Headers $(INTERFACER_HEADERS) ; # interfacer headers are required--should ideally be a phase product DEPENDS $(1) : $(INTERFACER_HEADERS) ; } actions Interfacer.Headers { "$(INTERFACER)" -masterInterfaces "$(MASTER_INTERFACES)/" -cacheFolder "$(INTERFACER_CACHE)/" $(INTERFACER_HEADER_OPTIONS) -c -rez -framework "$(1:D=:S=:G=)" -p -generated "c=$(FULL_PUBLIC_HEADER_DIR:G=)/" -generatedPriv "c=$(FULL_PRIVATE_HEADER_DIR:G=)/" -generated "rez=$(FULL_PUBLIC_HEADER_DIR:G=)/" -generatedPriv "rez=$(FULL_PRIVATE_HEADER_DIR:G=)/" } rule InterfacerExportSetsAndGlue { INTERFACER_CACHE default = $(TEMP_DIR)$(/)InterfacerCache ; EXPORT_SETS_DIR default = $(DERIVED_FILE_DIR)$(/)ExportSets ; UPP_GLUE_DIR default = $(DERIVED_FILE_DIR)$(/)UPPGlue ; COMPONENT_GLUE_DIR default = $(DERIVED_FILE_DIR)$(/)ComponentGlue ; GLUE_FILE_LIST = $(FILE_LIST)Glue ; RAW_GENERATED_EXPORTS_FILE default = $(EXPORT_SETS_DIR)$(/)fw_$(PRODUCT_NAME)_X.exp ; RAW_GENERATED_PRIVATE_EXPORTS_FILE default = $(EXPORT_SETS_DIR)$(/)fw_$(PRODUCT_NAME)Priv_X.exp ; # !!!:cmolick:20000602 private exports file optional...bad depend? PROCESSED_EXPORTS_FILE default = $(DERIVED_FILE_DIR)$(/)$(PRODUCT_NAME).exp ; DEPENDS $(RAW_GENERATED_EXPORTS_FILE) : $(DERIVED_FILE_DIR) ; DEPENDS $(RAW_GENERATED_PRIVATE_EXPORTS_FILE) : $(DERIVED_FILE_DIR) ; DEPENDS $(PROCESSED_EXPORTS_FILE) : $(DERIVED_FILE_DIR) ; # object file dir needs to be in place for glue object file list DEPENDS $(PROCESSED_EXPORTS_FILE) : $(OBJECT_FILE_DIR) ; DEPENDS $(PROCESSED_EXPORTS_FILE) : $(RAW_GENERATED_EXPORTS_FILE) ; DEPENDS $(1) : $(PROCESSED_EXPORTS_FILE) ; if $(GENERATE_HEADERS) = YES { DEPENDS $(RAW_GENERATED_EXPORTS_FILE) : $(INTERFACER_HEADERS) ; DEPENDS $(PROCESSED_EXPORTS_FILE) : $(INTERFACER_HEADERS) ; } if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(RAW_GENERATED_EXPORTS_FILE) $(PROCESSED_EXPORTS_FILE) ; } HEADER_SEARCH_PATHS on $(RAW_GENERATED_EXPORTS_FILE) = $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS on $(RAW_GENERATED_EXPORTS_FILE) = $(FRAMEWORK_SEARCH_PATHS) ; if $(GENERATE_COMPONENT_GLUE) = YES { INTERFACER_FLAGS += -componentGlueC ; INTERFACER_COMPONENT_GLUE_FLAGS = -generated "componentGlueC=$(COMPONENT_GLUE_DIR)/" -generatedPriv "componentGlueC=$(COMPONENT_GLUE_DIR)/" ; } Interfacer.RawExportSetsAndGlue $(RAW_GENERATED_EXPORTS_FILE) $(GLUE_FILE_LIST) : $(1) ; ProductFile $(RAW_GENERATED_EXPORTS_FILE) ; ProductFile $(GLUE_FILE_LIST) ; ADDITIONAL_EXPORTS_FILE on $(PROCESSED_EXPORTS_FILE) = $(ADDITIONAL_EXPORTS_FILE) ; ADDITIONAL_TRADITIONAL_EXPORTS_FILE on $(PROCESSED_EXPORTS_FILE) = $(ADDITIONAL_TRADITIONAL_EXPORTS_FILE) ; Interfacer.PrepareExportList $(PROCESSED_EXPORTS_FILE) : $(RAW_GENERATED_EXPORTS_FILE) ; ProductFile $(PROCESSED_EXPORTS_FILE) ; EXPORTED_SYMBOLS_FILE default = $(PROCESSED_EXPORTS_FILE) ; ProcessFile $(1) : $(EXPORTED_SYMBOLS_FILE) ; } actions Interfacer.RawExportSetsAndGlue # Generates export sets and UPP glue with Interfacer, # then attempts to compile UPP glue and add resulting # object files to a list to use at link time. { "$(INTERFACER)" -masterInterfaces "$(MASTER_INTERFACES)/" -cacheFolder "$(INTERFACER_CACHE)/" -exportset -uppGlueC "$(INTERFACER_FLAGS)" -framework "$(2:G=:D=:S=)" -p -generated "exportset=$(EXPORT_SETS_DIR)/" -generatedPriv "exportset=$(EXPORT_SETS_DIR)/" -generated "uppGlueC=$(UPP_GLUE_DIR)/" -generatedPriv "uppGlueC=$(UPP_GLUE_DIR)/" $(INTERFACER_COMPONENT_GLUE_FLAGS) cd "$(UPP_GLUE_DIR)" $(CC) -c $(ARCH_FLAGS) -O -fno-common -no-cpp-precomp -dynamic -Wmost -Wno-four-char-constants -fpascal-strings -fwritable-strings -fexceptions -DCARBON_THRASH=1 -DforCarbon=1 -DACCESSORS_CALLS_ARE_FUNCTIONS=1 -DUSE_INVOKEUPP_C_GLUE=1 "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "-I$(HEADER_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(BUILD_DIR)/$(PUBLIC_HEADER_DIR:G=)" "-I$(BUILD_DIR)/$(PRIVATE_HEADER_DIR:G=)" *.c find "$(UPP_GLUE_DIR)" -type f -name '*.i.o' -print > "$(GLUE_FILE_LIST)" if [ -e "$(COMPONENT_GLUE_DIR)" ]; then _component_glue_modules=`ls "$(COMPONENT_GLUE_DIR)"` if [ ! "$_component_glue_modules" = x"$_component_glue_modules" ]; then cd "$(COMPONENT_GLUE_DIR)" $(CC) -c $(ARCH_FLAGS) -O -fno-common -no-cpp-precomp -dynamic -Wmost -Wno-four-char-constants -fpascal-strings -fwritable-strings -fexceptions -DCARBON_THRASH=1 -DforCarbon=1 -DACCESSORS_CALLS_ARE_FUNCTIONS=1 -DUSE_INVOKEUPP_C_GLUE=1 "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "-I$(HEADER_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(BUILD_DIR)/$(PUBLIC_HEADER_DIR:G=)" "-I$(BUILD_DIR)/$(PRIVATE_HEADER_DIR:G=)" *.c find "$(COMPONENT_GLUE_DIR)" -type f -name '*.i.o' -print >> "$(GLUE_FILE_LIST)" fi fi } actions Interfacer.PrepareExportList # Translates PEF-oriented Interfacer export list output into # nmedit-compatible export lists for use with mach-o. { cat "$(EXPORT_SETS_DIR)$(/)fw_$(PRODUCT_NAME)_"*.exp > "$(EXPORT_SETS_DIR)$(/)_Generated.exp" if [ -e "$(EXPORT_SETS_DIR)/fw_$(PRODUCT_NAME)Priv_X.exp" ]; then cat "$(EXPORT_SETS_DIR)/fw_$(PRODUCT_NAME)Priv_"*.exp >> "$(EXPORT_SETS_DIR)$(/)_Generated.exp" fi cat "$(EXPORT_SETS_DIR)$(/)_Generated.exp" | grep -v ^\* | grep -v ^# | grep -v ^\$ | sort | uniq -u | sed -e '1,$ s/^/_/' > "$(1)" if [ "x$(ADDITIONAL_EXPORTS_FILE)" != "x" ]; then if [ -f "$(ADDITIONAL_EXPORTS_FILE)" ]; then cat "$(ADDITIONAL_EXPORTS_FILE)" >> "$(1)" fi fi if [ "x$(ADDITIONAL_TRADITIONAL_EXPORTS_FILE)" != "x" ]; then if [ -f "$(ADDITIONAL_TRADITIONAL_EXPORTS_FILE)" ]; then cat "$(ADDITIONAL_TRADITIONAL_EXPORTS_FILE)" | grep -v ^\* | grep -v ^# | grep -v ^\$ | sort | uniq -u | sed -e '1,$ s/^/_/' >> "$(1)" fi fi } # Linking, class archive generation, and related operations: # # Variables used by linking operations: # FLAGS.o of target, LDFLAGS, OTHER_LDFLAGS, # LIBRARY_SEARCH_PATHS, FRAMEWORK_SEARCH_PATHS, # and optionally LINK_FILE_LIST and INIT_ROUTINE # ClassArchive : # Generates an archive that stores class files in the given directory rule ClassArchive { if $(JAVA_ARCHIVE_TYPE) = JAR { local JARFLAGS = $(JAVA_JAR_FLAGS) ; if $(JAVA_MANIFEST_FILE) { DEPENDS $(1) : $(JAVA_MANIFEST_FILE) ; JAVA_MANIFEST_FILE on $(1) = $(SOURCE_ROOT)$(/)$(JAVA_MANIFEST_FILE) ; JARFLAGS = $(JARFLAGS)m ; } JARFLAGS = $(JARFLAGS)f ; if $(JAVA_ARCHIVE_COMPRESSION) != YES { JARFLAGS = $(JARFLAGS)0 ; } JARFLAGS += -J-Dfile.encoding=UTF8 ; JARFLAGS on $(1) = $(JARFLAGS) ; CLASS_FILE_DIR on $(1) = $(CLASS_FILE_DIR) ; ClassArchive.jarArchive $(1) : $(2) ; } else { if $(JAVA_ARCHIVE_TYPE) = ZIP { local ZIPFLAGS = $(JAVA_ZIP_FLAGS) ; if $(JAVA_ARCHIVE_COMPRESSION) != YES { ZIPFLAGS = $(ZIPFLAGS)0 ; } ZIPFLAGS on $(1) = $(ZIPFLAGS) ; CLASS_FILE_DIR on $(1) = $(CLASS_FILE_DIR) ; ClassArchive.zipArchive $(1) : $(2) ; } } } # Use jar command to generate an archive # from the class file list after removing "./" from each file path actions ClassArchive.jarArchive { cd "$(2)" && $(JAR) $(JARFLAGS) $(OTHER_JARFLAGS) "$(JAVA_MANIFEST_FILE)" "$(1)" . } # Use zip command to generate an archive # from the class file list after removing "./" from each file path actions ClassArchive.zipArchive { cd "$(2)" && $(ZIP) $(ZIPFLAGS) $(OTHER_ZIPFLAGS) "$(1)" . } # Bulk copy of class files # ClassCopy : actions ClassCopy { cd "$(2:G=)" && $(PAX) -pe -rw . "$(1:G=)" } # Unarchive : rule Unarchive { _DESTINATION_DIR = $(1:G=) ; if ! $(_DESTINATION_DIR) in $(PRODUCT_FILES) { Mkdir $(_DESTINATION_DIR) ; ProductFile $(_DESTINATION_DIR) ; } DEPENDS $(1) : $(_DESTINATION_DIR) ; DEPENDS $(1) : $(2) ; switch $(2:S) { case ".jar" : UnarchiveJar $(1) : $(2) ; case ".zip" : UnarchiveZip $(1) : $(2) ; } } # we use unzip to unarchive jars since it's much faster than jar, and we can exclude the manifest file actions UnarchiveJar { $(UNZIP) -oq "$(2)" -x META-INF/MANIFEST.MF -d "$(1:G=)" } actions UnarchiveZip { $(UNZIP) -oq "$(2)" -d "$(1:G=)" } # ProcessSingleObjectLink : : # Calls link rule which then calls ProcessLink # in order to generate a master object file # which is also used for symbol editing rule ProcessSingleObjectLink { local OTHER_LINKED_FILES ; # Master object file kept in other directory to avoid name conflict MASTER_OBJECT_FILE default = $(TEMP_DIR)$(/)master.o ; NonObjectFiles OTHER_LINKED_FILES : $(LINKED_FILES) ; MasterObjectFile $(MASTER_OBJECT_FILE) : $(OBJECT_FILES) : $(EXPORTED_SYMBOLS_FILE) ; if $(OTHER_LINKED_FILES) = "" { OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE) ; } else { OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE) ; } if $(VECTOR_OBJECT_FILE) { OTHER_LINKED_FILES += $(VECTOR_OBJECT_FILE) ; } $(3) $(INNER_PRODUCT) : $(OTHER_LINKED_FILES) ; } # ProcessLink : : # Processes into .ARGUMENTS for later use by the rule # where are object files, libraries, frameworks, object file lists, # and such and where is one of StaticLibrary, DynamicLibrary, or # StandaloneExecutable. rule ProcessLink { local RULE = $(3) ; # Link as standalone executable unless another rule is specified RULE default = StandaloneExecutable ; # Set rule-specific flags such as StandaloneExecutable.FILELIST_FLAG # and store the values in local variables local FILELIST_FLAG = $($(RULE).FILELIST_FLAG:G=) ; local LIBRARY_FLAG = $($(RULE).LIBRARY_FLAG:G=) ; local FRAMEWORK_FLAG = $($(RULE).FRAMEWORK_FLAG:G=) ; local FILELIST_NOSPACE = $($(RULE).FILELIST_FLAG:G) ; local LIBRARY_NOSPACE = $($(RULE).LIBRARY_FLAG:G) ; local FRAMEWORK_NOSPACE = $($(RULE).FRAMEWORK_FLAG:G) ; local BATCH_OFILES = $($(RULE).BATCH_OFILES) ; # The product depends on all of the input files, although # library and framework references may not be resolvable. DEPENDS $(1) : $(2) ; # link depends on file list LINK_FILE_LIST = $(FILE_LIST) ; DEPENDS $(1) : $(LINK_FILE_LIST) ; # Deal with each input file in turn local LINKED ; local ARGUMENT ; for LINKED in $(2) { $(RULE).FILES$(LINKED:S) on $(1) += $(LINKED) ; switch $(LINKED:BS) { case *.o : # If $(BATCH_OFILES) is true then object file lists are generated. if $(BATCH_OFILES) != NO { ClearFileList $(LINK_FILE_LIST) ; AppendToFileList $(LINK_FILE_LIST) : $(LINKED) ; DEPENDS $(LINK_FILE_LIST) : $(LINKED) ; } else { $(RULE).ARGUMENTS on $(1) += $(LINKED) ; } case *.objects : if $(FILELIST_NOSPACE) { ARGUMENT = $(FILELIST_FLAG)$(LINKED) ; NOTFILE $(ARGUMENT) ; } else { NOTFILE $(FILELIST_FLAG) ; ARGUMENT = $(FILELIST_FLAG) $(LINKED) ; } $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ; case lib*.a : if $(LIBRARY_FLAG) { LINKED = $(LINKED:A) ; } NOCARE $(LINKED) ; if $(LIBRARY_NOSPACE) { ARGUMENT = $(LIBRARY_FLAG)$(LINKED) ; } else { ARGUMENT = $(LIBRARY_FLAG) $(LINKED) ; } $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ; NOTFILE $(ARGUMENT) ; case *.lib : NOCARE $(LINKED) ; if $(LIBRARY_FLAG) { if $(LIBRARY_NOSPACE) { ARGUMENT = $(LIBRARY_FLAG)$(LINKED:A) ; } else { ARGUMENT = $(LIBRARY_FLAG) $(LINKED:A) ; } $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ; NOTFILE $(ARGUMENT) ; } else { ECHO jam: warning: For target $(1), rule $(RULE) will ignore $(LINKED) ; } case *.dylib : NOCARE $(LINKED) ; if $(LIBRARY_FLAG) { if $(LIBRARY_NOSPACE) { ARGUMENT = $(LIBRARY_FLAG)$(LINKED:A) ; } else { ARGUMENT = $(LIBRARY_FLAG) $(LINKED:A) ; } $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ; NOTFILE $(ARGUMENT) ; } else { ECHO jam: warning: For target $(1), rule $(RULE) will ignore $(LINKED) ; } case *.framework : NOCARE $(LINKED) ; if $(FRAMEWORK_FLAG) { if $(FRAMEWORK_NOSPACE) { ARGUMENT = $(FRAMEWORK_FLAG)$(LINKED:B) ; } else { ARGUMENT = $(FRAMEWORK_FLAG) $(LINKED:B) ; } $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ; NOTFILE $(ARGUMENT) ; } else { ECHO jam: warning: For target $(1), rule $(RULE) will ignore $(LINKED) ; } case *.jar : # silently ignore Java archives since they are valid, but not used for native linking case *.zip : # silently ignore Java archives since they are valid, but not used for native linking case * : ECHO Warning: $(RULE): Unknown extension on "$(LINKED:BS)" when linking with $(RULE) ; } } # include any object files compiled from objc generated with bridget if $(BRIDGET_FILE_LIST) { AppendFileToFileList $(LINK_FILE_LIST) : $(BRIDGET_FILE_LIST) ; } if $(BATCH_OFILES) != NO { $(RULE).LinkUsingFileList $(1) ; } else { $(RULE).Link $(1) ; } } actions quietly together piecemeal ClearFileList { $(RM) -rf "$(1)" } actions quietly together piecemeal AppendToFileList { for file_reference in "$(2)" do $(ECHO) "$file_reference" >> "$(1)" done } actions quietly together piecemeal AppendFileToFileList { cat "$(2)" >> "$(1)" } # StaticLibrary : # Stores in where are object files, # libraries, frameworks, object file lists, and such rule StaticLibrary { LIBRARY_SEARCH_PATHS on $(1) = $(LIBRARY_SEARCH_PATHS) ; ProcessLink $(1) : $(2) : StaticLibrary ; FLAGS.o on $(1) = $(LDFLAGS) $(SECTORDER_FLAGS) $(OTHER_LDFLAGS) ; } actions together StaticLibrary { } actions quietly together piecemeal StaticLibrary.Link bind StaticLibrary.ARGUMENTS { ( "$(LIBTOOL)" -o "$(1)" "$(2)" "-L$(LIBRARY_SEARCH_PATHS)" "$(StaticLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) && $(RANLIB) "$(1)" ) } actions quietly together piecemeal StaticLibrary.LinkUsingFileList bind StaticLibrary.ARGUMENTS { ( "$(LIBTOOL)" -o "$(1)" "$(2)" "-L$(LIBRARY_SEARCH_PATHS)" -filelist "$(LINK_FILE_LIST)" "$(StaticLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) && $(RANLIB) "$(1)" ) } StaticLibrary.FRAMEWORK_FLAG = ; StaticLibrary.LIBRARY_FLAG = ; StaticLibrary.BATCH_OFILES default = YES ; # StandaloneExecutable : # Links to produce , where are objects, # libraries, frameworks, and such. rule StandaloneExecutable { ProcessLink $(1) : $(2) ; FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ; LIBRARY_SEARCH_PATHS on $(1) = $(LIBRARY_SEARCH_PATHS) ; FLAGS.o on $(1) = $(ARCH_FLAGS) $(LDFLAGS) $(SECTORDER_FLAGS) $(OTHER_LDFLAGS) ; if $(INIT_ROUTINE) { FLAGS.o on $(1) += -init $(INIT_ROUTINE) ; } } StandaloneExecutable.FILELIST_FLAG = -filelist ; StandaloneExecutable.FRAMEWORK_FLAG = -framework ; StandaloneExecutable.LIBRARY_FLAG = -l ; StandaloneExecutable.BATCH_OFILES default = YES ; actions together StandaloneExecutable { } actions quietly together StandaloneExecutable.Link bind StandaloneExecutable.ARGUMENTS { $(__LD_FOR_LINKING) -o "$(1)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) "$(StandaloneExecutable.ARGUMENTS)" } actions quietly together StandaloneExecutable.LinkUsingFileList bind StandaloneExecutable.ARGUMENTS { $(__LD_FOR_LINKING) -o "$(1)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" -filelist "$(LINK_FILE_LIST)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) "$(StandaloneExecutable.ARGUMENTS)" } # DynamicLibrary : : # Links and to produce , using $(FLAGS.o) rule DynamicLibrary { LIBRARY_SEARCH_PATHS on $(1) = $(LIBRARY_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ; ProcessLink $(1) : $(2) : DynamicLibrary ; FLAGS.o on $(1) = $(ARCH_FLAGS) $(LDFLAGS) $(SECTORDER_FLAGS) $(OTHER_LDFLAGS) ; if $(INIT_ROUTINE) { FLAGS.o on $(1) += -init $(INIT_ROUTINE) ; } } actions together DynamicLibrary { } actions quietly together DynamicLibrary.Link bind DynamicLibrary.ARGUMENTS DynamicLibrary.DEFFILE { $(__LD_FOR_LINKING) -o "$(1)" $(DynamicLibrary.DEFFILE_FLAG)"$(DynamicLibrary.DEFFILE)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(DynamicLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) } actions quietly together DynamicLibrary.LinkUsingFileList bind DynamicLibrary.ARGUMENTS DynamicLibrary.DEFFILE { $(__LD_FOR_LINKING) -o "$(1)" $(DynamicLibrary.DEFFILE_FLAG)"$(DynamicLibrary.DEFFILE)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" -filelist "$(LINK_FILE_LIST)" "$(DynamicLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) } DynamicLibrary.DEFFILE_FLAG = "-Xlinker -DEF:" ; DynamicLibrary.FILELIST_FLAG = -filelist ; DynamicLibrary.FRAMEWORK_FLAG = -framework ; DynamicLibrary.LIBRARY_FLAG = -l ; DynamicLibrary.BATCH_OFILES default = YES ; # MasterObjectFile : : : [] # Merges many object files into one in order to edit # the list of exported symbols rule MasterObjectFile { local OBJECT_FILE ; if $(4) { LINK_FILE_LIST = $(FILE_LIST)Prelink_$(4) ; } else { LINK_FILE_LIST = $(FILE_LIST)Prelink ; } # object files must be present before master can be assembled DEPENDS $(1) : $(2) ; # list object files in a file to limit link line length DEPENDS $(1) : $(LINK_FILE_LIST) ; ClearFileList $(LINK_FILE_LIST) ; for LINKED in $(2) { AppendToFileList $(LINK_FILE_LIST) : $(LINKED) ; DEPENDS $(LINK_FILE_LIST) : $(LINKED) ; } if $(KEEP_PRIVATE_EXTERNS) != NO { KEEP_PRIVATE_EXTERNS_FLAG on $(1) = -keep_private_externs ; } if $(GLUE_FILE_LIST) { # !!! cmolick:20000602 making link file list depend on glue file list causes failure # this might work now... DEPENDS $(LINK_FILE_LIST) : $(GLUE_FILE_LIST) ; AppendFileToFileList $(LINK_FILE_LIST) : $(GLUE_FILE_LIST) ; } PRELINK_FLAGS on $(1) = $(PRELINK_FLAGS) ; PRELINK_LIBS on $(1) = $(PRELINK_LIBS) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(1) ; } MasterObjectFile.Combine $(1) : $(LINK_FILE_LIST) ; if $(3) { # changes to the exports file require redo of master object file # DEPENDS $(1) : $(3) ; INCLUDES $(1) : $(3) ; MasterObjectFile.EditExports $(1) : $(3) ; } } actions MasterObjectFile.Combine { $(__LD_FOR_LINKING) $(ARCH_FLAGS) $(KEEP_PRIVATE_EXTERNS_FLAG) $(GLOBAL_CFLAGS) "$(PRELINK_FLAGS)" -nostdlib -filelist "$(2)" -r -o "$(1)" "$(PRELINK_LIBS)" } actions MasterObjectFile.EditExports { $(NMEDIT) -s "$(2)" "$(1)" -o "$(1)" } # VersioningSystem_next-cvs # Handles automatic generation of CVSVersionInfo.txt file for projects that use NeXT CVS-style versioning. rule VersioningSystem_next-cvs { local VERSION_INFO_FILE ; VERSION_INFO_FILE default = $(1:B)_vers.c ; # Make sure that the C file containing the version string gets created. VersioningSystem_next-cvs.Create $(VERSION_INFO_FILE) : $(1:B) ; DerivedFiles $(VERSION_INFO_FILE) ; ProcessFile $(1) : $(VERSION_INFO_FILE) ; # Set up default values for the variables. CVS_VERS_FILE default = CVSVersionInfo.txt ; } rule VersioningSystem_next-cvs.Create { DEPENDS $(1) : $(CVS_VERS_FILE) ; } actions VersioningSystem_next-cvs.Create { versFile="$(CVS_VERS_FILE)" awk=/usr/bin/awk user=`$awk '/\\$\Id:/ {print $7;}' $versFile` timestamp=`$awk '/\\$\Id:/ {print $5 " " $6;}' $versFile` fileVers=`$awk '/\\$\Id:/ {print $4;}' $versFile` name=`$awk '/^ProjectName:/ {print $2;}' $versFile` tag=`$awk '/\\$\Name:/ {print $3;}' $versFile` versNum=`$awk '/^ProjectVersion:/ {print $2;}' $versFile` proj="$(2:B)" clean_proj_name=`echo $proj | sed 's/[^0-9A-Za-z]/_/g'` # the keyword name is the current tag and only gets filled in if the files are extracted at # that tag. If the tag has a value, then it is a released version, if the tag is '$' then # it has no value and is a development version. case $tag in '$') vers="$versNum.dev";; *) vers=$versNum;; esac q='"' vers_str="Project:$proj Version:$vers (Checkpoint by:$user on:$timestamp revision:$fileVers)" vers_suffix="$(CURRENT_PROJECT_VERSION_SUFFIX)" echo "const char "$clean_proj_name"_VERS_STRING[] = $q@(#)$vers_str$q;" > "$(1)" echo "const char "$clean_proj_name"_VERS_NUM[] = $q$vers$vers_suffix$q;" >> "$(1)" } # VersioningSystem_apple-generic # Generates _vers.c to define version symbol rule VersioningSystem_apple-generic { # Set values to use local VERSION_INFO_FILE ; VERSION_INFO_FILE default = $(1:B)_vers.c ; # variables used need to be defined on the version info file target CURRENT_PROJECT_VERSION on $(VERSION_INFO_FILE) = $(CURRENT_PROJECT_VERSION) ; VERSION_INFO_EXPORT_DECL on $(VERSION_INFO_FILE) default = $(VERSION_INFO_EXPORT_DECL) ; VERSION_INFO_PREFIX on $(VERSION_INFO_FILE) default = $(VERSION_INFO_PREFIX) ; VERSION_INFO_SUFFIX on $(VERSION_INFO_FILE) default = $(VERSION_INFO_SUFFIX) ; VERSION_INFO_BUILDER on $(VERSION_INFO_FILE) default = $(USER) ; # Create versioning code VersioningSystem_apple-generic.Create $(VERSION_INFO_FILE) : $(1) ; DerivedFiles $(VERSION_INFO_FILE) ; ProcessFile $(1) : $(VERSION_INFO_FILE) ; } actions VersioningSystem_apple-generic.Create { raw_project_name="$(PROJECT)" project_name=`echo $raw_project_name | sed 's/[^0-9A-Za-z]/_/g'` raw_target_name="$(2:B)" target_name=`echo $raw_target_name | sed 's/[^0-9A-Za-z]/_/g'` project_vers="$(CURRENT_PROJECT_VERSION)" vers_info_export_decl="$(VERSION_INFO_EXPORT_DECL)" vers_info_prefix="$(VERSION_INFO_PREFIX)" vers_info_suffix="$(VERSION_INFO_SUFFIX)" vers_info_builder="$(VERSION_INFO_BUILDER)" echo ${vers_info_export_decl} " const unsigned char ${vers_info_prefix}${target_name}VersionString${vers_info_suffix}[] = \"@(#)PROGRAM:${target_name} PROJECT:${project_name}-${project_vers} DEVELOPER:${vers_info_builder} BUILT:\" __DATE__ \" \" __TIME__ \"\n\";" > "$(1)" echo ${vers_info_export_decl} " const double ${vers_info_prefix}${target_name}VersionNumber${vers_info_suffix} = (double)${project_vers};" >> "$(1)" } # KernelModuleGeneratedSource # Creates a kernel module source stub based on the values # of MODULE_VERSION, MODULE_START, and MODULE_STOP rule KernelModuleGeneratedSource { MODULE_INFO_FILE default = $(1:B)_info.c ; DerivedFiles $(MODULE_INFO_FILE) ; DEPENDS $(MODULE_INFO_FILE) : $(MODULE_INFO_PLIST) ; MODULE_VERSION on $(MODULE_INFO_FILE) = $(MODULE_VERSION) ; MODULE_NAME on $(MODULE_INFO_FILE) = $(MODULE_NAME) ; if $(MODULE_IOKIT) = "YES" { MODULE_START on $(MODULE_INFO_FILE) = 0 ; MODULE_STOP on $(MODULE_INFO_FILE) = 0 ; } else { if $(MODULE_START) = "" { MODULE_START on $(MODULE_INFO_FILE) = 0 ; } else { MODULE_START on $(MODULE_INFO_FILE) = $(MODULE_START) ; } if $(MODULE_STOP) = "" { MODULE_STOP on $(MODULE_INFO_FILE) = 0 ; } else { MODULE_STOP on $(MODULE_INFO_FILE) = $(MODULE_STOP) ; } } KernelModuleGeneratedSource.Create $(MODULE_INFO_FILE) ; ProcessFile $(1) : $(MODULE_INFO_FILE) ; } actions KernelModuleGeneratedSource.Create { /bin/echo "#include " > "$(1)" /bin/echo " " >> "$(1)" /bin/echo "extern kern_return_t _start(kmod_info_t *ki, void *data);" >> "$(1)" /bin/echo "extern kern_return_t _stop(kmod_info_t *ki, void *data);" >> "$(1)" if [ $(MODULE_START) != 0 ]; then /bin/echo "__private_extern__ kern_return_t $(MODULE_START)(kmod_info_t *ki, void *data);" >> "$(1)" fi if [ $(MODULE_STOP) != 0 ]; then /bin/echo "__private_extern__ kern_return_t $(MODULE_STOP)(kmod_info_t *ki, void *data);" >> "$(1)" fi /bin/echo " " >> "$(1)" /bin/echo "KMOD_EXPLICIT_DECL($(MODULE_NAME), \"$(MODULE_VERSION)\", _start, _stop)" >> "$(1)" /bin/echo "__private_extern__ kmod_start_func_t *_realmain = $(MODULE_START);" >> "$(1)" /bin/echo "__private_extern__ kmod_stop_func_t *_antimain = $(MODULE_STOP);" >> "$(1)" } # GenerateFrameworkStub # Invokes a custom tool to generate a Mach-O framework executable stub at the specified path # Also be sure to the FRAMEWORK_INSTALL_NAME variable on the actions GenerateFrameworkStub { $(MKDIR) -p "$(DERIVED_FILE_DIR)" dummy_class_name=`echo -n $(1:B) | tr -c '[:alnum:]' '_'` $(ECHO) "@interface NSFramework_${dummy_class_name}" > "$(DERIVED_FILE_DIR)/framework_stub.m" $(ECHO) "@end" >> "$(DERIVED_FILE_DIR)/framework_stub.m" $(ECHO) "@implementation NSFramework_${dummy_class_name}" >> "$(DERIVED_FILE_DIR)/framework_stub.m" $(ECHO) "@end" >> "$(DERIVED_FILE_DIR)/framework_stub.m" $(CC) -c "$(DERIVED_FILE_DIR)/framework_stub.m" -o "$(DERIVED_FILE_DIR)/framework_stub.o" $(LD) -dynamiclib $(INSTALLED_NAME_FLAG) $(DYLIB_VERSION_FLAGS) "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(DynamicLibrary.ARGUMENTS)" "$(DERIVED_FILE_DIR)/framework_stub.o" -o "$(1)" } # Copyright (c) 1999,2000,2001 Apple Computer, Inc. # All rights reserved. # Define reasonable base locations, to be overridden by default # Build intermediates go into TEMP_ROOT which defaults to # build/intermediates in current directory, or OBJROOT if defined TEMP_ROOT default = $(OBJROOT) ; # Builds go into the BUILD_ROOT which defaults to # build/products in current directory, or SYMROOT if defined BUILD_ROOT default = $(SYMROOT) ; # Installation root defaults to root, or DSTROOT if defined INSTALL_ROOT default = $(DSTROOT) ; # Set initial values for installation information and framework version __BUILD_PHASING default = YES ; export INSTALL_OWNER default = $(USER) ; export INSTALL_GROUP default = $(GROUP) ; export INSTALL_MODE_FLAG default = "a-w,a+rX" ; export FRAMEWORK_VERSION default = "A" ; STRIP_INSTALLED_PRODUCT default = YES ; REMOVE_CVS_FROM_RESOURCES default = YES ; COPY_PHASE_STRIP default = YES ; CLONE_HEADERS default = YES ; PREBINDING default = YES ; # Set initial optimization level, debug, and profile settings export OPTIMIZATION_LEVEL default = 0 ; export DEBUGGING_SYMBOLS default = YES ; export PROFILING_CODE default = NO ; # Default settings for Java builds JAVA_ARCHIVE_CLASSES default = YES ; JAVA_ARCHIVE_TYPE default = JAR ; JAVA_APP_STUB default = /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub ; JAVA_JAR_FLAGS default = cv ; JAVA_SOURCE_SUBDIR default = . ; JAVA_FRAMEWORK_RESOURCES_DIRS default = Resources ; export JAVA_FRAMEWORK_JARS default = ; JAVA_USE_DEPENDENCIES default = YES ; JAVA_ZIP_FLAGS default = -urg ; #JAVAC_SOURCE_FILE_ENCODING default = MacAutomatic ; This is now written out by PBXCore into the Jamfile. # BeginProduct # # Initializes the directory and file list variables # # Variable references: # BUILD_ROOT Base directory for builds # TARGET_NAME Name of the target that builds this product # PRODUCT_NAME Name of the product that's built # TEMP_ROOT Base directory for intermediates # BASE_PROJECT_HEADER_DIR Base directory for project headers # HEADER_SUBDIRECTORY Path prefix in header #include lines # INSTALL_ROOT Base directory for installations # INSTALL_PATH Subdirectory where product is installed # PUBLIC_HEADER_DIR Location for public headers # # Variables set: # HEADER_SUBDIRECTORY Base product name # BUILD_COMPONENTS List may include: headers, build, source # OPTIMIZATION_CFLAGS Optimization flags for C compiles # OTHER_CPLUSPLUSFLAGS C++ flags default to C values # WARNING_CPLUSPLUSFLAGS # INCLUDED_ARCHS Architectures intended for this build # NATIVE_ARCH Architecture of the build machine # ARCHS Architectures used for this build # ARCH_FLAGS Architecture flags used for most tools # SOURCE_DIR # BUILD_DIR Target-specific directory for builds # TEMP_DIR For target-specific intermediates # BASE_PROJECT_HEADER_DIR Location for header clone folders # PROJECT_HEADER_DIR Project header file directory in $(TEMP_DIR) # OBJECT_FILE_DIR Object file directory in $(TEMP_DIR) # CLASS_FILE_DIR Class file directory in $(TEMP_DIR) # FILE_LIST Base name for lists of files generated # DERIVED_FILE_DIR Derived source directory in $(TEMP_DIR) # INSTALL_DIR Directory in $(INSTALL_ROOT) for installations # HEADER_SEARCH_PATHS Project header directories prepended # FRAMEWORK_SEARCH_PATHS Product build root appended # DERIVED_FILES Initialized empty # OBJECT_FILES Initialized empty # LINKED_FILES Initialized empty # PRODUCT_FILES Initialized empty # PRECOMP_TRUSTFILE List of trusted precompiled headers # rule BeginProduct { # target representing the build must be a nonfile pseudotarget NOTFILE $(1) ; # define the header subdirectory early since we'll use it to # compute the project header directory HEADER_SUBDIRECTORY = $(1:B) ; # the following sequence of tests sets up CC, CPLUSPLUS, LD, and LDPLUSPLUS appropriately, # depending on whether we're using GCC 2.95.2 or GCC 3.x (either explicitly or implicitly) # hack to detect attempt to use GCC 3 by setting CC explicitly, and to set the 'USE_GCC3' # build setting if this is the case if ( $(CC) = "/usr/bin/gcc3" ) || ( $(CC) = "/usr/gcc3/bin/gcc" ) { USE_GCC3 default = YES ; } # if USE_GCC2 has not been explicitly set to YES, and if the default compiler (as detected # by pbxbuild) is GCC 3, we set USE_GCC3 to YES so the rest of the logic knows it can do # GCC 3 specific stuff if ( $(USE_GCC2) != YES ) && ( $(_DEFAULT_GCC_VERSION) != "" ) && ( $(_DEFAULT_GCC_VERSION) != "2.95.2" ) { USE_GCC3 default = YES ; } # set up CC, CPLUSPLUS, LD, and LDPLUSPLUS appropriately (this logic is temporary, and is # expected to be phased out once we have per-build-phase compiler choices) if $(USE_GCC3) = YES { if $(_GCC3_IS_IN_OFFICIAL_LOCATION) = YES { CC default = /usr/bin/gcc3 ; CPLUSPLUS default = /usr/bin/g++3 ; } else { CC default = /usr/gcc3/bin/gcc ; CPLUSPLUS default = /usr/gcc3/bin/g++ ; } # for GCC 3, we use -precomp support (as opposed to PFE support) by default for now USE_GCC3_PFE_SUPPORT default = NO ; } else if $(USE_GCC2) = YES { if $(_DEFAULT_GCC_VERSION) = "2.95.2" { CC default = /usr/bin/cc ; CPLUSPLUS default = /usr/bin/c++ ; } else { CC default = /usr/bin/gcc2 ; CPLUSPLUS default = /usr/bin/g++2 ; } } else { CC default = /usr/bin/cc ; CPLUSPLUS default = /usr/bin/c++ ; } LD default = $(CC) ; LDPLUSPLUS default = $(CPLUSPLUS) ; __LD_FOR_LINKING = $(LD) ; # this might get reset to $(LDPLUSPLUS) in the CompileCplusplus rule # default mapping of build actions to build variants switch $(ACTION) { case build : BUILD_COMPONENTS default = headers build ; case install : BUILD_COMPONENTS default = headers build ; case installhdrs : BUILD_COMPONENTS default = headers ; case installsrc : BUILD_COMPONENTS default = source ; } # Set reasonable optimization flags for installs if not already set OPTIMIZATION_CFLAGS default = -O ; # C++ options match C options by default OTHER_CPLUSPLUSFLAGS default = $(OTHER_CFLAGS) ; WARNING_CPLUSPLUSFLAGS default = $(WARNING_CFLAGS) ; # Set up architecture options for product INCLUDED_ARCHS default = $(SUPPORTED_ARCHITECTURES) ; SUPPORTED_ARCHITECTURE_FLAGS = ; ARCHS = ; if ! $(RC_ARCHS) { $(NATIVE_ARCH) = YES ; RC_$(NATIVE_ARCH) = YES ; } for SUPPORTED_ARCHITECTURE in $(SUPPORTED_ARCHITECTURES) { if $($(SUPPORTED_ARCHITECTURE)) = YES && ( $(SUPPORTED_ARCHITECTURE) in $(INCLUDED_ARCHS) ) && ( $(SUPPORTED_ARCHITECTURE) in $(VALID_ARCHS) ) { SUPPORTED_ARCHITECTURE_FLAGS += -arch $(SUPPORTED_ARCHITECTURE) ; ARCHS += $(SUPPORTED_ARCHITECTURE) ; } } ARCH_FLAGS default = $(SUPPORTED_ARCHITECTURE_FLAGS) ; # Initialize the directory variables SOURCE_DIR default = $(INSTALL_ROOT) ; export ACTIVE_BUILD_DIR default = $(BUILD_DIR) ; export PRODUCT_LINK_DIR default = $(BUILD_DIR) ; TEMP_DIR default = $(TEMP_ROOT)$(/)$(PROJECT_NAME).build/$(TARGET_NAME).build ; if $(CLONE_HEADERS) = YES { BASE_PROJECT_HEADER_DIR default = $(BUILD_DIR)$(/)ProjectHeaders ; if $(HEADER_SUBDIRECTORY) { PROJECT_HEADER_DIR default = $(BASE_PROJECT_HEADER_DIR)$(/)$(HEADER_SUBDIRECTORY) ; } else { PROJECT_HEADER_DIR default = $(BASE_PROJECT_HEADER_DIR) ; } } OBJECT_FILE_DIR default = $(TEMP_DIR)$(/)Objects ; export CLASS_FILE_DIR default = $(TEMP_DIR)$(/)JavaClasses ; if $(JAVA_ARCHIVE_CLASSES) != YES && ( $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library ) { export PRODUCT_CLASS_FILE_DIR default = $(BUILD_DIR)$(/)$(PRODUCT_NAME) ; } FILE_LIST default = $(OBJECT_FILE_DIR)$(/)LinkFileList ; DERIVED_FILE_DIR default = $(TEMP_DIR)$(/)DerivedSources ; if $(INSTALL_PATH) { INSTALL_DIR default = $(INSTALL_ROOT)$(/)$(INSTALL_PATH) ; } else { INSTALL_DIR default = $(INSTALL_ROOT) ; } # Initialize the search paths if $(CLONE_HEADERS) = YES { HEADER_SEARCH_PATHS = $(PROJECT_HEADER_DIR) $(BUILD_DIR)$(/)include $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS = $(BASE_PROJECT_HEADER_DIR) $(BUILD_ROOT) $(FRAMEWORK_SEARCH_PATHS) ; } else { HEADER_SEARCH_PATHS = $(BUILD_DIR)$(/)include $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS = $(BUILD_ROOT) $(FRAMEWORK_SEARCH_PATHS) ; } LIBRARY_SEARCH_PATHS = $(BUILD_ROOT) $(LIBRARY_SEARCH_PATHS) ; # Initialize the file lists DERIVED_FILES = ; OBJECT_FILES = ; LINKED_FILES = ; PRODUCT_FILES = ; PRECOMP_TRUSTFILE default = $(TEMP_DIR)$(/)TrustedPrecomps.txt ; # Run the hack script to build debug and profile variants, if appropriate. if $(BUILD_VARIANTS) && $(BLOCK_BUILD_VARIANTS) != YES && ( $(RC_JASPER) || $(BUILD_VARIANTS_ONLY_IN_JASPER) != YES ) && ( $(ACTION) = build || $(ACTION) = install ) { # VARIANT_HACK_TARGET = $(1:G=VariantHack) ; # NOTFILE $(VARIANT_HACK_TARGET) ; # DEPENDS $(1) : $(VARIANT_HACK_TARGET) ; RunVariantHackScript $(1) ; } } # EndProduct # # Creates BUILD_DIR, OBJECT_FILE_DIR, CLASS_FILE_DIR, DERIVED_FILE_DIR, # and the PROJECT_HEADER_DIR if necessary, then sets up the build action. rule EndProduct { # Create required directories. This is done here to allow # variables to be overridden before this rule is evaluated. Mkdir $(BUILD_DIR) ; UnlocatedProductFile $(BUILD_DIR) ; if $(CLONE_HEADERS) = YES && $(PROJECT_HEADER_DIR) { Mkdir $(PROJECT_HEADER_DIR) ; ProductFile $(PROJECT_HEADER_DIR) ; } Mkdir $(OBJECT_FILE_DIR) ; UnlocatedProductFile $(OBJECT_FILE_DIR) ; Mkdir $(CLASS_FILE_DIR) ; UnlocatedProductFile $(CLASS_FILE_DIR) ; Mkdir $(DERIVED_FILE_DIR) ; UnlocatedProductFile $(DERIVED_FILE_DIR) ; # Basic definitions in place, define actions for this target Actions $(1) ; } # BeginWrappedProduct # # Sets additional variables required for wrapped products, # primarily to assign locations within the product wrapper. # WRAPPER Local convenience variable # WRAPPER_SUFFIX Based on WRAPPER_EXTENSION by default # RESOURCE_DIR Base bundle resources location # APPLESCRIPTS_DIR Compiled AppleScript files folder # [PUBLIC|PRIVATE]_HEADER_[CLONE_][DIR|LINK|LINK_PATH] Header folders # WRAPPER_CLONE_DIR Base location for header clone framework # CURRENT_VERSION[_CLONE]_[DIR|LINK|LINK_PATH] # HEADERDOC_DIR Headerdoc output folder # PRODUCT_CLASS_FILE_DIR Defined if JAVA_ARCHIVE_CLASSES is set # rule BeginWrappedProduct { # set up the basic product variables BeginProduct $(1) ; # define wrapper using appropriate extension and suffix local WRAPPER = $(1:G=) ; if $(WRAPPER_EXTENSION) { WRAPPER_SUFFIX = .$(WRAPPER_EXTENSION) ; } if $(WRAPPER_SUFFIX) { WRAPPER = $(WRAPPER:S=$(WRAPPER_SUFFIX)) ; } # make wrapper explicitly LOCATE on $(WRAPPER) = $(BUILD_DIR) ; Mkdir $(WRAPPER) ; # ProductFile $(WRAPPER) ; DEPENDS $(1) : $(WRAPPER) ; if $(PRODUCT_TYPE) = Application { # Application wrappers if $(PURE_JAVA) = YES { RESOURCE_DIR default = $(WRAPPER) ; } else { RESOURCE_DIR default = $(WRAPPER)$(/)Contents$(/)Resources ; } LOCATE on $(RESOURCE_DIR) = $(BUILD_DIR) ; RESOURCE_LINK = "" ; APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ; LOCATE on $(APPLESCRIPTS_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)Headers ; LOCATE on $(PUBLIC_HEADER_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_LINK default = "" ; PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_DIR) = $(BUILD_DIR) ; PRIVATE_HEADER_LINK default = "" ; CURRENT_VERSION_DIR default = "" ; CURRENT_VERSION_LINK default = "" ; if $(CLONE_HEADERS) = YES { WRAPPER_CLONE_DIR = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER) ; PUBLIC_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)"Contents"$(/)Headers ; LOCATE on $(PUBLIC_HEADER_CLONE_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_CLONE_LINK default = "" ; PRIVATE_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)"Contents"$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_CLONE_DIR) = $(BUILD_DIR) ; PRIVATE_HEADER_CLONE_LINK default = "" ; CURRENT_VERSION_CLONE_DIR default = "" ; CURRENT_VERSION_CLONE_LINK default = "" ; } } # application wrappers else if $(PRODUCT_TYPE) = Framework { # Framework wrappers RESOURCE_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Resources ; LOCATE on $(RESOURCE_DIR) = $(BUILD_DIR) ; RESOURCE_LINK default = $(WRAPPER)$(/)Resources ; LOCATE on $(RESOURCE_LINK) = $(BUILD_DIR) ; RESOURCE_LINK_PATH default = Versions$(/)Current$(/)Resources ; APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ; LOCATE on $(APPLESCRIPTS_DIR) = $(BUILD_DIR) ; HAS_PUBLIC_HEADERS = "NO" ; PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Headers ; LOCATE on $(PUBLIC_HEADER_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_LINK default = $(WRAPPER)$(/)Headers ; LOCATE on $(PUBLIC_HEADER_LINK) = $(BUILD_DIR) ; PUBLIC_HEADER_LINK_PATH default = Versions$(/)Current$(/)Headers ; PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_DIR) = $(BUILD_DIR) ; PRIVATE_HEADER_LINK default = $(WRAPPER)$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_LINK) = $(BUILD_DIR) ; PRIVATE_HEADER_LINK_PATH default = Versions$(/)Current$(/)PrivateHeaders ; CURRENT_VERSION_DIR default = $(WRAPPER:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION) ; LOCATE on $(CURRENT_VERSION_DIR) = $(BUILD_DIR) ; CURRENT_VERSION_LINK default = $(WRAPPER:G=)$(/)Versions$(/)Current ; LOCATE on $(CURRENT_VERSION_LINK) = $(BUILD_DIR) ; CURRENT_VERSION_LINK_PATH default = Versions$(/)Current ; if $(CLONE_HEADERS) = YES { WRAPPER_CLONE_DIR = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER) ; PUBLIC_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Headers ; LOCATE on $(PUBLIC_HEADER_CLONE_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_CLONE_LINK default = $(WRAPPER_CLONE_DIR)$(/)Headers ; LOCATE on $(PUBLIC_HEADER_CLONE_LINK) = $(BUILD_DIR) ; PUBLIC_HEADER_CLONE_LINK_PATH default = Versions$(/)Current$(/)Headers ; PRIVATE_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_CLONE_DIR) = $(BUILD_DIR) ; PRIVATE_HEADER_CLONE_LINK default = $(WRAPPER_CLONE_DIR)$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_CLONE_LINK) = $(BUILD_DIR) ; PRIVATE_HEADER_CLONE_LINK_PATH default = Versions$(/)Current$(/)PrivateHeaders ; CURRENT_VERSION_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)Versions$(/)$(FRAMEWORK_VERSION) ; LOCATE on $(CURRENT_VERSION_CLONE_DIR) = $(BUILD_DIR) ; CURRENT_VERSION_CLONE_LINK default = $(WRAPPER_CLONE_DIR)$(/)Versions$(/)Current ; LOCATE on $(CURRENT_VERSION_CLONE_LINK) = $(BUILD_DIR) ; CURRENT_VERSION_CLONE_LINK_PATH default = Versions$(/)Current ; } # Create current version directory and link now because # they are implicit and needed by almost everything else: # Current version dir Mkdir $(CURRENT_VERSION_DIR) ; ProductFile $(CURRENT_VERSION_DIR) ; DEPENDS $(1) : $(CURRENT_VERSION_DIR) ; NOUPDATE $(CURRENT_VERSION_DIR) ; # Current version link SymLink $(CURRENT_VERSION_LINK) : $(FRAMEWORK_VERSION) ; ProductFile $(CURRENT_VERSION_LINK) ; DEPENDS $(CURRENT_VERSION_LINK) : $(CURRENT_VERSION_DIR) ; DEPENDS $(1) : $(CURRENT_VERSION_LINK) ; NOUPDATE $(CURRENT_VERSION_LINK) ; if $(CLONE_HEADERS) = YES { Mkdir $(CURRENT_VERSION_CLONE_DIR) ; ProductFile $(CURRENT_VERSION_CLONE_DIR) ; DEPENDS $(1) : $(CURRENT_VERSION_CLONE_DIR) ; NOUPDATE $(CURRENT_VERSION_CLONE_DIR) ; # Current version link SymLink $(CURRENT_VERSION_CLONE_LINK) : $(FRAMEWORK_VERSION) ; ProductFile $(CURRENT_VERSION_CLONE_LINK) ; DEPENDS $(1) : $(CURRENT_VERSION_CLONE_LINK) ; DEPENDS $(CURRENT_VERSION_CLONE_LINK) : $(CURRENT_VERSION_CLONE_DIR) ; NOUPDATE $(CURRENT_VERSION_CLONE_LINK) ; # Make sure someone depends on the clone current symlink so it will get created. DEPENDS $(PUBLIC_HEADER_CLONE_LINK) : $(CURRENT_VERSION_CLONE_LINK) ; DEPENDS $(PRIVATE_HEADER_CLONE_LINK) : $(CURRENT_VERSION_CLONE_LINK) ; } } # framework wrappers else { # Default bundle wrappers RESOURCE_DIR default = $(WRAPPER)$(/)"Contents"$(/)Resources ; LOCATE on $(RESOURCE_DIR) = $(BUILD_DIR) ; RESOURCE_LINK default = "" ; APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ; LOCATE on $(APPLESCRIPTS_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)Headers ; LOCATE on $(PUBLIC_HEADER_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_LINK default = "" ; PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_DIR) = $(BUILD_DIR) ; PRIVATE_HEADER_LINK default = "" ; CURRENT_VERSION_DIR default = "" ; CURRENT_VERSION_LINK default = "" ; if $(CLONE_HEADERS) = YES { WRAPPER_CLONE_DIR = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER) ; PUBLIC_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)"Contents"$(/)Headers ; LOCATE on $(PUBLIC_HEADER_CLONE_DIR) = $(BUILD_DIR) ; PUBLIC_HEADER_CLONE_LINK default = "" ; PRIVATE_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)"Contents"$(/)PrivateHeaders ; LOCATE on $(PRIVATE_HEADER_CLONE_DIR) = $(BUILD_DIR) ; PRIVATE_HEADER_CLONE_LINK default = "" ; CURRENT_VERSION_CLONE_DIR default = "" ; CURRENT_VERSION_CLONE_LINK default = "" ; } } # all bundle layouts # define location for optional header documentation generation if $(GENERATE_HEADERDOC) = YES && $(RESOURCE_DIR) { HEADERDOC_DIR default = $(BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Documentation ; Mkdir $(HEADERDOC_DIR) ; ProductFile $(HEADERDOC_DIR) ; } # wrapped products may define a location for unarchived classes if $(JAVA_ARCHIVE_CLASSES) != YES { export PRODUCT_CLASS_FILE_DIR default = $(BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Java ; } } # EndWrappedProduct # # Sets up additional dependence related to object files. # Files depended on by object files should be in compile rules, # and dependence on object files should be in link rules. rule EndWrappedProduct { if $(OBJECT_FILES) { if $(INNER_PRODUCT) { DEPENDS $(INNER_PRODUCT) : $(OBJECT_FILES) ; } if $(PUBLIC_HEADER_DIR) && $(HAS_PUBLIC_HEADERS) = YES { DEPENDS $(OBJECT_FILES) : $(PUBLIC_HEADER_DIR) ; } if $(PUBLIC_HEADER_LINK) && $(HAS_PUBLIC_HEADERS) = YES { DEPENDS $(OBJECT_FILES) : $(PUBLIC_HEADER_LINK) ; } if $(PRIVATE_HEADER_DIR) && $(HAS_PRIVATE_HEADERS) = YES { DEPENDS $(OBJECT_FILES) : $(PRIVATE_HEADER_DIR) ; } if $(PRIVATE_HEADER_LINK) && $(HAS_PRIVATE_HEADERS) = YES { DEPENDS $(OBJECT_FILES) : $(PRIVATE_HEADER_LINK) ; } if $(CURRENT_VERSION_DIR) { DEPENDS $(OBJECT_FILES) : $(CURRENT_VERSION_DIR) ; } if $(CURRENT_VERSION_LINK) { DEPENDS $(OBJECT_FILES) : $(CURRENT_VERSION_LINK) ; } } # wrapper touch updates base container directory timestamp WRAPPER_TOUCH = $(1:G=Touch) ; LOCATE on $(WRAPPER_TOUCH) = $(BUILD_DIR) ; DEPENDS $(WRAPPER_TOUCH) : $(BUILD_PHASE) ; DEPENDS $(1) : $(WRAPPER_TOUCH) ; Touch $(WRAPPER_TOUCH) ; # wrapper logic complete, now handle final build issues EndProduct $(1) ; } # Copyright (c) 1999,2000,2001 Apple Computer, Inc. # All rights reserved. # Rules for target types include Begin and End rules # for Tool, Library, Bundle, Application, and Framework TOOL_SUFFIX default = "" ; rule BeginTool { export PRODUCT_TYPE = Tool ; BeginProduct $(1) ; } rule EndTool { EndProduct $(1) ; } # Library variable names have the form: $(OS)_$(LIBRARY_STYLE)_LIBRARY_$(VARIABLENAME) MACOS_STATIC_LIBRARY_PREFIX = lib ; MACOS_STATIC_LIBRARY_SUFFIX = .a ; MACOS_DYNAMIC_LIBRARY_PREFIX = "" ; MACOS_DYNAMIC_LIBRARY_SUFFIX = "" ; DARWIN_STATIC_LIBRARY_PREFIX = lib ; DARWIN_STATIC_LIBRARY_SUFFIX = .a ; DARWIN_DYNAMIC_LIBRARY_PREFIX = "" ; DARWIN_DYNAMIC_LIBRARY_SUFFIX = "" ; DYNAMIC_LIBRARY_PREFIX = $($(OS)_DYNAMIC_LIBRARY_PREFIX) ; DYNAMIC_LIBRARY_SUFFIX = $($(OS)_DYNAMIC_LIBRARY_SUFFIX) ; rule BeginLibrary { # These evaluations here to pick up style from target settings LIBRARY_PREFIX = $($(OS)_$(LIBRARY_STYLE)_LIBRARY_PREFIX) ; LIBRARY_SUFFIX = $($(OS)_$(LIBRARY_STYLE)_LIBRARY_SUFFIX) ; export PRODUCT_TYPE = Library ; BeginProduct $(1) ; } rule EndLibrary { EndProduct $(1) ; } rule BeginBundle { export PRODUCT_TYPE = Bundle ; BeginWrappedProduct $(1) ; } rule EndBundle { EndWrappedProduct $(1) ; } rule BeginApplication { export PRODUCT_TYPE = Application ; BeginWrappedProduct $(1) ; } rule EndApplication { EndWrappedProduct $(1) ; } rule BeginFramework { export PRODUCT_TYPE = Framework ; BeginWrappedProduct $(1) ; } rule EndFramework { EndWrappedProduct $(1) ; } # Copyright (c) 1999,2000,2001 Apple Computer, Inc. # All rights reserved. # Variables referenced: # BUILD_DIR Location of built product # RESOURCE_DIR Directory for resource files in product # *_LINK, *_LINK_PATH Wrapper versioning information # *_HEADER_DIR Directories for headers of product # _INFO_PLIST_FILE_PATH Path to Info.plist file (if any), generated by PBXCore # _PKGINFO_FILE_PATH Path to PkgInfo file (if any), generated by PBXCore # _VERSION_PLIST_FILE_PATH Path to version.plist file (if any), generated by PBXCore # _PBDEVELOPMENT_PLIST_FILE_PATH Path to pbdevelopment.plist file (if any), generated by PBXCore # VERSIONING_SYSTEM Versioning system to use for product # JAVA_COMPILE_TARGET Nonfile target representing all java compiles # REZ_EXECUTABLE Run Rez directly on executable to produce fork if YES # PRESERVE_RESOURCES Files to be recopied with CpMac after install tar copy # APPLESCRIPTS_DIR Directory for compiled AppleScripts # # Variables set: # DERIVED_FILES Intermediate sources # OBJECT_FILES Object files produced by compilations # LINKED_FILES Files to be used by a link rule # PRODUCT_FILES Files that belong in the built product # INFO_PLIST_FILE Info.plist file in product wrapper, copied from _INFO_PLIST_FILE_PATH # PKGINFO_FILE PkgInfo file in product wrapper, copied from _PKGINFO_FILE_PATH # HDRRULE, HDRSCAN Target specific header scanning information # FLAGS Target specific compilation flags # HEADER_SEARCH_PATHS, FRAMEWORK_SEARCH_PATHS Target specific search paths # # Build phase variables: # BUILD_PHASE Target for current build phase # PREVIOUS_BUILD_PHASE Target for previous build phase # BUILD_PHASE_PRODUCTS Products of current build phase # PHASE_TARGETS List of all phase targets for conflict checks # Source and resource handling rules by extension .h_RULE = ProcessHeader ; .nib_RULE = ProcessResource ; .rtf_RULE = ProcessResource ; .exe_RULE = ProcessResource ; .java_RULE = ProcessUsingJavaCompiler ; .applescript_RULE = ProcessAppleScript ; .s_RULE = ProcessC ; .c_RULE = ProcessC ; .C_RULE = ProcessCplusplus ; .cc_RULE = ProcessCplusplus ; .cp_RULE = ProcessCplusplus ; .cpp_RULE = ProcessCplusplus ; .CPP_RULE = ProcessCplusplus ; .cxx_RULE = ProcessCplusplus ; .CXX_RULE = ProcessCplusplus ; .m_RULE = ProcessC ; .mm_RULE = ProcessCplusplus ; .M_RULE = ProcessCplusplus ; .exp_RULE = ProcessExportsFile ; .defs_RULE = ProcessUsingMig ; .mig_RULE = ProcessUsingMig ; .l_RULE = ProcessUsingLex ; .lm_RULE = ProcessUsingLex ; .LM_RULE = ProcessUsingLex ; .lmm_RULE = ProcessUsingLex ; .lpp_RULE = ProcessUsingLex ; .LPP_RULE = ProcessUsingLex ; .lxx_RULE = ProcessUsingLex ; .LXX_RULE = ProcessUsingLex ; .y_RULE = ProcessUsingYacc ; .ym_RULE = ProcessUsingYacc ; .YM_RULE = ProcessUsingYacc ; .ymm_RULE = ProcessUsingYacc ; .ypp_RULE = ProcessUsingYacc ; .YPP_RULE = ProcessUsingYacc ; .yxx_RULE = ProcessUsingYacc ; .YXX_RULE = ProcessUsingYacc ; .x_RULE = ProcessUsingRPCGen ; .jobs_RULE = ProcessUsingBridget ; .framework_RULE = ProcessFrameworkOrLibrary ; .r_RULE = ProcessRezFile ; .rsrc_RULE = ProcessRezFile ; .RSRC_RULE = ProcessRezFile ; .ppob_RULE = ProcessRezFile ; # Set the initial list of phase targets to empty PHASE_TARGETS = ; # PhaseTarget # Sets up the given phase target variable based on the target # and phase name and uses the list of phase targets to attempt # avoid collisions between targets for phases with the same name. rule PhaseTarget { local PHASE_SUFFIXES = 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 ; local PHASE_TARGET = $(2:G=$(3)) ; if $(PHASE_TARGET) in $(PHASE_TARGETS) { # attempt differentiation by adding last nonmatching suffix for PHASE_SUFFIX in $(PHASE_SUFFIXES) { ALTERNATE_PHASE_TARGET = $(2:G=$(3)$(PHASE_SUFFIX)) ; if ! $(ALTERNATE_PHASE_TARGET) in $(PHASE_TARGETS) { PHASE_TARGET = $(ALTERNATE_PHASE_TARGET) ; } } } PHASE_TARGETS += $(PHASE_TARGET) ; $(1) = $(PHASE_TARGET) ; NOTFILE $(PHASE_TARGET) ; } # BuildPhase # Set up product (and variant hack) dependence on phase # and phase dependence on previous phase # and defines an action to indicate phase completion rule BuildPhase { # retain name for action echo PHASE_NAME on $(1) = $(1:G) ; # this build phase depends on the previous phase if $(3) { DEPENDS $(1) : $(3) ; } # phase required for parent target DEPENDS $(2) : $(1) ; # all phase required for variant hack # but currently the variant hack is only defined locally # if $(VARIANT_HACK_TARGET) { # DEPENDS $(VARIANT_HACK_TARGET) : $(2) ; # } } actions BuildPhase { $(ECHO) Completed phase "$(PHASE_NAME)" for "$(1)" } # DerivedFiles # Locates derived files in the derived file directory, # sees the derived paths with the derived file directory if necessary, # creates derived subpaths and ads them to derived paths as necessary, # and makes the derived file depend on all derived paths. rule DerivedFiles { local DERIVED_FILE ; for DERIVED_FILE in $(1) { # record any derived headers if $(DERIVED_FILE:S) = ".h" { DERIVED_HEADERS += $(DERIVED_FILE) ; } # derived file is a build phase product if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(DERIVED_FILE) ; } # make and depend on containing directory LOCATE on $(DERIVED_FILE) = $(DERIVED_FILE_DIR) ; if ! $(DERIVED_PATHS) { DERIVED_PATHS = $(DERIVED_FILE_DIR) ; } if $(DERIVED_FILE:D) != "" { local DIR = $(DERIVED_FILE_DIR)$(/)$(DERIVED_FILE:D) ; if ! ( $(DIR) in $(DERIVED_PATHS) ) { Mkdir $(DIR) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(DIR) ; } DERIVED_PATHS += $(DIR) ; } } DEPENDS $(DERIVED_FILE) : $(DERIVED_PATHS) ; } } # UnlocatedProductFile # If the product is not already in the list of products files, # then it is added. If build phasing is enabled (which it is # by default), the product file is also added to the list of # build phase products. The LOCATE of the product file is not # affected in any way. rule UnlocatedProductFile { if ! $(1) in $(PRODUCT_FILES) { PRODUCT_FILES += $(1) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(1) ; } if $(1) != $(BUILD_DIR) { DEPENDS $(1) : $(BUILD_DIR) ; } } } # ProductFile # If the product is not already in the list of products files, # then it is added. If build phasing is enabled (which it is # by default), the product file is also added to the list of # build phase products. The LOCATE of the product is set to # the BUILD_DIR (the products directory). rule ProductFile { LOCATE on $(1) = $(BUILD_DIR) ; UnlocatedProductFile $(1) ; } rule NoOp { if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : NoOp ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } # ProcessHeaders # # Process individual headers, call Interfacer to generate headers, # precompile and assemble implicitly included headers as necessary, # and run headerdoc. rule ProcessHeaders { if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : CopyHeaders ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } if ( headers in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) ) && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) { local FILE ; for FILE in $(2) { if $(__BUILD_PHASING) = YES { ProcessHeader $(BUILD_PHASE) : $(FILE) ; } else { ProcessHeader $(1) : $(FILE) ; } } # conditionally gather documentation generated from headers if build in $(BUILD_COMPONENTS) && $(GATHERHEADERDOC) && $(GENERATE_HEADERDOC) = YES && $(HEADERDOC_DIR) && HEADERDOC_TARGETS { GATHERED_HEADERDOC_TARGET = masterTOC.html ; LOCATE on $(GATHERED_HEADERDOC_TARGET) = $(HEADERDOC_DIR) ; DEPENDS $(GATHERED_HEADERDOC_TARGET) : $(HEADERDOC_DIR) ; DEPENDS $(GATHERED_HEADERDOC_TARGET) : $(HEADERDOC_TARGETS) ; GatheredHeaderDoc $(GATHERED_HEADERDOC_TARGET) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(GATHERED_HEADERDOC_TARGET) ; } } } # generate interfacer derived headers if headers in $(BUILD_COMPONENTS) && $(GENERATE_HEADERS) = YES { InterfacerHeaders $(1) ; } # :mferris:20011107 Only do IMPLICITLY_INCLUDED_HEADERS business if we are actually building. No need to do this for installhdrs, and currently, we cannot handle the precompiling aspect of this during installhdrs. If we ever support building framework precomps (ie if we ever have to invoke the compiler during installhdrs), this needs to be revisited. if ( build in $(BUILD_COMPONENTS) ) && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) { # if we have a prefix file, and if we're supposed to precompile it, we do so using either GCC 3's PFE mechanism or using cpp-precomp if ( $(PREFIX_HEADER) != "" && $(PRECOMPILE_PREFIX_HEADER) = YES ) { PFE_FILE_C_DIALECTS default = "c" "objective-c" "c++" "objective-c++" ; PRECOMP_DESTINATION_DIR default = $(TEMP_DIR)$(/)ImplicitHeaders ; Mkdir $(PRECOMP_DESTINATION_DIR) ; UnlocatedProductFile $(PRECOMP_DESTINATION_DIR) ; if $(USE_GCC3_PFE_SUPPORT) = YES { # We need to precompile the prefix file, and we're using GCC 3. This means that we need to make two PFE files (one for C, one for C++). The "effective prefix file" is set to nothing, since we won't be passing a -include directive. if ( "c" in $(PFE_FILE_C_DIALECTS) ) { C_PFE_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS=".pfe") ; MakePFEFile $(C_PFE_FILE_DESTINATION_PATH) : $(PREFIX_HEADER) ; UnlocatedProductFile $(C_PFE_FILE_DESTINATION_PATH) ; } if ( "objective-c" in $(PFE_FILE_C_DIALECTS) ) { OBJC_PFE_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS=".objpfe") ; MakePFEFile $(OBJC_PFE_FILE_DESTINATION_PATH) : $(PREFIX_HEADER) ; UnlocatedProductFile $(OBJC_PFE_FILE_DESTINATION_PATH) ; } if ( "c++" in $(PFE_FILE_C_DIALECTS) ) { CPLUSPLUS_PFE_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS=".pfe++") ; MakePFEFile $(CPLUSPLUS_PFE_FILE_DESTINATION_PATH) : $(PREFIX_HEADER) ; UnlocatedProductFile $(CPLUSPLUS_PFE_FILE_DESTINATION_PATH) ; } if ( "objective-c++" in $(PFE_FILE_C_DIALECTS) ) { OBJCPLUSPLUS_PFE_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS=".objpfe++") ; MakePFEFile $(OBJCPLUSPLUS_PFE_FILE_DESTINATION_PATH) : $(PREFIX_HEADER) ; UnlocatedProductFile $(OBJCPLUSPLUS_PFE_FILE_DESTINATION_PATH) ; } EFFECTIVE_PREFIX_HEADER = ; # because with a PFE file, we don't actually pass a -include argument } else { # We need to precompile the prefix file, and we're not using GCC 3. This means that we create a header stub in a special directory under the TEMP_DIR, precompile that for both C and C++, and then pass the prefix file in the -include. The "effective prefix file" is set to the prefix file stub. local PREFIX_HEADER_STUB = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS) ; DEPENDS $(PREFIX_HEADER_STUB) : $(PRECOMP_DESTINATION_DIR) ; AbsolutePathImportStub $(PREFIX_HEADER_STUB) : $(PREFIX_HEADER) ; INCLUDES $(PREFIX_HEADER_STUB) : $(PREFIX_HEADER) ; if ( "c" in $(PFE_FILE_C_DIALECTS) ) || ( "objective-c" in $(PFE_FILE_C_DIALECTS) ) { C_PRECOMP_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER_STUB:BS=".p") ; PrecompileHeader $(C_PRECOMP_FILE_DESTINATION_PATH) : $(PREFIX_HEADER_STUB) ; UnlocatedProductFile $(C_PRECOMP_FILE_DESTINATION_PATH) ; } if ( "c++" in $(PFE_FILE_C_DIALECTS) ) || ( "objective-c++" in $(PFE_FILE_C_DIALECTS) ) { CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER_STUB:BS=".pp") ; PrecompileHeader $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) : $(PREFIX_HEADER_STUB) ; UnlocatedProductFile $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) ; } EFFECTIVE_PREFIX_HEADER = $(PREFIX_HEADER_STUB) ; } } else { EFFECTIVE_PREFIX_HEADER = $(PREFIX_HEADER) ; } } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } # CreateMasterImplicitHeader rule CreateMasterImplicitHeader { # Creation of this header depends on all the header copies for HEADER_COPY in $(IMPLICITLY_INCLUDED_HEADER_COPIES) { DEPENDS $(1) : $(HEADER_COPY) ; } # Master implicit header depends on destination dir DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ; } actions CreateMasterImplicitHeader { $(RM) -f "$(1)" $(TOUCH) "$(1)" $(ECHO) "/* Generated master implicit inclusion header */" >> "$(1)" for header in "$(IMPLICITLY_INCLUDED_HEADER_COPIES)" do $(ECHO) "#include \"$header\"" >> "$(1)" done } # ProcessHeader
# # Clone header and generate headerdoc from header as necessary, # and copy header to subfolders of product as appropriate. rule ProcessHeader { if source in $(BUILD_COMPONENTS) { local HEADER_SOURCE_COPY ; local HEADER_SOURCE_DIR ; # make directory first if necessary if $(2:D) { HEADER_SOURCE_DIR = $(SOURCE_DIR)/$(2:D:G=) ; Mkdir $(HEADER_SOURCE_DIR) ; HEADER_SOURCE_COPY = $(HEADER_SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(HEADER_SOURCE_COPY) : $(HEADER_SOURCE_DIR) ; } else { HEADER_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(HEADER_SOURCE_COPY) : $(SOURCE_DIR) ; Mkdir $(SOURCE_DIR) ; } Cp $(HEADER_SOURCE_COPY) : $(2) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(HEADER_SOURCE_COPY) ; } } if build in $(BUILD_COMPONENTS) { # Scan this header to see if it includes other headers. if $(ENABLE_HEADER_SCANNING) != NO && $(INDEX_BASED_HEADER_DEPENDENCIES) != YES { HDRRULE on $(2) = ProcessC.HdrRule ; HDRSCAN on $(2) = $(HDRPATTERN) ; } # Set search path for header so dependence analysis will find it SEARCH on $(2:D=) += $(2:D) ; # Clone header to project header directory unless it was derived if ! $(2) in $(DERIVED_HEADERS) && $(CLONE_HEADERS) = YES { CloneHeader $(1) : $(2) : $(PROJECT_HEADER_DIR) ; } # conditionally generate documentation from headers if $(GENERATE_HEADERDOC) = YES && $(HEADERDOC_DIR) { HEADERDOC_TARGET = $(2:B)$(/)toc.html ; LOCATE on $(HEADERDOC_TARGET) = $(HEADERDOC_DIR) ; HeaderDoc $(HEADERDOC_TARGET) : $(2) ; DEPENDS $(HEADERDOC_TARGET) : $(HEADERDOC_DIR) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(HEADERDOC_TARGET) ; } HEADERDOC_TARGETS += $(HEADERDOC_TARGET) ; } } local ATTRIBUTES = $($(2)_ATTRIBUTES) ; local HEADER_ATTRIBUTE ; for HEADER_ATTRIBUTE in $(ATTRIBUTES) { switch $(HEADER_ATTRIBUTE) { case Project : # Define option as valid, but take no action case Public : HAS_PUBLIC_HEADERS = YES ; # Create a public header directory if ! $(PUBLIC_HEADER_DIR) in $(PRODUCT_FILES) { Mkdir $(PUBLIC_HEADER_DIR) ; ProductFile $(PUBLIC_HEADER_DIR) ; } # Create symlink to public header dir in versioned frameworks if $(PUBLIC_HEADER_LINK) && ! $(PUBLIC_HEADER_LINK) in $(PRODUCT_FILES) { SymLink $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ; DEPENDS $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_DIR) ; ProductFile $(PUBLIC_HEADER_LINK) ; NOUPDATE $(PUBLIC_HEADER_LINK) ; } # Public headers get stub "clones" put in the public header dir if build in $(BUILD_COMPONENTS) && $(CLONE_HEADERS) = YES { CloneHeader $(1) : $(2) : $(PUBLIC_HEADER_CLONE_DIR) ; } if headers in $(BUILD_COMPONENTS) { if $(PUBLIC_HEADER_DIR) { local HEADER_COPY = $(PUBLIC_HEADER_DIR)$(/)$(2:BS:G=) ; Cp $(HEADER_COPY) : $(2) ; ProductFile $(HEADER_COPY) ; } else { ECHO warning: public header $(2) ignored because PUBLIC_HEADER_DIR has no value ; } } case Private : HAS_PRIVATE_HEADERS = YES ; # create a private header directory if ! $(PRIVATE_HEADER_DIR) in $(PRODUCT_FILES) { Mkdir $(PRIVATE_HEADER_DIR) ; ProductFile $(PRIVATE_HEADER_DIR) ; } # accompanying link in versioned frameworks if $(PRIVATE_HEADER_LINK) && ! $(PRIVATE_HEADER_LINK) in $(PRODUCT_FILES) { SymLink $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ; DEPENDS $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_DIR) ; ProductFile $(PRIVATE_HEADER_LINK) ; NOUPDATE $(PRIVATE_HEADER_LINK) ; } # Private headers get stub "clones" put in private header dir if build in $(BUILD_COMPONENTS) && $(CLONE_HEADERS) = YES { CloneHeader $(1) : $(2) : $(PRIVATE_HEADER_CLONE_DIR) ; } if headers in $(BUILD_COMPONENTS) { if $(PRIVATE_HEADER_DIR) { local HEADER_COPY = $(PRIVATE_HEADER_DIR)$(/)$(2:BS:G=) ; Cp $(HEADER_COPY) : $(2) ; ProductFile $(HEADER_COPY) ; } else { ECHO warning: private header $(2) ignored because PRIVATE_HEADER_DIR has no value ; } } case * : if $(HEADER_ATTRIBUTE) != AbsolutePath { ECHO jam: warning: Ignoring unknown header attribute $(HEADER_ATTRIBUTE) ; } } } } rule PrecompileHeader { DEPENDS $(1) : $(2) ; if $(KERNEL_MODULE) = YES { local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ; local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ; local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd ; local KERNEL_COMPILE_OPTIONS = -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ; if $(ARCH) in ppc { KERNEL_COMPILE_OPTIONS += -mlong-branch ; } local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ; FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) $(OTHER_CFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ; GLOBAL_CFLAGS on $(1) = ; } else { FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ; # We must compile with the extension-specific build flags FLAGS on $(1) += $(OTHER_CFLAGS) ; } FLAGS on $(1) += -pipe ; # seed search paths with target-wide values HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ; # extension-specific build flags FLAGS on $(1) += $($(2:S)_CFLAGS) ; # Add debug flags, if appropriate. if $(DEBUGGING_SYMBOLS) = YES { FLAGS on $(1) += -g ; } # Add profiling flags, if appropriate. if $(PROFILING_CODE) = YES { FLAGS on $(1) += -pg ; } if $(OS) in MACOS DARWIN { FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ; } if $(CPP_HEADERMAP_FILE) { FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ; } if $(1:S) = .pp { # Hack: gcc3 doesn't support Objective-C++ yet (as of dec 10 2001) if $(USE_GCC3) = YES { FLAGS on $(1) += -x c++ ; } else { FLAGS on $(1) += -x objective-c++ ; } } if YES in $(GENERATE_CPP_ILOG_FILES) { local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)$(/)$(ARCH)$(/)$(2:DB).ilog ; FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ; } Mkdir $(PRECOMP_DESTINATION_DIR) ; DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ; SEARCH on $(2) = $(SOURCE_ROOT) ; } actions PrecompileHeader { $(CC) -precomp -o "$(1)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(HEADER_SEARCH_PATHS)" $(ARCH_FLAGS) "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "-I$(SOURCE_ROOT)" "$(PREFIX_HEADER_CFLAGS)" "$(OTHER_PRECOMP_CFLAGS)" "$(2)" } rule MakePFEFile { DEPENDS $(1) : $(2) ; if $(KERNEL_MODULE) = YES { local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ; local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ; local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd ; local KERNEL_COMPILE_OPTIONS = -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ; if $(ARCH) in ppc { KERNEL_COMPILE_OPTIONS += -mlong-branch ; } local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ; FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) $(OTHER_CFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ; GLOBAL_CFLAGS on $(1) = ; } else { FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ; # We must compile with the extension-specific build flags FLAGS on $(1) += $(OTHER_CFLAGS) ; } FLAGS on $(1) += -pipe ; # seed search paths with target-wide values HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ; # extension-specific build flags FLAGS on $(1) += $($(2:S)_CFLAGS) ; # Add debug flags, if appropriate. if $(DEBUGGING_SYMBOLS) = YES { FLAGS on $(1) += -g ; } # Add profiling flags, if appropriate. if $(PROFILING_CODE) = YES { FLAGS on $(1) += -pg ; } if $(OS) in MACOS DARWIN { FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ; } if $(CPP_HEADERMAP_FILE) { FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ; } if $(1:S) = ".pfe" { FLAGS on $(1) += -x c ; } else if $(1:S) = ".objpfe" { FLAGS on $(1) += -x objective-c ; } else if $(1:S) = ".pfe++" { FLAGS on $(1) += -x c++ ; } else if $(1:S) = ".objpfe++" { FLAGS on $(1) += -x objective-c++ ; } if YES in $(GENERATE_CPP_ILOG_FILES) { local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)$(/)$(ARCH)$(/)$(2:DB).ilog ; FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ; } Mkdir $(PRECOMP_DESTINATION_DIR) ; DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ; SEARCH on $(2) = $(SOURCE_ROOT) ; } actions MakePFEFile { $(CC) -c --dump-pch "$(1)" "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(HEADER_SEARCH_PATHS)" "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "-I$(SOURCE_ROOT)" "$(PREFIX_HEADER_CFLAGS)" "$(OTHER_PRECOMP_CFLAGS)" "$(2)" } # ProcessResources # # Process individual resource files, copy property list settings file, # and write the package info file if appropriate. rule ProcessResources { if ( build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) ) && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) { local FILE ; if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : CopyResources ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } for FILE in $(2) { if $(__BUILD_PHASING) = YES { ProcessResource $(BUILD_PHASE) : $(FILE) ; } else { ProcessResource $(1) : $(FILE) ; } } # product settings, version settings, and package info written only during build if build in $(BUILD_COMPONENTS) { # product settings property list if $(_INFO_PLIST_FILE_PATH) && $(PURE_JAVA) != YES { # if available and not pure java if $(PRODUCT_TYPE) = Framework { INFO_PLIST_FILE default = $(RESOURCE_DIR)$(/)Info.plist ; if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) { Mkdir $(RESOURCE_DIR) ; ProductFile $(RESOURCE_DIR) ; } DEPENDS $(INFO_PLIST_FILE) : $(RESOURCE_DIR) ; if $(RESOURCE_LINK) && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) { SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ; ProductFile $(RESOURCE_LINK) ; } DEPENDS $(INFO_PLIST_FILE) : $(RESOURCE_LINK) ; } else { INFO_PLIST_FILE default = $(1)$(/)Contents$(/)Info.plist ; INFO_PLIST_DIR = $(INFO_PLIST_FILE:D) ; if ! $(INFO_PLIST_DIR) in $(PRODUCT_FILES) { Mkdir $(INFO_PLIST_DIR) ; ProductFile $(INFO_PLIST_DIR) ; } DEPENDS $(INFO_PLIST_FILE) : $(INFO_PLIST_DIR) ; } Cp $(INFO_PLIST_FILE) : $(_INFO_PLIST_FILE_PATH) ; ProductFile $(INFO_PLIST_FILE) ; } # version settings property list if $(_VERSION_PLIST_FILE_PATH) && $(PURE_JAVA) != YES { # if available and not pure java if $(PRODUCT_TYPE) = Framework { VERSION_PLIST_FILE default = $(RESOURCE_DIR)$(/)version.plist ; if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) { Mkdir $(RESOURCE_DIR) ; ProductFile $(RESOURCE_DIR) ; } DEPENDS $(VERSION_PLIST_FILE) : $(RESOURCE_DIR) ; # create accompanying link in the case of versioned frameworks if $(RESOURCE_LINK) && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) { SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ; ProductFile $(RESOURCE_LINK) ; } DEPENDS $(VERSION_PLIST_FILE) : $(RESOURCE_LINK) ; } else { VERSION_PLIST_FILE default = $(1:G=)$(/)Contents$(/)version.plist ; VERSION_PLIST_DIR = $(VERSION_PLIST_FILE:D) ; if ! $(VERSION_PLIST_DIR) in $(PRODUCT_FILES) { Mkdir $(VERSION_PLIST_DIR) ; ProductFile $(VERSION_PLIST_DIR) ; } DEPENDS $(VERSION_PLIST_FILE) : $(VERSION_PLIST_DIR) ; } Cp $(VERSION_PLIST_FILE) : $(_VERSION_PLIST_FILE_PATH) ; ProductFile $(VERSION_PLIST_FILE) ; } # development settings property list # This plist gets copied into the bundle if we are doing a development build or removed from the symroot otherwise. Right now, "development build" means that the ACTION is "build" (as opposed to "install"). if $(_PBDEVELOPMENT_PLIST_FILE_PATH) && $(PURE_JAVA) != YES && $(ACTION) = build { # if available and not pure java if $(PRODUCT_TYPE) = Framework { DEVELOPMENT_PLIST_FILE default = $(RESOURCE_DIR)$(/)pbdevelopment.plist ; if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) { Mkdir $(RESOURCE_DIR) ; ProductFile $(RESOURCE_DIR) ; } DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(RESOURCE_DIR) ; # create accompanying link in the case of versioned frameworks if $(RESOURCE_LINK) && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) { SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ; ProductFile $(RESOURCE_LINK) ; } DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(RESOURCE_LINK) ; } else { DEVELOPMENT_PLIST_FILE default = $(1:G=)$(/)Contents$(/)pbdevelopment.plist ; DEVELOPMENT_PLIST_DIR = $(DEVELOPMENT_PLIST_FILE:D) ; if ! $(DEVELOPMENT_PLIST_DIR) in $(PRODUCT_FILES) { Mkdir $(DEVELOPMENT_PLIST_DIR) ; ProductFile $(DEVELOPMENT_PLIST_DIR) ; } DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_PLIST_DIR) ; } Cp $(DEVELOPMENT_PLIST_FILE) : $(_PBDEVELOPMENT_PLIST_FILE_PATH) ; ProductFile $(DEVELOPMENT_PLIST_FILE) ; } # Write package info file with type and creator if available # and if not framework or oldest layout or pure java if $(_PKGINFO_FILE_PATH) && ( ( $(PRODUCT_TYPE) != Framework && $(PRODUCT_TYPE) != Bundle && $(PURE_JAVA) != YES ) || $(GENERATE_PKGINFO_FILE) = YES ) { if $(PRODUCT_TYPE) = Framework { PKGINFO_FILE default = $(1)$(/)"PkgInfo" ; } else { PKGINFO_FILE default = $(1)$(/)"Contents"$(/)"PkgInfo" ; } PKGINFO_DIR = $(PKGINFO:D) ; if ! $(PKGINFO_DIR) in $(PRODUCT_FILES) { Mkdir $(PKGINFO_DIR) ; ProductFile $(PKGINFO_DIR) ; } Cp $(PKGINFO_FILE) : $(_PKGINFO_FILE_PATH) ; ProductFile $(PKGINFO_FILE) ; } } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } } # ProcessResource # # Copies resources to nonlocalized or localized folders as appropriate rule ProcessResource { if source in $(BUILD_COMPONENTS) { local RESOURCE_SOURCE_COPY ; local RESOURCE_SOURCE_DIR ; # make directory first if necessary if $(2:D) { RESOURCE_SOURCE_DIR = $(SOURCE_DIR)/$(2:D:G=) ; Mkdir $(RESOURCE_SOURCE_DIR) ; RESOURCE_SOURCE_COPY = $(RESOURCE_SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(RESOURCE_SOURCE_COPY) : $(RESOURCE_SOURCE_DIR) ; } else { RESOURCE_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(RESOURCE_SOURCE_COPY) : $(SOURCE_DIR) ; Mkdir $(SOURCE_DIR) ; } # copy resource to source location Cp $(RESOURCE_SOURCE_COPY) : $(2) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(RESOURCE_SOURCE_COPY) ; } } if build in $(BUILD_COMPONENTS) { local REGION = $($(2)_REGION) ; local SPECIFIC_REGION ; # resource directory must exist if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) { Mkdir $(RESOURCE_DIR) ; ProductFile $(RESOURCE_DIR) ; } # create accompanying link in the case of versioned frameworks if $(RESOURCE_LINK) && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) { SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ; ProductFile $(RESOURCE_LINK) ; } if ! $(REGION) { # non-localized resource local NONLOCALIZED_RESOURCE_DIR NONLOCALIZED_RESOURCE ; NONLOCALIZED_RESOURCE_DIR default = $(RESOURCE_DIR) ; if ! $(NONLOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) { Mkdir $(NONLOCALIZED_RESOURCE_DIR) ; ProductFile $(NONLOCALIZED_RESOURCE_DIR) ; } NONLOCALIZED_RESOURCE default = $(NONLOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ; DEPENDS $(NONLOCALIZED_RESOURCE) : $(NONLOCALIZED_RESOURCE_DIR) ; RobustCp $(NONLOCALIZED_RESOURCE) : $(2) ; ProductFile $(NONLOCALIZED_RESOURCE) ; } else for SPECIFIC_REGION in $(REGION) { # for each localization of a resource (only one ever expected) local LOCALIZED_RESOURCE_DIR LOCALIZED_RESOURCE ; LOCALIZED_RESOURCE_DIR default = $(RESOURCE_DIR)$(/)$(SPECIFIC_REGION:S=.lproj) ; # localized resource directory must exist if ! $(LOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) { Mkdir $(LOCALIZED_RESOURCE_DIR) ; ProductFile $(LOCALIZED_RESOURCE_DIR) ; } LOCALIZED_RESOURCE default = $(LOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ; DEPENDS $(LOCALIZED_RESOURCE) : $(LOCALIZED_RESOURCE_DIR) ; RobustCp $(LOCALIZED_RESOURCE) : $(2) ; ProductFile $(LOCALIZED_RESOURCE) ; } } } actions CopyProjectFiles { if [ -d $(2) ]; then $(CP) -pRP $(2) $(1) elif [ -d $(2:S=.pbxproj) ]; then $(CP) -pRP $(2:S=.pbxproj) $(1) fi } # ProcessSources # # Process individual source files and generate versioning stub, # kernel module stub, and use Interfacer to make exports and glue rule ProcessSources { if build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) { local FILE ; if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : DeriveAndCompileSources ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } # copy project files if copying source if source in $(BUILD_COMPONENTS) { local PROJECT_FILES = $(SOURCE_ROOT)/$(PROJECT).pbproj ; local LEGACY_PROJECT_FILES = $(SOURCE_ROOT)/$(PROJECT).pbxproj ; local PROJECT_FILES_COPY = $(INSTALL_ROOT)/$(PROJECT).pbproj ; CopyProjectFiles $(PROJECT_FILES_COPY) : $(PROJECT_FILES) : $(LEGACY_PROJECT_FILES) ; DEPENDS $(PROJECT_FILES_COPY) : $(INSTALL_ROOT) ; Mkdir $(INSTALL_ROOT) ; DEPENDS $(PROJECT_FILES_COPY) : $(PROJECT_FILES) ; NOCARE $(PROJECT_FILES) ; DEPENDS $(PROJECT_FILES_COPY) : $(LEGACY_PROJECT_FILES) ; NOCARE $(LEGACY_PROJECT_FILES) ; BUILD_PHASE_PRODUCTS += $(PROJECT_FILES_COPY) ; } for FILE in $(2) { if $(__BUILD_PHASING) = YES { ProcessSource $(BUILD_PHASE) : $(FILE) ; } else { ProcessSource $(1) : $(FILE) ; } } # any build component implies handling: header cloning, versioning, # kernel module generation, and interfacer usage if build in $(BUILD_COMPONENTS) { # generate versioning system derived sources if $(VERSIONING_SYSTEM) { local RULE = VersioningSystem_$(VERSIONING_SYSTEM) ; $(RULE) $(1) ; } # generate kernel module or extension info source if $(KERNEL_MODULE) = YES { KernelModuleGeneratedSource $(1) ; } # generate interfacer derived sources if $(GENERATE_EXPORT_SETS_AND_GLUE) = YES { InterfacerExportSetsAndGlue $(1) ; } } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } # Actually copy headers (over clones) only when compiles are finished if $(HEADER_COPIES) && $(OBJECT_FILES) { DEPENDS $(HEADER_COPIES) : $(OBJECT_FILES) ; } } } # ProcessSource # # Call ProcessFile to process a source file with the correct # extension-specific rule, and start header scanning. rule ProcessSource { # scan non-Java for header file references in any source if $(2:S) != ".java" { if $(ENABLE_HEADER_SCANNING) != NO && $(INDEX_BASED_HEADER_DEPENDENCIES) != YES { HDRRULE on $(2) = ProcessC.HdrRule ; HDRSCAN on $(2) = $(HDRPATTERN) ; } } ProcessFile $(1) : $(2) ; } rule ProcessFiles { local FILE ; for FILE in $(2) { ProcessFile $(1) : $(FILE) ; } } rule ProcessFile { local SOURCE_COPY ; local SOURCE_SUBDIR ; if source in $(BUILD_COMPONENTS) { # copy to source location # make directory first if necessary if $(2:D) { SOURCE_SUBDIR = $(SOURCE_DIR)/$(2:D:G=) ; Mkdir $(SOURCE_SUBDIR) ; SOURCE_COPY = $(SOURCE_SUBDIR)/$(2:D=:G=) ; DEPENDS $(SOURCE_COPY) : $(SOURCE_SUBDIR) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(SOURCE_SUBDIR) ; } } else { SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(SOURCE_COPY) : $(SOURCE_DIR) ; Mkdir $(SOURCE_DIR) ; } Cp $(SOURCE_COPY) : $(2) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(SOURCE_COPY) ; } } if build in $(BUILD_COMPONENTS) { # process file with rule based on the file suffix local EXCLUDED_OSS = $($(2)_EXCLUDED_OSS) ; local INCLUDED_OSS = $($(2)_INCLUDED_OSS) ; local RULE = $($(2:S)_RULE) ; if $(EXCLUDED_OSS) && ( $(OS) in $(EXCLUDED_OSS) ) { # do nothing -- file excluded from build } else if $(INCLUDED_OSS) && ! ( $(OS) in $(INCLUDED_OSS) ) { # do nothing -- file excluded from build } else if $(RULE) { $(RULE) $(1) : $(2) ; } else { ECHO jam: warning: no rule for file $(2) ; } } } # ProcessFrameworksAndLibraries # # Link object files and/or archive classes rule ProcessFrameworksAndLibraries { if ( build in $(BUILD_COMPONENTS) ) && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) { if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : LinkWithFrameworksAndLibraries ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = $(INNER_PRODUCT) ; } # add to linked files, including java .jar files even when there are no native object files! # !!!:cmolick:20011211 this only makes sense if $(2) is nonempty if $(2) { LINKED_FILES += $(2) ; } # only link if there are object files if $(OBJECT_FILES) { if ! ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC ) { GENERATE_MASTER_OBJECT_FILE default = YES ; } # process link based on product type switch $(PRODUCT_TYPE) { case Tool : if $(PURE_JAVA) = YES { INNER_PRODUCT default = ; INNER_PRODUCT_LINK = ; } else { INNER_PRODUCT default = $(1:G=) ; LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ; INNER_PRODUCT_LINK = ; STRIPPED_PRODUCT default = $(INNER_PRODUCT) ; if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) { ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : StandaloneExecutable ; } else { StandaloneExecutable $(INNER_PRODUCT) : $(LINKED_FILES) ; } if $(PREBINDING) = YES { FLAGS.o on $(INNER_PRODUCT) += -prebind ; } if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES { FLAGS.o on $(INNER_PRODUCT) += -pg ; } ProductFile $(INNER_PRODUCT) ; } case Library : INNER_PRODUCT default = $(1:G=) ; LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ; INNER_PRODUCT_LINK = ; STRIPPED_PRODUCT default = $(INNER_PRODUCT) ; ProductFile $(INNER_PRODUCT) ; # Link the final product if $(KERNEL_MODULE) = YES { # link kernel module DynamicLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ; FLAGS.o on $(INNER_PRODUCT) += -static -nostdlib -r -lkmodc++ "$(MODULE_OBJECT_FILES)" -lkmod -lcc_kext ; if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES { FLAGS.o on $(INNER_PRODUCT) += -pg ; } } else { if $(LIBRARY_STYLE) = STATIC { # link static library if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) { ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : StaticLibrary ; } else { StaticLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ; } FLAGS.o on $(INNER_PRODUCT) += -static ; if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES { FLAGS.o on $(INNER_PRODUCT) += -pg ; } } else { if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) { ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : DynamicLibrary ; } else { for ARCH in $(ARCHS) { THIN_MASTER_OBJECT_FILE default = $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ; } if $(THIN_MASTER_OBJECT_FILE) { # link dynamic library with architecture specific symbols edited #!!!:cmolick:20001117 missing per-arch exports files not accounted for for ARCH in $(ARCHS) { MASTER_OBJECT_FILE_$(ARCH) default = $(TEMP_DIR)$(/)master_$(ARCH).o ; MasterObjectFile $(MASTER_OBJECT_FILE_$(ARCH)) : $(OBJECT_FILES_$(ARCH)) : $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ; } NonObjectFiles OTHER_LINKED_FILES : $(LINKED_FILES) ; for ARCH in $(ARCHS) { if $(OTHER_LINKED_FILES) = "" { OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE_$(ARCH)) ; } else { OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(ARCH)) ; } } DynamicLibrary $(INNER_PRODUCT) : $(OTHER_LINKED_FILES) ; } else { # simple dynamic library link DynamicLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ; } } # Add flags to the link if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES { FLAGS.o on $(INNER_PRODUCT) += -pg ; } if $(LIBRARY_STYLE) = BUNDLE { FLAGS.o on $(INNER_PRODUCT) += -bundle ; } else { FLAGS.o on $(INNER_PRODUCT) += -dynamiclib ; } if $(DYLIB_COMPATIBILITY_VERSION) { FLAGS.o on $(INNER_PRODUCT) += -compatibility_version "$(DYLIB_COMPATIBILITY_VERSION)" ; } if $(DYLIB_CURRENT_VERSION) { FLAGS.o on $(INNER_PRODUCT) += -current_version "$(DYLIB_CURRENT_VERSION)" ; } if $(PREBINDING) = YES { FLAGS.o on $(INNER_PRODUCT) += -prebind ; } if $(INSTALL_PATH) { DYLIB_INSTALLED_NAME default = $(INSTALL_PATH)$(/)$(INNER_PRODUCT:G=) ; INSTALLED_NAME_FLAG on $(INNER_PRODUCT) = -install_name \"`echo \"$(DYLIB_INSTALLED_NAME)\" | $(SED) 's!//*!/!g'`\" ; } } } case Bundle : # Define primary executable INNER_PRODUCT location in wrapper if $(OBJECT_FILES) = "" { INNER_PRODUCT = "" ; STRIPPED_PRODUCT = "" ; } else { local DEFAULT_INNER_PRODUCT default = $(1:G=)$(/)"Contents"$(/)"MacOS"$(/)$(1:B)$(TOOL_SUFFIX) ; INNER_PRODUCT default = $(DEFAULT_INNER_PRODUCT) ; INNER_PRODUCT_DIR = $(INNER_PRODUCT:D) ; if ! $(INNER_PRODUCT_DIR) in $(PRODUCT_FILES) { Mkdir $(INNER_PRODUCT_DIR) ; ProductFile $(INNER_PRODUCT_DIR) ; DEPENDS $(INNER_PRODUCT) : $(INNER_PRODUCT_DIR) ; } LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ; INNER_PRODUCT_LINK default = ; ProductFile $(INNER_PRODUCT) ; STRIPPED_PRODUCT = $(INNER_PRODUCT) ; # link the final executable if $(KERNEL_MODULE) = YES { DynamicLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ; FLAGS.o on $(INNER_PRODUCT) += -static -nostdlib -r -lkmodc++ "$(MODULE_OBJECT_FILES)" -lkmod -lcc_kext ; } # end of kernel module case else { if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) { ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : DynamicLibrary ; } else { for ARCH in $(ARCHS) { THIN_MASTER_OBJECT_FILE default = $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ; } if $(THIN_MASTER_OBJECT_FILE) { # link bundle with architecture specific symbols edited #!!!:cmolick:20001117 missing per-arch exports files not accounted for for ARCH in $(ARCHS) { MASTER_OBJECT_FILE_$(ARCH) default = $(TEMP_DIR)$(/)master_$(ARCH).o ; MasterObjectFile $(MASTER_OBJECT_FILE_$(ARCH)) : $(OBJECT_FILES_$(ARCH)) : $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ; } NonObjectFiles OTHER_LINKED_FILES_$(ARCH) : $(LINKED_FILES) ; for ARCH in $(ARCHS) { if $(OTHER_LINKED_FILES) = "" { OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE_$(ARCH)) ; } else { OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(ARCH)) ; } } DynamicLibrary $(INNER_PRODUCT) : $(OTHER_LINKED_FILES) ; } else { # simple dynamic library link DynamicLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ; } } } if $(KERNEL_MODULE) != YES { FLAGS.o on $(INNER_PRODUCT) += -bundle ; } if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES { FLAGS.o on $(INNER_PRODUCT) += -pg ; } } case Application : # Define primary executable INNER_PRODUCT location in wrapper if $(PURE_JAVA) = YES { INNER_PRODUCT default = ; } else { INNER_PRODUCT default = $(1:G=)$(/)Contents$(/)MacOS$(/)$(1:B)$(TOOL_SUFFIX) ; LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ; } INNER_PRODUCT_LINK default = ; if $(INNER_PRODUCT) { INNER_PRODUCT_DIR = $(INNER_PRODUCT:D) ; if ! $(INNER_PRODUCT_DIR) in $(PRODUCT_FILES) { Mkdir $(INNER_PRODUCT_DIR) ; ProductFile $(INNER_PRODUCT_DIR) ; DEPENDS $(INNER_PRODUCT) : $(INNER_PRODUCT_DIR) ; } if $(JAVA_ONLY) != YES { if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) { ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : StandaloneExecutable ; } else { StandaloneExecutable $(INNER_PRODUCT) : $(LINKED_FILES) ; } if $(PREBINDING) = YES { FLAGS.o on $(INNER_PRODUCT) += -prebind ; } STRIPPED_PRODUCT = $(INNER_PRODUCT) ; ProductFile $(INNER_PRODUCT) ; if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES { FLAGS.o on $(INNER_PRODUCT) += -pg ; } } } case Framework : # Handle product wrapper versioning if $(CURRENT_VERSION_LINK) { INNER_PRODUCT default = $(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; INNER_PRODUCT_LINK default = $(BUILD_DIR)$(/)$(1:G=)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; INNER_PRODUCT_LINK_PATH default = Versions$(/)Current$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; # inner product link SymLink $(INNER_PRODUCT_LINK) : $(INNER_PRODUCT_LINK_PATH) ; ProductFile $(INNER_PRODUCT_LINK) ; NOUPDATE $(INNER_PRODUCT_LINK) ; } else { INNER_PRODUCT default = $(1:G=)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; } LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ; STRIPPED_PRODUCT = $(INNER_PRODUCT) ; ProductFile $(INNER_PRODUCT) ; # link the final shared library for ARCH in $(ARCHS) { THIN_MASTER_OBJECT_FILE default = $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ; } if $(THIN_MASTER_OBJECT_FILE) { # link bundle with architecture specific symbols edited #!!!:cmolick:20001117 missing per-arch exports files not accounted for for ARCH in $(ARCHS) { MASTER_OBJECT_FILE_$(ARCH) default = $(TEMP_DIR)$(/)master_$(ARCH).o ; MasterObjectFile $(MASTER_OBJECT_FILE_$(ARCH)) : $(OBJECT_FILES_$(ARCH)) : $(EXPORTED_SYMBOLS_FILE_$(ARCH)) : $(ARCH) ; } NonObjectFiles OTHER_LINKED_FILES : $(LINKED_FILES) ; for ARCH in $(ARCHS) { if $(OTHER_LINKED_FILES) = "" { OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE_$(ARCH)) ; } else { OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(ARCH)) ; } } DynamicLibrary $(INNER_PRODUCT) : $(OTHER_LINKED_FILES) ; } else { # default framework link if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) { ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : DynamicLibrary ; } else { # simple dynamic library link if $(VECTOR_OBJECT_FILE) { OTHER_LINKED_FILES += $(VECTOR_OBJECT_FILE) ; } DynamicLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ; } } if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES { FLAGS.o on $(INNER_PRODUCT) += -pg ; } FLAGS.o on $(INNER_PRODUCT) += -dynamiclib ; if $(DYLIB_COMPATIBILITY_VERSION) { FLAGS.o on $(INNER_PRODUCT) += -compatibility_version "$(DYLIB_COMPATIBILITY_VERSION)" ; } if $(DYLIB_CURRENT_VERSION) { FLAGS.o on $(INNER_PRODUCT) += -current_version "$(DYLIB_CURRENT_VERSION)" ; } if $(PREBINDING) = YES { FLAGS.o on $(INNER_PRODUCT) += -prebind ; } if $(INSTALL_PATH) { FRAMEWORK_INSTALLED_NAME default = $(INSTALL_PATH)$(/)$(INNER_PRODUCT:G=) ; INSTALLED_NAME_FLAG on $(INNER_PRODUCT) = -install_name \"`echo \"$(FRAMEWORK_INSTALLED_NAME)\" | $(SED) 's!//*!/!g'`\" ; } case * : ECHO warning: unknown project type ; } } else { if $(PRODUCT_TYPE) = Framework { if $(CURRENT_VERSION_LINK) { INNER_PRODUCT default = $(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; INNER_PRODUCT_LINK default = $(BUILD_DIR)$(/)$(1:G=)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; INNER_PRODUCT_LINK_PATH default = Versions$(/)Current$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; # inner product link SymLink $(INNER_PRODUCT_LINK) : $(INNER_PRODUCT_LINK_PATH) ; ProductFile $(INNER_PRODUCT_LINK) ; NOUPDATE $(INNER_PRODUCT_LINK) ; } else { INNER_PRODUCT default = $(1:G=)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ; } ProductFile $(INNER_PRODUCT) ; if $(DYLIB_COMPATIBILITY_VERSION) { DYLIB_VERSION_FLAGS on $(INNER_PRODUCT) += -compatibility_version "$(DYLIB_COMPATIBILITY_VERSION)" ; } else { DYLIB_VERSION_FLAGS on $(INNER_PRODUCT) += -compatibility_version 1 ; } if $(DYLIB_CURRENT_VERSION) { DYLIB_VERSION_FLAGS on $(INNER_PRODUCT) += -current_version "$(DYLIB_CURRENT_VERSION)" ; } else { DYLIB_VERSION_FLAGS on $(INNER_PRODUCT) += -current_version 1 ; } if $(INSTALL_PATH) { FRAMEWORK_INSTALLED_NAME default = $(INSTALL_PATH)$(/)$(INNER_PRODUCT:G=) ; INSTALLED_NAME_FLAG on $(INNER_PRODUCT) = -install_name \"`echo \"$(FRAMEWORK_INSTALLED_NAME)\" | $(SED) 's!//*!/!g'`\" ; } GenerateFrameworkStub $(INNER_PRODUCT) ; INNER_PRODUCT_DIR = $(INNER_PRODUCT:D) ; if ! $(INNER_PRODUCT_DIR) in $(PRODUCT_FILES) { Mkdir $(INNER_PRODUCT_DIR) ; ProductFile $(INNER_PRODUCT_DIR) ; DEPENDS $(INNER_PRODUCT) : $(INNER_PRODUCT_DIR) ; } if $(INNER_PRODUCT_LINK) { SymLink $(INNER_PRODUCT_LINK) : $(INNER_PRODUCT_LINK_PATH) ; NOUPDATE $(INNER_PRODUCT_LINK) ; ProductFile $(INNER_PRODUCT_LINK) ; } } } # end of object files block if $(COMPILED_JAVA) { # provide stub executable if necessary if $(JAVA_ONLY) = YES { INNER_PRODUCT default = $(1)$(/)Contents$(/)MacOS$(/)$(1:B) ; # must first make subfolder and depend on that INNER_PRODUCT_SUBDIR = $(INNER_PRODUCT:D) ; if ! $(INNER_PRODUCT_SUBDIR) in $(PRODUCT_FILES) { Mkdir $(INNER_PRODUCT_SUBDIR) ; ProductFile $(INNER_PRODUCT_SUBDIR) ; } Cp $(INNER_PRODUCT) : $(JAVA_APP_STUB) ; ProductFile $(INNER_PRODUCT) ; } } # Add jar/zip files that are in the link phase to the classpath if $(OTHER_JAVA_CLASS_PATH) { export LINKED_CLASS_ARCHIVES = :"$(OTHER_JAVA_CLASS_PATH)" ; } else { export LINKED_CLASS_ARCHIVES = "" ; } for JAVA_CLASS_SEARCH_PATH in $(JAVA_CLASS_SEARCH_PATHS) { LINKED_CLASS_ARCHIVES = "$(LINKED_CLASS_ARCHIVES):$(JAVA_CLASS_SEARCH_PATH)" ; } local ARCHIVE ; for ARCHIVE in $(LINKED_FILES) { switch $(ARCHIVE) { case *.framework : local FW_SUBDIR ; for FW_SUBDIR in $(JAVA_FRAMEWORK_RESOURCES_DIRS) { LINKED_CLASS_ARCHIVES = $(LINKED_CLASS_ARCHIVES):$(ARCHIVE)$(/)$(FW_SUBDIR)$(/)Java ; JAVA_FRAMEWORK_JARS += $(ARCHIVE)$(/)$(FW_SUBDIR)$(/)Java ; } case *.jar : LINKED_CLASS_ARCHIVES = $(LINKED_CLASS_ARCHIVES):$(ARCHIVE) ; if Merge in $($(ARCHIVE)_ATTRIBUTES) { # merge archive contents by unpacking them into hierarchy local DESTINATION_TARGET = $(CLASS_FILE_DIR:G=Unarchive$(ARCHIVE)) ; NOTFILE $(DESTINATION_TARGET) ; DEPENDS $(DESTINATION_TARGET) : $(JAVA_COMPILE_TARGET) ; if $(MERGED_ARCHIVES) { MERGED_ARCHIVES += $(DESTINATION_TARGET) ; } else { MERGED_ARCHIVES = $(DESTINATION_TARGET) ; } Unarchive $(DESTINATION_TARGET) : $(ARCHIVE) ; } case *.zip : LINKED_CLASS_ARCHIVES = $(LINKED_CLASS_ARCHIVES):$(ARCHIVE) ; if Merge in $($(ARCHIVE)_ATTRIBUTES) { # merge archive contents by unpacking them into hierarchy local DESTINATION_TARGET = $(CLASS_FILE_DIR:G=Unarchive$(ARCHIVE)) ; NOTFILE $(DESTINATION_TARGET) ; DEPENDS $(DESTINATION_TARGET) : $(JAVA_COMPILE_TARGET) ; if $(MERGED_ARCHIVES) { MERGED_ARCHIVES += $(DESTINATION_TARGET) ; } else { MERGED_ARCHIVES = $(DESTINATION_TARGET) ; } Unarchive $(DESTINATION_TARGET) : $(ARCHIVE) ; } } } # generate an archive if there are compiled or merged classes if $(COMPILED_JAVA) || $(MERGED_ARCHIVES) { if $(JAVA_ARCHIVE_CLASSES) != NO { # java archive suffix applies to applications and frameworks if $(JAVA_ARCHIVE_TYPE) = JAR { CLASS_ARCHIVE_SUFFIX default = .jar ; } else { if $(JAVA_ARCHIVE_TYPE) = ZIP { CLASS_ARCHIVE_SUFFIX default = .zip ; } } if ( $(PRODUCT_TYPE) = Bundle || $(PRODUCT_TYPE) = Application || $(PRODUCT_TYPE) = Framework ) { # Assume bundled products with object files are Cocoa CLASS_ARCHIVE default = $(RESOURCE_DIR)$(/)Java$(/)$(1:B)$(CLASS_ARCHIVE_SUFFIX) ; } else { CLASS_ARCHIVE default = $(1:B:G=)$(CLASS_ARCHIVE_SUFFIX) ; } # class archive depends on class archive dir CLASS_ARCHIVE_DIR = $(CLASS_ARCHIVE:D:G=) ; if ! $(CLASS_ARCHIVE_DIR) in $(PRODUCT_FILES) { Mkdir $(CLASS_ARCHIVE_DIR) ; ProductFile $(CLASS_ARCHIVE_DIR) ; } # class files unknown, so archive depends on java compile log ClassArchive $(CLASS_ARCHIVE) : $(CLASS_FILE_DIR) ; if $(MERGED_ARCHIVES) { DEPENDS $(CLASS_ARCHIVE) : $(MERGED_ARCHIVES) ; } else { DEPENDS $(CLASS_ARCHIVE) : $(JAVA_COMPILE_TARGET) ; } ProductFile $(CLASS_ARCHIVE) ; } if $(JAVA_ARCHIVE_CLASSES) != YES { Mkdir $(PRODUCT_CLASS_FILE_DIR) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(PRODUCT_CLASS_FILE_DIR) ; } CLASS_COPY_TARGET = $(PRODUCT_CLASS_FILE_DIR:G=ClassCopy) ; NOTFILE $(CLASS_COPY_TARGET) ; ClassCopy $(CLASS_COPY_TARGET) : $(CLASS_FILE_DIR) ; Mkdir $(PRODUCT_CLASS_FILE_DIR) ; DEPENDS $(CLASS_COPY_TARGET) : $(PRODUCT_CLASS_FILE_DIR) ; if $(MERGED_ARCHIVES) { DEPENDS $(CLASS_COPY_TARGET) : $(MERGED_ARCHIVES) ; } else { DEPENDS $(CLASS_COPY_TARGET) : $(JAVA_COMPILE_TARGET) ; } if $(__BUILD_PHASING) = YES { DEPENDS $(BUILD_PHASE) : $(CLASS_COPY_TARGET) ; } else { DEPENDS $(1) : $(CLASS_COPY_TARGET) ; } } } # Export the path to the inner product, if any. export INNER_PRODUCT_SUBPATH = $(INNER_PRODUCT:G=) ; # Build phasing bookkeeping if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } } rule ProcessFrameworkOrLibrary { LINKED_FILES += $(2) ; } # ProcessRezFiles # # Processes Rez and ResMerger input files, or if there are none # and type and creator are set uses SetFile to set type and creator. rule ProcessRezFiles { if ( build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) ) && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) { local FILE ; if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : RezResourceManagerFiles ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } if $(2) { for FILE in $(2) { if $(__BUILD_PHASING) = YES { ProcessRezFile $(BUILD_PHASE) : $(FILE) ; } else { ProcessRezFile $(1) : $(FILE) ; } } } else { if ( $(MACOS_TYPE) || $(MACOS_CREATOR) ) && $(REZ_EXECUTABLE) = YES { local RESOURCE_FORK = $(INNER_PRODUCT:G=ResourceFork) ; if ! $(INNER_PRODUCT) in $(PRESERVE_RESOURCES) { PRESERVE_RESOURCES += $(INNER_PRODUCT) ; } ProductFile $(RESOURCE_FORK) ; if $(ALWAYS_REZ) = YES { ALWAYS $(RESOURCE_FORK) ; } SetFile $(RESOURCE_FORK) ; } } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } } # ProcessRezFile # # Sets up the compile of one Rez or ResMerger input file. rule ProcessRezFile { if source in $(BUILD_COMPONENTS) { local REZ_SOURCE_COPY ; local REZ_SOURCE_DIR ; # make directory first if necessary if $(2:D) { REZ_SOURCE_DIR = $(SOURCE_DIR)/$(2:D:G=) ; Mkdir $(REZ_SOURCE_DIR) ; REZ_SOURCE_COPY = $(REZ_SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(REZ_SOURCE_COPY) : $(REZ_SOURCE_DIR) ; } else { REZ_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(REZ_SOURCE_COPY) : $(SOURCE_DIR) ; Mkdir $(SOURCE_DIR) ; } # copy rez files to source location Cp $(REZ_SOURCE_COPY) : $(2) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(REZ_SOURCE_COPY) ; } } # RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR folder for resource collectors # RESOURCE_MANAGER_RESOURCE_COLLECTOR resource collector # RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION) localized collector # RESOURCE_MANAGER_RESOURCE final resource destination # RESOURCE_MANAGER_RESOURCE_$(REGION) localized final destination # RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR localized final folder if build in $(BUILD_COMPONENTS) { local REGION = $($(2)_REGION) ; # scan for header files if $(ENABLE_HEADER_SCANNING) != NO && $(INDEX_BASED_HEADER_DEPENDENCIES) != YES { HDRRULE on $(2) = ProcessC.HdrRule ; HDRSCAN on $(2) = $(HDRPATTERN) ; } # all resources require a folder to hold any collector if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) { RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR = $(TEMP_DIR)$(/)ResourceManagerResources ; Mkdir $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ; ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ; } if $(REZ_EXECUTABLE) = YES { # Optionally accumulate ResourceManager resources # on a resource fork of the executable PRESERVE_RESOURCES += $(INNER_PRODUCT) ; if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) { RESOURCE_MANAGER_RESOURCE_COLLECTOR = $(INNER_PRODUCT:BG=ResourceManagerResourceCollector) ; DEPENDS $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ; } if $(2:S) = ".r" { RezCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ; } else { ResMergerCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ; } # The collector must be declared a product file # only after the first Collector rule invocation # to correctly initialize the collector. ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ; # location must be set after ProductFile invocation LOCATE on $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) = $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ; if ! $(RESOURCE_MANAGER_RESOURCE) { RESOURCE_MANAGER_RESOURCE = $(INNER_PRODUCT:G=ResourceManagerResource) ; ProductFile $(RESOURCE_MANAGER_RESOURCE) ; ResMergerProduct $(RESOURCE_MANAGER_RESOURCE) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ; } } else { # By default ResourceManager resources are stored in data forks # as Resources/.rsrc files if non localized, or # Resources/.lproj/Localized.rsrc files if localized. if $(REGION) { # localized resource collector if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) { RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION) = $(REGION).rsrc ; DEPENDS $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ; } if $(2:S) = ".r" { RezCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) : $(2) ; } else { ResMergerCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) : $(2) ; } # collector declared product after first Collector rule invocation ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) ; # set location only after ProductFile invocation LOCATE on $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) = $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ; # localized resource folder RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR = $(RESOURCE_DIR)$(/)$(REGION).lproj ; Mkdir $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ; ProductFile $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ; # localized resource if ! $(RESOURCE_MANAGER_RESOURCE_$(REGION)) { RESOURCE_MANAGER_RESOURCE_$(REGION) = $(RESOURCE_DIR)$(/)$(REGION).lproj$(/)Localized.rsrc ; ProductFile $(RESOURCE_MANAGER_RESOURCE_$(REGION)) ; # folder for localized resource RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR = $(RESOURCE_DIR)$(/)$(REGION).lproj ; Mkdir $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ; ProductFile $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ; DEPENDS $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) : $(RESOURCE_DIR) ; # get product from collector ResMergerProduct $(RESOURCE_MANAGER_RESOURCE_$(REGION)) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) ; DEPENDS $(RESOURCE_MANAGER_RESOURCE_$(REGION)) : $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ; } } else { # nonlocalized resource collector if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) { RESOURCE_MANAGER_RESOURCE_COLLECTOR = $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR)$(/)$(1:S=.rsrc:G=) ; DEPENDS $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ; } if $(2:S) = ".r" { RezCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ; } else { ResMergerCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ; } # collector declared product after Collector rule invocation ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ; # nonlocalized resource if ! $(RESOURCE_MANAGER_RESOURCE) { RESOURCE_MANAGER_RESOURCE = $(RESOURCE_DIR)$(/)$(1:S=.rsrc:G=) ; ProductFile $(RESOURCE_MANAGER_RESOURCE) ; # get product from collector ResMergerProduct $(RESOURCE_MANAGER_RESOURCE) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ; DEPENDS $(RESOURCE_MANAGER_RESOURCE) : $(RESOURCE_DIR) ; } } if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) { Mkdir $(RESOURCE_DIR) ; ProductFile $(RESOURCE_DIR) ; } } # not clear what this means in this context # if ! $(ALWAYS_REZ) = "" { # ALWAYS $(RESOURCE_FORK) ; # } # create accompanying link in the case of versioned frameworks if $(RESOURCE_LINK) && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) { SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ; ProductFile $(RESOURCE_LINK) ; } } } rule ProcessScriptBuildPhaseFiles { if build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) { if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : Script ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } if build in $(BUILD_COMPONENTS) { SEARCH on $(2) = $(SOURCE_ROOT) $(TEMP_ROOT) ; PHASE_SCRIPT_EXECUTION = $(2:G=Execution) ; NOTFILE $(PHASE_SCRIPT_EXECUTION) ; ALWAYS $(PHASE_SCRIPT_EXECUTION) ; DEPENDS $(1) : $(PHASE_SCRIPT_EXECUTION) ; PhaseScriptExecution $(PHASE_SCRIPT_EXECUTION) : $(2) ; if ! $(PHASE_SCRIPT_EXECUTION) in $(PRODUCT_FILES) { if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(PHASE_SCRIPT_EXECUTION) ; } } } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } } rule PhaseScriptExecution { JAMSHOULDSETENV on $(1) = YES ; DEPENDS $(1) : $(2) ; } actions exportvars PhaseScriptExecution { echo "=== Script ===" cat "$(2)" echo "--- Output ---" "$(2)" _result=$? echo "=== Exit code: ${_result} ===" exit ${_result} } rule ProcessCopyFiles { if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : CopyFiles ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } if build in $(BUILD_COMPONENTS) || ( headers in $(BUILD_COMPONENTS) && $(INSTALLHDRS_COPY_PHASE) = YES ) { SEARCH on $(2) = $(SOURCE_ROOT) ; for FILE in $(2) { ProcessCopyFile $(1) : $(FILE) : $(COPYFILES_DESTINATION_PATH) ; } } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } rule ProcessCopyFile { if source in $(BUILD_COMPONENTS) { local SOURCE_COPY ; local SOURCE_SUBDIR ; # copy files to source location # make directory first if necessary if $(2:D) { SOURCE_SUBDIR = $(2:D:G=SourceCopy) ; Mkdir $(SOURCE_SUBDIR) ; SOURCE_COPY = $(SOURCE_SUBDIR)/$(2:D=:G=) ; DEPENDS $(SOURCE_COPY) : $(SOURCE_SUBDIR) ; } else { SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(SOURCE_COPY) : $(SOURCE_DIR) ; Mkdir $(SOURCE_DIR) ; } Cp $(SOURCE_COPY) : $(2) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(SOURCE_COPY) ; } } if build in $(BUILD_COMPONENTS) || headers in $(BUILD_COMPONENTS) { local DESTINATION_DIR = $(3) ; if ! $(DESTINATION_DIR) in $(PRODUCT_FILES) { Mkdir $(DESTINATION_DIR) ; ProductFile $(DESTINATION_DIR) ; # !!!:cmolick:20010813 no way to know if this is wrapper content? } local DESTINATION_BASE = $(2:BS) ; local DESTINATION default = $(3)$(/)$(DESTINATION_BASE) ; DEPENDS $(DESTINATION) : $(DESTINATION_DIR) ; DEPENDS $(DESTINATION) : $(2) ; ProductFile $(DESTINATION) ; LOCATE on $(DESTINATION) = $(DESTINATION_DIR) ; # !!!:cmolick:20010813 no way to know if this is wrapper content? RobustCp $(DESTINATION) : $(2) ; } } rule ProcessJavaArchiveFiles { if build in $(BUILD_COMPONENTS) { local FILE ; if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : JavaArchiveFiles ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } LOCATE on $(2) = $(SOURCE_ROOT) ; for FILE in $(2) { ProcessJavaArchiveFile $(1) : $(FILE) : $(CLASS_FILE_DIR) ; } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } } rule ProcessJavaArchiveFile { local ARCHIVE_PATH ; local ARCHIVE_DESTINATION ; # copy any other reference - formulate destination first RemovePrefixPath ARCHIVE_PATH : $(JAVA_SOURCE_SUBDIR) : $(2) ; ARCHIVE_DESTINATION = $(3)$(/)$(ARCHIVE_PATH) ; ProductFile $(ARCHIVE_DESTINATION) ; Cp $(ARCHIVE_DESTINATION) : $(2) ; # copied content depends on source DEPENDS $(ARCHIVE_DESTINATION) : $(2) ; # make sure destination directory exists local DESTINATION_DIR = $(ARCHIVE_DESTINATION:D) ; DEPENDS $(ARCHIVE_DESTINATION) : $(DESTINATION_DIR) ; if ! $(DESTINATION_DIR) in $(PRODUCT_FILES) { Mkdir $(DESTINATION_DIR) ; ProductFile $(DESTINATION_DIR) ; # !!!:cmolick:20010813 not clear this is in a wrapper? } # set contents present for archival flag by making COMPILED_JAVA nonempty COMPILED_JAVA += $(2) ; } # Following rules are used by ProcessSource # to attend to specific types of source file. rule ProcessUsingJavaCompiler { # Because what class files will be generated by the java compiler # can't be known in advance, an abstract target is used for this step. if $(JAVA_COMPILE_TARGET) = "" { JAVA_COMPILE_TARGET = $(1:G=CompileJava) ; NOTFILE $(JAVA_COMPILE_TARGET) ; DEPENDS $(1) : $(JAVA_COMPILE_TARGET) ; DEPENDS $(JAVA_COMPILE_TARGET) : $(CLASS_FILE_DIR) ; # bridge derived java to be generated and compiled first if $(JAVA_BRIDGE_COMPILE_TARGET) { DEPENDS $(JAVA_COMPILE_TARGET) : $(JAVA_BRIDGE_COMPILE_TARGET) ; } } export JAVA_SOURCE_PATH default = $(SOURCE_ROOT)$(/)$(JAVA_SOURCE_SUBDIR) ; export JAVAC_FLAGS = $(JAVA_COMPILER_FLAGS) ; if $(DEBUGGING_SYMBOLS) = YES { JAVAC_FLAGS += "-g" ; } # !!!:cmolick:20010326 settings that activate optimization are in flux if "Optimize" in $($(2)_ATTRIBUTES) { JAVAC_FLAGS += "-O" ; } if $(JAVA_COMPILER:B) = javac { JAVAC_FLAGS += -J-Dfile.encoding=UTF8 -encoding "$(JAVAC_SOURCE_FILE_ENCODING)" ; } if $(JAVA_USE_DEPENDENCIES) = "NO" || ( ! $($(2)_JAVA_IMPORTS) && empty$($(2)_JAVA_IMPORTS) != empty ) { # With no dependence, or dependence info usage off # build with combinded compiler invocations but no file list DEPENDS $(JAVA_COMPILE_TARGET) : $(2) ; ALWAYS $(JAVA_COMPILE_TARGET) ; JAVAC_FLAGS on $(JAVA_COMPILE_TARGET) = $(JAVAC_FLAGS) ; JAVA_COMPILER on $(JAVA_COMPILE_TARGET) = $(JAVA_COMPILER) ; if $(JAVA_COMPILER:B) = jikes { JavaCompile.jikes $(JAVA_COMPILE_TARGET) : $(2) ; } else { JavaCompile.default $(JAVA_COMPILE_TARGET) : $(2) ; } COMPILED_JAVA += $(2) ; if ! $(JAVA_COMPILE_TARGET) in $(PRODUCT_FILES) { ProductFile $(JAVA_COMPILE_TARGET) ; } } else { # Using dependence info, set up file list for java compiles JAVA_FILE_LIST default = $(TEMP_DIR)$(/)JavaFileList ; # define and act on target to clear list if ! $(CLEAR_JAVA_FILE_LIST) { CLEAR_JAVA_FILE_LIST = $(JAVA_FILE_LIST:G=ClearFileList) ; ClearJavaFileList $(CLEAR_JAVA_FILE_LIST) ; DEPENDS $(JAVA_COMPILE_TARGET) : $(CLEAR_JAVA_FILE_LIST) ; } # set up compile target to use file list if ! $(JAVA_COMPILE_TARGET) in $(PRODUCT_FILES) { JAVAC_FLAGS on $(JAVA_COMPILE_TARGET) = $(JAVAC_FLAGS) ; JAVA_COMPILER on $(JAVA_COMPILE_TARGET) = $(JAVA_COMPILER) ; JAVA_FILE_LIST_REFERENCE = @$(JAVA_FILE_LIST) ; NOTFILE $(JAVA_FILE_LIST_REFERENCE) ; if $(JAVA_COMPILER:B) = jikes { JavaCompile.jikes $(JAVA_COMPILE_TARGET) : $(JAVA_FILE_LIST_REFERENCE) ; } else { JavaCompile.default $(JAVA_COMPILE_TARGET) : $(JAVA_FILE_LIST_REFERENCE) ; } ProductFile $(JAVA_COMPILE_TARGET) ; } # set up class file dependence used to add java files to compile list local CLASS_FILE ; # use the main class, if it's there if $($(2)_MAIN_CLASS) { CLASS_FILE = $(CLASS_FILE_DIR)$(/)$($(2)_MAIN_CLASS) ; } else { local JAVA_SOURCE ; RemovePrefixPath JAVA_SOURCE : $(JAVA_SOURCE_SUBDIR) : $(2) ; CLASS_FILE = $(CLASS_FILE_DIR)$(/)$(JAVA_SOURCE:S=.class) ; } DEPENDS $(CLASS_FILE) : $(2) ; if $($(2)_JAVA_IMPORTS) { DEPENDS $(CLASS_FILE) : $($(2)_JAVA_IMPORTS) ; DEPENDS $(CLEAR_JAVA_FILE_LIST) : $($(2)_JAVA_IMPORTS) ; } DEPENDS $(JAVA_COMPILE_TARGET) : $(CLASS_FILE) ; JAVA_FILE_LIST on $(CLASS_FILE) = $(JAVA_FILE_LIST) ; if $(JAVA_COMPILER:B) = jikes { AppendToJavaFileList.noquotes $(CLASS_FILE) : $(2) ; } else { AppendToJavaFileList $(CLASS_FILE) : $(2) ; } DEPENDS $(CLEAR_JAVA_FILE_LIST) : $(2) ; COMPILED_JAVA += $(2) ; } } actions quietly together piecemeal ClearJavaFileList { $(RM) -rf "$(JAVA_FILE_LIST)" && $(TOUCH) "$(JAVA_FILE_LIST)" } # Appends reference to list only if not already present actions quietly together piecemeal AppendToJavaFileList { _grep_result=`/usr/bin/grep -e \""$(2)"\" "$(JAVA_FILE_LIST)"` if [ "x$_grep_result" = "x" ] then $(ECHO) \""$(2)"\" >> "$(JAVA_FILE_LIST)" fi } # Append to references list as above without using quotes actions quietly together piecemeal AppendToJavaFileList.noquotes { _grep_result=`/usr/bin/grep -e "$(2)" "$(JAVA_FILE_LIST)"` if [ "x$_grep_result" = "x" ] then $(ECHO) "$(2)" >> "$(JAVA_FILE_LIST)" fi } actions together piecemeal JavaCompile.default { frameworkjars="" for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath` $(JAVA_COMPILER) $(JAVAC_FLAGS) -sourcepath "$(JAVA_SOURCE_PATH)" -classpath "$classpath" -d "$(CLASS_FILE_DIR)" '$(2)' } actions together piecemeal JavaCompile.jikes { frameworkjars="" for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath` $(JAVA_COMPILER) +E $(JAVAC_FLAGS) -sourcepath "$(JAVA_SOURCE_PATH)" -classpath "$classpath" -d "$(CLASS_FILE_DIR)" '$(2)' } rule ProcessApplescripts { if build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) { local FILE ; if $(__BUILD_PHASING) = YES { PhaseTarget BUILD_PHASE : $(1) : CompileAppleScripts ; BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ; BUILD_PHASE_PRODUCTS = ; } if $(CONTEXTNAME) = "" { for FILE in $(2) { if $(__BUILD_PHASING) = YES { ProcessAppleScript $(BUILD_PHASE) : $(FILE) : $(FILE) ; } else { ProcessAppleScript $(1) : $(FILE) : $(FILE) ; } } } else { ProcessAppleScript $(1) : $(2) : $(CONTEXTNAME) ; } if $(__BUILD_PHASING) = YES { if $(BUILD_PHASE_PRODUCTS) { DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ; } PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ; } } } rule ProcessAppleScript { if source in $(BUILD_COMPONENTS) { # make directory first if necessary if $(2:D) { SCRIPT_SOURCE_DIR = $(2:D:G=) ; Mkdir $(SCRIPT_SOURCE_DIR) ; SCRIPT_SOURCE_COPY = $(SCRIPT_SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(SCRIPT_SOURCE_COPY) : $(SCRIPT_SOURCE_DIR) ; } else { SCRIPT_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ; DEPENDS $(SCRIPT_SOURCE_COPY) : $(SOURCE_DIR) ; Mkdir $(SOURCE_DIR) ; } # copy script to source location Cp $(SCRIPT_SOURCE_COPY) : $(2) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(SCRIPT_SOURCE_COPY) ; } } if build in $(BUILD_COMPONENTS) { APPLESCRIPT_FILE = $(APPLESCRIPTS_DIR)$(/)$(3:S=.scpt) ; DEPENDS $(APPLESCRIPT_FILE) : $(APPLESCRIPTS_DIR) ; if ! $(APPLESCRIPTS_DIR) in $(PRODUCT_FILES) { Mkdir $(APPLESCRIPTS_DIR) ; ProductFile $(APPLESCRIPTS_DIR) ; } DEPENDS $(APPLESCRIPT_FILE) : $(2) ; OTHER_OSAFLAGS on $(APPLESCRIPT_FILE) = $(OTHER_OSAFLAGS) ; OSACompile $(APPLESCRIPT_FILE) : $(2) ; ProductFile $(APPLESCRIPT_FILE) ; } } actions OSACompile { $(OSAC) -d -i $(SYSTEM_LIBRARY_DIR)/Frameworks/AppleScriptKit.framework -U "$(2)" -o "$(1)" $(OTHER_OSAFLAGS) "$(2)" } rule ProcessC { for ARCH in $(ARCHS) { local OBJECT_FILE ; local OBJECT_SUBDIR = $(OBJECT_FILE_DIR)$(/)$(ARCH) ; # $(2)_UNIQUENAME is defined only if the basename of the file isn't unique within the target. if $($(2)_UNIQUENAME) { OBJECT_FILE = $($(2)_UNIQUENAME:G=$(ARCH)).o ; } else { OBJECT_FILE = $(2:D=:S=:G=$(ARCH)).o ; } DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ; if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) { Mkdir $(OBJECT_SUBDIR) ; UnlocatedProductFile $(OBJECT_SUBDIR) ; } ARCH on $(OBJECT_FILE) = $(ARCH) ; PER_ARCH_CFLAGS = $(PER_ARCH_CFLAGS_$(ARCH)) ; if $(JAVA_BRIDGET_TARGET) { DEPENDS $(OBJECT_FILE) : $(JAVA_BRIDGET_TARGET) ; } CompileC $(OBJECT_FILE) : $(2) ; if $(2:BS) != $(VECTOR_STUB:BS) { # add object file to object files and phase products # unless it is the compiled generated vector stub OBJECT_FILES += $(OBJECT_FILE) ; OBJECT_FILES_$(ARCH) += $(OBJECT_FILE) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(OBJECT_FILE) ; } } LOCATE on $(OBJECT_FILE) = $(OBJECT_SUBDIR) ; if $(2) = $(MODULE_INFO_FILE) { MODULE_OBJECT_FILE = $(OBJECT_FILE) ; MODULE_OBJECT_FILES += $(OBJECT_FILE_DIR)$(/)$(ARCH)$(/)$(MODULE_OBJECT_FILE:G=) ; LOCATE on $(MODULE_OBJECT_FILE) = $(OBJECT_SUBDIR) ; DEPENDS $(1) : $(MODULE_OBJECT_FILE) ; } else { # object file is added to linked files # unless it is the compiled generated vector stub if $(2:BS) != $(VECTOR_STUB:BS) { LINKED_FILES += $(OBJECT_FILE) ; } } } } rule ProcessCplusplus { for ARCH in $(ARCHS) { local OBJECT_FILE ; local OBJECT_SUBDIR = $(OBJECT_FILE_DIR)$(/)$(ARCH) ; # $(2)_UNIQUENAME is defined only if the basename of the file isn't unique within the target. if $($(2)_UNIQUENAME) { OBJECT_FILE = $($(2)_UNIQUENAME:G=$(ARCH)).o ; } else { OBJECT_FILE = $(2:D=:S=:G=$(ARCH)).o ; } DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ; if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) { Mkdir $(OBJECT_SUBDIR) ; # !!!:cmolick:20010727 should be a ProductFile if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(OBJECT_SUBDIR) ; } } ARCH on $(OBJECT_FILE) = $(ARCH) ; PER_ARCH_CPLUSPLUSFLAGS_$(ARCH) default = $(PER_ARCH_CFLAGS_$(ARCH)) ; PER_ARCH_CPLUSPLUSFLAGS = $(PER_ARCH_CPLUSPLUSFLAGS_$(ARCH)) ; CompileCplusplus $(OBJECT_FILE) : $(2) ; OBJECT_FILES += $(OBJECT_FILE) ; OBJECT_FILES_$(ARCH) += $(OBJECT_FILE) ; if $(__BUILD_PHASING) = YES { BUILD_PHASE_PRODUCTS += $(OBJECT_FILE) ; } if $(2) = $(MODULE_INFO_FILE) { MODULE_OBJECT_FILE = $(OBJECT_FILE) ; LOCATE on $(MODULE_OBJECT_FILE) = $(OBJECT_SUBDIR) ; DEPENDS $(1) : $(MODULE_OBJECT_FILE) ; } else { LOCATE on $(OBJECT_FILE) = $(OBJECT_SUBDIR) ; LINKED_FILES += $(OBJECT_FILE) ; } } } HDRPATTERN = "^[ ]*#[ ]*include[ ]*[<\"](.*)[\">].*$" ; HDRPATTERN += "^[ ]*#[ ]*import[ ]*[<\"](.*)[\">].*$" ; rule ProcessC.HdrRule { # header reference in subdirectory source may be to header in that subdirectory local LOCAL_HEADERS = $(2:D=$(1:D)) ; # or header reference may be to elsewhere local FOREIGN_HEADERS = $(2) ; # compiled sources may include headers in subdirectories INCLUDES $(1) : $(LOCAL_HEADERS) $(FOREIGN_HEADERS) ; # headers not found are ignored NOCARE $(LOCAL_HEADERS) $(FOREIGN_HEADERS) ; } rule CompileC { # object file depends on the source file DEPENDS $(1) : $(2) ; # Initialize the flags, and set search paths to nothing if $(KERNEL_MODULE) = YES { local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ; local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ; local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd ; local KERNEL_COMPILE_OPTIONS = -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ; if $(ARCH) in ppc { KERNEL_COMPILE_OPTIONS += -mlong-branch ; } local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ; FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) $(OTHER_CFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ; GLOBAL_CFLAGS on $(1) = ; } else { FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) $(OTHER_CFLAGS) ; } FLAGS on $(1) += -pipe ; if $(USE_GCC3) = YES { FLAGS on $(1) += -fmessage-length=0 ; } # seed search paths with target-wide values HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ; # If the source file is in a subdirectory, then search that # subdirectory for headers if $(2:D) { HEADER_SEARCH_PATHS on $(1) += $(2:D) ; } # We must compile with the extension-specific build flags FLAGS on $(1) += $($(2:S)_CFLAGS) ; # Add debug flags, if appropriate. if $(DEBUGGING_SYMBOLS) = YES { FLAGS on $(1) += -g ; } # Add profiling flags, if appropriate. if $(PROFILING_CODE) = YES { FLAGS on $(1) += -pg ; } # Pass the trusted-precomp file name to the compiler to keep track # of which precompiled headers it has already sanity checked. if $(OS) in MACOS DARWIN { FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ; } if $(CPP_HEADERMAP_FILE) { FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ; } if YES in $(GENERATE_CPP_ILOG_FILES) { local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)$(/)$(ARCH)$(/)$(1:DB).ilog ; FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ; } if $(INDEX_GENERATION_PIPE_NAME) != "" { FLAGS on $(1) += "-fgen-index=$(INDEX_GENERATION_PIPE_NAME)" ; } if ( $(2:S) in ".m" ".mm" ".M" ) && ( $(OBJC_PFE_FILE_DESTINATION_PATH) != "" ) { PREFIX_HEADER_CFLAGS on $(1) = --load-pch "$(OBJC_PFE_FILE_DESTINATION_PATH)" ; DEPENDS $(1) : $(OBJC_PFE_FILE_DESTINATION_PATH) ; } else if ( $(C_PFE_FILE_DESTINATION_PATH) != "" ) { PREFIX_HEADER_CFLAGS on $(1) = --load-pch "$(C_PFE_FILE_DESTINATION_PATH)" ; DEPENDS $(1) : $(C_PFE_FILE_DESTINATION_PATH) ; } if $(EFFECTIVE_PREFIX_HEADER) { PREFIX_HEADER_CFLAGS on $(1) += -include "$(EFFECTIVE_PREFIX_HEADER)" ; DEPENDS $(1) : $(EFFECTIVE_PREFIX_HEADER) ; } } actions CompileC { $(CC) -c "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(HEADER_SEARCH_PATHS)" "$(PREFIX_HEADER_CFLAGS)" "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "$(2)" -o "$(1)" } rule CompileCplusplus { # object file depends on the source file DEPENDS $(1) : $(2) ; # Initialize the flags, and set search paths to nothing if $(KERNEL_MODULE) = YES { local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ; local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ; local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd ; local KERNEL_COMPILE_OPTIONS = -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ; if $(ARCH) in ppc { KERNEL_COMPILE_OPTIONS += -mlong-branch ; } KERNEL_COMPILE_OPTIONS += -x c++ -fno-rtti -fno-exceptions -fcheck-new -fvtable-thunks ; if $(MODULE_IOKIT) = YES { KERNEL_COMPILE_OPTIONS += -findirect-virtual-calls ; } local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ; FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) $(OTHER_CPLUSPLUSFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ; GLOBAL_CFLAGS on $(1) = ; } else { FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) ; if $(2:S) = .CPP { FLAGS on $(1) += -x c++ ; } FLAGS on $(1) += $(OTHER_CPLUSPLUSFLAGS) ; } FLAGS on $(1) += -pipe ; if $(USE_GCC3) = YES { FLAGS on $(1) += -fmessage-length=0 ; } # seed search paths with target-wide values HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ; FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ; # If the source file is in a subdirectory, then search that # subdirectory for headers if $(2:D) { HEADER_SEARCH_PATHS on $(1) += $(2:D) ; } # We must compile with the extension-specific build flags FLAGS on $(1) += $($(2:S)_CC_FLAGS) ; # Add debug flags, if appropriate. if $(DEBUGGING_SYMBOLS) = YES { FLAGS on $(1) += -g ; } # Add profiling flags, if appropriate. if $(PROFILING_CODE) = YES { FLAGS on $(1) += -pg ; } # Pass the trusted-precomp file name to the compiler to keep track # of which precompiled headers it has already sanity checked. if $(OS) in MACOS DARWIN { FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ; } if $(CPP_HEADERMAP_FILE) { FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ; } if YES in $(GENERATE_CPP_ILOG_FILES) { local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)$(/)$(ARCH)$(/)$(1:DB).ilog ; FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ; } if ( $(2:S) in ".mm" ".M" ) && ( $(OBJCPLUSPLUS_PFE_FILE_DESTINATION_PATH) != "" ) { PREFIX_HEADER_CFLAGS on $(1) = --load-pch "$(OBJCPLUSPLUS_PFE_FILE_DESTINATION_PATH)" ; DEPENDS $(1) : $(OBJCPLUSPLUS_PFE_FILE_DESTINATION_PATH) ; } else if ( $(CPLUSPLUS_PFE_FILE_DESTINATION_PATH) != "" ) { PREFIX_HEADER_CFLAGS on $(1) = --load-pch "$(CPLUSPLUS_PFE_FILE_DESTINATION_PATH)" ; DEPENDS $(1) : $(CPLUSPLUS_PFE_FILE_DESTINATION_PATH) ; } if $(EFFECTIVE_PREFIX_HEADER) { PREFIX_HEADER_CFLAGS on $(1) += -include "$(EFFECTIVE_PREFIX_HEADER)" ; DEPENDS $(1) : $(EFFECTIVE_PREFIX_HEADER) ; } __LD_FOR_LINKING = $(LDPLUSPLUS) ; } actions CompileCplusplus { $(CPLUSPLUS) -c "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(HEADER_SEARCH_PATHS)" "$(PREFIX_HEADER_CFLAGS)" "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "$(2)" -o "$(1)" } VECTOR_SUFFIX default = ; rule ProcessExportsFile { if $(CFM_BRIDGE) = YES { local DYLIB_INSTALLED_NAME ; VECTOR_STUB default = $(DERIVED_FILE_DIR)$(/)$(1:B)Vector.s ; VECTOR_OBJECT_FILE default = $(OBJECT_FILE_DIR)$(/)$(1:B)Vector.o ; if $(VECTOR_SUFFIX) { VECTOR_FRAGMENT_NAME default = CFMPriv_$(1:B)$(VECTOR_SUFFIX) ; } else { VECTOR_FRAGMENT_NAME default = CFMPriv_$(1:B) ; } DEPENDS $(VECTOR_STUB) : $(CURRENT_VERSION_DIR) ; DEPENDS $(VECTOR_STUB) : $(DERIVED_FILE_DIR) ; Mkdir $(CURRENT_VERSION_DIR) ; if $(INSTALL_PATH) { DYLIB_INSTALLED_NAME default = $(INSTALL_PATH)$(/)$(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:B:G=) ; if $(DYNAMIC_LIBRARY_SUFFIX) { DYLIB_INSTALLED_NAME = $(DYLIB_INSTALLED_NAME)$(DYNAMIC_LIBRARY_SUFFIX) ; } } DYLIB_INSTALLED_NAME on $(1) = $(DYLIB_INSTALLED_NAME) ; GenerateVectorLibraryIntermediates $(VECTOR_STUB) $(VECTOR_OBJECT_FILE) : $(2) ; BUILD_PHASE_PRODUCTS += $(VECTOR_STUB) ; } } rule ProcessUsingMig { local TEMP_FILES ; local FILE_BASE = $(2:B) ; if AbsolutePath in $($(2)_ATTRIBUTES) { FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ; } if Client in $($(2)_ATTRIBUTES) { TEMP_FILES = $(FILE_BASE).h $(FILE_BASE)User.c ; } if Server in $($(2)_ATTRIBUTES) { TEMP_FILES += $(FILE_BASE)Server.h $(FILE_BASE)Server.c ; } Mig $(TEMP_FILES) : $(2) ; DerivedFiles $(TEMP_FILES) ; ProcessFiles $(1) : $(TEMP_FILES) ; } rule ProcessUsingLex { local TEMP_FILES ; local FILE_BASE = $(2:B) ; if AbsolutePath in $($(2)_ATTRIBUTES) { FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ; } switch $(2:S) { case ".l" : TEMP_FILES += $(FILE_BASE).c ; case ".lm" : TEMP_FILES += $(FILE_BASE).m ; case ".LM" : TEMP_FILES += $(FILE_BASE).M ; case ".lmm" : TEMP_FILES += $(FILE_BASE).mm ; case ".lpp" : TEMP_FILES += $(FILE_BASE).cpp ; case ".LPP" : TEMP_FILES += $(FILE_BASE).CPP ; case ".lxx" : TEMP_FILES += $(FILE_BASE).cxx ; case ".LXX" : TEMP_FILES += $(FILE_BASE).CXX ; } DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ; Lex $(TEMP_FILES) : $(2) ; DerivedFiles $(TEMP_FILES) ; ProcessFiles $(1) : $(TEMP_FILES) ; } rule ProcessUsingYacc { local FILE_BASE = $(2:B) ; if AbsolutePath in $($(2)_ATTRIBUTES) { FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ; } local TEMP_FILES = $(FILE_BASE).h ; switch $(2:S) { case ".y" : TEMP_FILES += $(FILE_BASE).c ; case ".ym" : TEMP_FILES += $(FILE_BASE).m ; case ".YM" : TEMP_FILES += $(FILE_BASE).M ; case ".ymm" : TEMP_FILES += $(FILE_BASE).mm ; case ".ypp" : TEMP_FILES += $(FILE_BASE).cpp ; case ".YPP" : TEMP_FILES += $(FILE_BASE).CPP ; case ".yxx" : TEMP_FILES += $(FILE_BASE).cxx ; case ".YXX" : TEMP_FILES += $(FILE_BASE).CXX ; } DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ; Yacc $(TEMP_FILES) : $(2) ; DerivedFiles $(TEMP_FILES) ; ProcessFiles $(1) : $(TEMP_FILES) ; } rule ProcessUsingRPCGen { local FILE_BASE = $(2:B) ; if AbsolutePath in $($(2)_ATTRIBUTES) { FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ; } local TEMP_FILES = $(FILE_BASE).h $(FILE_BASE)_xdr.c ; DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ; RPCGen $(TEMP_FILES) : $(2) ; DerivedFiles $(TEMP_FILES) ; ProcessFiles $(1) : $(TEMP_FILES) ; } rule ProcessUsingBridget { Bridget $(1) : $(2) ; } # Copyright (c) 1999,2000,2001 Apple Computer, Inc. # All rights reserved. # High level rules for build actions on targets # Actions # Defines all available build actions rule Actions { Clean clean : $(1) ; Build build : $(1) ; Install install : $(1) ; InstallHeaders installhdrs : $(1) ; NOTFILE installhdrs ; InstallSource installsrc : $(1) ; NOTFILE installsrc ; } # Clean clean : # Deletes the product and the files associated with building it rule Clean { # locate built product and remove local BUILT_PRODUCT = $(2:G=) ; LOCATE on $(BUILT_PRODUCT) = $(BUILD_DIR) ; Clean.Remove clean : $(BUILT_PRODUCT) ; # remove temporary directories Clean.Remove clean : $(TEMP_DIR) ; # Removal of archive in case of tools that are class archives, # this is which don't necessarily end with TOOL_SUFFIX. local ARCHIVE_SUFFIX ; local ARCHIVE_TARGET ; if $(JAVA_ARCHIVE_TYPE) = JAR { ARCHIVE_SUFFIX default = .jar ; } if $(JAVA_ARCHIVE_TYPE) = ZIP { ARCHIVE_SUFFIX default = .zip ; } ARCHIVE_SUFFIX default = "" ; ARCHIVE_TARGET = $(2:G=)$(ARCHIVE_SUFFIX) ; LOCATE on $(ARCHIVE_TARGET) = $(BUILD_DIR) ; Clean.RemoveArchive clean : $(ARCHIVE_TARGET) ; # remove project header clones for this target if $(PROJECT_HEADER_DIR) { Clean.Remove clean : $(PROJECT_HEADER_DIR) ; } if $(WRAPPER_CLONE_DIR) { Clean.Remove clean : $(WRAPPER_CLONE_DIR) ; } # whole project content to remove on full clean Clean.Remove clean : $(PRECOMP_TRUSTFILE) ; } actions quietly piecemeal together existing Clean.Remove { $(RM) -rf "$(2)" } actions Clean.RemoveArchive { if [ -f "$(2)" ]; then $(RM) -rf "$(2)" fi } # Build build : # Builds rule Build { local BUILD_TARGET = $(2:G=build) ; DEPENDS $(1) : $(BUILD_TARGET) ; NOTFILE $(BUILD_TARGET) ; DEPENDS $(BUILD_TARGET) : $(2) ; } # Install # Installs in INSTALL_DIR by copying, stripping, # and setting file mode and ownership rule Install { if $(SKIP_INSTALL) != "YES" { LOCATE on $(2) = $(BUILD_DIR) ; # The installed product has Install grist. # As a convenience the target is also set with grist. local INSTALLED_PRODUCT = $(2:G=install) ; # always perform the installation DEPENDS $(1) : $(INSTALLED_PRODUCT) ; ALWAYS $(INSTALLED_PRODUCT) ; # installation directory must exist prior to copy Mkdir $(INSTALL_DIR) ; LOCATE on $(INSTALLED_PRODUCT) = $(INSTALL_DIR) ; DEPENDS $(INSTALLED_PRODUCT) : $(INSTALL_DIR) ; # built product target is wrapper or inner product for tools and libs if ( $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library ) && $(INNER_PRODUCT) { BUILT_PRODUCT = $(INNER_PRODUCT) ; } else { BUILT_PRODUCT = $(BUILD_DIR)$(/)$(2:G=) ; } # set built product location only if unset # this doesn't work because the reference must be fully qualified to match all uses # LOCATE on $(BUILT_PRODUCT) default = $(BUILD_DIR) ; # Wrapper set up in BeginProduct to depend on build target # if ! $(BUILT_PRODUCT) in $(PRODUCT_FILES) { # Mkdir $(BUILT_PRODUCT) ; # DEPENDS $(INSTALLED_PRODUCT) : $(BUILT_PRODUCT) ; # } # recursive copy of product (does not preserve resource forks) # need this dependence? # depending on the built product breaks builds because it may be implicitly built # DEPENDS $(INSTALLED_PRODUCT) : $(BUILT_PRODUCT) ; DEPENDS $(INSTALLED_PRODUCT) : $(2) ; BulkCopy $(INSTALLED_PRODUCT) : $(BUILT_PRODUCT) ; # additional resource preserving copies for special files for SPECIAL_FILE in $(PRESERVE_RESOURCES) { SPECIAL_FILE_INSTALLED_PATH default = $(INSTALL_DIR)$(/)$(SPECIAL_FILE:G=) ; # preserved copies are differentiated by "" grist # and depend on full installed path of the primary tar copy INSTALLED_PRODUCT_PATH default = $(INSTALL_DIR)$(/)$(INSTALLED_PRODUCT:G=) ; DEPENDS $(SPECIAL_FILE_INSTALLED_PATH:G=Preserve) : $(INSTALLED_PRODUCT_PATH) ; # also need this? DEPENDS $(SPECIAL_FILE_INSTALLED_PATH:G=Preserve) : $(INSTALLED_PRODUCT) ; DEPENDS $(1) : $(SPECIAL_FILE_INSTALLED_PATH:G=Preserve) ; ResourcePreservingCp $(SPECIAL_FILE_INSTALLED_PATH:G=Preserve) : $(SPECIAL_FILE) ; } # remove development property list if $(DEVELOPMENT_PLIST_FILE) { DEVELOPMENT_PLIST_FILE_REMOVE = $(DEVELOPMENT_PLIST_FILE:G=Remove) ; NOTFILE $(DEVELOPMENT_PLIST_FILE_REMOVE) ; DEPENDS $(1) : $(DEVELOPMENT_PLIST_FILE_REMOVE) ; DEPENDS $(DEVELOPMENT_PLIST_FILE_REMOVE) : $(INSTALLED_PRODUCT) ; RelativeRm $(DEVELOPMENT_PLIST_FILE_REMOVE) : $(INSTALL_DIR) ; } # strip the installed product, unless UNSTRIPPED_PRODUCT nonempty if $(STRIPPED_PRODUCT) && ( $(STRIP_INSTALLED_PRODUCT) = YES ) && $(UNSTRIPPED_PRODUCT) = "" { INSTALLED_STRIPPED_PRODUCT default = $(INSTALL_DIR)$(/)$(STRIPPED_PRODUCT:G=) ; LOCATE on $(INSTALLED_STRIPPED_PRODUCT) = $(INSTALL_DIR) ; DEPENDS $(INSTALLED_STRIPPED_PRODUCT) : $(INSTALL_DIR) ; if $(PRODUCT_TYPE) != Tool && $(PRODUCT_TYPE) != Application { STRIPFLAGS default = -S ; } STRIPFLAGS on $(INSTALLED_PRODUCT) = $(STRIPFLAGS) ; Strip $(INSTALLED_PRODUCT) : $(INSTALLED_STRIPPED_PRODUCT) ; } # set standard file mode and ownership INSTALL_MODE_FLAG on $(INSTALLED_PRODUCT) = $(INSTALL_MODE_FLAG) ; ChangeMode $(INSTALLED_PRODUCT) ; INSTALL_OWNER on $(INSTALLED_PRODUCT) = $(INSTALL_OWNER) ; INSTALL_GROUP on $(INSTALLED_PRODUCT) = $(INSTALL_GROUP) ; ChangeOwnerAndGroup $(INSTALLED_PRODUCT) ; # do any special owner, group, or mode setting if $(ALTERNATE_PERMISSIONS_FILES) { ALTERNATE_PERMISSIONS_FILES = /$(ALTERNATE_PERMISSIONS_FILES) ; ALTERNATE_PERMISSIONS_FILES = $(INSTALL_DIR)$(ALTERNATE_PERMISSIONS_FILES) ; ALTERNATE_PERMISSIONS_FILES = $(ALTERNATE_PERMISSIONS_FILES:G=AlternatePermissions) ; DEPENDS $(ALTERNATE_PERMISSIONS_FILES) : $(INSTALLED_PRODUCT) ; DEPENDS $(1) : $(ALTERNATE_PERMISSIONS_FILES) ; if $(ALTERNATE_MODE) { INSTALL_MODE_FLAG = $(ALTERNATE_MODE) ; INSTALL_MODE_FLAG on $(ALTERNATE_PERMISSIONS_FILES) = $(INSTALL_MODE_FLAG) ; ChangeMode $(ALTERNATE_PERMISSIONS_FILES) ; } if $(ALTERNATE_OWNER) { INSTALL_OWNER = $(ALTERNATE_OWNER) ; INSTALL_OWNER on $(ALTERNATE_PERMISSIONS_FILES) = $(INSTALL_OWNER) ; } if $(ALTERNATE_GROUP) { INSTALL_GROUP = $(ALTERNATE_GROUP) ; INSTALL_GROUP on $(ALTERNATE_PERMISSIONS_FILES) = $(INSTALL_GROUP) ; } if $(ALTERNATE_OWNER) || $(ALTERNATE_GROUP) { ChangeOwnerAndGroup $(ALTERNATE_PERMISSIONS_FILES) ; } } } else { DEPENDS $(1) : $(2) ; } } # InstallHeaders # Installs headers for the product in INSTALL_DIR by copying # and setting file mode and ownership rule InstallHeaders { if $(SKIP_INSTALL) != YES { # NO && ! ( ( $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library ) && ( HAS_PUBLIC_HEADERS != YES && HAS_PRIVATE_HEADERS != YES ) ) { # define installhdrs target and dependencies local ACTION_TARGET = $(2:G=installhdrs) ; ACTION on $(2) = $(ACTION) ; DEPENDS $(1) : $(ACTION_TARGET) ; DEPENDS $(ACTION_TARGET) : $(2) ; NOTFILE $(ACTION_TARGET) ; ALWAYS $(ACTION_TARGET) ; # installation directory must exist prior to copy Mkdir $(INSTALL_DIR) ; DEPENDS $(ACTION_TARGET) : $(INSTALL_DIR) ; LOCATE on $(ACTION_TARGET) = $(INSTALL_DIR) ; # target with full path needed for copy and preen local QUALIFIED_ACTION_TARGET = $(INSTALL_DIR)$(/)$(ACTION_TARGET:G=) ; DEPENDS $(ACTION_TARGET) : $(QUALIFIED_ACTION_TARGET) ; # recursive copy of product BulkCopy $(QUALIFIED_ACTION_TARGET) : $(BUILD_DIR)$(/)$(2:G=) ; # set standard file mode and ownership INSTALL_MODE_FLAG on $(QUALIFIED_ACTION_TARGET) = $(INSTALL_MODE_FLAG) ; ChangeMode $(QUALIFIED_ACTION_TARGET) ; INSTALL_OWNER on $(QUALIFIED_ACTION_TARGET) = $(INSTALL_OWNER) ; INSTALL_GROUP on $(QUALIFIED_ACTION_TARGET) = $(INSTALL_GROUP) ; ChangeOwnerAndGroup $(QUALIFIED_ACTION_TARGET) ; } } # InstallSource # Installs source for the product in SOURCE_ROOT by copying # and setting file mode and ownership rule InstallSource { local ACTION_TARGET = $(2:G=installsrc) ; ACTION on $(2) = $(ACTION) ; DEPENDS $(1) : $(ACTION_TARGET) ; NOTFILE $(ACTION_TARGET) ; DEPENDS $(ACTION_TARGET) : $(2) ; } # RunVariantHackScript varianthack : # Runs /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuild.sh rule RunVariantHackScript { if $(RC_JASPER) || $(BUILD_VARIANTS_ONLY_IN_JASPER) != YES { local VARIANT_HACK_TARGET = $(1:G=varianthack) ; DEPENDS $(1) : $(VARIANT_HACK_TARGET) ; NOTFILE $(VARIANT_HACK_TARGET) ; } } actions exportvars RunVariantHackScript { /bin/sh /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuilder.sh $(BUILD_VARIANTS) } # Copyright (c) 1999,2000 Apple Computer, Inc. # All rights reserved. include $(JAMFILE) ;