#PR-2876130-2.diffs# [plain text]
Index: pbxbuild.sh
===================================================================
RCS file: /cvs/Darwin/AppleADBDisplay/pbxbuild.sh,v
retrieving revision 1.1
retrieving revision 1.1.8.1
diff -u -d -b -w -r1.1 -r1.1.8.1
--- pbxbuild.sh	2001/08/22 23:39:51	1.1
+++ pbxbuild.sh	2002/06/06 19:00:58	1.1.8.1
@@ -23,24 +23,24 @@
 
 while [ $# -gt 0 ] ; do
 	case ${1} in
-		-h | -help)
+		-h | -help | -usage)
 			echo "$USAGE_TEXT"
 			exit 0
 			;;
-#		-target)
-#			shift
-#			if [ ! -z ${1} ]; then
-#				Target="${1}"
-#			fi
-#			shift
-#			;;
-#		-buildstyle)
-#			shift
-#			if [ ! -z ${1} ]; then
-#				BuildStyle="${1}"
-#			fi
-#			shift
-#			;;
+		-target)
+			shift
+			if [ ! -z ${1} ]; then
+				Target="${1}"
+			fi
+			shift
+			;;
+		-buildstyle)
+			shift
+			if [ ! -z ${1} ]; then
+				BuildStyle="${1}"
+			fi
+			shift
+			;;
 		-*)
 			echo "pbxbuild: invalid option '"${1}"'"
 			echo "$USAGE_TEXT"
@@ -81,10 +81,16 @@
 		TargetPath="${DataPath}/${Target}.build"
 		echo
 		echo "*** ${Action} ${Target} ***"
-		echo jam -d2 ${Action} JAMFILE=\"${TargetPath}/Jamfile.jam\" JAMBASE=pbxbuild.data/ProjectBuilderJambase TARGETNAME=\"${Target}\" ACTION=${Action} OS=darwin NATIVE_ARCH=`arch` SRCROOT=\"`pwd`\" OBJROOT=\"`pwd`/obj\" SYMROOT=\"`pwd`/sym\" DSTROOT=\"`pwd`/dst\" ${Assignments}
-		jam -d2 ${Action} JAMFILE="${TargetPath}/Jamfile.jam" JAMBASE=pbxbuild.data/ProjectBuilderJambase TARGETNAME="${Target}" ACTION=${Action} OS=darwin NATIVE_ARCH=`arch` SRCROOT="`pwd`" OBJROOT="`pwd`/obj" SYMROOT="`pwd`/sym" DSTROOT="`pwd`/dst" ${Assignments}
-		[ $? != 0 ] && exit 1
+		echo jam -d2 ${Action} JAMFILE=\"${TargetPath}/Jamfile.jam\" JAMBASE=pbxbuild.data/ProjectBuilderJambase TARGETNAME=\"${Target}\" BUILD_STYLE="${BuildStyle}" ACTION=${Action} OS=darwin NATIVE_ARCH=`arch` SRCROOT=\"`pwd`\" OBJROOT=\"`pwd`/obj\" SYMROOT=\"`pwd`/sym\" DSTROOT=\"`pwd`/dst\" ${Assignments}
+		jam -d2 ${Action} JAMFILE="${TargetPath}/Jamfile.jam" JAMBASE=pbxbuild.data/ProjectBuilderJambase TARGETNAME="${Target}" BUILD_STYLE="${BuildStyle}" ACTION=${Action} OS=darwin NATIVE_ARCH=`arch` SRCROOT="`pwd`" OBJROOT="`pwd`/obj" SYMROOT="`pwd`/sym" DSTROOT="`pwd`/dst" ${Assignments}
+		if [ $? != 0 ]; then
+			echo "*** ${Action} ${Target} FAILED ***"
+			exit 1
+		fi
 	done
 done
+
+echo
+echo "*** BUILD SUCCEEDED ***"
 
 exit 0
Index: AppleADBDisplay.pbproj/project.pbxproj
===================================================================
RCS file: /cvs/Darwin/AppleADBDisplay/AppleADBDisplay.pbproj/project.pbxproj,v
retrieving revision 1.6
retrieving revision 1.6.4.2
diff -u -d -b -w -r1.6 -r1.6.4.2
--- project.pbxproj	2002/02/07 02:13:01	1.6
+++ project.pbxproj	2002/06/06 19:00:58	1.6.4.2
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 34;
+	objectVersion = 38;
 	objects = {
 		06AA1264FFB2107B11CA28AA = {
 			buildActionMask = 2147483647;
@@ -12,7 +12,6 @@
 			generatedFileNames = (
 			);
 			isa = PBXShellScriptBuildPhase;
-			name = "Shell Script";
 			neededFileNames = (
 			);
 			shellPath = /bin/sh;
@@ -44,7 +43,6 @@
 			generatedFileNames = (
 			);
 			isa = PBXShellScriptBuildPhase;
-			name = "Shell Script";
 			neededFileNames = (
 			);
 			shellPath = /bin/sh;
@@ -100,7 +98,7 @@
 				LIBRARY_SEARCH_PATHS = "";
 				MODULE_IOKIT = YES;
 				MODULE_NAME = com.apple.driver.AppleADBDisplay;
-				MODULE_VERSION = 1.0.2d1;
+				MODULE_VERSION = 1.0.2d2;
 				OTHER_CFLAGS = "";
 				OTHER_LDFLAGS = "";
 				OTHER_REZFLAGS = "";
@@ -117,8 +115,8 @@
 			productName = AppleADBDisplay;
 			productReference = 0B81C263FFB7832611CA28AA;
 			productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
-<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">
-<plist version=\"0.9\">
+<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
+<plist version=\"1.0\">
 <dict>
 	<key>CFBundleDevelopmentRegion</key>
 	<string>English</string>
@@ -139,7 +137,7 @@
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.0.2d1</string>
+	<string>1.0.2d2</string>
 	<key>IOKitPersonalities</key>
 	<dict>
 		<key>AppleADBDisplay</key>
@@ -195,7 +193,7 @@
 		<string>1.0.0b1</string>
 	</dict>
 	<key>OSBundleRequired</key>
-	<string>Root</string>
+	<string>Safe Boot</string>
 </dict>
 </plist>
 ";
@@ -207,7 +205,6 @@
 				1A224C40FF42367911CA2CB7,
 			);
 			isa = PBXHeadersBuildPhase;
-			name = Headers;
 		};
 		089C1675FE841209C02AAC07 = {
 			buildActionMask = 2147483647;
@@ -215,7 +212,6 @@
 				089C1680FE841241C02AAC07,
 			);
 			isa = PBXResourcesBuildPhase;
-			name = "Bundle Resources";
 		};
 		089C1676FE841209C02AAC07 = {
 			buildActionMask = 2147483647;
@@ -223,21 +219,18 @@
 				1A224C41FF42367911CA2CB7,
 			);
 			isa = PBXSourcesBuildPhase;
-			name = Sources;
 		};
 		089C1677FE841209C02AAC07 = {
 			buildActionMask = 2147483647;
 			files = (
 			);
 			isa = PBXFrameworksBuildPhase;
-			name = "Frameworks & Libraries";
 		};
 		089C1679FE841209C02AAC07 = {
 			buildActionMask = 2147483647;
 			files = (
 			);
 			isa = PBXRezBuildPhase;
-			name = "ResourceManager Resources";
 		};
 		089C167CFE841241C02AAC07 = {
 			children = (
Index: pbxbuild.data/ProjectBuilderJambase
===================================================================
RCS file: /cvs/Darwin/AppleADBDisplay/pbxbuild.data/ProjectBuilderJambase,v
retrieving revision 1.1
retrieving revision 1.1.8.2
diff -u -d -b -w -r1.1 -r1.1.8.2
--- ProjectBuilderJambase	2001/08/22 23:39:52	1.1
+++ ProjectBuilderJambase	2002/06/06 19:00:59	1.1.8.2
@@ -15,7 +15,7 @@
     include $(JAMBASE_DIR)/platform-$(OS).jam ;
 }
 
-# Copyright (c) 1999,2000 Apple Computer, Inc.
+# Copyright (c) 1999-2002 Apple Computer, Inc.
 # All rights reserved.
 
 # This file defines various functions for transforming text and
@@ -24,16 +24,16 @@
 / default = / ;
 
 # NonObjectFiles <non-object files returned> : <list of files>
-# Returns only files not in $(OBJECT_FILES) or $(OBJECT_FILES_$(ARCH))
-# for ARCH in $(ARCHS)
+# Returns only files not in $(OBJECT_FILES_$(VARIANT)
+# or $(OBJECT_FILES_$(VARIANT)_$(ARCH)) for ARCH in $(ARCHS)
 rule NonObjectFiles
 {
     $(1) = ;
     for X in $(2) {
-        if ! $(X) in $(OBJECT_FILES) {
+        if ! $(X) in $(OBJECT_FILES_$(VARIANT)) {
             REJECT = ;
             for ARCH in $(ARCHS) {
-                if $(X) in $(OBJECT_FILES_$(ARCH)) {
+                if $(X) in $(OBJECT_FILES_$(VARIANT)_$(ARCH)) {
                     REJECT = YES ;
                 }
             }
@@ -67,15 +67,143 @@
     }
     $(1) = $(newname) ;
 }
-# Copyright (c) 1999,2000 Apple Computer, Inc.
+# Copyright (c) 1999-2002 Apple Computer, Inc.
 # All rights reserved.
 
-# Maps legacy Makefile variables to modern Jambase variables
+# 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 directories 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) ;
+
+# 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" ;
+
+# language-independent code generation settings
+       deferred OPTIMIZATION_LEVEL = 0 ;
+       deferred OPTIMIZATION_CFLAGS = -O ;
+       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 = MACINTOSH ;
+
+# miscellaneous
+export deferred DEVELOPMENT_LANGUAGE = English ;
+export deferred FRAMEWORK_VERSION = A ;
+       deferred REMOVE_CVS_FROM_RESOURCES = YES ;
+       deferred COPY_PHASE_STRIP = NO ;
+       deferred CLONE_HEADERS = NO ;
+       deferred KEEP_PRIVATE_EXTERNS = YES ;   # this currently affects the master.o file only
+
+
+rule ConditionalDefinitions
+{
+    # default mapping of build actions to build variants
+    switch $(ACTION) {
+        case build : deferred BUILD_COMPONENTS = headers build ;
+        case copysrc : deferred BUILD_COMPONENTS = source ;
+        case copyhdrs : deferred BUILD_COMPONENTS = headers ;
+        case copyrsrcs : deferred BUILD_COMPONENTS = resources ;
+        case install : deferred BUILD_COMPONENTS = headers build ; 
+         deferred DEPLOYMENT_LOCATION = YES ;
+         deferred DEPLOYMENT_POSTPROCESSING = YES ;
+        case installdebugonly : deferred BUILD_COMPONENTS = build ;
+         deferred DEPLOYMENT_LOCATION = YES ;
+         deferred DEPLOYMENT_POSTPROCESSING = YES ;
+         deferred BUILD_VARIANTS = debug ;
+        case installprofileonly : deferred BUILD_COMPONENTS = build ;
+         deferred DEPLOYMENT_LOCATION = YES ;
+         deferred DEPLOYMENT_POSTPROCESSING = YES ;
+         deferred BUILD_VARIANTS = profile ;
+        case installdebugprofileonly : deferred BUILD_COMPONENTS = build ;
+         deferred DEPLOYMENT_LOCATION = YES ;
+         deferred DEPLOYMENT_POSTPROCESSING = YES ;
+         deferred BUILD_VARIANTS = debug profile ;
+        case installhdrs : deferred BUILD_COMPONENTS = headers ;
+         deferred DEPLOYMENT_LOCATION = YES ;
+         deferred DEPLOYMENT_POSTPROCESSING = YES ;
+        case installsrc : deferred BUILD_COMPONENTS = source ;
+         deferred DEPLOYMENT_LOCATION = YES ;
+         deferred DEPLOYMENT_POSTPROCESSING = YES ;
+        case installrsrcs : deferred BUILD_COMPONENTS = resources ;
+         deferred DEPLOYMENT_LOCATION = YES ;
+         deferred DEPLOYMENT_POSTPROCESSING = YES ;
+    }
+
+    # conditional locations enabling install-in-place
+    if $(DEPLOYMENT_LOCATION) = YES {
+        if $(SKIP_INSTALL) || ! $(INSTALL_PATH) {
+            # !!!:cmolick:20020301 uninstalled products might best go to
+            #  the built products dir, or a subfolder if there are asides
+            export deferred TARGET_BUILD_DIR = $(TEMP_ROOT)/UninstalledProducts ;
+        }
+        else {
+            export deferred TARGET_BUILD_DIR = $(INSTALL_ROOT)/$(INSTALL_PATH) ;
+        }
+        deferred BASE_PROJECT_HEADER_DIR = $(TEMP_ROOT)/ProjectHeaders ;
+        if $(INSTALLED_PRODUCT_ASIDES) = YES {
+            # built products go in subfolder when there are asides
+            export deferred BUILT_PRODUCTS_DIR = $(BUILD_ROOT)/BuiltProducts ;
+        }
+        else {
+            # built products go in build folder when there are no asides
+            export deferred BUILT_PRODUCTS_DIR = $(BUILD_ROOT) ;
+        }
+    }
+    else {
+        export deferred TARGET_BUILD_DIR = $(BUILD_DIR) ;
+        export deferred BUILT_PRODUCTS_DIR = $(BUILD_DIR) ;
+        deferred BASE_PROJECT_HEADER_DIR = $(BUILD_ROOT)/ProjectHeaders ;
+    }
+}
+# Copyright (c) 1999-2002 Apple Computer, Inc.
+# All rights reserved.
+
+# old skool...
 # Source root is SRCROOT, or ., or working directory
 # Root values are overridden by default
-SRCROOT default = $(PWD) ;
-SRCROOT default = . ;
-SOURCE_ROOT default = $(SRCROOT) ;
+#SRCROOT default = $(PWD) ;
+#SRCROOT default = . ;
+#SOURCE_ROOT default = $(SRCROOT) ;
+
+# 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) ;
@@ -86,18 +214,37 @@
         $(ARCH) = YES ;
     }
 }
-# Copyright (c) 1999,2000 Apple Computer, Inc.
+
+# 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 = $(TEMP_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 ;
-CC		default = /usr/bin/cc ;
+# !!!: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 ;
@@ -113,10 +260,13 @@
 JAR		default = /usr/bin/jar ;
 export JAVA_COMPILER	default = /usr/bin/javac ;
 export JAVACONFIG	default = /usr/bin/javaconfig ;
-LD		default = /usr/bin/cc ;
+# !!!: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 ;
+LNRESOLVE       default = $(SYSTEM_DEVELOPER_TOOLS)/lnresolve ;
 MAKEPSEUDOLIB	default = $(APPLE_INTERNAL_TOOLS)/MakePseudoLibrary ;
 MERGEINFO	default = /usr/lib/mergeInfo ;
 MKDIR		default = /bin/mkdir ;
@@ -230,17 +380,6 @@
     $(ECHO) "$(2)" >> "$(1)"
 }
 
-# RawEcho <file> : <text>
-# Echoes text into a file without trailing newline
-rule RawEcho
-{
-    NOTFILE "$(2)" ;
-}
-actions RawEcho
-{
-    $(ECHO) -n "$(2)" > "$(1)"
-}
-
 # ChangeOwnerAndGroup and ChangeMode to use when installing files
 # All these use the -H option to avoid traversing bad symbolic links
 rule ChangeOwnerAndGroup
@@ -273,15 +412,11 @@
     fi
 }
 
-# Strip <target> : <executable>
+# Strip <target>
 # Runs strip to remove debugging symbols from the executable of the target
-rule Strip
-{
-    DEPENDS $(1) : $(2) ;
-}
 actions Strip
 {
-    $(STRIP) $(STRIPFLAGS) "$(2)"
+    $(STRIP) $(STRIPFLAGS) "$(1)"
 }
 
 # SetFile <fork file>
@@ -291,10 +426,10 @@
     local MACOS_TYPE_ARG ;
     local MACOS_CREATOR_ARG ;
     if $(MACOS_TYPE) {
-        MACOS_TYPE_ARG = "-t" "'$(MACOS_TYPE)'" ;
+        MACOS_TYPE_ARG = -t '$(MACOS_TYPE)' ;
     }
     if $(MACOS_CREATOR) {
-        MACOS_CREATOR_ARG = "-c" "'$(MACOS_CREATOR)'" ;
+        MACOS_CREATOR_ARG = -c '$(MACOS_CREATOR)' ;
     }
     SETFILEFLAGS on $(1) = $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) "$(OTHER_SETFILEFLAGS)" ;
 }
@@ -311,10 +446,10 @@
     local MACOS_CREATOR_ARG ;
     DEPENDS $(1) : $(2) ;
     if $(MACOS_TYPE) {
-        MACOS_TYPE_ARG = "-t" "'$(MACOS_TYPE)'" ;
+        MACOS_TYPE_ARG = -t '$(MACOS_TYPE)' ;
     }
     if $(MACOS_CREATOR) {
-        MACOS_CREATOR_ARG = "-c" "'$(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" {
@@ -335,10 +470,10 @@
     local MACOS_CREATOR_ARG ;
     DEPENDS $(1) : $(2) ;
     if $(MACOS_TYPE) {
-        MACOS_TYPE_ARG = "-fileType" "'$(MACOS_TYPE)'" ;
+        MACOS_TYPE_ARG = -fileType '$(MACOS_TYPE)' ;
     }
     if $(MACOS_CREATOR) {
-        MACOS_CREATOR_ARG = "-fileCreator" "'$(MACOS_CREATOR)'" ;
+        MACOS_CREATOR_ARG = -fileCreator '$(MACOS_CREATOR)' ;
     }
     RESMERGEFLAGS on $(1) = -append $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) $(OTHER_RESMERGERFLAGS) ;
     if ! $(REZ_EXECUTABLE) = "YES" {
@@ -351,6 +486,109 @@
     $(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 <precomp> : <header>
 # Ensures that the precompiled header is up to date
 if $(FIXPRECOMPS) {
@@ -380,13 +618,12 @@
 rule Cp
 {
     DEPENDS $(1) : $(2) ;
-    if $(2) != $(JAVA_APP_STUB) {
-        CPFLAGS on $(1) default = -fRP ;
-    }
 }
+# !!!:cmolick:20020130 use of lnresolve allows references to be symbolic links
 actions together piecemeal Cp
 {
-    $(CP) "$(CPFLAGS)" "$(2)" "$(1)"
+    _source=`$(LNRESOLVE) "$(2)"`
+    $(CP) "$(CPFLAGS)" "$_source" "$(1)"
 }
 
 # RobustCp <destination> : <source>
@@ -398,11 +635,11 @@
     if ! $(ACTION) = installhdrs {
         DEPENDS $(1) : $(2) ;
     }
-    if $(REMOVE_CVS_FROM_RESOURCES) = YES {
+    if $(REMOVE_CVS_FROM_RESOURCES) = YES && $(DEPLOYMENT_POSTPROCESSING) = YES {
         RobustCp.CleanBeforeAndAfter $(1) : $(2) ;
     }
     else {
-        RobustCP.CleanBefore $(1) : $(2) ;
+        RobustCp.CleanBefore $(1) : $(2) ;
     }
     if $(COPY_PHASE_STRIP) = YES && ! $(ACTION) = installhdrs {
         StripBinaries $(1) ;
@@ -415,8 +652,9 @@
     fi
     if [ -e "$(2)" ]
         then
-        $(CP) -fRP "$(2)" "$(1)"
-        if [ -d "$(2)" ]
+        _source=`$(LNRESOLVE) "$(2)"`
+        $(CP) -fRP "$_source" "$(1)"
+        if [ -d "$_source" ]
             then
             $(FIND) "$(1)" -name CVS -type d -prune -print0 | $(XARGS) -0 rm -r
         fi
@@ -428,12 +666,13 @@
         then $(RM) -r "$(1)"
     fi
     if [ -e "$(2)" ]
-        then $(CP) -fRP "$(2)" "$(1)"
+        then _source=`$(LNRESOLVE) "$(2)"`
+        $(CP) -fRP "$_source" "$(1)"
     fi
 }
+
 # StripBinaries <starting directory>
 # Uses find to run strip -s on all binaries starting from a file or directory
-
 actions StripBinaries
 {
     if [ -f "$(1)" ]; then
@@ -500,18 +739,6 @@
     $(RESOURCE_PRESERVING_CP) -r "$(2)" "$(1)"
 }
 
-# BulkCopy <destination dir> : <source dir>
-rule BulkCopy
-{
-    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 <primary target> : <header> : <target directory>
 # Writes in the target directory a stub clone of the header
 # which contains only an #import directive with the path
@@ -544,36 +771,26 @@
     DEPENDS $(HEADER_CLONE) : $(3) ;
     if ! $(3) in $(PRODUCT_FILES) {
         Mkdir $(3) ;
-        PRODUCT_FILES += $(3) ;
-        if $(BUILD_PHASING) = YES {
-            BUILD_PHASE_PRODUCTS += $(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) ;
-            PRODUCT_FILES += $(PRIVATE_HEADER_CLONE_LINK) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(PRIVATE_HEADER_CLONE_LINK) ;
-            }
+            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) ;
-            PRODUCT_FILES += $(PUBLIC_HEADER_CLONE_LINK) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(PUBLIC_HEADER_CLONE_LINK) ;
-            }
+            ProductFile $(PUBLIC_HEADER_CLONE_LINK) ;
         }
     }
     # make clone and record as build phase product
     ImportStub $(HEADER_CLONE) : $(HEADER_PATH) ;
-    if $(BUILD_PHASING) = YES {
-        BUILD_PHASE_PRODUCTS += $(HEADER_CLONE) ;
-    }
+    ProductFile $(HEADER_CLONE) ;
+    LOCATE on $(HEADER_CLONE) = $(3) ;
 }
 
 # ImportStub <stub file> : <stub import file>
@@ -679,14 +896,13 @@
 rule Mig
 {
     DEPENDS $(1) : $(2) ;
-    if $(MACH_SERVER) = YES || $(MACH_CLIENT_AND_SERVER) = YES {
+    # was: $(MACH_SERVER) = YES || $(MACH_CLIENT_AND_SERVER) = YES
+    if Server in $($(2)_ATTRIBUTES) {
         Mig.server $(1) : $(2) ;
     }
     else {
         Mig.client $(1) : $(2) ;
     }
-    #!!!:cmolick:20010308 alternative shell setting not necessary or good?
-    JAMSHELL on $(1) = $(SH) -c ;
 }
 actions Mig.client
 {
@@ -700,35 +916,58 @@
 # Bridget <primary target> : <jobs file>
 rule Bridget
 {
+    # set up common settings and paths needed for 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) ;
     }
-    JAVA_BRIDGET_TARGET = $(1:G=Bridget) ;
-    NOTFILE $(JAVA_BRIDGET_TARGET) ;
-    DEPENDS $(1) : $(JAVA_BRIDGET_TARGET) ;
-    DEPENDS $(JAVA_BRIDGET_TARGET) : $(BRIDGET_FILES_DIR) ;
-    DEPENDS $(JAVA_BRIDGET_TARGET) : $(OBJECT_FILE_DIR) ;
-    Bridget.DeriveSources $(JAVA_BRIDGET_TARGET) : $(2) ;
     if $(BRIDGE_JAVA) = YES {
-        JAVA_BRIDGE_COMPILE_TARGET = $(1:G=JavaBridgeCompile) ;
-        NOTFILE $(JAVA_BRIDGE_COMPILE_TARGET) ;
-        DEPENDS $(1) : $(JAVA_BRIDGE_COMPILE_TARGET) ;
-        DEPENDS $(JAVA_BRIDGE_COMPILE_TARGET) : $(JAVA_BRIDGET_TARGET) ;
-        DEPENDS $(JAVA_BRIDGE_COMPILE_TARGET) : $(CLASS_FILE_DIR) ;
-        BRIDGETFLAGS on $(JAVA_BRIDGET_TARGET) = -java ;
-        if $(BUILD_PHASING) = YES {
-            BUILD_PHASE_PRODUCTS += $(JAVA_BRIDGE_COMPILE_TARGET) ;
-        }
+        # 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.CompileJava.jikes $(JAVA_BRIDGE_COMPILE_TARGET) : $(2) ;
+            Bridget. DeriveAndCompileJava.jikes $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(2) ;
         }
         else {
-            Bridget.CompileJava.default $(JAVA_BRIDGE_COMPILE_TARGET) : $(2) ;
+            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 ;
@@ -755,50 +994,79 @@
             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 ;
+            local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(1:DB).ilog ;
             BRIDGET_CFLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
         }
-        for HEADER in $(IMPLICITLY_INCLUDED_HEADERS) {
-            IMPLICIT_INCLUSION_FLAGS on $(1) += -include $(HEADER) ;
+        if $(PREFIX_HEADER) {
+            PREFIX_HEADER_CFLAGS on $(1) += -include $(PREFIX_HEADER) ;
         }
-        Bridget.CompileC $(1) : $(2) ;
+        Bridget.DeriveAndCompileC $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(2) ;
     }
 }
-actions Bridget.DeriveSources
+# Bridget.UpdateJavaFileList <list update target> <bridget file> generates draft
+# and updates definitive list if it is missing or out of date
+actions Bridget.UpdateJavaFileList
 {
-    $(BRIDGET) -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)"
+    $(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.CompileJava.jikes
+actions Bridget.DeriveAndCompileJava.javac
 {
-    _java_sources=`$(BRIDGET) -listjava -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):$(JAVA_SOURCE_PATH)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath`
-    cd "$(BRIDGET_FILES_DIR)"
-    $(JAVA_COMPILER) +E $(JAVAC_FLAGS) -classpath "$classpath" -d "$(CLASS_FILE_DIR)" $_java_sources
+    $(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.CompileJava.default
+actions Bridget.DeriveAndCompileJava.jikes
 {
-    _java_sources=`$(BRIDGET) -listjava -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)" $_java_sources
+    $(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=)"
 }
 
-actions Bridget.CompileC
+# Bridget.CompileC.UpdateFileList <list update target> <bridget file> generates draft
+# and updates definitive list if it is missing or out of date
+actions Bridget.UpdateCFileList
 {
-    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)" $(IMPLICIT_INCLUSION_FLAGS) *.m
-    find "$(BRIDGET_FILES_DIR)" -type f -name '*.o' -print > "$(BRIDGET_FILE_LIST)"
+    $(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$(TARGET_BUILD_DIR)/$(PUBLIC_HEADER_DIR:G=)" "-I$(TARGET_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 <vector stub> <vector object file> : <exports file>
 # Generates and compiles vector stub
 rule GenerateVectorLibraryIntermediates
 {
     DEPENDS $(1) : $(2) ;
+    LOCATE on $(2) = $(SOURCE_ROOT) ;
     VECTOR_STUB on $(1) = $(VECTOR_STUB) ;
     VECTOR_OBJECT_FILE on $(1) = $(VECTOR_OBJECT_FILE) ;
     VECTOR_FRAGMENT_NAME on $(1) = $(VECTOR_FRAGMENT_NAME) ;
@@ -807,7 +1075,7 @@
 }
 actions GenerateVectorLibraryIntermediates
 {
-    "$(MAKEPSEUDOLIB)" "$(2)" -strip -fragname "$(VECTOR_FRAGMENT_NAME)" -vector "$(VECTOR_STUB)" -dylibpath "$(DYLIB_INSTALLED_NAME)" && \
+    $(MAKEPSEUDOLIB) "$(2)" -p -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)"
 }
 
@@ -818,7 +1086,7 @@
 rule InterfacerHeaders
 {
     INTERFACER_CACHE default = $(TEMP_DIR)$(/)InterfacerCache ;
-    local BUILD_DIR_AND_SEPARATOR = $(BUILD_DIR)$(/) ;
+    local BUILD_DIR_AND_SEPARATOR = $(TARGET_BUILD_DIR)$(/) ;
     INTERFACER_HEADERS = $(1:G=InterfacerHeaders) ;
     if $(INTERFACER_TARGET_UPDATE) {
         INTERFACER_HEADER_OPTIONS += -externalHeader $(INTERFACER_TARGET_UPDATE) ;
@@ -827,29 +1095,84 @@
     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 {
+   # 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) ;
+        ProductFile $(PUBLIC_HEADER_LINK) ;
+        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+            ASIDE_PUBLIC_HEADER_LINK default = $(PUBLIC_HEADER_LINK:G=aside) ;
+            SymLink $(ASIDE_PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ;
+            ProductFileAside $(ASIDE_PUBLIC_HEADER_LINK) ;
+        }
+        NOUPDATE $(PUBLIC_HEADER_LINK) ;
+    }
+    # Create symlink to private header dir in versioned frameworks
+    if $(PRIVATE_HEADER_LINK)
+      && ! $(PRIVATE_HEADER_LINK) in $(PRODUCT_FILES) {
+        SymLink $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
+        ProductFile $(PRIVATE_HEADER_LINK) ;
+        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+            ASIDE_PRIVATE_HEADER_LINK default = $(PRIVATE_HEADER_LINK:G=aside) ;
+            SymLink $(ASIDE_PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
+            ProductFileAside $(ASIDE_PRIVATE_HEADER_LINK) ;
+        }
+        NOUPDATE $(PRIVATE_HEADER_LINK) ;
+    }
+
+    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=) ;
+
+#    Mkdir $(FULL_PUBLIC_HEADER_DIR) ;
+#    DEPENDS $(INTERFACER_HEADERS) : $(FULL_PUBLIC_HEADER_DIR) ;
+#    DEPENDS $(INTERFACER_HEADERS) : $(BUILD_DIR_AND_SEPARATOR)$(PUBLIC_HEADER_DIR:G=) ;
+#    if ! $(PUBLIC_HEADER_LINK) in $(PRODUCT_FILES) {
+#        SymLink $(BUILD_DIR_AND_SEPARATOR)$(PUBLIC_HEADER_LINK:G=) : $(PUBLIC_HEADER_LINK_PATH) ;
+#    }
+#    Mkdir $(FULL_PRIVATE_HEADER_DIR) ;
+#    DEPENDS $(INTERFACER_HEADERS) : $(FULL_PRIVATE_HEADER_DIR) ;
+#    DEPENDS $(INTERFACER_HEADERS) : $(BUILD_DIR_AND_SEPARATOR)$(PRIVATE_HEADER_DIR:G=) ;
+#    if ! $(PRIVATE_HEADER_LINK) in $(PRODUCT_FILES) {
+#        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=) ;
+#    }
+    # Create a public header directory
+    if ! $(PUBLIC_HEADER_DIR) in $(PRODUCT_FILES) {
+        Mkdir $(PUBLIC_HEADER_DIR) ;
+        ProductFile $(PUBLIC_HEADER_DIR) ;
+        DEPENDS $(INTERFACER_HEADERS) : $(PUBLIC_HEADER_DIR) ;
+        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+            ASIDE_PUBLIC_HEADER_DIR default = $(PUBLIC_HEADER_DIR:G=aside) ;
+            Mkdir $(ASIDE_PUBLIC_HEADER_DIR) ;
+            ProductFileAside $(ASIDE_PUBLIC_HEADER_DIR) ;
+        }
+    }
+    # Create a private header directory
+    if ! $(PRIVATE_HEADER_DIR) in $(PRODUCT_FILES) {
+        Mkdir $(PRIVATE_HEADER_DIR) ;
+        ProductFile $(PRIVATE_HEADER_DIR) ;
+        DEPENDS $(INTERFACER_HEADERS) : $(PRIVATE_HEADER_DIR) ;
+        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+            ASIDE_PRIVATE_HEADER_DIR default = $(PRIVATE_HEADER_DIR:G=aside) ;
+            Mkdir $(ASIDE_PRIVATE_HEADER_DIR) ;
+            ProductFileAside $(ASIDE_PRIVATE_HEADER_DIR) ;
     }
+    }
+
     Interfacer.Headers $(INTERFACER_HEADERS) ;
+    # Interfacer headers are required (ideally these should be phase products)
+    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=)/"
+    $(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
@@ -858,7 +1181,6 @@
     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?
@@ -867,15 +1189,14 @@
     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 $(PROCESSED_EXPORTS_FILE) : $(RAW_GENERATED_PRIVATE_EXPORTS_FILE) ;
+    # !!!:cmolick:20020105 this dependence appears superfluous
+    # 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 {
+    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) ;
@@ -884,11 +1205,20 @@
         INTERFACER_FLAGS += -componentGlueC ;
         INTERFACER_COMPONENT_GLUE_FLAGS = -generated "componentGlueC=$(COMPONENT_GLUE_DIR)/" -generatedPriv "componentGlueC=$(COMPONENT_GLUE_DIR)/" ;
     }
-    Interfacer.RawExportSetsAndGlue $(RAW_GENERATED_EXPORTS_FILE) : $(1) ;
-    Interfacer.CombineExportLists $(RAW_GENERATED_EXPORTS_FILE) : $(RAW_GENERATED_PRIVATE_EXPORTS_FILE) ;
+    for VARIANT in $(BUILD_VARIANTS) {
+        DEPENDS $(PROCESSED_EXPORTS_FILE) : $(OBJECT_FILE_DIR_$(VARIANT)) ;
+    }
+    GLUE_FILE_LIST default = $(TEMP_DIR)$(/)GlueFileList ;
+    #!!!:cmolick:20020319 bad build_variants reference was here at one time
+    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) ;
+    #!!!:cmolick:200203019 this dependence seems necessary for correct order
+    DEPENDS $(PROCESSED_EXPORTS_FILE) : $(RAW_GENERATED_EXPORTS_FILE) ;
     EXPORTED_SYMBOLS_FILE default = $(PROCESSED_EXPORTS_FILE) ;
     ProcessFile $(1) : $(EXPORTED_SYMBOLS_FILE) ;
 }
@@ -898,23 +1228,26 @@
 # 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: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)
+    $(INTERFACER) -masterInterfaces "$(MASTER_INTERFACES)/" -cacheFolder "$(INTERFACER_CACHE)/" -exportset -uppGlueC "$(INTERFACER_FLAGS)" -framework "$(2[1]: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)
+    if [ -e "$(UPP_GLUE_DIR)" ]; then
+        _upp_glue_modules=`ls "$(UPP_GLUE_DIR)"`
+        if [ ! "$_upp_glue_modules" = x"$_upp_glue_modules" ]; then
     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
+            for _upp_glue in *.c ; do
+                $(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$(BUILT_PRODUCTS_DIR)/$(PUBLIC_HEADER_DIR:G=)" "-I$(BUILT_PRODUCTS_DIR)/$(PRIVATE_HEADER_DIR:G=)" $_upp_glue
+            done
     find "$(UPP_GLUE_DIR)" -type f -name '*.i.o' -print > "$(GLUE_FILE_LIST)"
-    if [ -e "$(COMPONENT_GLUE_DIR)"/*.i.c ]; then
+        fi
+    fi
+    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
+            for _component_glue in *.c ; do
+                $(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$(BUILT_PRODUCTS_DIR)/$(PUBLIC_HEADER_DIR:G=)" "-I$(BUILT_PRODUCTS_DIR)/$(PRIVATE_HEADER_DIR:G=)" $_component_glue
+            done
         find "$(COMPONENT_GLUE_DIR)" -type f -name '*.i.o' -print >> "$(GLUE_FILE_LIST)"
     fi
-}
-
-actions Interfacer.CombineExportLists
-# Copies the contents of any private export list into the main public list
-{
-    if [ -f "$(2)" ]; then
-        chmod +w "$(1)"
-        cat "$(2)" >> "$(1)"
     fi
 }
 
@@ -922,16 +1255,22 @@
 # Translates PEF-oriented Interfacer export list output into
 # nmedit-compatible export lists for use with mach-o.
 {
-    cat "$(2)" |
-     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)"
+    _initial_working_dir=`pwd`
+    cd "$(EXPORT_SETS_DIR)"
+    ls | $(EGREP) '^fw_$(PRODUCT_NAME)(Priv)?_.+.exp$' > "$(EXPORT_SETS_DIR)$(/)_GeneratedExports"
+    cat `cat "$(EXPORT_SETS_DIR)$(/)_GeneratedExports"` > "$(EXPORT_SETS_DIR)$(/)_Generated.exp"
+    cat "$(EXPORT_SETS_DIR)$(/)_Generated.exp" | grep -v ^\* | grep -v ^# | grep -v ^\$ | sort | uniq -u | sed -e '1,$ s/^/_/' > "$(1)"
+    cd "$_initial_working_dir"
+    _additional_exports_file="$(ADDITIONAL_EXPORTS_FILE)"
+    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)" |
+    _additional_traditional_exports_file="$(ADDITIONAL_TRADITIONAL_EXPORTS_FILE)"
+    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
@@ -959,6 +1298,7 @@
         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) ;
@@ -978,23 +1318,29 @@
 # 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)" *
+    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)" *
+    cd "$(2)" && $(ZIP) $(ZIPFLAGS) $(OTHER_ZIPFLAGS) "$(1)" .
 }
 
 # Bulk copy of class files
 # ClassCopy <product class file dir> : <compiled class file dir>
 actions ClassCopy {
-    cd "$(2:G=)" && $(PAX) -pe -rw * "$(1:G=)"
+    mkdir -p "$(1:G=)" && cd "$(2:G=)" && $(PAX) -pe -rw . "$(1:G=)"
 }
 
 # Unarchive <location> : <archive>
 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) ;
@@ -1021,21 +1367,44 @@
 {
     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) ;
+
+    MASTER_OBJECT_FILE_$(VARIANT) default = $(OBJECT_FILE_DIR_$(VARIANT))$(/)ProjectBuilderMasterObjectFile.o ;
+    NonObjectFiles OTHER_LINKED_FILES : $(LINKED_FILES_$(VARIANT)) ;
+    MasterObjectFile $(MASTER_OBJECT_FILE_$(VARIANT)) : $(OBJECT_FILES_$(VARIANT)) : $(EXPORTED_SYMBOLS_FILE) ;
     if $(OTHER_LINKED_FILES) = "" {
-        OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE) ;
+        OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE_$(VARIANT)) ;
     }
     else {
-        OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE) ;
+        OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(VARIANT)) ;
     }
     if $(VECTOR_OBJECT_FILE) {
         OTHER_LINKED_FILES += $(VECTOR_OBJECT_FILE) ;
     }
-    $(3) $(INNER_PRODUCT) : $(OTHER_LINKED_FILES) ;
+    $(3) $(INNER_PRODUCT_$(VARIANT)) : $(OTHER_LINKED_FILES) ;
 }
 
+# ProcessLinkWithArchitectureSpecificEditing <executable> : <inputs> : <rule>
+rule ProcessLinkWithArchitectureSpecificEditing
+{
+    for ARCH in $(ARCHS) {
+        MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT) default = $(OBJECT_FILE_DIR_$(VARIANT))$(/)ProjectBuilderMasterObjectFile$(ARCH).o ;
+        MasterObjectFile $(MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT)) : $(OBJECT_FILES_$(ARCH)_$(VARIANT)) : $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ;
+    }
+    NonObjectFiles OTHER_LINKED_FILES : $(LINKED_FILES_$(VARIANT)) ;
+    for ARCH in $(ARCHS) {
+        if $(OTHER_LINKED_FILES) = "" {
+            OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT)) ;
+        }
+        else {
+            OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT)) ;
+        }
+    }
+    if $(VECTOR_OBJECT_FILE) {
+        OTHER_LINKED_FILES += $(VECTOR_OBJECT_FILE) ;
+    }
+    $(3) $(INNER_PRODUCT_$(VARIANT)) : $(OTHER_LINKED_FILES) ;
+}
+
 # ProcessLink <executable> : <inputs> : <rule>
 # Processes <inputs> into <rule>.ARGUMENTS for later use by the <rule> rule
 # where <inputs> are object files, libraries, frameworks, object file lists,
@@ -1059,8 +1428,8 @@
     # 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) ;
+    LINK_FILE_LIST_$(VARIANT) = $(FILE_LIST_$(VARIANT)) ;
+    DEPENDS $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
     # Deal with each input file in turn
     local LINKED ;
     local ARGUMENT ;
@@ -1070,9 +1439,9 @@
             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) ;
+                    ClearFileList $(LINK_FILE_LIST_$(VARIANT)) ;
+                    AppendToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(LINKED) ;
+                    DEPENDS $(LINK_FILE_LIST_$(VARIANT)) : $(LINKED) ;
                 } else {
                     $(RULE).ARGUMENTS on $(1) += $(LINKED) ;
                 }
@@ -1146,10 +1515,10 @@
     }
     # include any object files compiled from objc generated with bridget
     if $(BRIDGET_FILE_LIST) {
-        AppendFileToFileList $(LINK_FILE_LIST) : $(BRIDGET_FILE_LIST) ;
+        AppendFileToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(BRIDGET_FILE_LIST) ;
     }
     if $(BATCH_OFILES) != NO {
-        $(RULE).LinkUsingFileList $(1) ;
+        $(RULE).LinkUsingFileList $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
     }
     else {
         $(RULE).Link $(1) ;
@@ -1188,11 +1557,11 @@
 }
 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)" )
+    ( $(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)" )
+    ( $(LIBTOOL) -o "$(1)" "-L$(LIBRARY_SEARCH_PATHS)" -filelist "$(2)" "$(StaticLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) && $(RANLIB) "$(1)" )
 }
 StaticLibrary.FRAMEWORK_FLAG = ;
 StaticLibrary.LIBRARY_FLAG = ;
@@ -1204,7 +1573,6 @@
 rule StandaloneExecutable
 {
     ProcessLink $(1) : $(2) ;
-    LD on $(1) = $(LD) ;
     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) ;
@@ -1221,11 +1589,11 @@
 }
 actions quietly together StandaloneExecutable.Link bind StandaloneExecutable.ARGUMENTS
 {
-    $(LD) -o "$(1)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) "$(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) -o "$(1)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" -filelist "$(LINK_FILE_LIST)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) "$(StandaloneExecutable.ARGUMENTS)"
+    $(_LD_FOR_LINKING) -o "$(1)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" -filelist "$(2)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) "$(StandaloneExecutable.ARGUMENTS)"
 }
 
 
@@ -1246,11 +1614,11 @@
 }
 actions quietly together DynamicLibrary.Link bind DynamicLibrary.ARGUMENTS DynamicLibrary.DEFFILE
 {
-    $(LD) -o "$(1)" $(DynamicLibrary.DEFFILE_FLAG)"$(DynamicLibrary.DEFFILE)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(DynamicLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG)
+    $(_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) -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)
+    $(_LD_FOR_LINKING) -o "$(1)" $(DynamicLibrary.DEFFILE_FLAG)"$(DynamicLibrary.DEFFILE)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" -filelist "$(2)" "$(DynamicLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG)
 }
 DynamicLibrary.DEFFILE_FLAG = "-Xlinker -DEF:" ;
 DynamicLibrary.FILELIST_FLAG = -filelist ;
@@ -1265,45 +1633,54 @@
 {
     local OBJECT_FILE ;
     if $(4) {
-        LINK_FILE_LIST = $(FILE_LIST)Prelink_$(4) ;
+        LINK_FILE_LIST_$(VARIANT) = $(FILE_LIST_$(VARIANT))Prelink_$(4) ;
     }
     else {
-        LINK_FILE_LIST = $(FILE_LIST)Prelink ;
+        LINK_FILE_LIST_$(VARIANT) = $(FILE_LIST_$(VARIANT))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) ;
+    DEPENDS $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
+    ClearFileList $(LINK_FILE_LIST_$(VARIANT)) ;
     for LINKED in $(2) {
-        AppendToFileList $(LINK_FILE_LIST) : $(LINKED) ;
-        DEPENDS $(LINK_FILE_LIST) : $(LINKED) ;
+        AppendToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(LINKED) ;
+        DEPENDS $(LINK_FILE_LIST_$(VARIANT)) : $(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
-        AppendFileToFileList $(LINK_FILE_LIST) : $(GLUE_FILE_LIST) ;
+        DEPENDS $(LINK_FILE_LIST_$(VARIANT)) : $(GLUE_FILE_LIST) ;
+        AppendFileToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(GLUE_FILE_LIST) ;
     }
     PRELINK_FLAGS on $(1) = $(PRELINK_FLAGS) ;
     PRELINK_LIBS on $(1) = $(PRELINK_LIBS) ;
-    if $(BUILD_PHASING) = YES {
+    if $(_BUILD_PHASING) = YES {
         BUILD_PHASE_PRODUCTS += $(1) ;
     }
-    MasterObjectFile.Combine $(1) : $(LINK_FILE_LIST) ;
+    MasterObjectFile.Combine $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
     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
 {
-    $(CC) $(ARCH_FLAGS) -keep_private_externs $(GLOBAL_CFLAGS) "$(PRELINK_FLAGS)" -nostdlib -filelist "$(2)" -r -o "$(1)" "$(PRELINK_LIBS)"
+    $(_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)"
 }
 
+# Ranlib <library>
+# Ranlib for static library
+actions Ranlib
+{
+    $(RANLIB) "$(1)"
+}
+
 # VersioningSystem_next-cvs <product>
 # Handles automatic generation of CVSVersionInfo.txt file for projects that use NeXT CVS-style versioning.
 rule VersioningSystem_next-cvs
@@ -1312,11 +1689,10 @@
     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) ;
-    DERIVED_FILES += $(VERSION_INFO_FILE) ;
-    if $(BUILD_PHASING) = YES {
-        BUILD_PHASE_PRODUCTS += $(VERSION_INFO_FILE) ;
-    }
+    DerivedFiles $(VERSION_INFO_FILE) ;
+    SUPPRESS_PREFIX_HEADER = YES ;
     ProcessFile $(1) : $(VERSION_INFO_FILE) ;
+    SUPPRESS_PREFIX_HEADER = NO ;
 
     # Set up default values for the variables.
     CVS_VERS_FILE default = CVSVersionInfo.txt ;
@@ -1365,11 +1741,10 @@
 
     # Create versioning code
     VersioningSystem_apple-generic.Create $(VERSION_INFO_FILE) : $(1) ;
-    DERIVED_FILES += $(VERSION_INFO_FILE) ;
-    if $(BUILD_PHASING) = YES {
-        BUILD_PHASE_PRODUCTS += $(VERSION_INFO_FILE) ;
-    }
+    DerivedFiles $(VERSION_INFO_FILE) ;
+    SUPPRESS_PREFIX_HEADER = YES ;
     ProcessFile $(1) : $(VERSION_INFO_FILE) ;
+    SUPPRESS_PREFIX_HEADER = NO ;
 }
 actions VersioningSystem_apple-generic.Create
 {
@@ -1391,32 +1766,31 @@
 # of MODULE_VERSION, MODULE_START, and MODULE_STOP
 rule KernelModuleGeneratedSource
 {
-    MODULE_INFO_FILE default = $(1:B)_info.c ;
-    DERIVED_FILES += $(MODULE_INFO_FILE) ;
-    if $(BUILD_PHASING) = YES {
-        BUILD_PHASE_PRODUCTS += $(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) ;
+    MODULE_INFO_FILE_$(VARIANT) default = $(1:B)_info.c ;
+    DerivedFiles $(MODULE_INFO_FILE_$(VARIANT)) ;
+    DEPENDS $(MODULE_INFO_FILE_$(VARIANT)) : $(MODULE_INFO_PLIST) ;
+    MODULE_VERSION on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_VERSION) ;
+    MODULE_NAME on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_NAME) ;
     if $(MODULE_IOKIT) = "YES" {
-        MODULE_START on $(MODULE_INFO_FILE) = 0 ;
-        MODULE_STOP on $(MODULE_INFO_FILE) = 0 ;
+        MODULE_START on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
+        MODULE_STOP on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
     }
     else {
         if $(MODULE_START) = "" {
-            MODULE_START on $(MODULE_INFO_FILE) = 0 ;
+            MODULE_START on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
         } else {
-            MODULE_START on $(MODULE_INFO_FILE) = $(MODULE_START) ;
+            MODULE_START on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_START) ;
         }
         if $(MODULE_STOP) = "" {
-            MODULE_STOP on $(MODULE_INFO_FILE) = 0 ;
+            MODULE_STOP on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
         } else {
-            MODULE_STOP on $(MODULE_INFO_FILE) = $(MODULE_STOP) ;
+            MODULE_STOP on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_STOP) ;
         }
     }
-    KernelModuleGeneratedSource.Create $(MODULE_INFO_FILE) ;
-    ProcessFile $(1) : $(MODULE_INFO_FILE) ;
+    KernelModuleGeneratedSource.Create $(MODULE_INFO_FILE_$(VARIANT)) ;
+    SUPPRESS_PREFIX_HEADER = YES ;
+    ProcessFile $(1) : $(MODULE_INFO_FILE_$(VARIANT)) ;
+    SUPPRESS_PREFIX_HEADER = NO ;
 }
 actions KernelModuleGeneratedSource.Create
 {
@@ -1448,38 +1822,35 @@
     $(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) "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(DynamicLibrary.ARGUMENTS)" "$(DERIVED_FILE_DIR)/framework_stub.o" -o "$(1)"
+    $(_LD_FOR_LINKING) -dynamiclib $(DYLIB_VERSION_FLAGS) $(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 Apple Computer, Inc.
+# Copyright (c) 1999-2002 Apple Computer, Inc.
 # All rights reserved.
 
-# Define reasonable root values, to be overridden by default
+# 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) ;
-TEMP_ROOT default = .$(/)build$(/)intermediates ;
 
 # Builds go into the BUILD_ROOT which defaults to
 # build/products in current directory, or SYMROOT if defined
 BUILD_ROOT default = $(SYMROOT) ;
-BUILD_ROOT default = .$(/)build$(/)products ;
 
 # Installation root defaults to root, or DSTROOT if defined
 INSTALL_ROOT default = $(DSTROOT) ;
-INSTALL_ROOT default = / ;
 
 # Set initial values for installation information and framework version
-BUILD_PHASING default = YES ;
+_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 ;
+COPY_PHASE_STRIP default = NO ;
 PREBINDING default = YES ;
+SET_DIR_MODE_OWNER_GROUP default = YES ;
+SET_FILE_MODE_OWNER_GROUP default = NO ;
 
 # Set initial optimization level, debug, and profile settings
 export OPTIMIZATION_LEVEL default = 0 ;
@@ -1497,13 +1868,31 @@
 JAVA_USE_DEPENDENCIES default = YES ;
 JAVA_ZIP_FLAGS default = -urg ;
 
+JAVA_COMPILER_DEBUGGING_SYMBOLS default = YES ;
+JAVA_COMPILER_DISABLE_WARNINGS default = NO ;
+JAVA_COMPILER_DEPRECATED_WARNINGS default = NO ;
+
+# These default flags probably shouldn't be overridden by users.
+JAVAC_DEFAULT_FLAGS default = -J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8 ;
+JIKES_DEFAULT_FLAGS default = +E -OLDCSO ;
+
+# Default variants and flags
+# !!!:cmolick:20020226 using all three is an interesting test case
+# BUILD_VARIANTS default = normal debug profile ;
+BUILD_VARIANTS default = normal ;
+cc_normal_FLAGS default = ;
+cc_debug_FLAGS default = -g ;
+cc_profile_FLAGS default = -pg ;
+
+# !!!:cmolick:20020109 Installed product asides on by default for debugging
+#INSTALLED_PRODUCT_ASIDES default = YES ;
+
 # BeginProduct <product>
 #
 # Initializes the directory and file list variables
 #
 # Variable references:
 # BUILD_ROOT			Base directory for builds
-# BUILD_PATH			Subdirectory in root where product is located
 # 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
@@ -1515,11 +1904,22 @@
 #
 # 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
@@ -1527,22 +1927,67 @@
 # DERIVED_FILES			Initialized empty
 # OBJECT_FILES			Initialized empty
 # LINKED_FILES			Initialized empty
-# PRODUCT_FILES			Initialized with product
-# PRECOMP_TRUSTFILE		TrustedPrecomps.txt in $(TEMP_DIR)
+# 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) ;
 
-    # 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 ;
+    # 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, and to set the 'USE_GCC3' build setting accordingly
+    if ( $(CC) = "/usr/bin/gcc3" ) {
+        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 {
+        CC default = /usr/bin/gcc3 ;
+        CPLUSPLUS default = /usr/bin/g++3 ;
+        # 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
+
+    # Variant suffixes
+    for VARIANT in $(BUILD_VARIANTS) {
+        if $(VARIANT) = normal {
+            VARIANT_SUFFIX_$(VARIANT) = "" ;
+        }
+        else {
+            VARIANT_SUFFIX_$(VARIANT) = _$(VARIANT) ;
+        }
+    }
     # Set reasonable optimization flags for installs if not already set
     OPTIMIZATION_CFLAGS default = -O ;
     # C++ options match C options by default
@@ -1566,16 +2011,25 @@
     }
     ARCH_FLAGS default = $(SUPPORTED_ARCHITECTURE_FLAGS) ;
     # Initialize the directory variables
+    # SOURCE_DIR is the location of installed sources
     SOURCE_DIR default = $(INSTALL_ROOT) ;
-    if $(BUILD_PATH) {
-        BUILD_DIR default = $(BUILD_ROOT)$(/)$(BUILD_PATH) ;
-    }
-    else {
         BUILD_DIR default = $(BUILD_ROOT) ;
+    # create base build dir
+    Mkdir $(BUILD_DIR) ;
+    ProductFile $(BUILD_DIR) ;
+    # create active build dir
+    if $(TARGET_BUILD_DIR) && ($(TARGET_BUILD_DIR) != $(BUILD_DIR)) {
+        Mkdir $(TARGET_BUILD_DIR) ;
     }
-    TEMP_DIR default = $(TEMP_ROOT)$(/)$(TARGET_NAME).build ;
+    # asides
+    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+        ASIDE_DIR default = $(BUILD_ROOT) ;
+        Mkdir $(ASIDE_DIR) ;
+        ProductFile $(ASIDE_DIR) ;
+    }
+    # define other important locations
+    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) ;
         }
@@ -1585,10 +2039,16 @@
     }
     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) ;
+    for VARIANT in $(BUILD_VARIANTS) {
+        OBJECT_FILE_DIR_$(VARIANT) default = $(OBJECT_FILE_DIR)-$(VARIANT) ;
+        FILE_LIST_$(VARIANT) default = $(OBJECT_FILE_DIR_$(VARIANT))$(/)LinkFileList ;
+        # initialize file lists
+        OBJECT_FILES_$(VARIANT) = ;
+        LINKED_FILES_$(VARIANT) = ;
     }
-    FILE_LIST default = $(OBJECT_FILE_DIR)$(/)LinkFileList ;
+    if $(JAVA_ARCHIVE_CLASSES) != YES && ( $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library ) {
+        export PRODUCT_CLASS_FILE_DIR default = $(TARGET_BUILD_DIR)$(/)$(PRODUCT_NAME) ;
+    }
     DERIVED_FILE_DIR default = $(TEMP_DIR)$(/)DerivedSources ;
     if $(INSTALL_PATH) {
         INSTALL_DIR default = $(INSTALL_ROOT)$(/)$(INSTALL_PATH) ;
@@ -1598,86 +2058,133 @@
     }
     # Initialize the search paths
     if $(CLONE_HEADERS) = YES {
+        if $(TARGET_BUILD_DIR) != $(BUILD_DIR) {
+            HEADER_SEARCH_PATHS = $(PROJECT_HEADER_DIR) $(TARGET_BUILD_DIR)$(/)include $(BUILD_DIR)$(/)include $(HEADER_SEARCH_PATHS) ;
+        }
+        else {
         HEADER_SEARCH_PATHS = $(PROJECT_HEADER_DIR) $(BUILD_DIR)$(/)include $(HEADER_SEARCH_PATHS) ;
-        FRAMEWORK_SEARCH_PATHS = $(BASE_PROJECT_HEADER_DIR) $(BUILD_ROOT) $(FRAMEWORK_SEARCH_PATHS) ;
+        }
+        FRAMEWORK_SEARCH_PATHS = $(BASE_PROJECT_HEADER_DIR) $(BUILD_ROOT) $(INSTALL_DIR) $(FRAMEWORK_SEARCH_PATHS) ;
+    }
+    else {
+        if $(TARGET_BUILD_DIR) != $(BUILD_DIR) {
+            HEADER_SEARCH_PATHS = $(TARGET_BUILD_DIR)$(/)include $(BUILD_DIR)$(/)include $(HEADER_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) ;
+    if $(DEPLOYMENT_LOCATION) = YES && $(BUILT_PRODUCTS_DIR) {
+        HEADER_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR)$(/)include $(HEADER_SEARCH_PATHS) ;
+        FRAMEWORK_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR) $(FRAMEWORK_SEARCH_PATHS) ;
+        LIBRARY_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR) $(LIBRARY_SEARCH_PATHS) ;
+    }
     # Initialize the file lists
     DERIVED_FILES = ;
-    OBJECT_FILES = ;
-    LINKED_FILES = ;
-    if $(ACTION) != installsrc {
-        PRODUCT_FILES = $(1) ;
-    }
-    if $(OS) in MACOS DARWIN {
+    PRODUCT_FILES = ;
 	PRECOMP_TRUSTFILE default = $(TEMP_DIR)$(/)TrustedPrecomps.txt ;
+    # Make symlink to product in products dir,
+    # and also set product mode and ownership
+    # unless there is no nonempty product name.
+    if $(DEPLOYMENT_LOCATION) = YES {
+        if $(WRAPPER)
+         && $(PRODUCT_TYPE) != Tool
+         && $(PRODUCT_TYPE) != Library {
+            # Use WRAPPER when defined for bundle product
+            _INSTALLED_PRODUCT = $(TARGET_BUILD_DIR)$(/)$(WRAPPER) ;
+            _PRODUCT_REFERENCE default = $(BUILT_PRODUCTS_DIR:G=ProductLink)$(/)$(WRAPPER) ;
+            #!!!:cmolick:20020517:this may be bad for non-deployment location
+            if $(DEPLOYMENT_POSTPROCESSING) = YES {
+                SetModeOwnerAndGroup $(_INSTALLED_PRODUCT:G=ModeOwnerGroup) : $(_INSTALLED_PRODUCT) ;
     }
-    DEPENDS all : $(PRODUCT_NAME) ;
-    if ! $(PRODUCT_NAME:G=) = $(1:G=) {
-        DEPENDS $(PRODUCT_NAME) : $(1) ;
+            SymLink $(_PRODUCT_REFERENCE) : $(_INSTALLED_PRODUCT) ;
+            DEPENDS $(_PRODUCT_REFERENCE) : $(BUILT_PRODUCTS_DIR) ;
+            DEPENDS $(1) : $(_PRODUCT_REFERENCE) ;
     }
+        else {
+            if $(1:G=) {
+                # Use nonempty, ungristed primary target for tool or library product
+                _INSTALLED_PRODUCT = $(TARGET_BUILD_DIR)$(/)$(1:G=) ;
+                _PRODUCT_REFERENCE default = $(BUILT_PRODUCTS_DIR:G=ProductLink)$(/)$(1:G=) ;
+                SymLink $(_PRODUCT_REFERENCE) : $(_INSTALLED_PRODUCT) ;
+                DEPENDS $(_PRODUCT_REFERENCE) : $(BUILT_PRODUCTS_DIR) ;
+                DEPENDS $(1) : $(_PRODUCT_REFERENCE) ;
+            }
+        }
+    }
+    # Run the hack script to build debug and profile variants, if appropriate.
+    if $(INTERNAL_BUILD_VARIANTS)
+     && ( $(RC_JASPER) || $(INTERNAL_BUILD_VARIANTS_ONLY_IN_JASPER) != YES )
+     && ( $(ACTION) = build || $(ACTION) = install ) {
+        # build variants list should be used only by this call in this case
+        _INTERNAL_BUILD_VARIANTS = $(INTERNAL_BUILD_VARIANTS) ;
+        INTERNAL_BUILD_VARIANTS = ;
+        INTERNAL_BUILD_VARIANTS on $(1) = $(_INTERNAL_BUILD_VARIANTS) ;
+        RunVariantHackScript $(1) ;
+    }
 }
 
 # EndProduct <product>
 #
-# Sets LOCATE for intermediates and creates required directories.
+# 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) ;
-    if $(PROJECT_HEADER_DIR) {
+    if $(CLONE_HEADERS) = YES && $(PROJECT_HEADER_DIR) {
         Mkdir $(PROJECT_HEADER_DIR) ;
+        PRODUCT_FILES += $(PROJECT_HEADER_DIR) ;
+        DEPENDS $(1) : $(PROJECT_HEADER_DIR) ;
     }
-    Mkdir $(OBJECT_FILE_DIR) ;
+    for VARIANT in $(BUILD_VARIANTS) {
+        Mkdir $(OBJECT_FILE_DIR_$(VARIANT)) ;
+        PRODUCT_FILES += $(OBJECT_FILE_DIR_$(VARIANT)) ;
+        DEPENDS $(1) : $(OBJECT_FILE_DIR_$(VARIANT)) ;
+    }
+    if $(DEPLOYMENT_LOCATION) {
+        Mkdir $(BUILT_PRODUCTS_DIR) ;
+        PRODUCT_FILES += $(BUILT_PRODUCTS_DIR) ;
+        DEPENDS $(1) : $(BUILT_PRODUCTS_DIR) ;
+    }
     Mkdir $(CLASS_FILE_DIR) ;
+    PRODUCT_FILES += $(CLASS_FILE_DIR) ;
+    DEPENDS $(1) : $(CLASS_FILE_DIR) ;
     Mkdir $(DERIVED_FILE_DIR) ;
-    # ensure that the product goes into the correct place
-    LOCATE on $(1) $(PRODUCT_FILES) = $(BUILD_DIR) ;
-    LOCATE on $(1:D) $(PRODUCT_FILES:D:G) = $(BUILD_DIR) ;
-    for FILE in $(1) $(PRODUCT_FILES) {
-        if $(FILE:D) != "" {
-            Mkdir $(FILE:D) ;
-            DEPENDS $(FILE) : $(FILE:D) ;
-        } else {
-            DEPENDS $(FILE) : $(BUILD_DIR) ;
-        }
+    PRODUCT_FILES += $(DERIVED_FILE_DIR) ;
+    DEPENDS $(1) : $(DERIVED_FILE_DIR) ;
+    # Set up post-phase processing
+    if $(POST_PHASE_PRODUCTS) {
+        DEPENDS $(1) : $(POST_PHASE_PRODUCTS) ;
+        DEPENDS $(POST_PHASE_PRODUCTS) : $(BUILD_PHASES) ;
     }
-    # ensure that anytime we build the primary product we also build
-    # the resource directories, inner executables, etc.
-    if ! $(1) = $(PRODUCT_FILES) {
-        INCLUDES $(1) : $(PRODUCT_FILES) ;
+    # Alternative catch-all mechanism to set mode and ownership of files
+    # that for some reason require this post build processing.
+    if $(ACTION) = install {
+    for ALTERNATE_PERMISSIONS_FILE in $(ALTERNATE_PERMISSIONS_FILES) {
+        ALTERNATE_PERMISSIONS_FILE_PATH = $(INSTALL_DIR)$(/)$(ALTERNATE_PERMISSIONS_FILE) ;
+        ALTERNATE_PERMISSIONS_TARGET = $(ALTERNATE_PERMISSIONS_FILE:G=AlternatePermissions) ;
+        NOTFILE $(ALTERNATE_PERMISSIONS_TARGET) ;
+        DEPENDS $(1) : $(ALTERNATE_PERMISSIONS_TARGET) ;
+        DEPENDS $(ALTERNATE_PERMISSIONS_TARGET) : $(BUILD_PHASES) ;
+        if $(ALTERNATE_MODE) {
+            INSTALL_MODE_FLAG = $(ALTERNATE_MODE) ;
+            INSTALL_MODE_FLAG on $(ALTERNATE_PERMISSIONS_TARGET) = $(ALTERNATE_MODE) ;
     }
-    # ensure that the derived source files go into the correct place
-    # If any source files were in subdirectories, we must ensure
-    # that the corresponding derived source subdirectory is created before
-    # the file is compiled.
-    LOCATE on $(DERIVED_FILES) = $(DERIVED_FILE_DIR) ;
-    DERIVED_PATHS = $(DERIVED_FILE_DIR) ;
-    for FILE in $(DERIVED_FILES) {
-        if $(FILE:D) != "" {
-            local JUST_GRIST = $(FILE:G) ;
-            local JUST_DIRECTORY = $(FILE:D) ;
-            local DIRECTORY = $(JUST_DIRECTORY:G=Derived$(JUST_GRIST)) ;
-            Mkdir $(DIRECTORY) ;
-            local FULL_DERIVED_DIR default = $(DERIVED_FILE_DIR)$(/)$(JUST_DIRECTORY) ;
-            if ! ( $(FULL_DERIVED_DIR) in $(DERIVED_PATHS) ) {
-                DERIVED_PATHS += $(FULL_DERIVED_DIR) ;
+        if $(ALTERNATE_OWNER) {
+            INSTALL_OWNER = $(ALTERNATE_OWNER) ;
+            INSTALL_OWNER on $(ALTERNATE_PERMISSIONS_TARGET) = $(ALTERNATE_OWNER) ;
             }
-            DEPENDS $(FILE) : $(DIRECTORY) ;
-        } else {
-            DEPENDS $(FILE) : $(DERIVED_FILE_DIR) ;
+        if $(ALTERNATE_GROUP) {
+            INSTALL_GROUP = $(ALTERNATE_GROUP) ;
+            INSTALL_GROUP on $(ALTERNATE_PERMISSIONS_TARGET) = $(ALTERNATE_GROUP) ;
         }
+        SetModeOwnerAndGroup $(ALTERNATE_PERMISSIONS_TARGET) : $(ALTERNATE_PERMISSIONS_FILE_PATH) ;
     }
-    # Run the hack script to build debug and profile variants, if appropriate.
-    if $(BUILD_VARIANTS) && $(BLOCK_BUILD_VARIANTS) != YES {
-        RunVariantHackScript varianthack : $(1) ;
     }
-    # Basic definitions in place, define actions for this target
+    # Define actions for this target
     Actions $(1) ;
 }
 
@@ -1685,31 +2192,33 @@
 #
 # Sets additional variables required for wrapped products,
 # primarily to assign locations within the product wrapper.
-# The WRAPPER variable is set locally within this rule for convenience.
-#
-# Variables set:
-# WRAPPER_SUFFIX		Text to append to product wrapper based on WRAPPER_EXTENSION
-# RESOURCE_DIR			Directory for resource files
-# APPLESCRIPTS_DIR		Directory for Compiled AppleScript files
-# PUBLIC_HEADER_DIR		Public header destination
-# PRIVATE_HEADER_DIR	Private header destination
-# CURRENT_VERSION_DIR		Subdirectory holding current version of versioned wrapper
-# *_LINK			Link to directory in versioned wrapper
-# *_LINK_PATH			Path used by link to directory in versioned 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) ;
-    # set up new variables for the wrapper and derive suffix
-    # from wrapper extension
-    local WRAPPER = $(1:G=) ;
+    # define wrapper using appropriate extension and suffix
+    WRAPPER = $(1:G=) ;
     if $(WRAPPER_EXTENSION) {
         WRAPPER_SUFFIX = .$(WRAPPER_EXTENSION) ;
     }
     if $(WRAPPER_SUFFIX) {
-        $(WRAPPER) = $(WRAPPER:S=$(WRAPPER_SUFFIX)) ;
+        WRAPPER = $(WRAPPER:S=$(WRAPPER_SUFFIX)) ;
     }
+    # define and create wrapper and make primary nonfile target depend on it
+    LOCATE on $(WRAPPER) = $(TARGET_BUILD_DIR) ;
+    Mkdir $(WRAPPER) ;
+    PRODUCT_FILES += $(WRAPPER) ;
+    DEPENDS $(1) : $(WRAPPER) ;
     if $(PRODUCT_TYPE) = Application {
         # Application wrappers
         if $(PURE_JAVA) = YES {
@@ -1718,19 +2227,25 @@
         else {
             RESOURCE_DIR default = $(WRAPPER)$(/)Contents$(/)Resources ;
         }
+        LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
         RESOURCE_LINK = "" ;
         APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
+        LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
         PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)Headers ;
+        LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
         PUBLIC_HEADER_LINK default = "" ;
         PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)PrivateHeaders ;
+        LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_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) = $(TARGET_BUILD_DIR) ;
             PUBLIC_HEADER_CLONE_LINK default = "" ;
             PRIVATE_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)"Contents"$(/)PrivateHeaders ;
+            LOCATE on $(PRIVATE_HEADER_CLONE_DIR) = $(TARGET_BUILD_DIR) ;
             PRIVATE_HEADER_CLONE_LINK default = "" ;
             CURRENT_VERSION_CLONE_DIR default = "" ;
             CURRENT_VERSION_CLONE_LINK default = "" ;
@@ -1739,47 +2254,81 @@
     else if $(PRODUCT_TYPE) = Framework {
         # Framework wrappers
         RESOURCE_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Resources ;
+        LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
         RESOURCE_LINK default = $(WRAPPER)$(/)Resources ;
+        LOCATE on $(RESOURCE_LINK) = $(TARGET_BUILD_DIR) ;
         RESOURCE_LINK_PATH default = Versions$(/)Current$(/)Resources ;
         APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
+        LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
         HAS_PUBLIC_HEADERS = "NO" ;
         PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Headers ;
+        LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
         PUBLIC_HEADER_LINK default = $(WRAPPER)$(/)Headers ;
+        LOCATE on $(PUBLIC_HEADER_LINK) = $(TARGET_BUILD_DIR) ;
         PUBLIC_HEADER_LINK_PATH default = Versions$(/)Current$(/)Headers ;
         PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)PrivateHeaders ;
+        LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
         PRIVATE_HEADER_LINK default = $(WRAPPER)$(/)PrivateHeaders ;
+        LOCATE on $(PRIVATE_HEADER_LINK) = $(TARGET_BUILD_DIR) ;
         PRIVATE_HEADER_LINK_PATH default = Versions$(/)Current$(/)PrivateHeaders ;
         CURRENT_VERSION_DIR default = $(WRAPPER:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION) ;
+        LOCATE on $(CURRENT_VERSION_DIR) = $(TARGET_BUILD_DIR) ;
         CURRENT_VERSION_LINK default = $(WRAPPER:G=)$(/)Versions$(/)Current ;
+        LOCATE on $(CURRENT_VERSION_LINK) = $(TARGET_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) = $(TARGET_BUILD_DIR) ;
             PUBLIC_HEADER_CLONE_LINK default = $(WRAPPER_CLONE_DIR)$(/)Headers ;
+            LOCATE on $(PUBLIC_HEADER_CLONE_LINK) = $(TARGET_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) = $(TARGET_BUILD_DIR) ;
             PRIVATE_HEADER_CLONE_LINK default = $(WRAPPER_CLONE_DIR)$(/)PrivateHeaders ;
+            LOCATE on $(PRIVATE_HEADER_CLONE_LINK) = $(TARGET_BUILD_DIR) ;
             PRIVATE_HEADER_CLONE_LINK_PATH default = Versions$(/)Current$(/)PrivateHeaders ;
             CURRENT_VERSION_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)Versions$(/)$(FRAMEWORK_VERSION) ;
             CURRENT_VERSION_CLONE_LINK default = $(WRAPPER_CLONE_DIR)$(/)Versions$(/)Current ;
             CURRENT_VERSION_CLONE_LINK_PATH default = Versions$(/)Current ;
         }
+        if $(ASIDE_DIR) {
+            ASIDE_CURRENT_VERSION_DIR default = $(WRAPPER:G=aside)$(/)Versions$(/)$(FRAMEWORK_VERSION) ;
+            ASIDE_CURRENT_VERSION_LINK default = $(WRAPPER:G=aside)$(/)Versions$(/)Current ;
+            ASIDE_CURRENT_VERSION_LINK_PATH default = Versions$(/)Current ;
+            ASIDE_CURRENT_VERSION_LINK_PATH = $(ASIDE_CURRENT_VERSION_LINK_PATH:G=aside) ;
+            Mkdir $(ASIDE_CURRENT_VERSION_DIR) ;
+            ProductFileAside $(ASIDE_CURRENT_VERSION_DIR) ;
+            DEPENDS $(1) : $(ASIDE_CURRENT_VERSION_DIR) ;
+            NOUPDATE $(ASIDE_CURRENT_VERSION_DIR) ;
+            SymLink $(ASIDE_CURRENT_VERSION_LINK) : $(FRAMEWORK_VERSION) ;
+            ProductFileAside $(ASIDE_CURRENT_VERSION_LINK) ;
+            DEPENDS $(1) : $(ASIDE_CURRENT_VERSION_LINK) ;
+            DEPENDS $(ASIDE_CURRENT_VERSION_LINK) : $(ASIDE_CURRENT_VERSION_DIR) ;
+            NOUPDATE $(ASIDE_CURRENT_VERSION_LINK) ;
+        }
         # Create current version directory and link now because
         # they are implicit and needed by almost everything else:
         # Current version dir
-        PRODUCT_FILES += $(CURRENT_VERSION_DIR) ;
+        Mkdir $(CURRENT_VERSION_DIR) ;
+        ProductFile $(CURRENT_VERSION_DIR) ;
+        DEPENDS $(1) : $(CURRENT_VERSION_DIR) ;  # need this or build phase
         NOUPDATE $(CURRENT_VERSION_DIR) ;
         # Current version link
         SymLink $(CURRENT_VERSION_LINK) : $(FRAMEWORK_VERSION) ;
-        PRODUCT_FILES += $(CURRENT_VERSION_LINK) ;
+        ProductFile $(CURRENT_VERSION_LINK) ;
+        DEPENDS $(1) : $(CURRENT_VERSION_LINK) ;  # need this or build phase
+        DEPENDS $(CURRENT_VERSION_LINK) : $(CURRENT_VERSION_DIR) ;
         NOUPDATE $(CURRENT_VERSION_LINK) ;
         if $(CLONE_HEADERS) = YES {
-            PRODUCT_FILES += $(CURRENT_VERSION_CLONE_DIR) ;
+            Mkdir $(CURRENT_VERSION_CLONE_DIR) ;
+            ProductFile $(CURRENT_VERSION_CLONE_DIR) ;
             NOUPDATE $(CURRENT_VERSION_CLONE_DIR) ;
             # Current version link
             SymLink $(CURRENT_VERSION_CLONE_LINK) : $(FRAMEWORK_VERSION) ;
-            PRODUCT_FILES += $(CURRENT_VERSION_CLONE_LINK) ;
+            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) ;
@@ -1788,21 +2337,49 @@
     } # framework wrappers
     else {
         # Default bundle wrappers
-        RESOURCE_DIR default = $(WRAPPER)$(/)"Contents"$(/)Resources ;
-        RESOURCE_LINK default = "" ;
+        if $(BUNDLE_STYLE) = SHALLOW {
+            # shallow bundles do not have the Contents/Resources folders
+            RESOURCE_DIR default = $(WRAPPER) ;
+            LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
+            APPLESCRIPTS_DIR default = $(WRAPPER)$(/)Scripts ;
+            LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
+            PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Headers ;
+            LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
+            PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)PrivateHeaders ;
+            LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
+            if $(CLONE_HEADERS) = YES {
+                WRAPPER_CLONE_DIR = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER) ;
+                PUBLIC_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)Headers ;
+                LOCATE on $(PUBLIC_HEADER_CLONE_DIR) = $(TARGET_BUILD_DIR) ;
+                PRIVATE_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)PrivateHeaders ;
+                LOCATE on $(PRIVATE_HEADER_CLONE_DIR) = $(TARGET_BUILD_DIR) ;
+            }
+        }
+        else {
+            # else, BUNDLE_STYLE=DEEP bundles do have Contents/Resources folders
+            RESOURCE_DIR default = $(WRAPPER)$(/)Contents$(/)Resources ;
+            LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
         APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
-        PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)Headers ;
+            LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
+            PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Contents$(/)Headers ;
+            LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
+            PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)Contents$(/)PrivateHeaders ;
+            LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
+            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) = $(TARGET_BUILD_DIR) ;
+                PRIVATE_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)Contents$(/)PrivateHeaders ;
+                LOCATE on $(PRIVATE_HEADER_CLONE_DIR) = $(TARGET_BUILD_DIR) ;
+            }
+        }
+        RESOURCE_LINK default = "" ;
         PUBLIC_HEADER_LINK default = "" ;
-        PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)PrivateHeaders ;
         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 ;
             PUBLIC_HEADER_CLONE_LINK default = "" ;
-            PRIVATE_HEADER_CLONE_DIR default = $(WRAPPER_CLONE_DIR)$(/)"Contents"$(/)PrivateHeaders ;
             PRIVATE_HEADER_CLONE_LINK default = "" ;
            CURRENT_VERSION_CLONE_DIR default = "" ;
            CURRENT_VERSION_CLONE_LINK default = "" ;
@@ -1810,48 +2387,38 @@
     } # all bundle layouts
     # define location for optional header documentation generation
     if $(GENERATE_HEADERDOC) = YES && $(RESOURCE_DIR) {
-        HEADERDOC_DIR default = $(BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Documentation ;
+        HEADERDOC_DIR default = $(TARGET_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 ;
+        export PRODUCT_CLASS_FILE_DIR default = $(TARGET_BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Java ;
     }
 }
 
+# EndWrappedProduct <product>
+#
+# 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) ;
-        }
-    }
-    if $(INNER_PRODUCT) {
-        local WRAPPER = $(1) ;
-        TouchConditionally $(WRAPPER) : $(INNER_PRODUCT) ;
+    # Wrapper touch updates base container directory timestamp
+    # This must be conditional on the "build" component,
+    # otherwize installhdrs builds with no headers will fail.
+    if build in $(BUILD_COMPONENTS) {
+        WRAPPER_TOUCH = $(1:G=Touch) ;
+        LOCATE on $(WRAPPER_TOUCH) = $(TARGET_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 Apple Computer, Inc.
+# Copyright (c) 1999-2002 Apple Computer, Inc.
 # All rights reserved.
 
 # Rules for target types include Begin and End rules
@@ -1927,7 +2494,7 @@
 {
     EndWrappedProduct $(1) ;
 }
-# Copyright (c) 1999,2000 Apple Computer, Inc.
+# Copyright (c) 1999-2002 Apple Computer, Inc.
 # All rights reserved.
 
 # Variables referenced:
@@ -1935,8 +2502,10 @@
 # RESOURCE_DIR 		Directory for resource files in product
 # *_LINK, *_LINK_PATH	Wrapper versioning information
 # *_HEADER_DIR		Directories for headers of product
-# PRODUCT_INFO_SETTINGS	Property list file for targets
-# PKGINFO_FILE_CONTENTS Type and creator for package info
+# _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
@@ -1948,8 +2517,8 @@
 # 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	Based on PRODUCT_INFO_SETTINGS
-# PKGINFO_FILE		Package info file from PKGINFO_FILE_CONTENTS
+# INFO_PLIST_FILE	Info.plist file in product wrapper, copied from PRODUCT_SETTINGS_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
@@ -1976,9 +2545,11 @@
 .CPP_RULE       = ProcessCplusplus ;
 .cxx_RULE	= ProcessCplusplus ;
 .CXX_RULE	= ProcessCplusplus ;
+# !!!:cmolick:20020226 note: .C++ not accepted by c++ compiler driver
+.c++_RULE	= ProcessCplusplus ;
 .m_RULE		= ProcessC ;
-.mm_RULE	= ProcessC ;
-.M_RULE		= ProcessC ;
+.mm_RULE	= ProcessCplusplus ;
+.M_RULE		= ProcessCplusplus ;
 .exp_RULE	= ProcessExportsFile ;
 .defs_RULE	= ProcessUsingMig ;
 .mig_RULE	= ProcessUsingMig ;
@@ -2006,7 +2577,13 @@
 .RSRC_RULE	= ProcessRezFile ;
 .ppob_RULE	= ProcessRezFile ;
 
+# Set the initial list of phase targets to empty
 PHASE_TARGETS = ;
+
+# PhaseTarget <phase target variable> <product> <phase name>
+# 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 ;
@@ -2022,11 +2599,17 @@
     }
     PHASE_TARGETS += $(PHASE_TARGET) ;
     $(1) = $(PHASE_TARGET) ;
-    NOTFILE $(1) ;
+    NOTFILE $(PHASE_TARGET) ;
 }
 
+# BuildPhase <phase> <product> <previous phase>
+# 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 a list of all phases
+    BUILD_PHASES += $(1) ;
     # retain name for action echo
     PHASE_NAME on $(1) = $(1:G) ;
     # this build phase depends on the previous phase
@@ -2036,122 +2619,240 @@
     # phase required for parent target
     DEPENDS $(2) : $(1) ;
 }
-
 actions BuildPhase
 {
     $(ECHO) Completed phase "$(PHASE_NAME)" for "$(1)"
 }
 
+# DerivedFiles <derived-files>
+# 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) ;
+        }
+        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) ;
+    }
+}
+
+# ProductFile <product-file>
+# The product file location is set to BUILD_DIR.
+# If the reference and containing directory are not already
+# in the list of product files, then they are added.  They also
+# become build phase products unless phasing is turned off.
+rule ProductFile
+{
+    LOCATE on $(1) = $(TARGET_BUILD_DIR) ;
+    if ! $(1) in $(PRODUCT_FILES) {
+        PRODUCT_FILES += $(1) ;
+        if $(_BUILD_PHASING) = YES {
+            BUILD_PHASE_PRODUCTS += $(1) ;
+        }
+    }
+}
+
+# ProductFileAside <file>
+# Same as ProductFile, but default location is ASIDE_DIR.
+rule ProductFileAside
+{
+    LOCATE on $(1) = $(ASIDE_DIR) ;
+    if ! $(1) in $(PRODUCT_FILES) {
+        PRODUCT_FILES += $(1) ;
+        if $(_BUILD_PHASING) = YES {
+            BUILD_PHASE_PRODUCTS += $(1) ;
+        }
+    }
+}
+
+# SetModeOwnerAndGroup <nonfile gristed target> : <base target>
+# Uses given nonfile gristed target to set mode, owner, and group
+# of the base product
+rule SetModeOwnerAndGroup
+{
+    NOTFILE $(1) ;
+    LOCATE on $(1) = $(TARGET_BUILD_DIR) ;
+    POST_PHASE_PRODUCTS += $(1) ;
+    if $(INSTALL_MODE_FLAG) {
+        SetMode $(1) : $(2) ;
+    }
+    if $(INSTALL_OWNER) {
+        if $(INSTALL_GROUP) {
+            SetOwnerAndGroup $(1) : $(2) ;
+        }
+        else {
+            SetOwner $(1) : $(2) ;
+        }
+    }
+    else if $(INSTALL_GROUP) {
+        SetGroup $(1) : $(2) ;
+    }
+}
+actions SetMode
+{
+     $(CHMOD) -RH $(INSTALL_MODE_FLAG) "$(2:G=)"
+}
+actions SetOwner
+{
+    $(CHOWN) -RH $(INSTALL_OWNER) "$(2:G=)"
+}
+actions SetGroup
+{
+    $(CHOWN) -RH :$(INSTALL_GROUP) "$(2:G=)"
+}
+actions SetOwnerAndGroup
+{
+    $(CHOWN) -RH $(INSTALL_OWNER):$(INSTALL_GROUP) "$(2:G=)"
+}
+
 rule NoOp
 {
-    if $(BUILD_PHASING) = YES {
+    if $(_BUILD_PHASING) = YES {
         PhaseTarget BUILD_PHASE : $(1) : NoOp ;
         BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
         PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
     }
 }
 
+# ProcessHeaders <product> <headers>
+#
+# Process individual headers, call Interfacer to generate headers,
+# precompile and assemble implicitly included headers as necessary,
+# and run headerdoc.
 rule ProcessHeaders
 {
     if ( headers in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) )
      && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) {
 
         local FILE ;
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             PhaseTarget BUILD_PHASE : $(1) : CopyHeaders ;
             BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
             BUILD_PHASE_PRODUCTS = ;
         }
         for FILE in $(2) {
-            if $(BUILD_PHASING) = YES {
+            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) ;
         }
-        # Copy implicit headers to TEMP_DIR while populating
-        # list of IMPLICITLY_INCLUDED_HEADER_COPIES
-        IMPLICITLY_INCLUDED_HEADER_COPIES = ;
-        IMPLICIT_HEADER_DESTINATION_DIR default = $(TEMP_DIR)$(/)ImplicitHeaders ;
-        for HEADER in $(IMPLICITLY_INCLUDED_HEADERS) {
-            local HEADER_COPY = $(IMPLICIT_HEADER_DESTINATION_DIR)$(/)$(HEADER:BS) ;
-            DEPENDS $(HEADER_COPY) : $(IMPLICIT_HEADER_DESTINATION_DIR) ;
-            Mkdir $(IMPLICIT_HEADER_DESTINATION_DIR) ;
-            AbsolutePathImportStub $(HEADER_COPY) : $(HEADER) ;
-            # Add the copy path to the list
-            IMPLICITLY_INCLUDED_HEADER_COPIES += "$(HEADER_COPY)" ;
-            # header copy required for product or build phase if available
-            if $(BUILD_PHASING) = YES {
-                DEPENDS $(BUILD_PHASE) : $(HEADER_COPY) ;
+    # :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)$(/)PrefixHeaders ;
+            Mkdir $(PRECOMP_DESTINATION_DIR) ;
+            PRODUCT_FILES += $(PRECOMP_DESTINATION_DIR) ;
+            if $(_BUILD_PHASING) = YES {
+                BUILD_PHASE_PRODUCTS += $(PRECOMP_DESTINATION_DIR) ;
             }
-            else {
-                DEPENDS $(1) : $(HEADER_COPY) ;
+            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 an arbitrary number of PFE files, one per language-and-architecture combination.  PFE_FILE_C_DIALECTS gives the languages and ARCHS gives the architectures (although PFE_FILE_C_DIALECTS is only used _inside_ the action of MakePFEFile -- from Jam's perspective, we treat each architecture's PFE file as an atomic unit).  The "effective prefix file" is set to nothing, since we won't be passing a -include directive.  The "EFFECTIVE_PFE_FILE_$(ARCH)" is set to the produced PFE file.
+                for ARCH in $(ARCHS) {
+                    EFFECTIVE_PFE_FILE_$(ARCH) = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS="-$(ARCH).pfe") ;
+                    MakePFEFile $(EFFECTIVE_PFE_FILE_$(ARCH)) : $(PREFIX_HEADER) ;
+                    PRODUCT_FILES += $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
+                    if $(_BUILD_PHASING) = YES {
+                        BUILD_PHASE_PRODUCTS += $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
             }
         }
-        # Gather implicit inclusion headers in a master header
-        # to workaround cpp-precomp only supporting a single -include
-        if $(IMPLICITLY_INCLUDED_HEADER_COPIES) {
-            MASTER_IMPLICIT_HEADER default = $(IMPLICIT_HEADER_DESTINATION_DIR)$(/)ProjectBuilderMasterImplicitInclusionHeader.h ;
-            CreateMasterImplicitHeader $(MASTER_IMPLICIT_HEADER) ;
-            # component depends on product or phase if available
-            if $(BUILD_PHASING) = YES {
-                DEPENDS $(BUILD_PHASE) : $(MASTER_IMPLICIT_HEADER) ;
+                EFFECTIVE_PREFIX_HEADER = ;  # because with a PFE file, we don't actually pass a -include argument
             }
             else {
-                DEPENDS $(1) : $(MASTER_IMPLICIT_HEADER) ;
+                # 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="-gcc3.p") ;
+                    PrecompileHeader $(C_PRECOMP_FILE_DESTINATION_PATH) : $(PREFIX_HEADER_STUB) ;
+                    PRODUCT_FILES += $(C_PRECOMP_FILE_DESTINATION_PATH) ;
+                    if $(_BUILD_PHASING) = YES {
+                        BUILD_PHASE_PRODUCTS += $(C_PRECOMP_FILE_DESTINATION_PATH) ;
             }
         }
-        for HEADER in $(PRECOMPILED_IMPLICITLY_INCLUDED_HEADERS) {
-            local HEADER_COPY_PATH = $(IMPLICIT_HEADER_DESTINATION_DIR)$(/)$(HEADER:BS) ;
-            local PRECOMP_DESTINATION_PATH = $(IMPLICIT_HEADER_DESTINATION_DIR)$(/)$(HEADER:BS=.p) ;
-            local CPLUSPLUS_PRECOMP_DESTINATION_PATH = $(IMPLICIT_HEADER_DESTINATION_DIR)$(/)$(HEADER:BS=.pp) ;
-            PrecompileHeader $(PRECOMP_DESTINATION_PATH) : $(HEADER_COPY_PATH) ;
-            PrecompileHeader $(CPLUSPLUS_PRECOMP_DESTINATION_PATH) : $(HEADER_COPY_PATH) ;
-            # component depends on product or phase if available
-            if $(BUILD_PHASING) = YES {
-                DEPENDS $(BUILD_PHASE) : $(PRECOMP_DESTINATION_PATH) ;
-                DEPENDS $(BUILD_PHASE) : $(CPLUSPLUS_PRECOMP_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="-gcc3.pp") ;
+                    PrecompileHeader $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) : $(PREFIX_HEADER_STUB) ;
+                    PRODUCT_FILES += $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) ;
+                    if $(_BUILD_PHASING) = YES {
+                        BUILD_PHASE_PRODUCTS += $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) ;
             }
-            else {
-                DEPENDS $(1) : $(PRECOMP_DESTINATION_PATH) ;
-                DEPENDS $(1) : $(CPLUSPLUS_PRECOMP_DESTINATION_PATH) ;
             }
+                EFFECTIVE_PREFIX_HEADER = $(PREFIX_HEADER_STUB) ;
         }
-        # 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) ;
+        }
+        else {
+            EFFECTIVE_PREFIX_HEADER = $(PREFIX_HEADER) ;
             }
         }
-        if $(BUILD_PHASING) = YES {
+    # phase end logic
+    # THIS *MUST* COME *AFTER* ALL OTHER WORK FOR THIS PHASE!!!
+    # cmolick:20020213 ideally this should be within action conditionals,
+    #  but that is difficult now that there are three disjointed ones,
+    #  so checking to see if the build phase is defined is a hack
+    #  the problem of bad DEPENDS here on clean for now.
+    if $(_BUILD_PHASING) = YES && $(BUILD_PHASE) {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
             }
             PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
         }
     }
-}
 
 # CreateMasterImplicitHeader <master implicit header path>
 rule CreateMasterImplicitHeader
 {
     #Creation of this header depends on all the header copies
-    for HEADER in $(IMPLICITLY_INCLUDED_HEADER_COPIES) {
-        DEPENDS $(1) : $(HEADER) ;
+    for HEADER_COPY in $(IMPLICITLY_INCLUDED_HEADER_COPIES) {
+        DEPENDS $(1) : $(HEADER_COPY) ;
     }
     # Master implicit header depends on destination dir
-    DEPENDS $(1) : $(IMPLICIT_HEADER_DESTINATION_DIR) ;
-    Mkdir $(IMPLICIT_HEADER_DESTINATION_DIR) ;
+    DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ;
 }
 actions CreateMasterImplicitHeader
 {
@@ -2164,7 +2865,10 @@
     done
 }
 
-
+# ProcessHeader <product or phase> <header>
+#
+# 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) {
@@ -2183,21 +2887,21 @@
             Mkdir $(SOURCE_DIR) ;
         }
         Cp $(HEADER_SOURCE_COPY) : $(2) ;
-        if $(BUILD_PHASING) = YES {
+        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 {
+        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
-        if ! $(2) in $(DERIVED_FILES) && $(CLONE_HEADERS) = YES {
+        # 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
@@ -2206,7 +2910,7 @@
             LOCATE on $(HEADERDOC_TARGET) = $(HEADERDOC_DIR) ;
             HeaderDoc $(HEADERDOC_TARGET) : $(2) ;
             DEPENDS $(HEADERDOC_TARGET) : $(HEADERDOC_DIR) ;
-            if $(BUILD_PHASING) = YES {
+            if $(_BUILD_PHASING) = YES {
                 BUILD_PHASE_PRODUCTS += $(HEADERDOC_TARGET) ;
             }
             HEADERDOC_TARGETS += $(HEADERDOC_TARGET) ;
@@ -2219,22 +2923,28 @@
             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) {
-                    PRODUCT_FILES += $(PUBLIC_HEADER_DIR) ;
-                    if $(BUILD_PHASING) = YES {
-                        BUILD_PHASE_PRODUCTS += $(PUBLIC_HEADER_DIR) ;
-                    }
                     Mkdir $(PUBLIC_HEADER_DIR) ;
+                    ProductFile $(PUBLIC_HEADER_DIR) ;
+                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                        ASIDE_PUBLIC_HEADER_DIR default = $(PUBLIC_HEADER_DIR:G=aside) ;
+                        Mkdir $(ASIDE_PUBLIC_HEADER_DIR) ;
+                        ProductFileAside $(ASIDE_PUBLIC_HEADER_DIR) ;
                 }
+                }
                 # Create symlink to public header dir in versioned frameworks
                 if $(PUBLIC_HEADER_LINK)
                   && ! $(PUBLIC_HEADER_LINK) in $(PRODUCT_FILES) {
-                    DEPENDS $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_DIR) ;
                     SymLink $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ;
-                    PRODUCT_FILES += $(PUBLIC_HEADER_LINK) ;
-                    if $(BUILD_PHASING) = YES {
-                        BUILD_PHASE_PRODUCTS += $(PUBLIC_HEADER_LINK) ;
+                    DEPENDS $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_DIR) ;
+                    ProductFile $(PUBLIC_HEADER_LINK) ;
+                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                        ASIDE_PUBLIC_HEADER_LINK default = $(PUBLIC_HEADER_LINK:G=aside) ;
+                        SymLink $(ASIDE_PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ;
+                        DEPENDS $(ASIDE_PUBLIC_HEADER_LINK) : $(ASIDE_PUBLIC_HEADER_DIR) ;
+                        ProductFileAside $(ASIDE_PUBLIC_HEADER_LINK) ;
                     }
                     NOUPDATE $(PUBLIC_HEADER_LINK) ;
                 }
@@ -2246,9 +2956,11 @@
                     if $(PUBLIC_HEADER_DIR) {
                         local HEADER_COPY = $(PUBLIC_HEADER_DIR)$(/)$(2:BS:G=) ;
                         Cp $(HEADER_COPY) : $(2) ;
-                        PRODUCT_FILES += $(HEADER_COPY) ;
-                        if $(BUILD_PHASING) = YES {
-                            BUILD_PHASE_PRODUCTS += $(HEADER_COPY) ;
+                        ProductFile $(HEADER_COPY) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_HEADER_COPY = $(HEADER_COPY:G=aside) ;
+                            Cp $(ASIDE_HEADER_COPY) : $(2) ;
+                            ProductFile $(ASIDE_HEADER_COPY) ;
                         }
                     }
                     else {
@@ -2256,25 +2968,30 @@
                     }
                 }
             case Private :
+                HAS_PRIVATE_HEADERS = YES ;
                 # create a private header directory
                 if ! $(PRIVATE_HEADER_DIR) in $(PRODUCT_FILES) {
-                    PRODUCT_FILES += $(PRIVATE_HEADER_DIR) ;
-                    if $(BUILD_PHASING) = YES {
-                       BUILD_PHASE_PRODUCTS += $(PRIVATE_HEADER_DIR) ;
-                    }
                     Mkdir $(PRIVATE_HEADER_DIR) ;
+                    ProductFile $(PRIVATE_HEADER_DIR) ;
+                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                        ASIDE_PRIVATE_HEADER_DIR default = $(PRIVATE_HEADER_DIR:G=aside) ;
+                        Mkdir $(ASIDE_PRIVATE_HEADER_DIR) ;
+                        ProductFileAside $(ASIDE_PRIVATE_HEADER_DIR) ;
                 }
+                }
                 # accompanying link in versioned frameworks
                 if $(PRIVATE_HEADER_LINK)
                   && ! $(PRIVATE_HEADER_LINK) in $(PRODUCT_FILES) {
-                    PRODUCT_FILES += $(PRIVATE_HEADER_LINK) ;
-                    if $(BUILD_PHASING) = YES {
-                        BUILD_PHASE_PRODUCTS += $(PRIVATE_HEADER_LINK) ;
-                    }
-                    DEPENDS $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_DIR) ;
                     SymLink $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
+                    DEPENDS $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_DIR) ;
+                    ProductFile $(PRIVATE_HEADER_LINK) ;
+                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                        ASIDE_PRIVATE_HEADER_LINK default = $(PRIVATE_HEADER_LINK:G=aside) ;
+                        SymLink $(ASIDE_PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
+                        DEPENDS $(ASIDE_PRIVATE_HEADER_LINK) : $(ASIDE_PRIVATE_HEADER_DIR) ;
+                        ProductFileAside $(ASIDE_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 {
@@ -2284,9 +3001,11 @@
                     if $(PRIVATE_HEADER_DIR) {
                         local HEADER_COPY = $(PRIVATE_HEADER_DIR)$(/)$(2:BS:G=) ;
                         Cp $(HEADER_COPY) : $(2) ;
-                        PRODUCT_FILES += $(HEADER_COPY) ;
-                        if $(BUILD_PHASING) = YES {
-                            BUILD_PHASE_PRODUCTS += $(HEADER_COPY) ;
+                        ProductFile $(HEADER_COPY) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_HEADER_COPY = $(HEADER_COPY:G=aside) ;
+                            Cp $(ASIDE_HEADER_COPY) : $(2) ;
+                            ProductFileAside $(ASIDE_HEADER_COPY) ;
                         }
                     }
                     else {
@@ -2307,20 +3026,23 @@
     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_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
+        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
         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) = ;
+        if $(ARCH) in ppc {
+            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
+        }
     }
     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 ;
+    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) ;
@@ -2341,33 +3063,97 @@
         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 ;
+        local INCLUSION_LOG_FILE default = $(TEMP_DIR)$(/)ImplicitHeaderPrecompile$(ARCH)$(/)$(2:DB).ilog ;
         FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
     }
-    Mkdir $(IMPLICIT_HEADER_DESTINATION_DIR) ;
-    DEPENDS $(1) : $(IMPLICIT_HEADER_DESTINATION_DIR) ;
+    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)" "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "-I$(SOURCE_ROOT)" "$(IMPLICIT_INCLUSION_FLAGS)" "$(OTHER_PRECOMP_CFLAGS)" "$(2)"
+    $(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 $(KERNEL_FRAMEWORK)/PrivateHeaders ;
+        local KERNEL_COMPILE_OPTIONS = -fno-builtin -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 ;
+    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) ;
+    # 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 $(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)-$(VARIANT)$(/)$(ARCH)$(/)$(2:DB).ilog ;
+        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
+    }
+    ARCH on $(1) = $(ARCH) ;
+    Mkdir $(PRECOMP_DESTINATION_DIR) ;
+    DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ;
+    SEARCH on $(2) = $(SOURCE_ROOT) ;
+}
+actions MakePFEFile
+{
+    for c_dialect in $(PFE_FILE_C_DIALECTS) ; do $(CC:Q) -c -x ${c_dialect} -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) "$(FLAGS)" $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) -I$(SOURCE_ROOT:Q) $(PREFIX_HEADER_CFLAGS:Q) $(OTHER_PRECOMP_CFLAGS:Q) $(2:Q) -o /tmp/.null.o --dump-pch $(1:Q) ; if [ $? != 0 ] ; then exit 1 ; fi ; done
+}
+
 
+# ProcessResources <product> <bundle resources>
+#
+# 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 {
+        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 {
+            if $(_BUILD_PHASING) = YES {
                 ProcessResource $(BUILD_PHASE) : $(FILE) ;
             }
             else {
@@ -2377,94 +3163,211 @@
         # product settings, version settings, and package info written only during build
         if build in $(BUILD_COMPONENTS) {
             # product settings property list
-            if $(PRODUCT_SETTINGS_PATH)
+            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) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
+                            Mkdir $(ASIDE_RESOURCE_DIR) ;
+                            ProductFileAside $(ASIDE_RESOURCE_DIR) ;
+                        }
+                    }
+                    DEPENDS $(INFO_PLIST_FILE) : $(RESOURCE_DIR) ;
                     if $(RESOURCE_LINK)
                      && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) {
                         SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
-                        PRODUCT_FILES += $(RESOURCE_LINK) ;
-                        if $(BUILD_PHASING) = YES {
-                            BUILD_PHASE_PRODUCTS += $(RESOURCE_LINK) ;
+                        ProductFile $(RESOURCE_LINK) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
+                            SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
+                            ProductFileAside $(ASIDE_RESOURCE_LINK) ;
                         }
                     }
+                    DEPENDS $(INFO_PLIST_FILE) : $(RESOURCE_LINK) ;
                 }
                 else {
-                    INFO_PLIST_FILE default = $(1)$(/)Contents$(/)Info.plist ;
+                    if $(BUNDLE_STYLE) = SHALLOW {
+                        INFO_PLIST_FILE default = $(1:G=)$(/)Info.plist ;
                 }
-                Cp $(INFO_PLIST_FILE) : $(PRODUCT_SETTINGS_PATH) ;
-                PRODUCT_FILES += $(INFO_PLIST_FILE) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(INFO_PLIST_FILE) ;
+                    else {
+                        INFO_PLIST_FILE default = $(1:G=)$(/)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) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_INFO_PLIST_DIR default = $(INFO_PLIST_DIR:G=aside) ;
+                            Mkdir $(ASIDE_INFO_PLIST_DIR) ;
+                            ProductFileAside $(ASIDE_INFO_PLIST_DIR) ;
+                        }
                 }
+                    DEPENDS $(INFO_PLIST_FILE) : $(INFO_PLIST_DIR) ;
             }
+                Cp $(INFO_PLIST_FILE) : $(_INFO_PLIST_FILE_PATH) ;
+                ProductFile $(INFO_PLIST_FILE) ;
+                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                    ASIDE_INFO_PLIST_FILE default = $(INFO_PLIST_FILE:G=aside) ;
+                    DEPENDS $(ASIDE_INFO_PLIST_FILE) : $(ASIDE_INFO_PLIST_DIR) ;
+                    Cp $(ASIDE_INFO_PLIST_FILE) : $(PRODUCT_SETTINGS_PATH) ;
+                    ProductFileAside $(ASIDE_INFO_PLIST_FILE) ;
+                }
+            }
             # version settings property list
-            if $(VERSION_SETTINGS_PATH)
+            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) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
+                            Mkdir $(ASIDE_RESOURCE_DIR) ;
+                            ProductFileAside $(ASIDE_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) ;
-                        PRODUCT_FILES += $(RESOURCE_LINK) ;
-                        if $(BUILD_PHASING) = YES {
-                            BUILD_PHASE_PRODUCTS += $(RESOURCE_LINK) ;
+                        ProductFile $(RESOURCE_LINK) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
+                            DEPENDS $(ASIDE_RESOURCE_LINK) : $(ASIDE_RESOURCE_DIR) ;
+                            SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
+                            ProductFileAside $(ASIDE_RESOURCE_LINK) ;
                         }
                     }
+                    DEPENDS $(VERSION_PLIST_FILE) : $(RESOURCE_LINK) ;
                 }
                 else {
+                    if $(BUNDLE_STYLE) = SHALLOW {
                     VERSION_PLIST_FILE default = $(1:G=)$(/)Contents$(/)version.plist ;
                 }
-                Cp $(VERSION_PLIST_FILE) : $(VERSION_SETTINGS_PATH) ;
-                PRODUCT_FILES += $(VERSION_PLIST_FILE) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(VERSION_PLIST_FILE) ;
+                    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) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_VERSION_PLIST_DIR default = $(VERSION_PLIST_DIR) ;
+                            Mkdir $(ASIDE_VERSION_PLIST_DIR) ;
+                            ProductFileAside $(ASIDE_VERSION_PLIST_DIR) ;
+                        }
+                    }
+                    DEPENDS $(VERSION_PLIST_FILE) : $(VERSION_PLIST_DIR) ;
+                }
+                Cp $(VERSION_PLIST_FILE) : $(_VERSION_PLIST_FILE_PATH) ;
+                ProductFile $(VERSION_PLIST_FILE) ;
+                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                    ASIDE_VERSION_PLIST_FILE default = $(VERSION_PLIST_FILE:G=aside) ;
+                    Cp $(ASIDE_VERSION_PLIST_FILE) : $(VERSION_PLIST_FILE) ;
+                    DEPENDS $(ASIDE_VERSION_PLIST_FILE) : $(ASIDE_VERSION_PLIST_DIR) ;
+                    ProductFileAside $(ASIDE_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 $(DEVELOPMENT_SETTINGS_PATH)
+            if $(_PBDEVELOPMENT_FILE_LIST_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) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
+                            Mkdir $(ASIDE_RESOURCE_DIR) ;
+                            ProductFileAsides $(ASIDE_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) ;
-                        PRODUCT_FILES += $(RESOURCE_LINK) ;
-                        if $(BUILD_PHASING) = YES {
-                            BUILD_PHASE_PRODUCTS += $(RESOURCE_LINK) ;
+                        ProductFile $(RESOURCE_LINK) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
+                            SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
+                            DEPENDS $(ASIDE_RESOURCE_LINK) : $(ASIDE_RESOURCE_DIR) ;
+                            ProductFileAside $(ASIDE_RESOURCE_LINK) ;
                         }
                     }
+                    DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(RESOURCE_LINK) ;
                 }
                 else {
+                    if $(BUNDLE_STYLE) = SHALLOW {
+                        DEVELOPMENT_PLIST_FILE default = $(1:G=)$(/)pbdevelopment.plist ;
+                    }
+                    else {
                     DEVELOPMENT_PLIST_FILE default = $(1:G=)$(/)Contents$(/)pbdevelopment.plist ;
                 }
-                Cp $(DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_SETTINGS_PATH) ;
-                PRODUCT_FILES += $(DEVELOPMENT_PLIST_FILE) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(DEVELOPMENT_PLIST_FILE) ;
+                    DEVELOPMENT_PLIST_DIR = $(DEVELOPMENT_PLIST_FILE:D) ;
+                    if ! $(DEVELOPMENT_PLIST_DIR) in $(PRODUCT_FILES) {
+                        Mkdir $(DEVELOPMENT_PLIST_DIR) ;
+                        ProductFile $(DEVELOPMENT_PLIST_DIR) ;
+                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                            ASIDE_DEVELOPMENT_PLIST_DIR default = $(DEVELOPMENT_PLIST_DIR:G=aside) ;
+                            Mkdir $(ASIDE_DEVELOPMENT_PLIST_DIR) ;
+                            ProductFileAsides $(ASIDE_DEVELOPMENT_PLIST) ;
+                        }
                 }
+                    DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_PLIST_DIR) ;
             }
+                Cp $(DEVELOPMENT_PLIST_FILE) : $(_DEVELOPMENT_PLIST_FILE_PATH) ;
+                ProductFile $(DEVELOPMENT_PLIST_FILE) ;
+                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                    ASIDE_DEVELOPMENT_PLIST_FILE default = $(DEVELOPMENT_PLIST_FILE:G=aside) ;
+                    Cp $(ASIDE_DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_SETTINGS_PATH) ;
+                    DEPENDS $(ASIDE_DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_PLIST_DIR) ;
+                    ProductFileAside $(ASIDE_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_CONTENTS)
-             && $(PRODUCT_TYPE) != Framework
-             && $(PURE_JAVA) != YES {
-                PKGINFO_FILE default = $(1)$(/)"Contents"$(/)"PkgInfo" ;
-                RawEcho $(PKGINFO_FILE) : $(PKGINFO_FILE_CONTENTS) ;
-                PRODUCT_FILES += $(PKGINFO_FILE) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(PKGINFO_FILE) ;
+            if $(_PKGINFO_FILE_PATH)
+             && ( $(PRODUCT_TYPE) != Framework
+             && $(PRODUCT_TYPE) != Bundle
+             && $(PURE_JAVA) != YES || $(GENERATE_PKGINFO_FILE) = YES ) {
+                if $(BUNDLE_STYLE) = SHALLOW || $(PRODUCT_TYPE) = Framework {
+                    PKGINFO_FILE default = $(1:G=)$(/)PkgInfo ;
                 }
+                else {
+                    PKGINFO_FILE default = $(1:G=)$(/)Contents$(/)PkgInfo ;
             }
+                PKGINFO_DIR = $(PKGINFO:D) ;
+                if ! $(PKGINFO_DIR) in $(PRODUCT_FILES) {
+                    Mkdir $(PKGINFO_DIR) ;
+                    ProductFile $(PKGINFO_DIR) ;
+                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATIN) = YES {
+                        ASIDE_PKGINFO_DIR default = $(PKGINFO_DIR:G=aside) ;
+                        Mkdir $(ASIDE_PKGINFO_DIR) ;
+                        ProductFileAside $(ASIDE_PKGINFO_DIR) ;
         }
-        if $(BUILD_PHASING) = YES {
+                }
+                Cp $(PKGINFO_FILE) : $(_PKGINFO_FILE_PATH) ;
+                ProductFile $(PKGINFO_FILE) ;
+                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                    ASIDE_PKGINFO_FILE default = $(PKGINFO_FILE:G=aside) ;
+                    DEPENDS $(ASIDE_PKGINFO_FILE) : $(ASIDE_PKGINFO_DIR) ;
+                    Cp $(ASIDE_PKGINFO_FILE) : $(_PKGINFO_FILE_PATH) ;
+                    ProductFileAside $(ASIDE_PKGINFO_FILE) ;
+                }
+            }
+        }
+        if $(_BUILD_PHASING) = YES {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
             }
@@ -2473,6 +3376,9 @@
     }
 }
 
+# ProcessResource <product or phase> <bundle resource>
+#
+# Copies resources to nonlocalized or localized folders as appropriate
 rule ProcessResource
 {
     if source in $(BUILD_COMPONENTS) {
@@ -2492,7 +3398,7 @@
         }
         # copy resource to source location
         Cp $(RESOURCE_SOURCE_COPY) : $(2) ;
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             BUILD_PHASE_PRODUCTS += $(RESOURCE_SOURCE_COPY) ;
         }
     }
@@ -2501,57 +3407,79 @@
         local SPECIFIC_REGION ;
         # resource directory must exist
         if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) {
-            PRODUCT_FILES = $(RESOURCE_DIR) $(PRODUCT_FILES) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS = $(RESOURCE_DIR) $(PRODUCT_FILES) ;
+            Mkdir $(RESOURCE_DIR) ;
+            ProductFile $(RESOURCE_DIR) ;
+            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
+                Mkdir $(ASIDE_RESOURCE_DIR) ;
+                ProductFileAside $(ASIDE_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) ;
-            PRODUCT_FILES += $(RESOURCE_LINK) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(RESOURCE_LINK) ;
+            ProductFile $(RESOURCE_LINK) ;
+            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
+                SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
+                DEPENDS $(ASIDE_RESOURCE_LINK) : $(ASIDE_RESOURCE_DIR) ;
+                ProductFileAside $(ASIDE_RESOURCE_LINK) ;
             }
         }
-        if ! $(REGION) {
+        if ! $(REGION)
+         || ( $(BUNDLE_STYLE) = SHALLOW && $(REGION) = $(DEVELOPMENT_LANGUAGE) ) {
             # non-localized resource
+            # or development language resource for shallow bundle
             local NONLOCALIZED_RESOURCE_DIR NONLOCALIZED_RESOURCE ;
-            NONLOCALIZED_RESOURCE_DIR default = $(RESOURCE_DIR) ;
+            NONLOCALIZED_RESOURCE_DIR = $(RESOURCE_DIR) ;
             if ! $(NONLOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
-                PRODUCT_FILES = $(NONLOCALIZED_RESOURCE_DIR) $(PRODUCT_FILES) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS = $(NONLOCALIZED_RESOURCE_DIR) $(BUILD_PHASE_PRODUCTS) ;
-                }
+                Mkdir $(NONLOCALIZED_RESOURCE_DIR) ;
+                ProductFile $(NONLOCALIZED_RESOURCE_DIR) ;
             }
-            NONLOCALIZED_RESOURCE default = $(NONLOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ;
-            if ! $(NONLOCALIZED_RESOURCE) in $(PRODUCT_FILES) {
-                PRODUCT_FILES = $(NONLOCALIZED_RESOURCE) $(PRODUCT_FILES) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS = $(NONLOCALIZED_RESOURCE) $(BUILD_PHASE_PRODUCTS) ;
+            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                ASIDE_NONLOCALIZED_RESOURCE_DIR = $(NONLOCALIZED_RESOURCE_DIR:G=aside) ;
+                if ! $(ASIDE_NONLOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
+                    Mkdir $(ASIDE_NONLOCALIZED_RESOURCE_DIR) ;
+                    ProductFileAside $(ASIDE_NONLOCALIZED_RESOURCE_DIR) ;
                 }
             }
+            NONLOCALIZED_RESOURCE = $(NONLOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ;
+            DEPENDS $(NONLOCALIZED_RESOURCE) : $(NONLOCALIZED_RESOURCE_DIR) ;
             RobustCp $(NONLOCALIZED_RESOURCE) : $(2) ;
+            ProductFile $(NONLOCALIZED_RESOURCE) ;
+            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                ASIDE_NONLOCALIZED_RESOURCE = $(NONLOCALIZED_RESOURCE:G=aside) ;
+                DEPENDS $(ASIDE_NONLOCALIZED_RESOURCE) : $(ASIDE_NONLOCALIZED_RESOURCE_DIR) ;
+                RobustCp $(ASIDE_NONLOCALIZED_RESOURCE) : $(2) ;
+                ProductFileAside $(ASIDE_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_DIR = $(RESOURCE_DIR)$(/)$(SPECIFIC_REGION:S=.lproj) ;
             # localized resource directory must exist
             if ! $(LOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
-                PRODUCT_FILES = $(LOCALIZED_RESOURCE_DIR) $(PRODUCT_FILES) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS = $(LOCALIZED_RESOURCE_DIR) $(BUILD_PHASE_PRODUCTS) ;
-                }
+                Mkdir $(LOCALIZED_RESOURCE_DIR) ;
+                ProductFile $(LOCALIZED_RESOURCE_DIR) ;
             }
-            LOCALIZED_RESOURCE default = $(LOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ;
-            if ! $(LOCALIZED_RESOURCE) in $(PRODUCT_FILES) {
-                PRODUCT_FILES = $(LOCALIZED_RESOURCE) $(PRODUCT_FILES) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS = $(LOCALIZED_RESOURCE) $(BUILD_PHASE_PRODUCTS) ;
+            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                ASIDE_LOCALIZED_RESOURCE_DIR = $(LOCALIZED_RESOURCE_DIR:G=aside) ;
+                if ! $(ASIDE_LOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
+                    Mkdir $(ASIDE_LOCALIZED_RESOURCE_DIR) ;
+                    ProductFileAside $(ASIDE_LOCALIZED_RESOURCE_DIR) ;
                 }
             }
+            LOCALIZED_RESOURCE = $(LOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ;
+            DEPENDS $(LOCALIZED_RESOURCE) : $(LOCALIZED_RESOURCE_DIR) ;
             RobustCp $(LOCALIZED_RESOURCE) : $(2) ;
+            ProductFile $(LOCALIZED_RESOURCE) ;
+            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
+                ASIDE_LOCALIZED_RESOURCE = $(LOCALIZED_RESOURCE:G=aside) ;
+                DEPENDS $(ASIDE_LOCALIZED_RESOURCE) : $(ASIDE_LOCALIZED_RESOURCE_DIR) ;
+                RobustCp $(ASIDE_LOCALIZED_RESOURCE) : $(2) ;
+                ProductFileAside $(ASIDE_LOCALIZED_RESOURCE) ;
+            }
         }
     }
 }
@@ -2565,16 +3493,19 @@
     fi
 }
 
+# ProcessSources <product> <source files>
+#
+# 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 {
+        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 ;
@@ -2590,7 +3521,7 @@
             BUILD_PHASE_PRODUCTS += $(PROJECT_FILES_COPY) ;
         }
         for FILE in $(2) {
-            if $(BUILD_PHASING) = YES {
+            if $(_BUILD_PHASING) = YES {
                 ProcessSource $(BUILD_PHASE) : $(FILE) ;
             }
             else {
@@ -2614,24 +3545,29 @@
                 InterfacerExportSetsAndGlue $(1) ;
             }
         }
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
+                # product reference link must be in place before any compiles
+                if $(PRODUCT_REFERENCE) {
+                    DEPENDS $(BUILD_PHASE_PRODUCTS) : $(PRODUCT_REFERENCE) ;
+                }
             }
             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 <product> <source file>
+#
+# 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 {
+        if $(ENABLE_HEADER_SCANNING) != NO && $(INDEX_BASED_HEADER_DEPENDENCIES) != YES {
             HDRRULE on $(2) = ProcessC.HdrRule ;
             HDRSCAN on $(2) = $(HDRPATTERN) ;
         }
@@ -2659,7 +3595,7 @@
             Mkdir $(SOURCE_SUBDIR) ;
             SOURCE_COPY = $(SOURCE_SUBDIR)/$(2:D=:G=) ;
             DEPENDS $(SOURCE_COPY) : $(SOURCE_SUBDIR) ;
-            if $(BUILD_PHASING) = YES {
+            if $(_BUILD_PHASING) = YES {
                 BUILD_PHASE_PRODUCTS += $(SOURCE_SUBDIR) ;
             }
         }
@@ -2669,7 +3605,7 @@
             Mkdir $(SOURCE_DIR) ;
         }
         Cp $(SOURCE_COPY) : $(2) ;
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             BUILD_PHASE_PRODUCTS += $(SOURCE_COPY) ;
         }
     }
@@ -2691,365 +3627,292 @@
     }
 }
 
+# ProcessFrameworksAndLibraries <product> <linked files>
+#
+# 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 {
+        if $(_BUILD_PHASING) = YES {
             PhaseTarget BUILD_PHASE : $(1) : LinkWithFrameworksAndLibraries ;
             BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
             BUILD_PHASE_PRODUCTS = $(INNER_PRODUCT) ;
         }
-
+        for VARIANT in $(BUILD_VARIANTS) {
 	# add to linked files, including java .jar files even when there are no native object files!
-	LINKED_FILES += $(2) ;
+        # This was never questioned, but the long comment was added after this
+        # step was repeatedly moved outside this block by integration errors.
+	LINKED_FILES_$(VARIANT) += $(2) ;
 
         # only link if there are object files
-        if $(OBJECT_FILES) {
+        if $(OBJECT_FILES_$(VARIANT)) {
             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 {
+            # define products
+            if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library {
+                # simple product
 		        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) ;
+                INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT)$(VARIANT_SUFFIX_$(VARIANT)) ;
+                INNER_PRODUCT_LINK_$(VARIANT) default = ;
+                ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
+                if $(DEPLOYMENT_POSTPROCESSING) = YES {
+                    SetModeOwnerAndGroup $(INNER_PRODUCT:G=ModeOwnerGroup) : $(INNER_PRODUCT) ;
                         }
-                        if $(PREBINDING) = YES {
-                            FLAGS.o on $(INNER_PRODUCT) += -prebind ;
                         }
-                        if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES {
-			    FLAGS.o on $(INNER_PRODUCT) += -pg ;
+            else {
+                if $(PRODUCT_TYPE) = Framework {
+                    # versioned bundle
+                    INNER_PRODUCT default = $(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:BG=) ;
+                    INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
+                    INNER_PRODUCT_LINK default = $(1:G=)$(/)$(1:BG=) ;
+                    INNER_PRODUCT_LINK_$(VARIANT) default = $(INNER_PRODUCT_LINK)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
+                    INNER_PRODUCT_LINK_PATH default = Versions$(/)Current$(/)$(1:BG=) ;
+                    INNER_PRODUCT_LINK_PATH_$(VARIANT) default = $(INNER_PRODUCT_LINK_PATH)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
 			}
-                        PRODUCT_FILES += $(INNER_PRODUCT) ;
-		        if $(BUILD_PHASING) = YES {
-			    BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT) ;
+                else {
+                    # standard bundle
+                    if $(BUNDLE_STYLE) = SHALLOW {
+                        INNER_PRODUCT default = $(1:G=)$(/)$(1:BG=) ;
 		        }
+                    else {
+                        INNER_PRODUCT default = $(1:G=)$(/)Contents$(/)MacOS$(/)$(1:BG=) ;
 		    }
-	        case Library :
-		    INNER_PRODUCT default = $(1:G=) ;
-		    LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ;
-		    INNER_PRODUCT_LINK = ;
-		    STRIPPED_PRODUCT default = $(INNER_PRODUCT) ;
-		    PRODUCT_FILES += $(INNER_PRODUCT) ;
-		    if $(BUILD_PHASING) = YES {
-		        BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT) ;
+                    INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT)$(VARIANT_SUFFIX_$(VARIANT))$(TOOL_SUFFIX) ;
+                    INNER_PRODUCT_LINK_$(VARIANT) default = ;
 		    }
-		    # 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 ;
+                # inner product should always be ready before the link to it
+                if $(INNER_PRODUCT_LINK_$(VARIANT)) {
+                    DEPENDS $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
 			}
+                # inner product directory needed for all bundle types
+                INNER_PRODUCT_DIR_$(VARIANT) = $(INNER_PRODUCT_$(VARIANT):D) ;
+                if ! $(INNER_PRODUCT_DIR_$(VARIANT)) in $(PRODUCT_FILES) {
+                    Mkdir $(INNER_PRODUCT_DIR_$(VARIANT)) ;
+                    ProductFile $(INNER_PRODUCT_DIR_$(VARIANT)) ;
 		    }
-		    else {
-		        if $(LIBRARY_STYLE) = STATIC {
-                            # link static library
-                            if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) {
-                                ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : StaticLibrary ;
+                if $(INNER_PRODUCT_$(VARIANT)) && $(INNER_PRODUCT_DIR_$(VARIANT)) {
+                    DEPENDS $(INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_DIR_$(VARIANT)) ;
                             }
-                            else {
-			        StaticLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ;
+                # optionally make inner product dir aside
+                if $(ASIDE_DIR) {
+                    ASIDE_INNER_PRODUCT_DIR_$(VARIANT) = $(INNER_PRODUCT_DIR_$(VARIANT):G=aside) ;
+                    if ! $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) in $(PRODUCT_FILES) {
+                        Mkdir $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
+                        ProductFileAside $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
                             }
-			    FLAGS.o on $(INNER_PRODUCT) += -static ;
-			    if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES {
-				FLAGS.o on $(INNER_PRODUCT) += -pg ;
 			    }
 		        }
-		        else {
+            # Link inner product
+            # There are three kinds of linking that may be done,
+            # and three link rules that may be used:
+            # Linking a master object file that may be edited
+            # is the first case assumed to be the most common,
+            # linking using a master object file and
+            # architecture-specific exports files is supported,
+            # as is basic linking.
+            # The link rules can be used to construct a static library,
+            # a dynamic library, or a directly launchable executable.
+            # Finally, static libraries need to have ranlib run after all else.
+	    LINK_FILE_LIST_$(VARIANT) on $(INNER_PRODUCT_$(VARIANT)) = $(FILE_LIST_$(VARIANT)) ;
+            if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
+                # stand alone executable
 			    if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) {
-                                ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : DynamicLibrary ;
+                    ProcessSingleObjectLink $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : StandaloneExecutable ;
 			    }
 			    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 ;
+                        ProcessLinkWithArchitectureSpecificEditing $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : StandaloneExecutable ;
 			    }
 			    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 = "" ;
+                        StandaloneExecutable $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) ;
 		    }
-		    else {
-		        local DEFAULT_INNER_PRODUCT default = $(1)$(/)"Contents"$(/)"MacOS"$(/)$(1:B)$(TOOL_SUFFIX) ;
-		        INNER_PRODUCT default = $(DEFAULT_INNER_PRODUCT) ;
-		        LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ;
-		        INNER_PRODUCT_LINK default = ;
-		        PRODUCT_FILES += $(INNER_PRODUCT) ;
-		        if $(BUILD_PHASING) = YES {
-			    BUILD_PHASE_PRODUCTS += $(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 ;
 		        }
                         else {
+                if $(LIBRARY_STYLE) = STATIC && $(KERNEL_MODULE) != YES {
+                    # static library
                             if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) {
-                                ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : DynamicLibrary ;
+                        ProcessSingleObjectLink $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : StaticLibrary ;
 		            }
                             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)) ;
+                            ProcessLinkWithArchitectureSpecificEditing $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : StaticLibrary ;
                                         }
                                         else {
-                                            OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(ARCH)) ;
+                            StaticLibrary $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) ;
                                         }
                                     }
-                                    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 ;
-			}
-# !!!:mferris:20010725 Disbaled since prebinding is not supported for bundles.
-#                        if $(PREBINDING) = YES {
-#                            FLAGS.o on $(INNER_PRODUCT) += -prebind ;
-#                        }
-		    }
-	        case Application :
-		    # Define primary executable INNER_PRODUCT location in wrapper
-		    if $(PURE_JAVA) = YES {
-		        INNER_PRODUCT default = ;
+                    # dylibs, bundles, frameworks, and kernel extensions
+                    if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) {
+                        ProcessSingleObjectLink $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : DynamicLibrary ;
 		    }
 		    else {
-	                INNER_PRODUCT default = $(1)$(/)Contents$(/)MacOS$(/)$(1:B)$(TOOL_SUFFIX) ;
-	                PRODUCT_FILES += $(INNER_PRODUCT) ;
-		        LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ;
+                        # use architecture-specific exported symbols file if provided
+                        for ARCH in $(ARCHS) {
+                            THIN_MASTER_OBJECT_FILE default = $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ;
 		    }
-		    INNER_PRODUCT_LINK default = ;
-		    if $(INNER_PRODUCT) {
-		        if $(JAVA_ONLY) != YES {
-                            if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) {
-                                ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : StandaloneExecutable ;
+                        if $(THIN_MASTER_OBJECT_FILE) {
+                            ProcessLinkWithArchitectureSpecificEditing $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : DynamicLibrary ;
                             }
                             else {
-                                StandaloneExecutable $(INNER_PRODUCT) : $(LINKED_FILES) ;
-                            }
-                            if $(PREBINDING) = YES {
-                                FLAGS.o on $(INNER_PRODUCT) += -prebind ;
+                            DynamicLibrary $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) ;
                             }
-			    STRIPPED_PRODUCT = $(INNER_PRODUCT) ;
-			    PRODUCT_FILES += $(INNER_PRODUCT) ;
-			    if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES {
-				FLAGS.o on $(INNER_PRODUCT) += -pg ;
 			    }
 		        }
-		        if $(BUILD_PHASING) = YES {
-			    BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT) ;
 		        }
+            ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
+            DEPENDS $(INNER_PRODUCT_$(VARIANT)) : $(TARGET_BUILD_DIR) ;
+            # optionally copy inner product aside
+            if $(ASIDE_DIR) {
+                ASIDE_INNER_PRODUCT_$(VARIANT) = $(INNER_PRODUCT_$(VARIANT):G=aside) ;
+                ProductFileAside $(ASIDE_INNER_PRODUCT_$(VARIANT)) ;
+                Cp $(ASIDE_INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
+                if $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) {
+                    DEPENDS $(ASIDE_INNER_PRODUCT_$(VARIANT)) : $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
 		    }
-	        case Framework :
-		    # Handle product wrapper versioning
-		    if $(CURRENT_VERSION_LINK) {
-		        INNER_PRODUCT default = $(1)$(/)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) ;
-		        PRODUCT_FILES += $(INNER_PRODUCT_LINK) ;
-		        NOUPDATE $(INNER_PRODUCT_LINK) ;
 		    }
-		    else  {
-		        INNER_PRODUCT default = $(1)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ;
+            # preen
+            if $(DEPLOYMENT_POSTPROCESSING) = YES && $(UNSTRIPPED_PRODUCT) != YES {
+                STRIPPED_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT_$(VARIANT):G=strip) ;
+                DEPENDS $(STRIPPED_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
+                if $(PRODUCT_TYPE) != Tool && $(PRODUCT_TYPE) != Application {
+                    STRIPFLAGS default = -S ;
 		    }
-		    LINK_FILE_LIST on $(INNER_PRODUCT) = $(FILE_LIST) ;
-		    STRIPPED_PRODUCT = $(INNER_PRODUCT) ;
-		    PRODUCT_FILES += $(INNER_PRODUCT) ;
-		    if $(BUILD_PHASING) = YES {
-		        BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT) ;
+                Strip $(STRIPPED_PRODUCT_$(VARIANT)) ;
+                if $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC {
+                    Ranlib $(STRIPPED_PRODUCT_$(VARIANT)) ;
 		    }
-		    # link the final shared library
-                    for ARCH in $(ARCHS) {
-                        THIN_MASTER_OBJECT_FILE default = $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ;
+                ProductFile $(STRIPPED_PRODUCT_$(VARIANT)) ;
                     }
-                    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) ;
+            # make inner product symlink, if any
+            if $(INNER_PRODUCT_LINK_$(VARIANT)) {
+                SymLink $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
+                ProductFile $(INNER_PRODUCT_LINK_$(VARIANT)) ;
+                DEPENDS $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
+                # optionally copy inner product link aside
+                if $(ASIDE_DIR) {
+                    ASIDE_INNER_PRODUCT_LINK_$(VARIANT) = $(INNER_PRODUCT_LINK_$(VARIANT):G=aside) ;
+                    ProductFileAside $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) ;
+                    SymLink $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
+                    DEPENDS $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) : $(ASIDE_INNER_PRODUCT_$(VARIANT)) ;
+                    DEPENDS $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) : $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
                         }
-                        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)) ;
+            # static libraries must have ranlib run on them after all else
+            if $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC {
+                RANLIB_INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT_$(VARIANT):G=ranlib) ;
+                # ranlib depends on link, strip, modeownergroup
+                DEPENDS $(RANLIB_INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
+                if $(STRIPPED_PRODUCT_$(VARIANT)) {
+                    DEPENDS $(RANLIB_INNER_PRODUCT_$(VARIANT)) : $(STRIPPED_PRODUCT_$(VARIANT)) ;
                             }
+                ProductFile $(RANLIB_INNER_PRODUCT_$(VARIANT)) ;
                         }
-                        DynamicLibrary $(INNER_PRODUCT) : $(OTHER_LINKED_FILES) ;
+            # Basic link options determine if this is kext, bundle, or library
+            if $(KERNEL_MODULE) = YES {
+                MODULE_OBJECT_PATH = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(MODULE_OBJECT_FILE_$(VARIANT)) ;
+                FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -static -nostdlib -r -lkmodc++ "$(MODULE_OBJECT_PATH)" -lkmod -lcc_kext ;
                     }
                     else {
-                        # default framework link
-		        if $(GENERATE_MASTER_OBJECT_FILE) = YES || $(EXPORTED_SYMBOLS_FILE) {
-                            ProcessSingleObjectLink $(INNER_PRODUCT) : $(LINKED_FILES) : DynamicLibrary ;
+                if $(PRODUCT_TYPE) = Bundle
+                 || ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = BUNDLE ) {
+                    FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -bundle ;
+                } else {
+                    if $(PRODUCT_TYPE) = Framework
+                     || ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = DYNAMIC ) {
+                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -dynamiclib ;
                         }
 		        else {
-                            # simple dynamic library link
-	                    if $(VECTOR_OBJECT_FILE) {
-		                OTHER_LINKED_FILES += $(VECTOR_OBJECT_FILE) ;
-		            }
-		            DynamicLibrary $(INNER_PRODUCT) : $(LINKED_FILES) ;
+                        if $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC {
+                            FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -static ;
                         }
                     }
-		    if $(INNER_PRODUCT) && $(PROFILING_CODE) = YES {
-			FLAGS.o on $(INNER_PRODUCT) += -pg ;
 		    }
-		    FLAGS.o on $(INNER_PRODUCT) += -dynamiclib ;
+                # Dynamic library link options set version and installed name
+                if ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = DYNAMIC )
+                 || $(PRODUCT_TYPE) = Framework {
 		    if $(DYLIB_COMPATIBILITY_VERSION) {
-		        FLAGS.o on $(INNER_PRODUCT) += -compatibility_version "$(DYLIB_COMPATIBILITY_VERSION)" ;
+                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -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 ;
+                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -current_version "$(DYLIB_CURRENT_VERSION)" ;
                     }
 		    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'`\" ;
-		    }
-		    # make link to library if in versioned framework
-		    if $(INNER_PRODUCT_LINK) {
-		        SymLink $(INNER_PRODUCT_LINK) : $(INNER_PRODUCT_LINK_PATH) ;
-		        NOUPDATE $(INNER_PRODUCT_LINK) ;
-		        PRODUCT_FILES += $(INNER_PRODUCT_LINK) ;
-		        if $(BUILD_PHASING) = YES {
-			    BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT_LINK) ;
+                        DYLIB_INSTALLED_NAME_$(VARIANT) default = $(INSTALL_PATH)$(/)$(INNER_PRODUCT_$(VARIANT):G=) ;
+                        INSTALLED_NAME_FLAG on $(INNER_PRODUCT_$(VARIANT)) = -install_name \"`echo \"$(DYLIB_INSTALLED_NAME_$(VARIANT))\" | $(SED) 's!//*!/!g'`\" ;
 		        }
 		    }
-	        case * :
-		    ECHO warning: unknown project type ;
 	   }
         }
         else {
+            # no object files present, indicating pure Java
             if $(PRODUCT_TYPE) = Framework {
                 if $(CURRENT_VERSION_LINK) {
-                    INNER_PRODUCT default = $(1)$(/)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_$(VARIANT) default = $(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:B)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
+                    INNER_PRODUCT_LINK_$(VARIANT) default = $(1:G=)$(/)$(1:BG=)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
+                    INNER_PRODUCT_LINK_PATH_$(VARIANT) default = Versions$(/)Current$(/)$(1:BG=)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
                     # inner product link
-                    SymLink $(INNER_PRODUCT_LINK) : $(INNER_PRODUCT_LINK_PATH) ;
-                    PRODUCT_FILES += $(INNER_PRODUCT_LINK) ;
-                    NOUPDATE $(INNER_PRODUCT_LINK) ;
+                    SymLink $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
+                    ProductFile $(INNER_PRODUCT_LINK_$(VARIANT)) ;
+                    NOUPDATE $(INNER_PRODUCT_LINK_$(VARIANT)) ;
                 }
                 else  {
-                    INNER_PRODUCT default = $(1)$(/)$(1:B)$(DYNAMIC_LIBRARY_SUFFIX) ;
+                    INNER_PRODUCT_$(VARIANT) default = $(1:G=)$(/)$(1:BG=)_$(VARIANT)$(DYNAMIC_LIBRARY_SUFFIX) ;
                 }
-                PRODUCT_FILES += $(INNER_PRODUCT) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT) ;
+                ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
+                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'`\" ;
+                    FRAMEWORK_INSTALLED_NAME_$(VARIANT) default = $(INSTALL_PATH)$(/)$(INNER_PRODUCT_$(VARIANT):G=) ;
+                    INSTALLED_NAME_FLAG on $(INNER_PRODUCT_$(VARIANT)) = -install_name \"`echo \"$(FRAMEWORK_INSTALLED_NAME_$(VARIANT))\" | $(SED) 's!//*!/!g'`\" ;
                 }
-                GenerateFrameworkStub $(INNER_PRODUCT) ;
-                DEPENDS $(INNER_PRODUCT) : $(1) ;
-                if $(INNER_PRODUCT_LINK) {
-                    SymLink $(INNER_PRODUCT_LINK) : $(INNER_PRODUCT_LINK_PATH) ;
-                    NOUPDATE $(INNER_PRODUCT_LINK) ;
-                    PRODUCT_FILES += $(INNER_PRODUCT_LINK) ;
-                    if $(BUILD_PHASING) = YES {
-                        BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT_LINK) ;
+                GenerateFrameworkStub $(INNER_PRODUCT_$(VARIANT)) ;
+                INNER_PRODUCT_DIR = $(INNER_PRODUCT_$(VARIANT):D) ;
+                if ! $(INNER_PRODUCT_DIR) in $(PRODUCT_FILES) {
+                    Mkdir $(INNER_PRODUCT_DIR) ;
+                    ProductFile $(INNER_PRODUCT_DIR) ;
+                    DEPENDS $(INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_DIR) ;
+                }
+                if $(INNER_PRODUCT_LINK_$(VARIANT)) {
+                    SymLink $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
+                    NOUPDATE $(INNER_PRODUCT_LINK_$(VARIANT)) ; 
+                    ProductFile $(INNER_PRODUCT_LINK_$(VARIANT)) ;
                     }
                 }
             }
-        } # end of object files block
+        # Java processing compatible with the presense of object files
         if $(COMPILED_JAVA) {
             # provide stub executable if necessary
             if $(JAVA_ONLY) = YES {
-                INNER_PRODUCT default = $(1)$(/)Contents$(/)MacOS$(/)$(1:B) ;
-                Cp $(INNER_PRODUCT) : $(JAVA_APP_STUB) ;
-                PRODUCT_FILES += $(INNER_PRODUCT) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(INNER_PRODUCT) ;
+                INNER_PRODUCT_$(VARIANT) default = $(1:G=)$(/)Contents$(/)MacOS$(/)$(1:BG=) ;
+                # must first make subfolder and depend on that
+                INNER_PRODUCT_SUBDIR = $(INNER_PRODUCT_$(VARIANT):D) ;
+                if ! $(INNER_PRODUCT_SUBDIR) in $(PRODUCT_FILES) {
+                    Mkdir $(INNER_PRODUCT_SUBDIR) ;
+                    ProductFile $(INNER_PRODUCT_SUBDIR) ;
                 }
+                Cp $(INNER_PRODUCT_$(VARIANT)) : $(JAVA_APP_STUB) ;
+                ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
             }
         }
         # Add jar/zip files that are in the link phase to the classpath
@@ -3064,7 +3927,7 @@
         }
         local ARCHIVE ;
         
-        for ARCHIVE in $(LINKED_FILES) {
+        for ARCHIVE in $(LINKED_FILES_$(VARIANT)) {
             switch $(ARCHIVE) {
             case *.framework :
                 local FW_SUBDIR ;
@@ -3104,7 +3967,8 @@
                 }
             }
         }
-        if $(COMPILED_JAVA) {
+        # 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 {
@@ -3123,8 +3987,13 @@
 	        }
 	        else {
                     CLASS_ARCHIVE default = $(1:B:G=)$(CLASS_ARCHIVE_SUFFIX) ;
-		    LOCATE on $(CLASS_ARCHIVE) = $(BUILD_DIR) ;
 	        }
+                # 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) {
@@ -3133,20 +4002,16 @@
                 else {
                     DEPENDS $(CLASS_ARCHIVE) : $(JAVA_COMPILE_TARGET) ;
                 }
-	        PRODUCT_FILES += $(CLASS_ARCHIVE) ;
-	        if $(BUILD_PHASING) = YES {
-		    BUILD_PHASE_PRODUCTS += $(CLASS_ARCHIVE) ;
-	        }
+                ProductFile $(CLASS_ARCHIVE) ;
 	    }
             if $(JAVA_ARCHIVE_CLASSES) != YES {
+                # !!!:cmolick:20020123 product class file dir not always made?!
                 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) ;
+                ProductFile $(PRODUCT_CLASS_FILE_DIR) ;
+
+                CLASS_COPY_TARGET default = $(PRODUCT_CLASS_FILE_DIR:G=ClassCopy) ;
                 ClassCopy $(CLASS_COPY_TARGET) : $(CLASS_FILE_DIR) ;
-                Mkdir $(PRODUCT_CLASS_FILE_DIR) ;
+                ProductFile $(CLASS_COPY_TARGET) ;
                 DEPENDS $(CLASS_COPY_TARGET) : $(PRODUCT_CLASS_FILE_DIR) ;
 	        if $(MERGED_ARCHIVES) {
                     DEPENDS $(CLASS_COPY_TARGET) : $(MERGED_ARCHIVES) ;
@@ -3154,18 +4019,12 @@
                 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_PHASING) = YES {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
             }
@@ -3173,25 +4032,32 @@
         }
     }
 }
+}
 
 rule ProcessFrameworkOrLibrary
 {
-    LINKED_FILES += $(2) ;
+    for VARIANT in $(BUILD_VARIANTS) {
+    LINKED_FILES_$(VARIANT) += $(2) ;
 }
+}
 
+# ProcessRezFiles <product> <rez and resmerger input files>
+#
+# 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 {
+        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 {
+                if $(_BUILD_PHASING) = YES {
                     ProcessRezFile $(BUILD_PHASE) : $(FILE) ;
                 }
                 else {
@@ -3205,17 +4071,14 @@
                 if ! $(INNER_PRODUCT) in $(PRESERVE_RESOURCES) {
                      PRESERVE_RESOURCES += $(INNER_PRODUCT) ;
                 }
-                PRODUCT_FILES += $(RESOURCE_FORK) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(RESOURCE_FORK) ;
-                }
+                ProductFile $(RESOURCE_FORK) ;
                 if $(ALWAYS_REZ) = YES {
                     ALWAYS $(RESOURCE_FORK) ;
                 }
                 SetFile $(RESOURCE_FORK) ;
             }
         }
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
             }
@@ -3224,6 +4087,15 @@
     }
 }
 
+# ProcessRezFile <product or phase> <rez or resmerger input file>
+#
+# Sets up the compile of one Rez or ResMerger input file.
+# 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)_DIR	localized final folder
+# RESOURCE_MANAGER_RESOURCE_$(REGION)		localized final destination
 rule ProcessRezFile
 {
     if source in $(BUILD_COMPONENTS) {
@@ -3243,67 +4115,121 @@
         }
         # copy rez files to source location
         Cp $(REZ_SOURCE_COPY) : $(2) ;
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             BUILD_PHASE_PRODUCTS += $(REZ_SOURCE_COPY) ;
         }
     }
     if build in $(BUILD_COMPONENTS) {
         local REGION = $($(2)_REGION) ;
         # scan for header files
-        if $(ENABLE_HEADER_SCANNING) != NO {
+        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_FORK) = "" {
-                RESOURCE_FORK = $(INNER_PRODUCT:G=ResourceFork) ;
+            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/<product>.rsrc files
-            # or Resources/<region>.lproj/Localized.rsrc files
+            # By default ResourceManager resources are stored in data forks
+            # as Resources/<product>.rsrc files if non localized, or 
+            # Resources/<region>.lproj/Localized.rsrc files if localized.
             if $(REGION) {
-                RESOURCE_FORK = $(RESOURCE_DIR)$(/)$(REGION).lproj$(/)Localized.rsrc ;
+                # 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 {
-                RESOURCE_FORK = $(RESOURCE_DIR)$(/)$(1:S=.rsrc:G=) ;
+                # 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) ;
             }
-            DEPENDS $(RESOURCE_FORK) : $(RESOURCE_DIR) ;
-            if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) {
-                PRODUCT_FILES += $(RESOURCE_DIR) ;
-                if $(BUILD_PHASING) = YES {
-                    BUILD_PHASE_PRODUCTS += $(RESOURCE_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 $(ALWAYS_REZ) = YES {
+                        ALWAYS $(RESOURCE_MANAGER_RESOURCE) ;
             }
         }
-        # Setting ALWAYS_REZ nonempty correctly handles iterations
-        # on HFS when REZ_EXECUTABLE is YES and Rez may fail
-        if ! $(ALWAYS_REZ) = "" {
-            ALWAYS $(RESOURCE_FORK) ;
         }
-        if ! $(RESOURCE_FORK) in $(PRODUCT_FILES) {
-            PRODUCT_FILES += $(RESOURCE_FORK) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(RESOURCE_FORK) ;
+
+            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) ;
-            PRODUCT_FILES += $(RESOURCE_LINK) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(RESOURCE_LINK) ;
-            }
-        }
-        if $(2:S) = ".r" {
-            Rez $(RESOURCE_FORK) : $(2) ;
-        } else {
-            ResMerge $(RESOURCE_FORK) : $(2) ;
+            ProductFile $(RESOURCE_LINK) ;
         }
     }
 }
@@ -3311,12 +4237,13 @@
 rule ProcessScriptBuildPhaseFiles
 {
     if build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) {
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             PhaseTarget BUILD_PHASE : $(1) : Script ;
             BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
             BUILD_PHASE_PRODUCTS = ;
         }
-        if build in $(BUILD_COMPONENTS) {
+        if build in $(BUILD_COMPONENTS)
+         || ( headers in $(BUILD_COMPONENTS) && $(INSTALLHDRS_SCRIPT_PHASE) = YES ) {
             SEARCH on $(2) = $(SOURCE_ROOT) $(TEMP_ROOT) ;
             PHASE_SCRIPT_EXECUTION = $(2:G=Execution) ;
             NOTFILE $(PHASE_SCRIPT_EXECUTION) ;
@@ -3324,21 +4251,17 @@
             DEPENDS $(1) : $(PHASE_SCRIPT_EXECUTION) ;
             PhaseScriptExecution $(PHASE_SCRIPT_EXECUTION) : $(2) ;
             if ! $(PHASE_SCRIPT_EXECUTION) in $(PRODUCT_FILES) {
-                if $(BUILD_PHASING) = YES {
+                if $(_BUILD_PHASING) = YES {
                     BUILD_PHASE_PRODUCTS += $(PHASE_SCRIPT_EXECUTION) ;
                 }
             }
         }
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
             }
             PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
         }
-        # For compatibility:
-        export TEMP_FILES_DIR default = $(TEMP_DIR) ;
-        export DERIVED_SOURCES_DIR default = $(DERIVED_FILE_DIR) ;
-        export BUILD_PATH default = $(OBJROOT) ;
     }
 }
 
@@ -3355,11 +4278,12 @@
     "$(2)"
     _result=$?
     echo "=== Exit code: ${_result} ==="
+    exit ${_result}
 }
 
 rule ProcessCopyFiles
 {
-    if $(BUILD_PHASING) = YES {
+    if $(_BUILD_PHASING) = YES {
         PhaseTarget BUILD_PHASE : $(1) : CopyFiles ;
         BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
         BUILD_PHASE_PRODUCTS = ;
@@ -3371,7 +4295,7 @@
             ProcessCopyFile $(1) : $(FILE) : $(COPYFILES_DESTINATION_PATH) ;
         }
     }
-    if $(BUILD_PHASING) = YES {
+    if $(_BUILD_PHASING) = YES {
         if $(BUILD_PHASE_PRODUCTS) {
             DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
         }
@@ -3398,7 +4322,7 @@
             Mkdir $(SOURCE_DIR) ;
         }
         Cp $(SOURCE_COPY) : $(2) ;
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             BUILD_PHASE_PRODUCTS += $(SOURCE_COPY) ;
         }
     }
@@ -3406,20 +4330,14 @@
         local DESTINATION_DIR = $(3) ;
         if ! $(DESTINATION_DIR) in $(PRODUCT_FILES) {
             Mkdir $(DESTINATION_DIR) ;
-            PRODUCT_FILES += $(DESTINATION_DIR) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(DESTINATION_DIR) ;
-            }
+            ProductFile $(DESTINATION_DIR) ;
         }
         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) ;
-        PRODUCT_FILES += $(DESTINATION) ;
-        if $(BUILD_PHASING) = YES {
-            BUILD_PHASE_PRODUCTS += $(DESTINATION) ;
-        }
         RobustCp $(DESTINATION) : $(2) ;
     }
 }
@@ -3428,7 +4346,7 @@
 {
     if build in $(BUILD_COMPONENTS) {
         local FILE ;
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             PhaseTarget BUILD_PHASE : $(1) : JavaArchiveFiles ;
             BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
             BUILD_PHASE_PRODUCTS = ;
@@ -3437,7 +4355,7 @@
         for FILE in $(2) {
             ProcessJavaArchiveFile $(1) : $(FILE) : $(CLASS_FILE_DIR) ;
         }
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
             }
@@ -3452,12 +4370,14 @@
     local ARCHIVE_DESTINATION ;
 
     # copy any other reference - formulate destination first
+    if $($(2)_JAVA_ARCHIVE_SUBDIR) {
+        ARCHIVE_DESTINATION = $(3)$(/)$($(2)_JAVA_ARCHIVE_SUBDIR)$(/)$(2:BS) ;
+    }
+    else {
     RemovePrefixPath ARCHIVE_PATH : $(JAVA_SOURCE_SUBDIR) : $(2) ;
     ARCHIVE_DESTINATION = $(3)$(/)$(ARCHIVE_PATH) ;
-    PRODUCT_FILES += $(ARCHIVE_DESTINATION) ;
-    if $(BUILD_PHASING) = YES {
-        BUILD_PHASE_PRODUCTS += $(ARCHIVE_DESTINATION) ;
     }
+    ProductFile $(ARCHIVE_DESTINATION) ;
     Cp $(ARCHIVE_DESTINATION) : $(2) ;
 
     # copied content depends on source
@@ -3466,13 +4386,13 @@
     local DESTINATION_DIR = $(ARCHIVE_DESTINATION:D) ;
     DEPENDS $(ARCHIVE_DESTINATION) : $(DESTINATION_DIR) ;
     if ! $(DESTINATION_DIR) in $(PRODUCT_FILES) {
-        PRODUCT_FILES += $(DESTINATION_DIR) ;
+        Mkdir $(DESTINATION_DIR) ;
+        ProductFile $(DESTINATION_DIR) ;
     }
     # 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.
 
@@ -3491,14 +4411,43 @@
         }
     }
     export JAVA_SOURCE_PATH default = $(SOURCE_ROOT)$(/)$(JAVA_SOURCE_SUBDIR) ;
-    export JAVAC_FLAGS = $(JAVA_COMPILER_FLAGS) ;
-    if $(DEBUGGING_SYMBOLS) = YES {
+
+    # start with the compiler-specific flags.
+    if $(JAVA_COMPILER:B) = jikes {
+        export JAVAC_FLAGS = $(JIKES_DEFAULT_FLAGS) ;
+    }
+    if $(JAVA_COMPILER:B) = javac {
+        export JAVAC_FLAGS = $(JAVAC_DEFAULT_FLAGS) ;
+    }
+    else {
+        export JAVAC_FLAGS = ;
+    }
+    
+    if $(JAVA_COMPILER_DISABLE_WARNINGS) = YES {
+        JAVAC_FLAGS += "-nowarn" ;
+    }
+    if $(JAVA_COMPILER_DEPRECATED_WARNINGS) = YES {
+        JAVAC_FLAGS += "-deprecation" ;
+    }
+    JAVAC_FLAGS += $(JAVA_COMPILER_FLAGS) ;
+
+    if $(JAVA_COMPILER_TARGET_VM_VERSION) {
+        if $(JAVA_COMPILER:B) = jikes {
+            ECHO warning: Target VM version not supported by jikes ;
+        }
+        else {
+            JAVAC_FLAGS += "-target "$(JAVA_COMPILER_TARGET_VM_VERSION) ;
+        }
+    }
+    
+    if $(JAVA_COMPILER_DEBUGGING_SYMBOLS) = YES {
         JAVAC_FLAGS += "-g" ;
     }
-    # !!!:cmolick:20010326 settings that activate optimization are in flux
-    if "Optimize" in $($(2)_ATTRIBUTES) {
-        JAVAC_FLAGS += "-O" ;
+    
+    if $(JAVAC_SOURCE_FILE_ENCODING) {
+        JAVAC_FLAGS += -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
@@ -3514,10 +4463,7 @@
         }
         COMPILED_JAVA += $(2) ;
         if ! $(JAVA_COMPILE_TARGET) in $(PRODUCT_FILES) {
-            PRODUCT_FILES += $(JAVA_COMPILE_TARGET) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(JAVA_COMPILE_TARGET) ;
-            }
+            ProductFile $(JAVA_COMPILE_TARGET) ;
         }
     }
     else {
@@ -3540,11 +4486,8 @@
             }
             else {
 	        JavaCompile.default $(JAVA_COMPILE_TARGET) : $(JAVA_FILE_LIST_REFERENCE) ;
-            }
-            PRODUCT_FILES += $(JAVA_COMPILE_TARGET) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(JAVA_COMPILE_TARGET) ;
             }
+            ProductFile $(JAVA_COMPILE_TARGET) ;
         }
         # set up class file dependence used to add java files to compile list
         local CLASS_FILE ;
@@ -3575,10 +4518,15 @@
     $(RM) -rf "$(JAVA_FILE_LIST)" && $(TOUCH) "$(JAVA_FILE_LIST)"
 }
 
+# Appends reference to list only if not already present
 actions quietly together piecemeal AppendToJavaFileList
 {
-    $(ECHO) "$(2)" >> "$(JAVA_FILE_LIST)"
+    _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
@@ -3589,14 +4537,14 @@
     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)'
+    $(JAVA_COMPILER) +OLDCSO +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 {
+        if $(_BUILD_PHASING) = YES {
             PhaseTarget BUILD_PHASE : $(1) : CompileAppleScripts ;
             BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
             BUILD_PHASE_PRODUCTS = ;
@@ -3604,7 +4552,7 @@
         if $(CONTEXTNAME) = ""
         {
             for FILE in $(2) {
-                if $(BUILD_PHASING) = YES {
+                if $(_BUILD_PHASING) = YES {
                     ProcessAppleScript $(BUILD_PHASE) : $(FILE) : $(FILE) ;
                 }
                 else {
@@ -3616,7 +4564,7 @@
         {
             ProcessAppleScript $(1) : $(2) : $(CONTEXTNAME) ;
         }
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             if $(BUILD_PHASE_PRODUCTS) {
                 DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
             }
@@ -3642,53 +4590,56 @@
         }
         # copy script to source location
         Cp $(SCRIPT_SOURCE_COPY) : $(2) ;
-        if $(BUILD_PHASING) = YES {
+        if $(_BUILD_PHASING) = YES {
             BUILD_PHASE_PRODUCTS += $(SCRIPT_SOURCE_COPY) ;
         }
     }
     if build in $(BUILD_COMPONENTS) {
+        if $(2) = $(3) {
+            # third argument is a file (ignore subfolder for result)
+            APPLESCRIPT_FILE = $(APPLESCRIPTS_DIR)$(/)$(3:BS=.scpt) ;
+        }
+        else {
+            # third argument is a context name
         APPLESCRIPT_FILE = $(APPLESCRIPTS_DIR)$(/)$(3:S=.scpt) ;
+        }
         DEPENDS $(APPLESCRIPT_FILE) : $(APPLESCRIPTS_DIR) ;
         if ! $(APPLESCRIPTS_DIR) in $(PRODUCT_FILES) {
             Mkdir $(APPLESCRIPTS_DIR) ;
-            PRODUCT_FILES += $(APPLESCRIPTS_DIR) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(APPLESCRIPTS_DIR) ;
-            }
+            ProductFile $(APPLESCRIPTS_DIR) ;
         }
         DEPENDS $(APPLESCRIPT_FILE) : $(2) ;
-        if ! $(APPLESCRIPT_FILE) in $(PRODUCT_FILES) {
-            PRODUCT_FILES += $(APPLESCRIPT_FILE) ;
-            if $(BUILD_PHASING) = YES {
-                BUILD_PHASE_PRODUCTS += $(APPLESCRIPT_FILE) ;
-            }
-        }
         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)"
+    $(OSAC) -d -i $(SYSTEM_LIBRARY_DIR)/Frameworks/AppleScriptKit.framework -U "$(2:BS)" -o "$(1)" $(OTHER_OSAFLAGS) "$(2)"
 }
 
 rule ProcessC
 {
+    for VARIANT in $(BUILD_VARIANTS) {
     for ARCH in $(ARCHS) {
         local OBJECT_FILE ;
-        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR)$(/)$(ARCH) ;
+        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(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 ;
+            OBJECT_FILE = $($(2)_UNIQUENAME:G=$(VARIANT)-$(ARCH)).o ;
         }
         else {
-            OBJECT_FILE = $(2:D=:S=:G=$(ARCH)).o ;
+            OBJECT_FILE = $(2:D=:S=:G=$(VARIANT)-$(ARCH)).o ;
         }
         DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ;
         if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) {
             Mkdir $(OBJECT_SUBDIR) ;
-            if $(BUILD_PHASING) = YES {
+#!!!:needs to be a product file without LOCATE
+#            ProductFile $(OBJECT_SUBDIR) ;
+            PRODUCT_FILES += $(OBJECT_SUBDIR) ;
+            if $(_BUILD_PHASING) = YES {
                 BUILD_PHASE_PRODUCTS += $(OBJECT_SUBDIR) ;
             }
         }
@@ -3701,24 +4652,24 @@
         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 {
+            OBJECT_FILES_$(VARIANT) += $(OBJECT_FILE) ;
+            OBJECT_FILES_$(VARIANT)_$(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) ;
+            MODULE_OBJECT_FILE_$(VARIANT) = $(OBJECT_FILE) ;
+            LOCATE on $(MODULE_OBJECT_FILE_$(VARIANT)) = $(OBJECT_SUBDIR) ;
+            DEPENDS $(1) : $(MODULE_OBJECT_FILE_$(VARIANT)) ;
         }
         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) ;
+                LINKED_FILES_$(VARIANT) += $(OBJECT_FILE) ;
+            }
             }
         }
     }
@@ -3726,20 +4677,22 @@
 
 rule ProcessCplusplus
 {
+    for VARIANT in $(BUILD_VARIANTS) {
     for ARCH in $(ARCHS) {
         local OBJECT_FILE ;
-        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR)$(/)$(ARCH) ;
+        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(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 ;
+            OBJECT_FILE = $($(2)_UNIQUENAME:G=$(VARIANT)-$(ARCH)).o ;
         }
         else {
-            OBJECT_FILE = $(2:D=:S=:G=$(ARCH)).o ;
+            OBJECT_FILE = $(2:D=:S=:G=$(VARIANT)-$(ARCH)).o ;
         }
         DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ;
         if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) {
             Mkdir $(OBJECT_SUBDIR) ;
-            if $(BUILD_PHASING) = YES {
+            # !!!:cmolick:20010727 should be a ProductFile
+            if $(_BUILD_PHASING) = YES {
                 BUILD_PHASE_PRODUCTS += $(OBJECT_SUBDIR) ;
             }
         }
@@ -3747,25 +4700,27 @@
         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 {
+        OBJECT_FILES_$(VARIANT) += $(OBJECT_FILE) ;
+        OBJECT_FILES_$(VARIANT)_$(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) ;
+        if $(2) = $(MODULE_INFO_FILE_$(VARIANT)) {
+            MODULE_OBJECT_FILE_$(VARIANT) = $(OBJECT_FILE) ;
+            LOCATE on $(MODULE_OBJECT_FILE_$(VARIANT)) = $(OBJECT_SUBDIR) ;
+            DEPENDS $(1) : $(MODULE_OBJECT_FILE_$(VARIANT)) ;
         }
         else {
             LOCATE on $(OBJECT_FILE) = $(OBJECT_SUBDIR) ;
-            LINKED_FILES += $(OBJECT_FILE) ;
+            LINKED_FILES_$(VARIANT) += $(OBJECT_FILE) ;
+        }
         }
     }
 }
 
-HDRPATTERN = "^#[	 ]*include[	 ]*[<\"](.*)[\">].*$" ;
-HDRPATTERN += "^#[	 ]*import[	 ]*[<\"](.*)[\">].*$" ;
+HDRPATTERN = "^[	 ]*#[	 ]*include[	 ]*[<\"](.*)[\">].*$" ;
+HDRPATTERN += "^[	 ]*#[	 ]*import[	 ]*[<\"](.*)[\">].*$" ;
+
 rule ProcessC.HdrRule
 {
     # header reference in subdirectory source may be to header in that subdirectory
@@ -3786,8 +4741,8 @@
     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 ;
+        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
+        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
         if $(ARCH) in ppc {
             KERNEL_COMPILE_OPTIONS += -mlong-branch ;
         }
@@ -3799,6 +4754,17 @@
         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 ;
+        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
+            USE_DYNAMIC_NO_PIC default = YES ;
+        } else {
+            USE_DYNAMIC_NO_PIC default = NO ;
+        }
+        if $(USE_DYNAMIC_NO_PIC) = YES {
+            FLAGS on $(1) += -mdynamic-no-pic ;
+        }
+    }
     # seed search paths with target-wide values
     HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
     FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
@@ -3810,6 +4776,11 @@
     }
     # We must compile with the extension-specific build flags
     FLAGS on $(1) += $($(2:S)_CFLAGS) ;
+    # Add variant-specific flags
+    local _VARIANT_FLAGS = $($(CC:BS)_$(VARIANT)_FLAGS) ;
+    if $(_VARIANT_FLAGS) {
+        FLAGS on $(1) += $(_VARIANT_FLAGS) ;
+    }
     # Add debug flags, if appropriate.
     if $(DEBUGGING_SYMBOLS) = YES {
         FLAGS on $(1) += -g ;
@@ -3820,27 +4791,32 @@
     }
     # 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 {
+    if $(OS) in MACOS DARWIN  &&  $(EFFECTIVE_PFE_FILE_$(ARCH)) = "" {
         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 ;
+        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(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 $(MASTER_IMPLICIT_HEADER) {
-        IMPLICIT_INCLUSION_FLAGS on $(1) += -include $(MASTER_IMPLICIT_HEADER) ;
+    if $(EFFECTIVE_PFE_FILE_$(ARCH)) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
+        PREFIX_HEADER_CFLAGS on $(1) = --load-pch "$(EFFECTIVE_PFE_FILE_$(ARCH))" ;
+        DEPENDS $(1) : $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
     }
+    if $(EFFECTIVE_PREFIX_HEADER) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
+        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)" "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "$(IMPLICIT_INCLUSION_FLAGS)" "$(2)" -o "$(1)"
+    $(CC:Q) -c -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) "$(FLAGS)" $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) $(PREFIX_HEADER_CFLAGS:Q) $(2:Q) -o $(1:Q)
 }
 
 rule CompileCplusplus
@@ -3851,16 +4827,23 @@
     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_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
+        #!!!:cmolick:20020228 different default flags for gcc3 kext builds
+        if $(USE_GCC3) = YES {
+            KERNEL_COMPILE_OPTIONS = -fno-builtin -x c++ -fno-rtti -fno-exceptions -fcheck-new ;
+            if $(MODULE_IOKIT) = YES {
+                KERNEL_COMPILE_OPTIONS += -fapple-kext ;
         }
-        KERNEL_COMPILE_OPTIONS += -x c++ -fno-rtti -fno-exceptions -fcheck-new -fvtable-thunks ;
+        }
+        else {
+            KERNEL_COMPILE_OPTIONS = -fno-builtin -x c++ -fno-rtti -fno-exceptions -fcheck-new -fvtable-thunks ;
         if $(MODULE_IOKIT) = YES {
             KERNEL_COMPILE_OPTIONS += -findirect-virtual-calls ;
         }
-
+        }
+        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_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) = ;
@@ -3873,6 +4856,17 @@
         FLAGS on $(1) += $(OTHER_CPLUSPLUSFLAGS) ;
     }
     FLAGS on $(1) += -pipe ;
+    if ( $(USE_GCC3) = YES ) {
+        FLAGS on $(1) += -fmessage-length=0 ;
+        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
+            USE_DYNAMIC_NO_PIC default = YES ;
+        } else {
+            USE_DYNAMIC_NO_PIC default = NO ;
+        }
+        if $(USE_DYNAMIC_NO_PIC) = YES {
+            FLAGS on $(1) += -mdynamic-no-pic ;
+        }
+    }
     # seed search paths with target-wide values
     HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
     FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
@@ -3883,6 +4877,11 @@
     }
     # We must compile with the extension-specific build flags
     FLAGS on $(1) += $($(2:S)_CC_FLAGS) ;
+    # Add variant-specific flags
+    local _VARIANT_FLAGS = $($(CC:BS)_$(VARIANT)_FLAGS) ;
+    if $(_VARIANT_FLAGS) {
+        FLAGS on $(1) += $(_VARIANT_FLAGS) ;
+    }
     # Add debug flags, if appropriate.
     if $(DEBUGGING_SYMBOLS) = YES {
         FLAGS on $(1) += -g ;
@@ -3893,24 +4892,30 @@
     }
     # 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 {
+    if $(OS) in MACOS DARWIN  &&  $(EFFECTIVE_PFE_FILE_$(ARCH)) = "" {
         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 ;
+        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(1:DB).ilog ;
         FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
     }
-    if $(MASTER_IMPLICIT_HEADER) {
-        IMPLICIT_INCLUSION_FLAGS on $(1) += -include $(MASTER_IMPLICIT_HEADER) ;
+    if $(EFFECTIVE_PFE_FILE_$(ARCH)) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
+        PREFIX_HEADER_CFLAGS on $(1) = --load-pch "$(EFFECTIVE_PFE_FILE_$(ARCH))" ;
+        DEPENDS $(1) : $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
+    }
+    if $(EFFECTIVE_PREFIX_HEADER) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
+        PREFIX_HEADER_CFLAGS on $(1) += -include "$(EFFECTIVE_PREFIX_HEADER)" ;
+        DEPENDS $(1) : $(EFFECTIVE_PREFIX_HEADER) ;
     }
+    _LD_FOR_LINKING = $(LDPLUSPLUS) ;
 }
 
 actions CompileCplusplus
 {
-    $(CC) -c "-F$(FRAMEWORK_SEARCH_PATHS)" "-I$(HEADER_SEARCH_PATHS)" "$(FLAGS)" $(GLOBAL_CFLAGS) "-I$(DERIVED_PATHS)" "$(IMPLICIT_INCLUSION_FLAGS)" "$(2)" -o "$(1)"
+    $(CPLUSPLUS:Q) -c -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) "$(FLAGS)" $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) $(PREFIX_HEADER_CFLAGS:Q) $(2:Q) -o $(1:Q)
 }
 
 VECTOR_SUFFIX default = ;
@@ -3919,7 +4924,7 @@
     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 ;
+        VECTOR_OBJECT_FILE default = $(TEMP_DIR)$(/)$(1:B)Vector.o ;
         if $(VECTOR_SUFFIX) {
             VECTOR_FRAGMENT_NAME default = CFMPriv_$(1:B)$(VECTOR_SUFFIX) ;
         }
@@ -3948,16 +4953,16 @@
     if AbsolutePath in $($(2)_ATTRIBUTES) {
         FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ;
     }
-    if $(MACH_SERVER) != YES || $(MACH_CLIENT_AND_SERVER) = YES {
+# was    if $(MACH_SERVER) != YES || $(MACH_CLIENT_AND_SERVER) = YES {
+    if Client in $($(2)_ATTRIBUTES) {
         TEMP_FILES = $(FILE_BASE).h $(FILE_BASE)User.c ;
     }
-    if $(MACH_SERVER) = YES || $(MACH_CLIENT_AND_SERVER) = YES {
+# was    if $(MACH_SERVER) = YES || $(MACH_CLIENT_AND_SERVER) = YES {
+    if Server in $($(2)_ATTRIBUTES) {
         TEMP_FILES += $(FILE_BASE)Server.h $(FILE_BASE)Server.c ;
     }
-    DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ;
     Mig $(TEMP_FILES) : $(2) ;
-    DERIVED_FILES += $(TEMP_FILES) ;
-    BUILD_PHASE_PRODUCTS += $(TEMP_FILES) ;
+    DerivedFiles $(TEMP_FILES) ;
     ProcessFiles $(1) : $(TEMP_FILES) ;
 }
 
@@ -3980,8 +4985,7 @@
     }
     DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ;
     Lex $(TEMP_FILES) : $(2) ;
-    DERIVED_FILES += $(TEMP_FILES) ;
-    BUILD_PHASE_PRODUCTS += $(TEMP_FILES) ;
+    DerivedFiles $(TEMP_FILES) ;
     ProcessFiles $(1) : $(TEMP_FILES) ;
 }
 
@@ -4004,8 +5008,7 @@
     }
     DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ;
     Yacc $(TEMP_FILES) : $(2) ;
-    DERIVED_FILES += $(TEMP_FILES) ;
-    BUILD_PHASE_PRODUCTS += $(TEMP_FILES) ;
+    DerivedFiles $(TEMP_FILES) ;
     ProcessFiles $(1) : $(TEMP_FILES) ;
 }
 
@@ -4018,8 +5021,7 @@
     local TEMP_FILES = $(FILE_BASE).h $(FILE_BASE)_xdr.c ;
     DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ;
     RPCGen $(TEMP_FILES) : $(2) ;
-    DERIVED_FILES += $(TEMP_FILES) ;
-    BUILD_PHASE_PRODUCTS += $(TEMP_FILES) ;
+    DerivedFiles $(TEMP_FILES) ;
     ProcessFiles $(1) : $(TEMP_FILES) ;
 }
 
@@ -4027,7 +5029,7 @@
 {
     Bridget $(1) : $(2) ;
 }
-# Copyright (c) 1999,2000 Apple Computer, Inc.
+# Copyright (c) 1999-2002 Apple Computer, Inc.
 # All rights reserved.
 
 # High level rules for build actions on targets
@@ -4037,22 +5039,39 @@
 rule Actions
 {
     Clean clean : $(1) ;
-    Build build : $(1) ;
-    Install install : $(1) ;
-    InstallHeaders installhdrs : $(1) ;
-    NOTFILE installhdrs ;
-    InstallSource installsrc : $(1) ;
+    BuildAction build : $(1) ;
+    BuildAction copysrc : $(1) ;
+    NOTFILE copysrc ;
+    BuildAction copyhdrs : $(1) ;
+    NOTFILE copyhdrs ;
+    BuildAction copyrsrcs : $(1) ;
+    NOTFILE copyrsrcs ;
+    BuildAction install : $(1) ;
+    BuildAction installdebugonly : $(1) ;
+    NOTFILE installdebug ;
+    BuildAction installprofileonly : $(1) ;
+    NOTFILE installprofile ;
+    BuildAction installdebugprofileonly : $(1) ;
+    NOTFILE installdebugprofile ;
+    BuildAction installsrc : $(1) ;
     NOTFILE installsrc ;
+    BuildAction installhdrs : $(1) ;
+    NOTFILE installhdrs ;
+    BuildAction installrsrcs : $(1) ;
+    NOTFILE installrsrcs ;
 }
 
 # Clean clean : <product>
 # Deletes the product and the files associated with building it
 rule Clean
 {
-    # invoke clean action to remove target temporary directories
-    Clean.Remove $(2:G=clean) : $(2) $(TEMP_DIR) ;
-    Clean.Remove $(PRODUCT_NAME:G=clean) : $(2) $(TEMP_DIR) ;
-    Clean.Remove clean : $(2) $(TEMP_DIR) ;
+    # locate built product and remove
+    local BUILT_PRODUCT = $(2:G=) ;
+    LOCATE on $(BUILT_PRODUCT) = $(TARGET_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.
@@ -4066,19 +5085,17 @@
     }
     ARCHIVE_SUFFIX default = "" ;
     ARCHIVE_TARGET = $(2:G=)$(ARCHIVE_SUFFIX) ;
-    LOCATE on $(ARCHIVE_TARGET) = $(BUILD_DIR) ;
+    LOCATE on $(ARCHIVE_TARGET) = $(TARGET_BUILD_DIR) ;
     Clean.RemoveArchive clean : $(ARCHIVE_TARGET) ;
-
-    # whole project content to remove on full clean
-    Clean.Remove clean : $(2) $(PRECOMP_TRUSTFILE) ;
-    # mferris:20010310 Do not remove whole shared ProjectHeaders dir. Just remove the specific subdirs for this target.
-    # Clean.Remove clean : $(2) $(BASE_PROJECT_HEADER_DIR) ;
+    # remove project header clones for this target
     if $(PROJECT_HEADER_DIR) {
-        Clean.Remove clean : $(2) $(PROJECT_HEADER_DIR) ;
+        Clean.Remove clean : $(PROJECT_HEADER_DIR) ;
     }
     if $(WRAPPER_CLONE_DIR) {
-        Clean.Remove clean : $(2) $(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 
@@ -4092,168 +5109,29 @@
         $(RM) -rf "$(2)"
     fi
 }
-
-# Build build : <product>
-# Builds <product>
-rule Build
-{
-    local BUILD_TARGET = $(2:G=build) ;
-    DEPENDS $(1) : $(BUILD_TARGET) ;
-    NOTFILE $(BUILD_TARGET) ;
-    DEPENDS $(BUILD_TARGET) : $(2) ;
-}
 
-# Install <product>
-# Installs <product> in INSTALL_DIR by copying, stripping,
-# and setting file mode and ownership
-rule Install
-{
-    if $(SKIP_INSTALL) != "YES" {
-        # 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) ;
-        # recursive copy of product (does not preserve resource forks)
-        BulkCopy $(INSTALLED_PRODUCT) : $(2) ;
-        # 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 "<Preserve>" 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) ;
-            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 <product>
-# Installs headers for the product in INSTALL_DIR by copying
-# and setting file mode and ownership
-rule InstallHeaders
+rule BuildAction
 {
-    if $(SKIP_INSTALL) != YES {
-        # define installhdrs target and dependencies
-        local ACTION_TARGET = $(2:G=installhdrs) ;
+    local ACTION_TARGET = $(2:G=$(1)BuildAction) ;
         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) : $(2) ;
-        # 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 <product>
-# 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) ;
-}
-
-# Sv sv
-# Displays the value of the variable stored in V
-rule Sv
-{
-}
-actions Sv
-{
-    $(ECHO) $(V) "=" $($(V))
 }
-Sv sv ;
 
 # RunVariantHackScript varianthack : <product>
-# Runs /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuild.sh
+# Runs /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuild.sh,
 rule RunVariantHackScript
 {
-    if $(RC_JASPER) || $(BUILD_VARIANTS_ONLY_IN_JASPER) != YES {
-        local VARIANT_HACK_TARGET = $(2:G=varianthack) ;
+    if $(RC_JASPER) || $(INTERNAL_BUILD_VARIANTS_ONLY_IN_JASPER) != YES {
+        local VARIANT_HACK_TARGET = $(1:G=varianthack) ;
         DEPENDS $(1) : $(VARIANT_HACK_TARGET) ;
         NOTFILE $(VARIANT_HACK_TARGET) ;
-        DEPENDS $(VARIANT_HACK_TARGET) : $(2) ;
-        DEPENDS install : $(1) ;
     }
 }
 actions exportvars RunVariantHackScript
 {
-    /bin/sh /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuilder.sh $(BUILD_VARIANTS)
+    /bin/sh /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuilder.sh $(INTERNAL_BUILD_VARIANTS)
 }
 # Copyright (c) 1999,2000 Apple Computer, Inc.
 # All rights reserved.
Index: pbxbuild.data/TargetNames
===================================================================
RCS file: /cvs/Darwin/AppleADBDisplay/pbxbuild.data/TargetNames,v
retrieving revision 1.1
retrieving revision 1.1.8.1
diff -u -d -b -w -r1.1 -r1.1.8.1
--- TargetNames	2001/08/22 23:39:52	1.1
+++ TargetNames	2002/06/06 19:00:59	1.1.8.1
@@ -1 +1,5 @@
+if [ "${Target}" = "AppleADBDisplay" ]; then
+	Targets='AppleADBDisplay'
+else
 Targets='AppleADBDisplay'
+fi
Index: pbxbuild.data/AppleADBDisplay.build/Info.plist
===================================================================
RCS file: /cvs/Darwin/AppleADBDisplay/pbxbuild.data/AppleADBDisplay.build/Info.plist,v
retrieving revision 1.3
retrieving revision 1.3.4.2
diff -u -d -b -w -r1.3 -r1.3.4.2
--- Info.plist	2002/02/07 02:13:02	1.3
+++ Info.plist	2002/06/06 19:01:00	1.3.4.2
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
-<plist version="0.9">
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
 <dict>
 	<key>CFBundleDevelopmentRegion</key>
 	<string>English</string>
@@ -19,7 +19,7 @@
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.0.2d1</string>
+	<string>1.0.2d2</string>
 	<key>IOKitPersonalities</key>
 	<dict>
 		<key>AppleADBDisplay</key>
@@ -75,6 +75,6 @@
 		<string>1.0.0b1</string>
 	</dict>
 	<key>OSBundleRequired</key>
-	<string>Root</string>
+	<string>Safe Boot</string>
 </dict>
 </plist>
Index: pbxbuild.data/AppleADBDisplay.build/Jamfile.jam
===================================================================
RCS file: /cvs/Darwin/AppleADBDisplay/pbxbuild.data/AppleADBDisplay.build/Jamfile.jam,v
retrieving revision 1.3
retrieving revision 1.3.4.2
diff -u -d -b -w -r1.3 -r1.3.4.2
--- Jamfile.jam	2002/02/07 02:13:02	1.3
+++ Jamfile.jam	2002/06/06 19:01:00	1.3.4.2
@@ -1,16 +1,29 @@
-# Jamfile for target AppleADBDisplay of project AppleADBDisplay
-# Generated by Project Builder on 2002-02-04 15:18:39 -0800
-# If you edit this file by hand it will no longer have Buddha-nature
+# Jamfile for target "AppleADBDisplay" of project "AppleADBDisplay"
 
-PROJECT = AppleADBDisplay ;
-# AppleADBDisplay target
-export deferred TARGET_NAME = AppleADBDisplay ;
-export deferred PRODUCT_NAME = AppleADBDisplay ;
 
-export deferred PKGINFO_FILE_CONTENTS = "KEXT????" ;
-export deferred PRODUCT_SETTINGS_PATH = "$(SRCROOT)/pbxbuild.data/AppleADBDisplay.build/Info.plist" ;
-export deferred DEVELOPMENT_SETTINGS_PATH = "$(SRCROOT)/pbxbuild.data/AppleADBDisplay.build/pbdevelopment.plist" ;
+JAVAC_SOURCE_FILE_ENCODING default = MacRoman ;
 
+# Implicitly computed project-wide settings for project
+export deferred DEVELOPMENT_LANGUAGE = English ;
+export deferred PROJECT = $(PROJECT_NAME) ;
+export deferred PROJECT_NAME = AppleADBDisplay ;
+export deferred SRCROOT = /Network/Servers/noether/homes/gandalf/ngervae/Public/AppleADBDisplay ;
+
+# User-defined project-wide settings for project
+
+# Target "AppleADBDisplay"
+
+export deferred _INFO_PLIST_FILE_PATH = "$(SRCROOT)/pbxbuild.data/AppleADBDisplay.build/Info.plist" ;
+export deferred _PKGINFO_FILE_PATH = "$(SRCROOT)/pbxbuild.data/AppleADBDisplay.build/PkgInfo" ;
+export deferred _PBDEVELOPMENT_PLIST_FILE_PATH = "$(SRCROOT)/pbxbuild.data/AppleADBDisplay.build/pbdevelopment.plist" ;
+
+# Implicitly computed build settings for target "AppleADBDisplay"
+export deferred CLONE_HEADERS = NO ;
+export deferred PFE_FILE_C_DIALECTS = "c++" ;
+export deferred TARGETNAME = $(TARGET_NAME) ;
+export deferred TARGET_NAME = AppleADBDisplay ;
+
+# User-defined build settings for target "AppleADBDisplay"
 export deferred FRAMEWORK_SEARCH_PATHS =  ;
 export deferred HEADER_SEARCH_PATHS =  ;
 export deferred INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions" ;
@@ -18,7 +31,7 @@
 export deferred LIBRARY_SEARCH_PATHS =  ;
 export deferred MODULE_IOKIT = YES ;
 export deferred MODULE_NAME = com.apple.driver.AppleADBDisplay ;
-export deferred MODULE_VERSION = 1.0.2d1 ;
+export deferred MODULE_VERSION = 1.0.2d2 ;
 export deferred OTHER_CFLAGS =  ;
 export deferred OTHER_LDFLAGS =  ;
 export deferred OTHER_REZFLAGS =  ;
@@ -36,6 +49,8 @@
 	export deferred COPY_PHASE_STRIP = YES ;
 }
 
+
+ConditionalDefinitions _ ;
 commitdeferred ;
 
 
Index: pbxbuild.data/AppleADBDisplay.build/pbdevelopment.plist
===================================================================
RCS file: /cvs/Darwin/AppleADBDisplay/pbxbuild.data/AppleADBDisplay.build/pbdevelopment.plist,v
retrieving revision 1.1
retrieving revision 1.1.8.2
diff -u -d -b -w -r1.1 -r1.1.8.2
--- pbdevelopment.plist	2001/08/22 23:39:53	1.1
+++ pbdevelopment.plist	2002/06/06 19:01:00	1.1.8.2
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PBXProjectSourcePath</key>
+	<string>/Network/Servers/noether/homes/gandalf/ngervae/Public/AppleADBDisplay/AppleADBDisplay.pbproj</string>
+</dict>
+</plist>

Generated by GNU enscript 1.6.4.