1# ProjectBuilder Jambase
2# Copyright (c) 1999,2000 Apple Computer, Inc.
3# All rights reserved.
4
5CROSS_ROOT default = "" ;
6
7JAMBASE_DIR default = $(JAMBASE:D) ;
8
9OS default = macos ;
10if $(OS) = MACOS {
11    OS = macos ;
12}
13
14if OS != "" {
15    include $(JAMBASE_DIR)/platform-$(OS).jam ;
16}
17
18# Copyright (c) 1999-2003 Apple Computer, Inc.
19# All rights reserved.
20
21# This file defines various functions for transforming text and
22# manipulating variables
23
24/ default = / ;
25
26# NonObjectFiles <non-object files returned> : <list of files>
27# Returns only files not in $(OBJECT_FILES_$(VARIANT)
28# or $(OBJECT_FILES_$(VARIANT)_$(ARCH)) for ARCH in $(ARCHS)
29rule NonObjectFiles
30{
31    $(1) = ;
32    for X in $(2) {
33        if ! $(X) in $(OBJECT_FILES_$(VARIANT)) {
34            REJECT = ;
35            for ARCH in $(ARCHS) {
36                if $(X) in $(OBJECT_FILES_$(VARIANT)_$(ARCH)) {
37                    REJECT = YES ;
38                }
39            }
40            if ! $(REJECT) {
41                $(1) += $(X) ;
42            }
43        }
44    }
45}
46
47#
48# RemovePrefixPath <variable> : <prefix> : <path-with-prefix>
49#  removes the given prefix from the path and puts the result
50# in the given variable
51#
52rule RemovePrefixPath
53{
54    local newname = $(3:BS) ;
55    local newdir = $(3:D) ;
56    local INDEX ;
57    if $(2) != "." {
58	for INDEX in 1 2 3 4 5 6 7 8 9 10 {
59	    if $(newdir) != $(2) {
60		newname = $(newdir:BS)/$(newname) ;
61		newdir = $(newdir:D) ;
62	    }
63	}
64    }
65    else {
66	newname = $(3) ;
67    }
68    $(1) = $(newname) ;
69}
70# Copyright (c) 1999-2003 Apple Computer, Inc.
71# All rights reserved.
72
73# Built-in definitions of common build settings.  These can be
74# overridden by any higher layer (project-level, target-level,
75# build-phase-level, command-line etc).
76
77# the four 'root' directories
78export deferred SRCROOT = $(PWD) ;
79export deferred OBJROOT = $(SYMROOT) ;
80export deferred SYMROOT = $(SRCROOT)/build ;
81export deferred DSTROOT = /tmp/$(PROJECT_NAME).dst ;
82
83# synonyms for the above
84export deferred SOURCE_ROOT = $(SRCROOT) ;
85export deferred TEMP_ROOT = $(OBJROOT) ;
86export deferred BUILD_ROOT = $(SYMROOT) ;
87export deferred INSTALL_ROOT = $(DSTROOT) ;
88
89# more specific directories inside the TEMP_ROOT
90export deferred TEMP_DIR = $(OBJROOT)/$(PROJECT_NAME).build/$(TARGET_NAME).build ;
91export deferred DERIVED_FILE_DIR = $(TEMP_DIR)/DerivedSources ;
92       deferred OBJECT_FILE_DIR = $(TEMP_DIR)/Objects ;
93       deferred CLASS_FILE_DIR = $(TEMP_DIR)/JavaClasses ;
94       deferred FILE_LIST = $(OBJECT_FILE_DIR)/LinkFileList ;
95       deferred PRECOMP_TRUSTFILE = $(TEMP_DIR)/TrustedPrecomps.txt ;
96
97# more specific directories inside the BUILD_ROOT
98export deferred BUILD_DIR = $(SYMROOT) ;
99
100# more specific directories inside the INSTALL_ROOT
101export deferred INSTALL_DIR = $(DSTROOT)/$(INSTALL_PATH) ;
102
103# installation parameters
104export deferred INSTALL_OWNER = $(USER) ;
105export deferred INSTALL_GROUP = $(GROUP) ;
106export deferred INSTALL_MODE_FLAG = "ugo-w,o+rX" ;
107
108# language-independent code generation settings
109       deferred OPTIMIZATION_LEVEL = 0 ;
110       deferred OPTIMIZATION_CFLAGS = -Os ;
111       deferred DEBUGGING_SYMBOLS = YES ;
112       deferred PROFILING_CODE = NO ;
113       deferred PREBINDING = YES ;
114
115# Java-specific (some are marginally obsolete)
116       deferred JAVA_ARCHIVE_CLASSES = YES ;
117       deferred JAVA_ARCHIVE_TYPE = JAR ;
118       deferred JAVA_APP_STUB = $(SYSTEM_LIBRARY_DIR)/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub ;
119       deferred JAVA_JAR_FLAGS = cv ;
120       deferred JAVA_SOURCE_SUBDIR = . ;
121       deferred JAVA_FRAMEWORK_RESOURCES_DIRS = Resources ;
122       deferred JAVA_FRAMEWORK_JARS = ;
123       deferred JAVA_USE_DEPENDENCIES = YES ;
124       deferred JAVA_ZIP_FLAGS = -urg ;
125       deferred JAVAC_SOURCE_FILE_ENCODING = MACINTOSH ;
126
127# miscellaneous
128export deferred DEVELOPMENT_LANGUAGE = English ;
129export deferred FRAMEWORK_VERSION = A ;
130       deferred REMOVE_CVS_FROM_RESOURCES = YES ;
131       deferred COPY_PHASE_STRIP = NO ;
132       deferred CLONE_HEADERS = NO ;
133       deferred KEEP_PRIVATE_EXTERNS = YES ;   # this currently affects the master.o file only
134       deferred USE_GCC3_PFE_SUPPORT = YES ;
135# We avoid setting a default value for this for Project Builder 2.1, so that lower-level tools can pick their own default.
136#export deferred MACOSX_DEPLOYMENT_TARGET = 10.2 ;
137
138
139rule ConditionalDefinitions
140{
141    # default mapping of build actions to build variants
142    switch $(ACTION) {
143        case build : deferred BUILD_COMPONENTS = headers build ;
144        case copysrc : deferred BUILD_COMPONENTS = source ;
145        case copyhdrs : deferred BUILD_COMPONENTS = headers ;
146        case copyrsrcs : deferred BUILD_COMPONENTS = resources ;
147        case install : deferred BUILD_COMPONENTS = headers build ; 
148         deferred DEPLOYMENT_LOCATION = YES ;
149         deferred DEPLOYMENT_POSTPROCESSING = YES ;
150        case installdebugonly : deferred BUILD_COMPONENTS = build ;
151         deferred DEPLOYMENT_LOCATION = YES ;
152         deferred DEPLOYMENT_POSTPROCESSING = YES ;
153         deferred BUILD_VARIANTS = debug ;
154        case installprofileonly : deferred BUILD_COMPONENTS = build ;
155         deferred DEPLOYMENT_LOCATION = YES ;
156         deferred DEPLOYMENT_POSTPROCESSING = YES ;
157         deferred BUILD_VARIANTS = profile ;
158        case installdebugprofileonly : deferred BUILD_COMPONENTS = build ;
159         deferred DEPLOYMENT_LOCATION = YES ;
160         deferred DEPLOYMENT_POSTPROCESSING = YES ;
161         deferred BUILD_VARIANTS = debug profile ;
162        case installhdrs : deferred BUILD_COMPONENTS = headers ;
163         deferred DEPLOYMENT_LOCATION = YES ;
164         deferred DEPLOYMENT_POSTPROCESSING = YES ;
165        case installsrc : deferred BUILD_COMPONENTS = source ;
166         deferred DEPLOYMENT_LOCATION = YES ;
167         deferred DEPLOYMENT_POSTPROCESSING = YES ;
168        case installrsrcs : deferred BUILD_COMPONENTS = resources ;
169         deferred DEPLOYMENT_LOCATION = YES ;
170         deferred DEPLOYMENT_POSTPROCESSING = YES ;
171    }
172
173    # conditional locations enabling install-in-place
174    if $(DEPLOYMENT_LOCATION) = YES {
175        if $(SKIP_INSTALL) || ! $(INSTALL_PATH) {
176            export deferred TARGET_BUILD_DIR = $(TEMP_ROOT)/UninstalledProducts ;
177        }
178        else {
179            export deferred TARGET_BUILD_DIR = $(INSTALL_ROOT)/$(INSTALL_PATH) ;
180        }
181        deferred BASE_PROJECT_HEADER_DIR = $(TEMP_ROOT)/ProjectHeaders ;
182        if $(INSTALLED_PRODUCT_ASIDES) = YES {
183            # built products go in subfolder when there are asides
184            export deferred BUILT_PRODUCTS_DIR = $(BUILD_ROOT)/BuiltProducts ;
185        }
186        else {
187            # built products go in build folder when there are no asides
188            export deferred BUILT_PRODUCTS_DIR = $(BUILD_ROOT) ;
189        }
190    }
191    else {
192        export deferred TARGET_BUILD_DIR = $(BUILD_DIR) ;
193        export deferred BUILT_PRODUCTS_DIR = $(BUILD_DIR) ;
194        deferred BASE_PROJECT_HEADER_DIR = $(BUILD_ROOT)/ProjectHeaders ;
195    }
196}
197# Copyright (c) 1999-2003 Apple Computer, Inc.
198# All rights reserved.
199
200# Maps legacy Makefile variables to modern Jambase variables
201# Set global C flags, architectures, and architecture flags for linking
202GLOBAL_CFLAGS default = $(RC_NONARCH_CFLAGS) ;
203ARCHITECTURES default = $(RC_ARCHS) ;
204SUPPORTED_ARCHITECTURES default = i386 ppc ;
205VALID_ARCHS default = i386 ppc ;
206for ARCH in $(SUPPORTED_ARCHITECTURES) {
207    if $(RC_$(ARCH)) = YES {
208        $(ARCH) = YES ;
209    }
210}
211
212# More compatibility definitions for things that we have
213# renamed that we had already told external users about
214export deferred TEMP_FILES_DIR = $(TEMP_DIR) ;
215export deferred DERIVED_SOURCES_DIR = $(DERIVED_FILE_DIR) ;
216export deferred BUILD_PATH = $(TEMP_ROOT) ;
217
218export deferred PROJECT = $(PROJECT_NAME) ;
219export deferred TARGETNAME = $(TARGET_NAME) ;
220
221# (the following four are build settings to the generated package files
222#  written by PBXCore -- the new names have underscores to indicate that
223#  they are private, and they have more consistent names -- we should
224#  be able to remove the old compatibility settings soon)
225export deferred PRODUCT_SETTINGS_PATH = $(_INFO_PLIST_FILE_PATH) ;
226export deferred PKGINFO_FILE_PATH = $(_PKGINFO_FILE_PATH) ;
227export deferred VERSION_SETTINGS_PATH = $(_VERSION_PLIST_FILE_PATH) ;
228export deferred DEVELOPMENT_SETTINGS_PATH = $(_PBDEVELOPMENT_PLIST_FILE_PATH) ;
229# Copyright (c) 1999-2003 Apple Computer, Inc.
230# All rights reserved.
231
232# !!!cmolick:20000821 hardcoded tool paths because variables not set yet
233APPLE_INTERNAL_TOOLS default = /AppleInternal/Developer/Tools ;
234SYSTEM_DEVELOPER_TOOLS default = /Developer/Tools ;
235# Variables for invoking commands using explict paths
236# except where built in shell functions should be used
237ASM		default = /usr/bin/as ;
238BRIDGET         default = /usr/bin/bridget ;
239# CC defined in BeginProduct rule based on value of GCC_VERSION and other settings
240CD		default = cd ;
241CHMOD		default = /bin/chmod ;
242CHOWN		default = /usr/sbin/chown ;
243CP		default = /bin/cp ;
244DITTO		default = /usr/bin/ditto ;
245ECHO            default = echo ;
246EGREP		default = /usr/bin/egrep ;
247FASTCP		default = /usr/lib/fastcp ;
248FIXPRECOMPS	default = /usr/bin/fixPrecomps ;
249FIND		default = /usr/bin/find ;
250GATHERHEADERDOC default = /usr/bin/gatherHeaderDoc ;
251HEADERDOC2HTML	default = /usr/bin/headerdoc2html ;
252INTERFACER	default = $(APPLE_INTERNAL_TOOLS)/Interfacer ;
253JAR		default = /usr/bin/jar ;
254export JAVA_COMPILER	default = /usr/bin/javac ;
255export JAVACONFIG	default = /usr/bin/javaconfig ;
256# LD defined in BeginProduct rule based value of GCC_VERSION and other settings
257LEX		default = /usr/bin/lex ;
258LIBTOOL		default = /usr/bin/libtool ;
259LN		default = /bin/ln ;
260LNRESOLVE       default = $(SYSTEM_DEVELOPER_TOOLS)/lnresolve ;
261MAKEPSEUDOLIB	default = $(APPLE_INTERNAL_TOOLS)/MakePseudoLibrary ;
262MERGEINFO	default = /usr/lib/mergeInfo ;
263MKDIR		default = /bin/mkdir ;
264MIG		default = /usr/bin/mig ;
265MV		default = /bin/mv ;
266NMEDIT		default = /usr/bin/nmedit ;
267OSAC		default = /usr/bin/osacompile ;
268OSAL		default = /usr/bin/osalang ;
269OSAS		default = /usr/bin/osascript ;
270PBXCP		default = $(SYSTEM_DEVELOPER_TOOLS)/pbxcp ;
271RANLIB		default = /usr/bin/ranlib ;
272REGGEN		default = reggen ;
273RESMERGER	default = $(SYSTEM_DEVELOPER_TOOLS)/ResMerger ;
274RESOURCE_PRESERVING_CP default = $(SYSTEM_DEVELOPER_TOOLS)/CpMac ;
275REZ		default = $(SYSTEM_DEVELOPER_TOOLS)/Rez ;
276RM		default = /bin/rm ;
277RPCGEN		default = /usr/bin/rpcgen ;
278SED		default = /usr/bin/sed ;
279SETFILE		default = $(SYSTEM_DEVELOPER_TOOLS)/SetFile ;
280SH		default = /bin/sh ;
281STRIP		default = /usr/bin/strip ;
282TOUCH		default = /usr/bin/touch ;
283UNZIP		default = /usr/bin/unzip ;
284XARGS		default = /usr/bin/xargs ;
285YACC		default = /usr/bin/yacc ;
286ZIP		default = /usr/bin/zip ;
287
288# Basic operations:
289
290# Rm <files>
291# Removes <files> from the filesystem.  Note that the actions are only
292# executed once, no matter how many times the rule is invoked.
293actions together piecemeal Rm
294{
295    $(RM) -r $(1:Q)
296}
297
298# Mkdir <directory>
299# Creates <directory>
300rule Mkdir
301{
302    # Only existence of the directory matters
303    NOUPDATE $(1) ;
304}
305actions together piecemeal Mkdir
306{
307    $(MKDIR) -p $(1:Q)
308}
309
310# MkEmptyDir <directory>
311# Makes a directory if necessary, and insures it is empty
312actions together MkEmptyDir
313{
314    ( $(MKDIR) -p $(1:Q) && $(CD) $(1:Q) && $(RM) -rf "*" )
315}
316
317# SymLink <link> : <to>
318# Makes a symbolic link to the path indicated.
319# Link target is treated as a nonfile to preserve the value
320rule SymLink
321{
322    if ! $(2) in $(PRODUCT_FILES) && $(2) != $(PRODUCT_CLASS_FILE_DIR) {
323        NOTFILE $(2) ;
324    }
325}
326actions SymLink
327{
328    $(LN) -sf $(2:Q) $(1:Q)
329}
330
331# Touch <files>
332# Touches files in the filesystem.
333actions Touch
334{
335    $(TOUCH) $(1:Q)
336}
337
338# TouchConditionally <fileToTouch> : <fileToCompareAgainst>
339# Touches a file in the filesystem if <fileToCompareAgainst> is newer.
340rule TouchConditionally
341{
342	DEPENDS $(1) : $(2) ;
343}
344actions TouchConditionally
345{
346    $(TOUCH) $(1:G=:Q)
347}
348
349# Echo <file> : <text>
350# Echoes text into a file.
351rule Echo
352{
353    local FILE ;
354    NOTFILE $(2) ;
355    Echo.remove $(1) ;
356    for FILE in $(2) {
357        Echo.append $(1) : $(FILE) ;
358    }
359}
360actions together piecemeal quietly Echo.remove
361{
362    $(RM) -rf $(1:Q)
363}
364actions quietly Echo.append
365{
366    $(ECHO) $(2:Q) >> $(1:Q)
367}
368
369# ChangeOwnerAndGroup and ChangeMode to use when installing files
370# All these use the -H option to avoid traversing bad symbolic links
371rule ChangeOwnerAndGroup
372{
373    if $(INSTALL_OWNER) {
374        if $(INSTALL_GROUP) {
375            ChangeOwnerAndGroup.Action $(1) ;
376        }
377        else {
378            ChangeOwner.Action $(1) ;
379        }
380    }
381}
382actions ChangeOwnerAndGroup.Action
383{
384    if [ -e $(1:Q) ]
385      then $(CHOWN) -RH $(INSTALL_OWNER):$(INSTALL_GROUP) $(1:Q)
386    fi
387}
388actions ChangeOwner.Action
389{
390    if [ -e $(1:Q) ]
391      then $(CHOWN) -RH $(INSTALL_OWNER) $(1:Q)
392    fi
393}
394actions ChangeMode
395{
396    if [ -e $(1:Q) ]
397      then $(CHMOD) -RH $(INSTALL_MODE_FLAG) $(1:Q)
398    fi
399}
400
401# Strip <target>
402# Runs strip to remove debugging symbols from the executable of the target
403actions Strip
404{
405    $(STRIP) $(STRIPFLAGS:Q) $(1:Q)
406}
407
408# SetFile <fork file>
409# Appends type and creator to a file
410rule SetFile
411{
412    local MACOS_TYPE_ARG ;
413    local MACOS_CREATOR_ARG ;
414    if $(MACOS_TYPE) {
415        MACOS_TYPE_ARG = -t '$(MACOS_TYPE)' ;
416    }
417    if $(MACOS_CREATOR) {
418        MACOS_CREATOR_ARG = -c '$(MACOS_CREATOR)' ;
419    }
420    SETFILEFLAGS on $(1) = $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) ;
421}
422actions SetFile
423{
424    $(SETFILE) $(SETFILEFLAGS:Q) "$(OTHER_SETFILEFLAGS)" $(1:Q)
425}
426
427# Rez <fork file> : <target file>
428# Appends resource fork data to a file
429rule Rez
430{
431    local MACOS_TYPE_ARG ;
432    local MACOS_CREATOR_ARG ;
433    DEPENDS $(1) : $(2) ;
434    if $(MACOS_TYPE) {
435        MACOS_TYPE_ARG = -t '$(MACOS_TYPE)' ;
436    }
437    if $(MACOS_CREATOR) {
438        MACOS_CREATOR_ARG = -c '$(MACOS_CREATOR)' ;
439    }
440    REZFLAGS on $(1) = -append -d SystemSevenOrLater=1 $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) "$(OTHER_REZFLAGS)" ;
441    if ! $(REZ_EXECUTABLE) = "YES" {
442        # by default use data forks
443        REZFLAGS on $(1) += -useDF ;
444    }
445}
446actions Rez
447{
448    $(REZ) $(2:Q) $(REZFLAGS) -o $(1:Q)
449}
450
451# ResMerge <fork file> : <rsrc file>
452# Merges the resources from binary resource file 'rsrc file' into 'fork file'
453# CAUTION: OTHER_RESMERGERFLAGS (with R) are used for RESMERGEFLAGS (no R)
454rule ResMerge
455{
456    local MACOS_TYPE_ARG ;
457    local MACOS_CREATOR_ARG ;
458    DEPENDS $(1) : $(2) ;
459    if $(MACOS_TYPE) {
460        MACOS_TYPE_ARG = -fileType '$(MACOS_TYPE)' ;
461    }
462    if $(MACOS_CREATOR) {
463        MACOS_CREATOR_ARG = -fileCreator '$(MACOS_CREATOR)' ;
464    }
465    RESMERGEFLAGS on $(1) = -append $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) "$(OTHER_RESMERGERFLAGS)" ;
466    if ! $(REZ_EXECUTABLE) = "YES" {
467        # by default use data forks
468        RESMERGEFLAGS on $(1) += -dstIs DF ;
469    }
470}
471actions ResMerge
472{
473    $(RESMERGER) $(2:Q) $(RESMERGEFLAGS) -o $(1:Q)
474}
475
476# RezCollector and ResMergerCollector either compile
477# resource manager resources together, or split compiles
478# by file with the first compile being treated differently.
479# This code assumes collectors will be declared product files
480# only after the first Collector rule evaluation.
481rule RezCollector
482{
483    DEPENDS $(1) : $(2) ;
484    REZFLAGS on $(1) = -d SystemSevenOrLater=1 -useDF ;
485    REZPATHFLAGS on $(1) = ;
486    for _REZ_PATH in $(REZ_SEARCH_PATHS) {
487        REZPATHFLAGS on $(1) += -i $(_REZ_PATH) ;
488    }
489    if $(REZ_TOGETHER) = YES {
490        RezCollector.together $(1) : $(2) ;
491    }
492    else {
493        if ! $(1) in $(PRODUCT_FILES) {
494            RezCollector.initial $(1) : $(2) ;
495        }
496        else {
497            RezCollector.append $(1) : $(2) ;
498        }
499    }
500}
501actions together piecemeal RezCollector.together
502{
503    if [ -f $(1:Q) ]; then
504        _appendoption=-append
505    fi
506    $(REZ) -o $(1:Q) $_appendoption $(REZFLAGS:Q) "$(OTHER_REZFLAGS)" $(REZPATHFLAGS:Q) $(2:Q)
507}
508actions RezCollector.initial
509{
510    $(RM) -f $(1:Q) && \
511    $(REZ) -o $(1:Q) $(REZFLAGS:Q) "$(OTHER_REZFLAGS)" $(REZPATHFLAGS:Q) $(2:Q)
512}
513actions RezCollector.append
514{
515    $(REZ) -o $(1:Q) -append $(REZFLAGS:Q) "$(OTHER_REZFLAGS)" $(REZPATHFLAGS:Q) $(2:Q)
516}
517
518rule ResMergerCollector
519{
520    DEPENDS $(1) : $(2) ;
521    RESMERGEFLAGS on $(1) = -dstIs DF ;
522    if $(REZ_TOGETHER) = YES {
523        ResMergerCollector.together $(1) : $(2) ;
524    }
525    else {
526        if ! $(1) in $(PRODUCT_FILES) {
527            ResMergerCollector.initial $(1) : $(2) ;
528        }
529        else {
530            ResMergerCollector.append $(1) : $(2) ;
531        }
532    }
533}
534actions together piecemeal ResMergerCollector.together
535{
536    if [ -f $(1:Q) ]; then
537        _appendoption=-append
538    fi
539    $(RESMERGER) -o $(1:Q) $_appendoption $(RESMERGEFLAGS:Q) "$(OTHER_RESMERGERFLAGS)" $(2:Q)
540}
541actions ResMergerCollector.initial
542{
543    $(RM) -f $(1:Q) && $(RESMERGER) -o $(1:Q) $(RESMERGEFLAGS:Q) "$(OTHER_RESMERGERFLAGS)" $(2:Q)
544}
545actions ResMergerCollector.append
546{
547    $(RESMERGER) -o $(1:Q) -append $(RESMERGEFLAGS:Q) "$(OTHER_RESMERGERFLAGS)" $(2:Q)
548}
549
550# ResMergerProduct - used to transfer collector resources to final destination
551rule ResMergerProduct
552{
553    local MACOS_TYPE_ARG ;
554    local MACOS_CREATOR_ARG ;
555    DEPENDS $(1) : $(2) ;
556    if $(MACOS_TYPE) {
557        MACOS_TYPE_ARG = -fileType '$(MACOS_TYPE)' ;
558    }
559    if $(MACOS_CREATOR) {
560        MACOS_CREATOR_ARG = -fileCreator '$(MACOS_CREATOR)' ;
561    }
562    RESMERGEFLAGS on $(1) = $(MACOS_TYPE_ARG) $(MACOS_CREATOR_ARG) -srcIs DF "$(OTHER_RESMERGERFLAGS)" ;
563    if $(REZ_EXECUTABLE) = "YES" {
564        ResMergerProductResourceFork $(1) : $(2) ;
565    }
566    else {
567        RESMERGEFLAGS on $(1) += -dstIs DF ;
568        ResMergerProductDataFork $(1) : $(2) ;
569    }
570}
571actions ResMergerProductResourceFork
572{
573    $(REZ) -o $(1:Q) < /dev/null && \
574    $(RESMERGER) $(2:Q) $(RESMERGEFLAGS) -o $(1:Q)
575}
576actions ResMergerProductDataFork
577{
578    $(RM) -f $(1:Q) && \
579    $(RESMERGER) $(2:Q) $(RESMERGEFLAGS) -o $(1:Q)
580}
581
582# Fixprecomps <precomp> : <header>
583# Ensures that the precompiled header is up to date
584if $(FIXPRECOMPS) {
585    rule Fixprecomps
586    {
587        DEPENDS $(1) : $(2) ;
588    }
589    actions Fixprecomps
590    {
591        $(FIXPRECOMPS) -precomps $(1:Q)
592    }
593} else {
594    rule Fixprecomps
595    {
596        # if we don't have a fixprecomps command, we'll just
597        # quietly do nothing
598        NOTFILE $(1) ;
599    }
600}
601
602
603# Copy operations:
604
605# Cp <destination> : <source>
606# Reliably copies files only.
607# Leaf names of the source and destination are expected to match.
608rule Cp
609{
610    DEPENDS $(1) : $(2) ;
611}
612actions together piecemeal Cp
613{
614    $(CP) $(CPFLAGS:Q) $(2:Q) $(1:Q)
615}
616
617# PBXCp <destination-file> : <source-file>
618# Reliably copies files only.  Does not currently respect Mac OS
619# Finder info or resource forks, but it does skip CVS directories
620# and it does optionally strip Mach-O executables.
621# Leaf names of the source and destination are expected to match.
622rule PBXCp
623{
624    if $(ACTION) != installhdrs {
625        DEPENDS $(1) : $(2) ;
626    }
627    PBXCP_FLAGS on $(1) = ;
628    VERBOSE_PBXCP default = NO ;
629    if $(VERBOSE_PBXCP) = YES {
630        PBXCP_FLAGS on $(1) += -V ;
631    }
632    PBXCP_FLAGS on $(1) += -exclude .DS_Store ;
633    if $(REMOVE_CVS_FROM_RESOURCES) = YES {
634        PBXCP_FLAGS on $(1) += -exclude CVS ;
635    }
636    if $(COPY_PHASE_STRIP) = YES  &&  $(ACTION) != installhdrs {
637        PBXCP_FLAGS on $(1) += -strip-debug-symbols ;
638    }
639    # Because any content copied may have been generated, and so may be
640    # in the form of a symlink to the actual content, it is necessary
641    # to resolve one level of symbolic link for all sources copied.
642    PBXCP_FLAGS on $(1) += -resolve-src-symlinks ;
643}
644actions together piecemeal PBXCp
645{
646    $(PBXCP) $(PBXCP_FLAGS:Q) $(2:Q) $(1:DQ)
647}
648
649# Ditto <destination> : <source>
650# Directory to directory copies.
651rule Ditto
652{
653    DEPENDS $(1) : $(2) ;
654}
655actions Ditto
656{
657    $(DITTO) $(2:Q) $(1:Q)
658}
659
660# RobustCp <destination> : <source>
661# RobustCp is like Cp, but is made more robust by first removing
662# any previous copy results and then conditionally removing CVS
663# directories from the destination.
664rule RobustCp
665{
666    if ! $(ACTION) = installhdrs {
667        DEPENDS $(1) : $(2) ;
668    }
669    if $(REMOVE_CVS_FROM_RESOURCES) = YES && $(DEPLOYMENT_POSTPROCESSING) = YES {
670        RobustCp.CleanBeforeAndAfter $(1) : $(2) ;
671    }
672    else {
673        RobustCp.CleanBefore $(1) : $(2) ;
674    }
675    if $(COPY_PHASE_STRIP) = YES && ! $(ACTION) = installhdrs {
676        StripBinaries $(1) ;
677    }
678}
679actions RobustCp.CleanBeforeAndAfter
680{
681    if [ -d $(1:Q) ]
682        then $(RM) -r $(1:Q)
683    fi
684    if [ -e $(2:Q) ]
685        then
686        _source=`$(LNRESOLVE) $(2:Q)`
687        $(CP) -fRP "$_source" $(1:Q)
688        if [ -d "$_source" ]
689            then
690            $(FIND) $(1:Q) -name CVS -type d -prune -print0 | $(XARGS) -0 rm -r
691        fi
692    fi
693}
694actions RobustCp.CleanBefore
695{
696    if [ -d $(1:Q) ]
697        then $(RM) -r $(1:Q)
698    fi
699    if [ -e $(2:Q) ]
700        then _source=`$(LNRESOLVE) $(2:Q)`
701        $(CP) -fRP "$_source" $(1:Q)
702    fi
703}
704
705# StripBinaries <starting directory>
706# Uses find to run strip -s on all binaries starting from a file or directory
707actions StripBinaries
708{
709    if [ -f $(1:Q) ]; then
710        filetype=`file $(1:Q)`
711        macho=`echo $filetype | fgrep Mach-O | sed 's/:.*//'`
712        ararch=`echo $filetype | fgrep ar\ archive | sed 's/:.*//'`
713        if [ "x$macho" != "x" ]; then
714            $(STRIP) -S "$macho"
715        fi
716        if [ "x$ararch" != "x" ]; then
717            $(STRIP) -S "$ararch"
718        fi
719    else
720        machos=`cd $(1:Q); $(FIND) . -type f -print0 | xargs -0 file | fgrep Mach-O | sed 's/:.*//'`
721        ararchs=`cd $(1:Q); $(FIND) . -type f -print0 | xargs -0 file | fgrep ar\ archive | sed 's/:.*//'`
722        if [ "x$machos" != "x" ]; then
723            cd $(1:Q); 
724	    origIFS=$IFS
725	    IFS="
726"
727	    for curbinary in $machos ; do
728	    	$(STRIP) -S "$curbinary"
729	    done
730	    IFS=$oldIFS
731        fi
732        if [ "x$ararchs" != "x" ]; then
733            cd $(1:Q); 
734	    origIFS=$IFS
735	    IFS="
736"
737	    for curbinary in $ararchs ; do
738	    	$(STRIP) -S "$curbinary"
739	    done
740	    IFS=$oldIFS
741        fi
742    fi
743}
744
745# ResourcePreservingCp <destination> : <source>
746# where the leaf names of <destination> and <source> are the same
747# and CpMac is to be used to insure resources are preserved.
748# Although CpMac is invoked with -r, this command is only reliable
749# for individual file copies becaues there is no preremove of
750# a directory destination which could cause nesting of the copy.
751rule ResourcePreservingCp
752{
753    DEPENDS $(1) : $(2) ;
754}
755actions together piecemeal ResourcePreservingCp
756{
757    $(RESOURCE_PRESERVING_CP) -r $(2:Q) $(1:Q)
758}
759
760# ResourcePreservingMv <destination> : <source> : <junk>
761# where the leaf names of <destination> and <source> are the same
762# and CpMac is to be used to insure resources are preserved.
763# The <junk> is removed after copying.
764rule ResourcePreservingMv
765{
766    DEPENDS $(1) : $(2) ;
767}
768actions together piecemeal ResourcePreservingMv
769{
770    $(RESOURCE_PRESERVING_CP) -r $(2:Q) $(1:Q)
771}
772
773# AbsolutePathImportStub <stub file> : <stub import file>
774# Generates a file with one line which is an #import directive
775# and the second parameter quoted which should be a full path
776# to the real file to be imported.
777# If $2 is not an absolute path, $(SRCROOT) will be prepended to make 
778# it absolute.
779rule AbsolutePathImportStub
780{
781    DEPENDS $(1) : $(2) ;
782    NOUPDATE $(1) ;
783}
784actions AbsolutePathImportStub
785{
786    firstChar=`echo "$(2)" | colrm 2`
787    if [ z$firstChar = z"/" -o z$firstChar = z"~" ] ; then
788        includePath="$(2)"
789    else
790        includePath="$(SRCROOT)/$(2)"
791    fi
792    echo "#include" \""${includePath}"\" > "$(1)"
793}
794
795# HeaderDoc <headerdoc target (table of contents for header)> : <header>
796rule HeaderDoc
797{
798    DEPENDS $(1) : $(2) ;
799}
800actions HeaderDoc
801{
802    $(HEADERDOC2HTML) -o $(HEADERDOC_DIR:Q) $(2:Q)
803}
804
805# GatheredHeaderDoc <gathered headerdoc target>
806rule GatheredHeaderDoc
807{
808}
809actions GatheredHeaderDoc
810{
811    $(GATHERHEADERDOC) $(HEADERDOC_DIR:Q)
812}
813
814# Source derivation operations:
815
816# Lex <file>.{c|m} : <file>.l[m]
817# Runs lex to generate <file>.c or <file>.m based on scanner input
818rule Lex
819{
820    DEPENDS $(1) : $(2) ;
821}
822
823actions Lex
824{
825    $(LEX) $(LEXFLAGS) "-o$(1)" $(2:Q)
826}
827
828# Yacc <file>.{c|m} <file>.h : <file>.y[m]
829# Uses yacc to generate parser from description
830rule Yacc
831{
832    DEPENDS $(1) : $(2) ;
833}
834
835actions Yacc
836# Generate result by noting location, going to derived source directory,
837# running yacc, then copying the results to what is desired.
838{
839    origin=`/bin/pwd` && $(CD) "$(1[1]:D)" && $(YACC) $(YACCFLAGS) -d "$origin/$(2)" && $(CP) y.tab.h "$(1[2])" && $(CP) y.tab.c "$(1[1])"
840}
841
842# RPCGen <proto>_xdr.c <proto>.h : <proto>.x
843# Generates RPC stubs from specifications
844#
845rule RPCGen
846{
847    DEPENDS $(1) : $(2) ;
848}
849
850# Generate header and C code with two calls to rpcgen
851actions RPCGen
852{
853    $(RPCGEN) $(RPCGENFLAGS) -h -o "$(1[2])" $(2:Q)
854    $(RPCGEN) $(RPCGENFLAGS) -c -o "$(1[1])" $(2:Q)
855}
856
857# Mig <file>User.c <file>.h : <file>.defs OR
858# Mig <file>Server.c <file>Server.h : <file>.defs
859# Runs mig to create client and server files from a definition file.
860rule Mig
861{
862    DEPENDS $(1) : $(2) ;
863    if Server in $($(2)_ATTRIBUTES) {
864        Mig.server $(1) : $(2) ;
865    }
866    else {
867        Mig.client $(1) : $(2) ;
868    }
869}
870actions Mig.client
871{
872    origin=`pwd` && $(CD) "$(1[1]:D)" && $(MIG) "$(OTHER_MIGFLAGS)" "$origin/$(2)"
873}
874actions Mig.server
875{
876    origin=`pwd` && $(CD) "$(1[1]:D)" && $(MIG) "$(OTHER_MIGFLAGS)" -sheader "$(2:B)Server.h" "$origin/$(2)"
877}
878
879# Bridget <primary target> : <jobs file>
880rule Bridget
881{
882    # set up common settings and paths needed for bridget usage
883    JAVA_HEADERS default = /Developer/Java/Headers /System/Library/Frameworks/JavaVM.framework/Headers ;
884    if ! $(BRIDGET_FILES_DIR) {
885        BRIDGET_FILES_DIR = $(DERIVED_FILE_DIR)$(/)JavaBridgeFiles ;
886        Mkdir $(BRIDGET_FILES_DIR) ;
887        ProductFile $(BRIDGET_FILES_DIR) ;
888    }
889    if $(BRIDGE_JAVA) = YES {
890        # produce the file list draft
891        # conditionally update the file list from the draft
892        BRIDGET_DERIVED_JAVA_FILE_LIST = $(FILE_LIST:G=BridgetDerivedJavaFileList)BridgetDerivedJavaFileList ;
893        NOTFILE $(BRIDGET_DERIVED_JAVA_FILE_LIST) ;
894        DEPENDS $(1) : $(BRIDGET_DERIVED_JAVA_FILE_LIST) ;
895        DEPENDS $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(2) ;
896        DEPENDS $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(BRIDGET_FILES_DIR) ;
897        DEPENDS $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(OBJECT_FILE_DIR) ;
898        Bridget.UpdateJavaFileList $(BRIDGET_DERIVED_JAVA_FILE_LIST) : $(2) ;
899        # derive files using file list
900        # compile derived files (nonfile target?)
901        BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG = $(FILE_LIST:G=BridgetDeriveAndCompileJavaTag)BridgetDeriveAndCompileJavaTag ;
902        ProductFile $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) ;
903        DEPENDS $(1) : $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) ;
904        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(BRIDGET_DERIVED_JAVA_FILE_LIST) ;
905        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(BRIDGET_FILES_DIR) ;
906        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(CLASS_FILE_DIR) ;
907        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(2) ;
908        if $(JAVA_COMPILER:B) = jikes {
909            Bridget. DeriveAndCompileJava.jikes $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(2) ;
910        }
911        else {
912            Bridget.DeriveAndCompileJava.javac $(BRIDGET_DERIVE_AND_COMPILE_JAVA_TAG) : $(2) ;
913        }
914    }
915    if $(BRIDGE_OBJC) = YES {
916        # Produce the derived C file list draft
917        # and conditionally update the file list from the draft.
918        BRIDGET_DERIVED_C_FILE_LIST = $(FILE_LIST:G=BridgetDerivedCFileList)BridgetDerivedCFileList ;
919        NOTFILE $(BRIDGET_DERIVED_C_FILE_LIST) ;
920        DEPENDS $(1) : $(BRIDGET_DERIVED_C_FILE_LIST) ;
921        DEPENDS $(BRIDGET_DERIVED_C_FILE_LIST) : $(2) ;
922        DEPENDS $(BRIDGET_DERIVED_C_FILE_LIST) : $(BRIDGET_FILES_DIR) ;
923        DEPENDS $(BRIDGET_DERIVED_C_FILE_LIST) : $(OBJECT_FILE_DIR) ;
924        Bridget.UpdateCFileList $(BRIDGET_DERIVED_C_FILE_LIST) : $(2) ;
925        BRIDGET_DERIVE_AND_COMPILE_C_TAG = $(FILE_LIST:G=BridgetDeriveAndCompileCTag)BridgetDeriveAndCompileCTag ;
926        ProductFile $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) ;
927        DEPENDS $(1) : $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) ;
928        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(BRIDGET_DERIVED_C_FILE_LIST) ;
929        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(BRIDGET_FILES_DIR) ;
930        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(OBJECT_FILE_DIR) ;
931        DEPENDS $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(2) ;
932        # derive files using file list
933        # compile derived files (nonfile target?)
934        BRIDGET_FILE_LIST default = $(FILE_LIST)Bridget ;
935        BRIDGET_CFLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ;
936        BRIDGET_CFLAGS on $(1) += -pipe ;
937        # seed search paths with target-wide values
938        HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
939        FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
940
941        # We must compile with the extension-specific build flags
942        BRIDGET_CFLAGS on $(1) += $($(2:S)_CFLAGS) ;
943        # Add debug flags, if appropriate.
944        if $(DEBUGGING_SYMBOLS) = YES {
945            BRIDGET_CFLAGS on $(1) += -g ;
946        }
947        # Add profiling flags, if appropriate.
948        if $(PROFILING_CODE) = YES {
949            BRIDGET_CFLAGS on $(1) += -pg ;
950        }
951        # Pass the trusted-precomp file name to the compiler to keep track
952        # of which precompiled headers it has already sanity checked.
953        if $(OS) in MACOS DARWIN {
954            BRIDGET_CFLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ;
955        }
956        if $(CPP_HEADERMAP_FILE) {
957            BRIDGET_CFLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
958        }
959        if YES in $(GENERATE_CPP_ILOG_FILES) {
960            local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(1:DB).ilog ;
961            BRIDGET_CFLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
962        }
963        if $(PREFIX_HEADER) {
964            PREFIX_HEADER_CFLAGS on $(1) += -include $(PREFIX_HEADER) ;
965        }
966        Bridget.DeriveAndCompileC $(BRIDGET_DERIVE_AND_COMPILE_C_TAG) : $(2) ;
967    }
968}
969# Bridget.UpdateJavaFileList <list update target> <bridget file> generates draft
970# and updates definitive list if it is missing or out of date
971actions Bridget.UpdateJavaFileList
972{
973    $(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" && \
974    if [ ! -e "$(1:G=)" ]; then
975        cp "$(1:G=)Draft" "$(1:G=)"
976    else 
977        _file_list_diffs=`diff --brief "$(1:G=)Draft" "$(1:G=)"`
978        if [ "x$_file_list_diffs" != "x" ]; then
979            cp "$(1:G=)Draft" "$(1:G=)"
980        fi
981    fi
982}
983actions Bridget.DeriveAndCompileJava.javac
984{
985    $(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)" && \
986    frameworkjars="" && \
987    for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done && \
988    classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath` && \
989    cd "$(BRIDGET_FILES_DIR)" && \
990    $(JAVA_COMPILER) $(JAVAC_FLAGS) -sourcepath "$(JAVA_SOURCE_PATH)" -classpath "$classpath" -d "$(CLASS_FILE_DIR)" @"$(BRIDGET_DERIVED_JAVA_FILE_LIST:G=)" && \
991    /usr/bin/touch "$(1:G=)"
992}
993actions Bridget.DeriveAndCompileJava.jikes
994{
995    $(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)" && \
996    frameworkjars="" && \
997    for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done && \
998    classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath` && \
999    cd "$(BRIDGET_FILES_DIR)" && \
1000    $(JAVA_COMPILER) +E $(JAVAC_FLAGS) -classpath "$classpath" -d "$(CLASS_FILE_DIR)" `cat "$(BRIDGET_DERIVED_JAVA_FILE_LIST:G=)"` && \
1001    /usr/bin/touch "$(1:G=)"
1002}
1003
1004# Bridget.CompileC.UpdateFileList <list update target> <bridget file> generates draft
1005# and updates definitive list if it is missing or out of date
1006actions Bridget.UpdateCFileList
1007{
1008    $(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" && \
1009    if [ ! -e "$(1:G=)" ]; then
1010        cp "$(1:G=)Draft" "$(1:G=)"
1011    else 
1012        _file_list_diffs=`diff --brief "$(1:G=)Draft" "$(1:G=)"`
1013        if [ "x$_file_list_diffs" != "x" ]; then
1014            cp "$(1:G=)Draft" "$(1:G=)"
1015        fi
1016    fi
1017}
1018actions Bridget.DeriveAndCompileC
1019{
1020    $(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)" && \
1021    cd "$(BRIDGET_FILES_DIR)" && \
1022    $(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=)"` && \
1023    find "$(BRIDGET_FILES_DIR)" -type f -name '*.o' -print > "$(BRIDGET_FILE_LIST:G=)" && \
1024    /usr/bin/touch "$(1:G=)"
1025}
1026
1027# GenerateVectorLibraryIntermediates <vector stub> <vector object file> : <exports file>
1028# Generates and compiles vector stub
1029rule GenerateVectorLibraryIntermediates
1030{
1031    DEPENDS $(1) : $(2) ;
1032    LOCATE on $(2) = $(SOURCE_ROOT) ;
1033    VECTOR_STUB on $(1) = $(VECTOR_STUB) ;
1034    VECTOR_OBJECT_FILE on $(1) = $(VECTOR_OBJECT_FILE) ;
1035    VECTOR_FRAGMENT_NAME on $(1) = $(VECTOR_FRAGMENT_NAME) ;
1036    DYLIB_INSTALLED_NAME on $(1) = $(DYLIB_INSTALLED_NAME) ;
1037    DEPENDS $(VECTOR_STUB) : $(DERIVED_FILE_DIR) ;
1038}
1039actions GenerateVectorLibraryIntermediates
1040{
1041    $(MAKEPSEUDOLIB) $(2:Q) -p -strip -fragname $(VECTOR_FRAGMENT_NAME:Q) -vector $(VECTOR_STUB:Q) -dylibpath "$(DYLIB_INSTALLED_NAME)"
1042    $(CC) -Wa,-L -c $(ARCH_FLAGS) -O -fno-common -no-cpp-precomp -dynamic "$(FLAGS)" $(GLOBAL_CFLAGS) -o $(VECTOR_OBJECT_FILE:Q) $(VECTOR_STUB:Q)
1043}
1044
1045MASTER_INTERFACES default = /AppleInternal/Carbon/interfaces ;
1046# !!!:cmolick:20010412 Apple internal RC_ settings nonempty in offical builds
1047INTERFACER_TARGET_UPDATE default = \"$(RC_ProjectName)-$(RC_ProjectSourceVersion)~$(RC_ProjectBuildVersion)\" ;
1048
1049rule InterfacerHeaders
1050{
1051    INTERFACER_CACHE default = $(TEMP_DIR)$(/)InterfacerCache ;
1052    local BUILD_DIR_AND_SEPARATOR = $(TARGET_BUILD_DIR)$(/) ;
1053    INTERFACER_HEADERS = $(1:G=InterfacerHeaders) ;
1054    if $(INTERFACER_TARGET_UPDATE) {
1055        INTERFACER_HEADER_OPTIONS += -externalHeader $(INTERFACER_TARGET_UPDATE) ;
1056    }
1057    FULL_PUBLIC_HEADER_DIR = $(BUILD_DIR_AND_SEPARATOR)$(PUBLIC_HEADER_DIR:G=) ;
1058    FULL_PUBLIC_HEADER_DIR on $(INTERFACER_HEADERS) = $(FULL_PUBLIC_HEADER_DIR) ;
1059    FULL_PRIVATE_HEADER_DIR = $(BUILD_DIR_AND_SEPARATOR)$(PRIVATE_HEADER_DIR:G=) ;
1060    FULL_PRIVATE_HEADER_DIR on $(INTERFACER_HEADERS) = $(FULL_PRIVATE_HEADER_DIR) ;
1061   # Create symlink to public header dir in versioned frameworks
1062    if $(PUBLIC_HEADER_LINK)
1063      && ! $(PUBLIC_HEADER_LINK) in $(PRODUCT_FILES) {
1064        SymLink $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ;
1065        ProductFile $(PUBLIC_HEADER_LINK) ;
1066        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
1067            ASIDE_PUBLIC_HEADER_LINK default = $(PUBLIC_HEADER_LINK:G=aside) ;
1068            SymLink $(ASIDE_PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ;
1069            ProductFileAside $(ASIDE_PUBLIC_HEADER_LINK) ;
1070        }
1071        NOUPDATE $(PUBLIC_HEADER_LINK) ;
1072    }
1073    # Create symlink to private header dir in versioned frameworks
1074    if $(PRIVATE_HEADER_LINK)
1075      && ! $(PRIVATE_HEADER_LINK) in $(PRODUCT_FILES) {
1076        SymLink $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
1077        ProductFile $(PRIVATE_HEADER_LINK) ;
1078        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
1079            ASIDE_PRIVATE_HEADER_LINK default = $(PRIVATE_HEADER_LINK:G=aside) ;
1080            SymLink $(ASIDE_PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
1081            ProductFileAside $(ASIDE_PRIVATE_HEADER_LINK) ;
1082        }
1083        NOUPDATE $(PRIVATE_HEADER_LINK) ;
1084    }
1085
1086    if $(_BUILD_PHASING) = YES {
1087        BUILD_PHASE_PRODUCTS += $(INTERFACER_HEADERS) ;
1088    }
1089    # Create a public header directory
1090    if ! $(PUBLIC_HEADER_DIR) in $(PRODUCT_FILES) {
1091        Mkdir $(PUBLIC_HEADER_DIR) ;
1092        ProductFile $(PUBLIC_HEADER_DIR) ;
1093        DEPENDS $(INTERFACER_HEADERS) : $(PUBLIC_HEADER_DIR) ;
1094        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
1095            ASIDE_PUBLIC_HEADER_DIR default = $(PUBLIC_HEADER_DIR:G=aside) ;
1096            Mkdir $(ASIDE_PUBLIC_HEADER_DIR) ;
1097            ProductFileAside $(ASIDE_PUBLIC_HEADER_DIR) ;
1098        }
1099    }
1100    # Create a private header directory
1101    if ! $(PRIVATE_HEADER_DIR) in $(PRODUCT_FILES) {
1102        Mkdir $(PRIVATE_HEADER_DIR) ;
1103        ProductFile $(PRIVATE_HEADER_DIR) ;
1104        DEPENDS $(INTERFACER_HEADERS) : $(PRIVATE_HEADER_DIR) ;
1105        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
1106            ASIDE_PRIVATE_HEADER_DIR default = $(PRIVATE_HEADER_DIR:G=aside) ;
1107            Mkdir $(ASIDE_PRIVATE_HEADER_DIR) ;
1108            ProductFileAside $(ASIDE_PRIVATE_HEADER_DIR) ;
1109        }
1110    }
1111
1112       # install .i files if requested
1113    if $(FRAMEWORK_INTERFACES) {
1114        INTERFACER_INSTALL_OPTIONS = -frameworkInterfaces $(SRCROOT)$(/)$(FRAMEWORK_INTERFACES)$(/) -installMasterInterfaces $(DSTROOT)/AppleInternal/Carbon/interfaces/ ;
1115    }
1116
1117    Interfacer.Headers $(INTERFACER_HEADERS) ;
1118    # Interfacer headers are required (ideally these should be phase products)
1119    DEPENDS $(1) : $(INTERFACER_HEADERS) ;
1120}
1121
1122actions Interfacer.Headers
1123{
1124    $(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_INSTALL_OPTIONS)
1125}
1126
1127rule InterfacerExportSetsAndGlue
1128{
1129    INTERFACER_CACHE default = $(TEMP_DIR)$(/)InterfacerCache ;
1130    EXPORT_SETS_DIR default = $(DERIVED_FILE_DIR)$(/)ExportSets ;
1131    UPP_GLUE_DIR default = $(DERIVED_FILE_DIR)$(/)UPPGlue ;
1132    COMPONENT_GLUE_DIR default = $(DERIVED_FILE_DIR)$(/)ComponentGlue ;
1133    RAW_GENERATED_EXPORTS_FILE default = $(EXPORT_SETS_DIR)$(/)fw_$(PRODUCT_NAME)_X.exp ;
1134    RAW_GENERATED_PRIVATE_EXPORTS_FILE default = $(EXPORT_SETS_DIR)$(/)fw_$(PRODUCT_NAME)Priv_X.exp ;
1135    # !!!:cmolick:20000602 private exports file optional...bad depend?
1136    PROCESSED_EXPORTS_FILE default = $(DERIVED_FILE_DIR)$(/)$(PRODUCT_NAME).exp ;
1137    DEPENDS $(RAW_GENERATED_EXPORTS_FILE) : $(DERIVED_FILE_DIR) ;
1138    DEPENDS $(RAW_GENERATED_PRIVATE_EXPORTS_FILE) : $(DERIVED_FILE_DIR) ;
1139    DEPENDS $(PROCESSED_EXPORTS_FILE) : $(DERIVED_FILE_DIR) ;
1140    # object file dir needs to be in place for glue object file list
1141    # !!!:cmolick:20020105 this dependence appears superfluous
1142    # DEPENDS $(PROCESSED_EXPORTS_FILE) : $(RAW_GENERATED_EXPORTS_FILE) ;
1143    DEPENDS $(1) : $(PROCESSED_EXPORTS_FILE) ;
1144    if $(GENERATE_HEADERS) = YES {
1145        DEPENDS $(RAW_GENERATED_EXPORTS_FILE) : $(INTERFACER_HEADERS) ;
1146        DEPENDS $(PROCESSED_EXPORTS_FILE) : $(INTERFACER_HEADERS) ;
1147    }
1148    if $(_BUILD_PHASING) = YES {
1149        BUILD_PHASE_PRODUCTS += $(RAW_GENERATED_EXPORTS_FILE) $(PROCESSED_EXPORTS_FILE) ;
1150    }
1151    HEADER_SEARCH_PATHS on $(RAW_GENERATED_EXPORTS_FILE) = $(HEADER_SEARCH_PATHS) ;
1152    FRAMEWORK_SEARCH_PATHS on $(RAW_GENERATED_EXPORTS_FILE) = $(FRAMEWORK_SEARCH_PATHS) ;
1153    if $(GENERATE_COMPONENT_GLUE) = YES {
1154        INTERFACER_FLAGS += -componentGlueC ;
1155        INTERFACER_COMPONENT_GLUE_FLAGS = -generated "componentGlueC=$(COMPONENT_GLUE_DIR)/" -generatedPriv "componentGlueC=$(COMPONENT_GLUE_DIR)/" ;
1156    }
1157    for VARIANT in $(BUILD_VARIANTS) {
1158        DEPENDS $(PROCESSED_EXPORTS_FILE) : $(OBJECT_FILE_DIR_$(VARIANT)) ;
1159    }
1160    GLUE_FILE_LIST default = $(TEMP_DIR)$(/)GlueFileList ;
1161    Interfacer.RawExportSetsAndGlue $(RAW_GENERATED_EXPORTS_FILE) $(GLUE_FILE_LIST) : $(1) ;
1162    ProductFile $(RAW_GENERATED_EXPORTS_FILE) ;
1163    ProductFile $(GLUE_FILE_LIST) ;
1164    ADDITIONAL_EXPORTS_FILE on $(PROCESSED_EXPORTS_FILE) = $(ADDITIONAL_EXPORTS_FILE) ;
1165    ADDITIONAL_TRADITIONAL_EXPORTS_FILE on $(PROCESSED_EXPORTS_FILE) = $(ADDITIONAL_TRADITIONAL_EXPORTS_FILE) ;
1166    Interfacer.PrepareExportList $(PROCESSED_EXPORTS_FILE) : $(RAW_GENERATED_EXPORTS_FILE) ;
1167    ProductFile $(PROCESSED_EXPORTS_FILE) ;
1168    #!!!:cmolick:200203019 this dependence is necessary to ensure correct order
1169    DEPENDS $(PROCESSED_EXPORTS_FILE) : $(RAW_GENERATED_EXPORTS_FILE) ;
1170    EXPORTED_SYMBOLS_FILE default = $(PROCESSED_EXPORTS_FILE) ;
1171    ProcessFile $(1) : $(EXPORTED_SYMBOLS_FILE) ;
1172}
1173
1174actions Interfacer.RawExportSetsAndGlue
1175# Generates export sets and UPP glue with Interfacer,
1176# then attempts to compile UPP glue and add resulting
1177# object files to a list to use at link time.
1178{
1179    $(INTERFACER) -masterInterfaces "$(MASTER_INTERFACES)/" -cacheFolder "$(INTERFACER_CACHE)/" -uppGlueC "$(INTERFACER_FLAGS)" -framework "$(2[1]:G=:D=:S=)" -frameworkExports -p -generated "frameworkExports=$(EXPORT_SETS_DIR)/" -generatedPriv "frameworkExports=$(EXPORT_SETS_DIR)/" -generated "uppGlueC=$(UPP_GLUE_DIR)/" -generatedPriv "uppGlueC=$(UPP_GLUE_DIR)/" $(INTERFACER_COMPONENT_GLUE_FLAGS) $(INTERFACER_INSTALL_OPTIONS)
1180    if [ -e "$(UPP_GLUE_DIR)" ]; then
1181        _upp_glue_modules=`ls "$(UPP_GLUE_DIR)"`
1182        if [ ! "$_upp_glue_modules" = x"$_upp_glue_modules" ]; then
1183            cd "$(UPP_GLUE_DIR)"
1184            for _upp_glue in *.c ; do
1185                $(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
1186            done
1187            find "$(UPP_GLUE_DIR)" -type f -name '*.i.o' -print > "$(GLUE_FILE_LIST)"
1188        fi
1189    fi
1190    if [ -e "$(COMPONENT_GLUE_DIR)" ]; then
1191        _component_glue_modules=`ls "$(COMPONENT_GLUE_DIR)"`
1192        if [ ! "$_component_glue_modules" = x"$_component_glue_modules" ]; then
1193            cd "$(COMPONENT_GLUE_DIR)"
1194            for _component_glue in *.c ; do
1195                $(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
1196            done
1197            find "$(COMPONENT_GLUE_DIR)" -type f -name '*.i.o' -print >> "$(GLUE_FILE_LIST)"
1198        fi
1199    fi
1200}
1201
1202actions Interfacer.PrepareExportList
1203# Translates PEF-oriented Interfacer export list output into
1204# nmedit-compatible export lists for use with mach-o.
1205{
1206    cat "$(EXPORT_SETS_DIR)$(/)$(PRODUCT_NAME).exp" "$(EXPORT_SETS_DIR)$(/)$(PRODUCT_NAME)Priv.exp" > $(1:Q)
1207    _additional_exports_file="$(ADDITIONAL_EXPORTS_FILE)"
1208    if [ "x$_additional_exports_file" != "x" ]; then
1209        if [ -f "$_additional_exports_file" ]; then
1210            cat "$_additional_exports_file" >> $(1:Q)
1211        fi
1212    fi
1213    _additional_traditional_exports_file="$(ADDITIONAL_TRADITIONAL_EXPORTS_FILE)"
1214    if [ "x$_additional_traditional_exports_file" != "x" ]; then
1215        if [ -f "$_additional_traditional_exports_file" ]; then
1216            cat "$_additional_traditional_exports_file" |
1217             grep -v ^\* | grep -v ^# | grep -v ^\$ | sort | uniq -u | sed -e '1,$ s/^/_/' >> "$(1)"
1218        fi
1219    fi
1220}
1221
1222
1223# Linking, class archive generation, and related operations:
1224#
1225# Variables used by linking operations:
1226# FLAGS.o of target, LDFLAGS, SECTORDER_FLAGS
1227# LIBRARY_SEARCH_PATHS, FRAMEWORK_SEARCH_PATHS,
1228# and optionally LINK_FILE_LIST and INIT_ROUTINE
1229
1230# ClassArchive <archive> : <class file dir>
1231# Generates an archive that stores class files in the given directory
1232rule ClassArchive {
1233    if $(JAVA_ARCHIVE_TYPE) = JAR {
1234        local JARFLAGS = $(JAVA_JAR_FLAGS) ;
1235        if $(JAVA_MANIFEST_FILE) {
1236            DEPENDS $(1) : $(JAVA_MANIFEST_FILE) ;
1237            JAVA_MANIFEST_FILE on $(1) = $(SOURCE_ROOT)$(/)$(JAVA_MANIFEST_FILE) ;
1238            JARFLAGS = $(JARFLAGS)m ;
1239        }
1240        JARFLAGS = $(JARFLAGS)f ;
1241        if $(JAVA_ARCHIVE_COMPRESSION) != YES {
1242            JARFLAGS = $(JARFLAGS)0 ;
1243        }
1244        JARFLAGS += -J-Dfile.encoding=UTF8 ;
1245        JARFLAGS on $(1) = $(JARFLAGS) ;
1246	CLASS_FILE_DIR on $(1) = $(CLASS_FILE_DIR) ;
1247        ClassArchive.jarArchive $(1) : $(2) ;
1248    }
1249    else {
1250        if $(JAVA_ARCHIVE_TYPE) = ZIP {
1251            local ZIPFLAGS = $(JAVA_ZIP_FLAGS) ;
1252            if $(JAVA_ARCHIVE_COMPRESSION) != YES {
1253                ZIPFLAGS = $(ZIPFLAGS)0 ;
1254            }
1255            ZIPFLAGS on $(1) = $(ZIPFLAGS) ;
1256	    CLASS_FILE_DIR on $(1) = $(CLASS_FILE_DIR) ;
1257            ClassArchive.zipArchive $(1) : $(2) ;
1258        }
1259    }
1260}
1261# Use jar command to generate an archive
1262# from the class file list after removing "./" from each file path
1263actions ClassArchive.jarArchive {
1264    cd $(2:Q) && $(MKDIR) -p $(1:DQ) && $(JAR) $(JARFLAGS:Q) "$(OTHER_JARFLAGS)" $(JAVA_MANIFEST_FILE:Q) $(1:Q) .
1265}
1266# Use zip command to generate an archive
1267# from the class file list after removing "./" from each file path
1268actions ClassArchive.zipArchive {
1269    cd $(2:Q) && $(MKDIR) -p $(1:DQ) && $(ZIP) $(ZIPFLAGS:Q) "$(OTHER_ZIPFLAGS)" $(1:Q) .
1270}
1271
1272# Unarchive <location> : <archive>
1273rule Unarchive
1274{
1275    _DESTINATION_DIR = $(1:G=) ;
1276    if ! $(_DESTINATION_DIR) in $(PRODUCT_FILES) {
1277        Mkdir $(_DESTINATION_DIR) ;
1278        ProductFile $(_DESTINATION_DIR) ;
1279    }
1280    DEPENDS $(1) : $(_DESTINATION_DIR) ;
1281    DEPENDS $(1) : $(2) ;
1282    switch $(2:S) {
1283        case ".jar" : UnarchiveJar $(1) : $(2) ;
1284        case ".zip" : UnarchiveZip $(1) : $(2) ;
1285    }
1286}
1287
1288# we use unzip to unarchive jars since it's much faster than jar, and we can exclude the manifest file
1289actions UnarchiveJar
1290{
1291    $(UNZIP) -oq $(2:Q) -x META-INF/MANIFEST.MF -d $(1:G=:Q)
1292}
1293
1294actions UnarchiveZip
1295{
1296    $(UNZIP) -oq $(2:Q) -d $(1:G=:Q)
1297}
1298
1299# ProcessSingleObjectLink <executable> : <inputs> : <rule>
1300# Calls link rule which then calls ProcessLink
1301# in order to generate a master object file
1302# which is also used for symbol editing
1303rule ProcessSingleObjectLink
1304{
1305    local OTHER_LINKED_FILES ;
1306    # Master object file kept in other directory to avoid name conflict
1307
1308    MASTER_OBJECT_FILE_$(VARIANT) default = $(OBJECT_FILE_DIR_$(VARIANT))$(/)ProjectBuilderMasterObjectFile.o ;
1309    NonObjectFiles OTHER_LINKED_FILES : $(LINKED_FILES_$(VARIANT)) ;
1310    MasterObjectFile $(MASTER_OBJECT_FILE_$(VARIANT)) : $(OBJECT_FILES_$(VARIANT)) : $(EXPORTED_SYMBOLS_FILE) ;
1311    if $(OTHER_LINKED_FILES) = "" {
1312        OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE_$(VARIANT)) ;
1313    }
1314    else {
1315        OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(VARIANT)) ;
1316    }
1317    if $(VECTOR_OBJECT_FILE) {
1318        OTHER_LINKED_FILES += $(VECTOR_OBJECT_FILE) ;
1319    }
1320    $(3) $(INNER_PRODUCT_$(VARIANT)) : $(OTHER_LINKED_FILES) ;
1321}
1322
1323# ProcessLinkWithArchitectureSpecificEditing <executable> : <inputs> : <rule>
1324# !!!:cmolick:20021115 arch-specific editing is no longer used because symbols should uniform on all architectures
1325rule ProcessLinkWithArchitectureSpecificEditing
1326{
1327    for ARCH in $(ARCHS) {
1328        MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT) default = $(OBJECT_FILE_DIR_$(VARIANT))$(/)ProjectBuilderMasterObjectFile$(ARCH).o ;
1329        MasterObjectFile $(MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT)) : $(OBJECT_FILES_$(ARCH)_$(VARIANT)) : $(EXPORTED_SYMBOLS_FILE_$(ARCH)) ;
1330    }
1331    NonObjectFiles OTHER_LINKED_FILES : $(LINKED_FILES_$(VARIANT)) ;
1332    for ARCH in $(ARCHS) {
1333        if $(OTHER_LINKED_FILES) = "" {
1334            OTHER_LINKED_FILES = $(MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT)) ;
1335        }
1336        else {
1337            OTHER_LINKED_FILES += $(MASTER_OBJECT_FILE_$(ARCH)_$(VARIANT)) ;
1338        }
1339    }
1340    if $(VECTOR_OBJECT_FILE) {
1341        OTHER_LINKED_FILES += $(VECTOR_OBJECT_FILE) ;
1342    }
1343    $(3) $(INNER_PRODUCT_$(VARIANT)) : $(OTHER_LINKED_FILES) ;
1344}
1345
1346# ProcessLink <executable> : <inputs> : <rule>
1347# Processes <inputs> into <rule>.ARGUMENTS for later use by the <rule> rule
1348# where <inputs> are object files, libraries, frameworks, object file lists,
1349# and such and where <rule> is one of StaticLibrary, DynamicLibrary, or
1350# StandaloneExecutable.
1351rule ProcessLink
1352{
1353    local RULE = $(3) ;
1354    # Link as standalone executable unless another rule is specified
1355    RULE default = StandaloneExecutable ;
1356    # Set rule-specific flags such as StandaloneExecutable.FILELIST_FLAG
1357    # and store the values in local variables
1358    local FILELIST_FLAG = $($(RULE).FILELIST_FLAG:G=) ;
1359    local LIBRARY_FLAG = $($(RULE).LIBRARY_FLAG:G=) ;
1360    local FRAMEWORK_FLAG = $($(RULE).FRAMEWORK_FLAG:G=) ;
1361    local FILELIST_NOSPACE = $($(RULE).FILELIST_FLAG:G) ;
1362    local LIBRARY_NOSPACE = $($(RULE).LIBRARY_FLAG:G) ;
1363    local FRAMEWORK_NOSPACE = $($(RULE).FRAMEWORK_FLAG:G) ;
1364    local BATCH_OFILES = $($(RULE).BATCH_OFILES) ;
1365    # The product depends on all of the input files, although
1366    # library and framework references may not be resolvable.
1367    DEPENDS $(1) : $(2) ;
1368    # link depends on file list
1369    LINK_FILE_LIST_$(VARIANT) = $(FILE_LIST_$(VARIANT)) ;
1370    DEPENDS $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
1371    # Deal with each input file in turn
1372    local LINKED ;
1373    local ARGUMENT ;
1374    for LINKED in $(2) {
1375        $(RULE).FILES$(LINKED:S) on $(1) += $(LINKED) ;
1376        switch $(LINKED:BS) {
1377            case *.o :
1378                # If $(BATCH_OFILES) is true then object file lists are generated.
1379                if $(BATCH_OFILES) != NO {
1380                    ClearFileList $(LINK_FILE_LIST_$(VARIANT)) ;
1381                    AppendToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(LINKED) ;
1382                    DEPENDS $(LINK_FILE_LIST_$(VARIANT)) : $(LINKED) ;
1383                } else {
1384                    $(RULE).ARGUMENTS on $(1) += $(LINKED) ;
1385                }
1386            case *.objects :
1387                if $(FILELIST_NOSPACE) {
1388                    ARGUMENT = $(FILELIST_FLAG)$(LINKED) ;
1389                    NOTFILE $(ARGUMENT) ;
1390                } else {
1391                    NOTFILE $(FILELIST_FLAG) ;
1392                    ARGUMENT = $(FILELIST_FLAG) $(LINKED) ;
1393                }
1394                $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ;
1395            case lib*.a :
1396                if $(LIBRARY_FLAG) {
1397                    LINKED = $(LINKED:A) ;
1398                }
1399                NOCARE $(LINKED) ;
1400                if $(LIBRARY_NOSPACE) {
1401                    ARGUMENT = $(LIBRARY_FLAG)$(LINKED) ;
1402                } else {
1403                    ARGUMENT = $(LIBRARY_FLAG) $(LINKED) ;
1404                }
1405                $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ;
1406                NOTFILE $(ARGUMENT) ;
1407            case *.lib :
1408                NOCARE $(LINKED) ;
1409                if $(LIBRARY_FLAG) {
1410                    if $(LIBRARY_NOSPACE) {
1411                        ARGUMENT = $(LIBRARY_FLAG)$(LINKED:A) ;
1412                    } else {
1413                        ARGUMENT = $(LIBRARY_FLAG) $(LINKED:A) ;
1414                    }
1415                    $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ;
1416                    NOTFILE $(ARGUMENT) ;
1417                } else {
1418                    ECHO jam: warning: For target $(1), rule $(RULE) will ignore $(LINKED) ;
1419                }
1420            case *.dylib :
1421                NOCARE $(LINKED) ;
1422                if $(LIBRARY_FLAG) {
1423                    if $(LIBRARY_NOSPACE) {
1424                        ARGUMENT = $(LIBRARY_FLAG)$(LINKED:A) ;
1425                    } else {
1426                        ARGUMENT = $(LIBRARY_FLAG) $(LINKED:A) ;
1427                    }
1428                    $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ;
1429                    NOTFILE $(ARGUMENT) ;
1430                } else {
1431                    ECHO jam: warning: For target $(1), rule $(RULE) will ignore $(LINKED) ;
1432                }
1433            case *.framework :
1434                NOCARE $(LINKED) ;
1435                if $(FRAMEWORK_FLAG) {
1436                    if $(FRAMEWORK_NOSPACE) {
1437                        ARGUMENT = $(FRAMEWORK_FLAG)$(LINKED:B) ;
1438                    } else {
1439                        ARGUMENT = $(FRAMEWORK_FLAG) $(LINKED:B) ;
1440                    }
1441                    $(RULE).ARGUMENTS on $(1) += $(ARGUMENT) ;
1442                    NOTFILE $(ARGUMENT) ;
1443                } else {
1444                    ECHO jam: warning: For target $(1), rule $(RULE) will ignore $(LINKED) ;
1445                }
1446	    case *.jar :
1447		# silently ignore Java archives since they are valid, but not used for native linking
1448	    case *.zip :
1449		# silently ignore Java archives since they are valid, but not used for native linking
1450            case * :
1451                ECHO Warning: $(RULE): Unknown extension on "$(LINKED:BS)" when linking with $(RULE) ;
1452        }
1453    }
1454    # include any object files compiled from objc generated with bridget
1455    if $(BRIDGET_FILE_LIST) {
1456        AppendFileToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(BRIDGET_FILE_LIST) ;
1457    }
1458    if $(BATCH_OFILES) != NO {
1459        $(RULE).LinkUsingFileList $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
1460    }
1461    else {
1462        $(RULE).Link $(1) ;
1463    }
1464}
1465
1466actions quietly together piecemeal ClearFileList
1467{
1468    $(RM) -rf "$(1)"
1469}
1470
1471actions quietly together piecemeal AppendToFileList
1472{
1473    for file_reference in "$(2)"
1474    do
1475        $(ECHO) "$file_reference" >> "$(1)"
1476    done
1477}
1478
1479actions quietly together piecemeal AppendFileToFileList
1480{
1481    cat "$(2)" >> "$(1)"
1482}
1483
1484# StaticLibrary <library> : <inputs>
1485# Stores <inputs> in <library> where <inputs> are object files,
1486# libraries, frameworks, object file lists, and such
1487rule StaticLibrary
1488{
1489    LIBRARY_SEARCH_PATHS on $(1) = $(LIBRARY_SEARCH_PATHS) ;
1490    ProcessLink $(1) : $(2) : StaticLibrary ;
1491    FLAGS.o on $(1) = $(LDFLAGS) $(SECTORDER_FLAGS) ;
1492}
1493actions together StaticLibrary
1494{
1495}
1496actions quietly together piecemeal StaticLibrary.Link bind StaticLibrary.ARGUMENTS
1497{
1498    ( $(LIBTOOL) -o $(1:Q) $(2:Q) "-L$(LIBRARY_SEARCH_PATHS)" "$(StaticLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) && $(RANLIB) $(1:Q) )
1499}
1500actions quietly together piecemeal StaticLibrary.LinkUsingFileList bind StaticLibrary.ARGUMENTS
1501{
1502    ( $(LIBTOOL) -o $(1:Q) "-L$(LIBRARY_SEARCH_PATHS)" -filelist $(2:Q) "$(StaticLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) && $(RANLIB) $(1:Q) )
1503}
1504StaticLibrary.FRAMEWORK_FLAG = ;
1505StaticLibrary.LIBRARY_FLAG = ;
1506StaticLibrary.BATCH_OFILES default = YES ;
1507
1508# StandaloneExecutable <executable> : <inputs>
1509# Links <inputs> to produce <executable>, where <inputs> are objects,
1510# libraries, frameworks, and such.
1511rule StandaloneExecutable
1512{
1513    ProcessLink $(1) : $(2) ;
1514    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
1515    LIBRARY_SEARCH_PATHS on $(1) = $(LIBRARY_SEARCH_PATHS) ;
1516    FLAGS.o on $(1) = $(ARCH_FLAGS) $(LDFLAGS) $(SECTORDER_FLAGS) ;
1517    if $(INIT_ROUTINE) {
1518        FLAGS.o on $(1) += -init $(INIT_ROUTINE) ;
1519    }
1520}
1521StandaloneExecutable.FILELIST_FLAG = -filelist ;
1522StandaloneExecutable.FRAMEWORK_FLAG = -framework ;
1523StandaloneExecutable.LIBRARY_FLAG = <nospace>-l ;
1524StandaloneExecutable.BATCH_OFILES default = YES ;
1525actions together StandaloneExecutable
1526{
1527}
1528actions quietly together StandaloneExecutable.Link bind StandaloneExecutable.ARGUMENTS
1529{
1530    $(_LD_FOR_LINKING) -o $(1:Q) "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) "$(StandaloneExecutable.ARGUMENTS)"
1531}
1532actions quietly together StandaloneExecutable.LinkUsingFileList bind StandaloneExecutable.ARGUMENTS
1533{
1534    $(_LD_FOR_LINKING) -o $(1:Q) "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" -filelist $(2:Q) "$(FLAGS.o)" $(INSTALLED_NAME_FLAG) "$(StandaloneExecutable.ARGUMENTS)"
1535}
1536
1537
1538# DynamicLibrary <library> : <objects> : <libraries>
1539# Links <objects> and <libraries> to produce <library>, using $(FLAGS.o)
1540rule DynamicLibrary
1541{
1542    LIBRARY_SEARCH_PATHS on $(1) = $(LIBRARY_SEARCH_PATHS) ;
1543    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
1544    ProcessLink $(1) : $(2) : DynamicLibrary ;
1545    FLAGS.o on $(1) = $(ARCH_FLAGS) $(LDFLAGS) $(SECTORDER_FLAGS) ;
1546    if $(INIT_ROUTINE) {
1547        FLAGS.o on $(1) += -init $(INIT_ROUTINE) ;
1548    }
1549}
1550actions together DynamicLibrary
1551{
1552}
1553actions quietly together DynamicLibrary.Link bind DynamicLibrary.ARGUMENTS DynamicLibrary.DEFFILE
1554{
1555    $(_LD_FOR_LINKING) -o $(1:Q) $(DynamicLibrary.DEFFILE_FLAG)"$(DynamicLibrary.DEFFILE)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" "$(DynamicLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG)
1556}
1557actions quietly together DynamicLibrary.LinkUsingFileList bind DynamicLibrary.ARGUMENTS DynamicLibrary.DEFFILE
1558{
1559    $(_LD_FOR_LINKING) -o $(1:Q) $(DynamicLibrary.DEFFILE_FLAG)"$(DynamicLibrary.DEFFILE)" "-L$(LIBRARY_SEARCH_PATHS)" "-F$(FRAMEWORK_SEARCH_PATHS)" -filelist $(2:Q) "$(DynamicLibrary.ARGUMENTS)" "$(FLAGS.o)" $(INSTALLED_NAME_FLAG)
1560}
1561DynamicLibrary.DEFFILE_FLAG = "-Xlinker -DEF:" ;
1562DynamicLibrary.FILELIST_FLAG = -filelist ;
1563DynamicLibrary.FRAMEWORK_FLAG = -framework ;
1564DynamicLibrary.LIBRARY_FLAG = <nospace>-l ;
1565DynamicLibrary.BATCH_OFILES default = YES ;
1566
1567# MasterObjectFile <master object file> : <object files> : <exports file> : [<arch>]
1568# Merges many object files into one in order to edit
1569# the list of exported symbols
1570rule MasterObjectFile
1571{
1572    local OBJECT_FILE ;
1573    if $(4) {
1574        LINK_FILE_LIST_$(VARIANT) = $(FILE_LIST_$(VARIANT))Prelink_$(4) ;
1575    }
1576    else {
1577        LINK_FILE_LIST_$(VARIANT) = $(FILE_LIST_$(VARIANT))Prelink ;
1578    }
1579    # object files must be present before master can be assembled
1580    DEPENDS $(1) : $(2) ;
1581    # list object files in a file to limit link line length
1582    DEPENDS $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
1583    ClearFileList $(LINK_FILE_LIST_$(VARIANT)) ;
1584    for LINKED in $(2) {
1585        AppendToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(LINKED) ;
1586        DEPENDS $(LINK_FILE_LIST_$(VARIANT)) : $(LINKED) ;
1587    }
1588    if $(KEEP_PRIVATE_EXTERNS) != NO {
1589        KEEP_PRIVATE_EXTERNS_FLAG on $(1) = -keep_private_externs ;
1590    }
1591    if $(GLUE_FILE_LIST) {
1592        DEPENDS $(LINK_FILE_LIST_$(VARIANT)) : $(GLUE_FILE_LIST) ;
1593        AppendFileToFileList $(LINK_FILE_LIST_$(VARIANT)) : $(GLUE_FILE_LIST) ;
1594    }
1595    PRELINK_FLAGS on $(1) = $(PRELINK_FLAGS) ;
1596    PRELINK_LIBS on $(1) = $(PRELINK_LIBS) ;
1597    # !!!:cmolick:20021021 provide an optional way for the target to depend on the PRELINK_LIBS?
1598    if $(_BUILD_PHASING) = YES {
1599        BUILD_PHASE_PRODUCTS += $(1) ;
1600    }
1601    MasterObjectFile.Combine $(1) : $(LINK_FILE_LIST_$(VARIANT)) ;
1602    if $(3) {
1603        INCLUDES $(1) : $(3) ;
1604        MasterObjectFile.EditExports $(1) : $(3) ;
1605    }
1606}
1607actions MasterObjectFile.Combine
1608{
1609    $(_LD_FOR_LINKING) $(ARCH_FLAGS) $(KEEP_PRIVATE_EXTERNS_FLAG) $(GLOBAL_CFLAGS) -L$(LIBRARY_SEARCH_PATHS:Q) -F$(FRAMEWORK_SEARCH_PATHS:Q) $(PRELINK_FLAGS:Q) $(WARNING_LDFLAGS) -nostdlib -filelist $(2:Q) -r -o $(1:Q) $(PRELINK_LIBS:Q)
1610}
1611actions MasterObjectFile.EditExports
1612{
1613    $(NMEDIT) -s $(2:Q) $(1:Q) -o $(1:Q)
1614}
1615
1616# EditSymbols <binary> : <symbols file>
1617# !!!:cmolick:20021022 rule for invoking nmedit needed until exported symbols flags available for linker
1618rule EditSymbols
1619{
1620    DEPENDS $(1) : $(2) ;
1621}
1622actions EditSymbols
1623{
1624    $(NMEDIT) -s $(2:Q) $(1:Q) -o $(1:Q)
1625}
1626
1627# Ranlib <library>
1628# Ranlib for static library
1629actions Ranlib
1630{
1631    $(RANLIB) $(1:Q)
1632}
1633
1634# VersioningSystem_next-cvs <product>
1635# Handles automatic generation of CVSVersionInfo.txt file for projects that use NeXT CVS-style versioning.
1636rule VersioningSystem_next-cvs
1637{
1638    local VERSION_INFO_FILE ;
1639    VERSION_INFO_FILE default = $(1:B)_vers.c ;
1640    # Make sure that the C file containing the version string gets created.
1641    VersioningSystem_next-cvs.Create $(VERSION_INFO_FILE) : $(1:B) ;
1642    DerivedFiles $(VERSION_INFO_FILE) ;
1643    SUPPRESS_PREFIX_HEADER = YES ;
1644    ProcessFile $(1) : $(VERSION_INFO_FILE) ;
1645    SUPPRESS_PREFIX_HEADER = NO ;
1646
1647    # Set up default values for the variables.
1648    CVS_VERS_FILE default = CVSVersionInfo.txt ;
1649}
1650rule VersioningSystem_next-cvs.Create
1651{
1652    DEPENDS $(1) : $(CVS_VERS_FILE) ;
1653}
1654actions VersioningSystem_next-cvs.Create
1655{
1656    versFile="$(CVS_VERS_FILE)"
1657    awk=/usr/bin/awk
1658    user=`$awk '/\\$\Id:/ {print $7;}' $versFile`
1659    timestamp=`$awk '/\\$\Id:/ {print $5 " " $6;}' $versFile`
1660    fileVers=`$awk '/\\$\Id:/ {print $4;}' $versFile`
1661    name=`$awk '/^ProjectName:/ {print $2;}' $versFile`
1662    tag=`$awk '/\\$\Name:/ {print $3;}' $versFile`
1663    versNum=`$awk '/^ProjectVersion:/ {print $2;}' $versFile`
1664    proj="$(2:B)"
1665    clean_proj_name=`echo $proj | sed 's/[^0-9A-Za-z]/_/g'`
1666    # the keyword name is the current tag and only gets filled in if the files are extracted at
1667    # that tag. If the tag has a value, then it is a released version, if the tag is '$' then
1668    # it has no value and is a development version.
1669    case $tag in '$') vers="$versNum.dev";; *) vers=$versNum;; esac
1670    q='"'
1671    vers_str="Project:$proj Version:$vers (Checkpoint by:$user on:$timestamp revision:$fileVers)"
1672    vers_suffix="$(CURRENT_PROJECT_VERSION_SUFFIX)"
1673    echo "const char "$clean_proj_name"_VERS_STRING[] = $q@(#)$vers_str$q;" > "$(1)"
1674    echo "const char "$clean_proj_name"_VERS_NUM[] = $q$vers$vers_suffix$q;" >> "$(1)"
1675}
1676
1677# VersioningSystem_apple-generic <product>
1678# Generates <product>_vers.c to define version symbol
1679rule VersioningSystem_apple-generic
1680{
1681    # Set values to use
1682    local VERSION_INFO_FILE ;
1683    VERSION_INFO_FILE default = $(1:B)_vers.c ;
1684
1685    # variables used need to be defined on the version info file target
1686    CURRENT_PROJECT_VERSION on $(VERSION_INFO_FILE) = $(CURRENT_PROJECT_VERSION) ;
1687    VERSION_INFO_EXPORT_DECL on $(VERSION_INFO_FILE) default = $(VERSION_INFO_EXPORT_DECL) ;
1688    VERSION_INFO_PREFIX on $(VERSION_INFO_FILE) default = $(VERSION_INFO_PREFIX) ;
1689    VERSION_INFO_SUFFIX on $(VERSION_INFO_FILE) default = $(VERSION_INFO_SUFFIX) ;
1690    VERSION_INFO_BUILDER on $(VERSION_INFO_FILE) default = $(USER) ;
1691
1692    # Create versioning code
1693    VersioningSystem_apple-generic.Create $(VERSION_INFO_FILE) : $(1) ;
1694    DerivedFiles $(VERSION_INFO_FILE) ;
1695    SUPPRESS_PREFIX_HEADER = YES ;
1696    ProcessFile $(1) : $(VERSION_INFO_FILE) ;
1697    SUPPRESS_PREFIX_HEADER = NO ;
1698}
1699actions VersioningSystem_apple-generic.Create
1700{
1701    raw_project_name=$(PROJECT:Q)
1702    project_name=`echo $raw_project_name | sed 's/[^0-9A-Za-z]/_/g'`
1703    raw_target_name=$(2:BQ)
1704    target_name=`echo $raw_target_name | sed 's/[^0-9A-Za-z]/_/g'`
1705    project_vers="$(CURRENT_PROJECT_VERSION)"
1706    vers_info_export_decl="$(VERSION_INFO_EXPORT_DECL)"
1707    vers_info_prefix="$(VERSION_INFO_PREFIX)"
1708    vers_info_suffix="$(VERSION_INFO_SUFFIX)"
1709    vers_info_builder="$(VERSION_INFO_BUILDER)"
1710    echo ${vers_info_export_decl} " const unsigned char ${vers_info_prefix}${target_name}VersionString${vers_info_suffix}[] =  \"@(#)PROGRAM:${target_name}  PROJECT:${project_name}-${project_vers}  DEVELOPER:${vers_info_builder}  BUILT:\" __DATE__  \" \" __TIME__ \"\n\";" > "$(1)"
1711    echo ${vers_info_export_decl} " const double ${vers_info_prefix}${target_name}VersionNumber${vers_info_suffix} = (double)${project_vers};" >> $(1:Q)
1712}
1713
1714# KernelModuleGeneratedSource
1715# Creates a kernel module source stub based on the values
1716# of MODULE_VERSION, MODULE_START, and MODULE_STOP
1717rule KernelModuleGeneratedSource
1718{
1719    MODULE_INFO_FILE_$(VARIANT) default = $(1:B)_info.c ;
1720    DerivedFiles $(MODULE_INFO_FILE_$(VARIANT)) ;
1721    DEPENDS $(MODULE_INFO_FILE_$(VARIANT)) : $(MODULE_INFO_PLIST) ;
1722    MODULE_VERSION on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_VERSION) ;
1723    MODULE_NAME on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_NAME) ;
1724    if $(MODULE_IOKIT) = "YES" {
1725        MODULE_START on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
1726        MODULE_STOP on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
1727    }
1728    else {
1729        if $(MODULE_START) = "" {
1730            MODULE_START on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
1731        } else {
1732            MODULE_START on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_START) ;
1733        }
1734        if $(MODULE_STOP) = "" {
1735            MODULE_STOP on $(MODULE_INFO_FILE_$(VARIANT)) = 0 ;
1736        } else {
1737            MODULE_STOP on $(MODULE_INFO_FILE_$(VARIANT)) = $(MODULE_STOP) ;
1738        }
1739    }
1740    KernelModuleGeneratedSource.Create $(MODULE_INFO_FILE_$(VARIANT)) ;
1741    SUPPRESS_PREFIX_HEADER = YES ;
1742    ProcessFile $(1) : $(MODULE_INFO_FILE_$(VARIANT)) ;
1743    SUPPRESS_PREFIX_HEADER = NO ;
1744}
1745actions KernelModuleGeneratedSource.Create
1746{
1747    /bin/echo "#include <mach/mach_types.h>" > $(1:Q)
1748    /bin/echo " " >> $(1:Q)
1749    /bin/echo "extern kern_return_t _start(kmod_info_t *ki, void *data);" >> $(1:Q)
1750    /bin/echo "extern kern_return_t _stop(kmod_info_t *ki, void *data);" >> $(1:Q)
1751    if [ $(MODULE_START) != 0 ]; then
1752        /bin/echo "__private_extern__ kern_return_t $(MODULE_START)(kmod_info_t *ki, void *data);" >> $(1:Q)
1753    fi
1754    if [ $(MODULE_STOP) != 0 ]; then
1755        /bin/echo "__private_extern__ kern_return_t $(MODULE_STOP)(kmod_info_t *ki, void *data);" >> $(1:Q)
1756    fi
1757    /bin/echo " " >> $(1:Q)
1758    /bin/echo "KMOD_EXPLICIT_DECL($(MODULE_NAME), \"$(MODULE_VERSION)\", _start, _stop)" >> $(1:Q)
1759    /bin/echo "__private_extern__ kmod_start_func_t *_realmain = $(MODULE_START);" >> $(1:Q)
1760    /bin/echo "__private_extern__ kmod_stop_func_t *_antimain = $(MODULE_STOP);" >> $(1:Q)
1761    /bin/echo "__private_extern__ int _kext_apple_cc = __APPLE_CC__ ;" >> $(1:Q)
1762}
1763
1764# GenerateFrameworkStub <framework stub>
1765# Invokes a custom tool to generate a Mach-O framework executable stub at the specified path
1766# Also be sure to the FRAMEWORK_INSTALL_NAME variable on the <framework stub>
1767actions GenerateFrameworkStub
1768{
1769    $(MKDIR) -p $(DERIVED_FILE_DIR:Q)
1770    dummy_class_name=`echo -n $(1:B) | tr -c '[:alnum:]' '_'`
1771    $(ECHO) "@interface NSFramework_${dummy_class_name}" > $(DERIVED_FILE_DIR:Q)/framework_stub.m
1772    $(ECHO) "@end" >> $(DERIVED_FILE_DIR:Q)/framework_stub.m
1773    $(ECHO) "@implementation NSFramework_${dummy_class_name}" >> $(DERIVED_FILE_DIR:Q)/framework_stub.m
1774    $(ECHO) "@end" >> $(DERIVED_FILE_DIR:Q)/framework_stub.m
1775    $(CC) -c $(DERIVED_FILE_DIR:Q)/framework_stub.m $(ARCH_FLAGS) -o $(DERIVED_FILE_DIR:Q)/framework_stub.o
1776    $(_LD_FOR_LINKING) $(ARCH_FLAGS) -dynamiclib $(INSTALLED_NAME_FLAG) $(DYLIB_VERSION_FLAGS:Q) -L$(LIBRARY_SEARCH_PATHS:Q) -F$(FRAMEWORK_SEARCH_PATHS:Q) $(DynamicLibrary.ARGUMENTS:Q) $(DERIVED_FILE_DIR:Q)/framework_stub.o -o $(1:Q)
1777    $(STRIP) $(STRIPFLAGS:Q) $(1:Q)
1778}
1779# Copyright (c) 1999-2003 Apple Computer, Inc.
1780# All rights reserved.
1781
1782# Define reasonable base locations, to be overridden by default
1783
1784# Build intermediates go into TEMP_ROOT which defaults to
1785# build/intermediates in current directory, or OBJROOT if defined
1786TEMP_ROOT default = $(OBJROOT) ;
1787
1788# Builds go into the BUILD_ROOT which defaults to
1789# build/products in current directory, or SYMROOT if defined
1790BUILD_ROOT default = $(SYMROOT) ;
1791
1792# Installation root defaults to root, or DSTROOT if defined
1793INSTALL_ROOT default = $(DSTROOT) ;
1794
1795# Set initial values for installation information and framework version
1796_BUILD_PHASING default = YES ;
1797export INSTALL_OWNER default = $(USER) ;
1798export INSTALL_GROUP default = $(GROUP) ;
1799export FRAMEWORK_VERSION default = "A" ;
1800REMOVE_CVS_FROM_RESOURCES default = YES ;
1801COPY_PHASE_STRIP default = NO ;
1802PREBINDING default = YES ;
1803SET_DIR_MODE_OWNER_GROUP default = YES ;
1804SET_FILE_MODE_OWNER_GROUP default = NO ;
1805
1806# Set initial optimization level, debug, and profile settings
1807export OPTIMIZATION_LEVEL default = 0 ;
1808export DEBUGGING_SYMBOLS default = YES ;
1809export PROFILING_CODE default = NO ;
1810
1811# Default linker warnings
1812WARNING_LDFLAGS default = -Wl,-no_arch_warnings ;
1813
1814# Default settings for Java builds
1815JAVA_ARCHIVE_CLASSES default = YES ;
1816JAVA_ARCHIVE_TYPE default = JAR ;
1817JAVA_APP_STUB default = /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub ;
1818JAVA_JAR_FLAGS default = cv ;
1819JAVA_SOURCE_SUBDIR default = . ;
1820JAVA_FRAMEWORK_RESOURCES_DIRS default = Resources ;
1821export JAVA_FRAMEWORK_JARS default = ;
1822JAVA_USE_DEPENDENCIES default = YES ;
1823JAVA_ZIP_FLAGS default = -urg ;
1824
1825JAVA_COMPILER_DEBUGGING_SYMBOLS default = YES ;
1826JAVA_COMPILER_DISABLE_WARNINGS default = NO ;
1827JAVA_COMPILER_DEPRECATED_WARNINGS default = NO ;
1828
1829# These default flags probably shouldn't be overridden by users.
1830JAVAC_DEFAULT_FLAGS default = -J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8 ;
1831JIKES_DEFAULT_FLAGS default = +E +OLDCSO ;
1832
1833# Default variants and flags
1834BUILD_VARIANTS default = normal ;
1835_BUILD_PHASES = ;
1836
1837# BeginProduct <product>
1838#
1839# Initializes the directory and file list variables
1840#
1841# Variable references:
1842# BUILD_ROOT			Base directory for builds
1843# TARGET_NAME			Name of the target that builds this product
1844# PRODUCT_NAME			Name of the product that's built
1845# TEMP_ROOT			Base directory for intermediates
1846# BASE_PROJECT_HEADER_DIR	Base directory for project headers
1847# HEADER_SUBDIRECTORY		Path prefix in header #include lines
1848# INSTALL_ROOT			Base directory for installations
1849# INSTALL_PATH			Subdirectory where product is installed
1850# PUBLIC_HEADER_DIR		Location for public headers
1851#
1852# Variables set:
1853# HEADER_SUBDIRECTORY		Base product name
1854# BUILD_COMPONENTS		List may include: headers, build, source
1855# OPTIMIZATION_CFLAGS		Optimization flags for C compiles
1856# OTHER_CPLUSPLUSFLAGS		C++ flags default to C values
1857# WARNING_CPLUSPLUSFLAGS
1858# INCLUDED_ARCHS		Architectures intended for this build
1859# NATIVE_ARCH			Architecture of the build machine
1860# ARCHS				Architectures used for this build
1861# ARCH_FLAGS			Architecture flags used for most tools
1862# SOURCE_DIR			
1863# BUILD_DIR			Target-specific directory for builds
1864# TEMP_DIR			For target-specific intermediates
1865# PROJECT_HEADER_DIR		Project header file directory in $(TEMP_DIR)
1866# OBJECT_FILE_DIR		Object file directory in $(TEMP_DIR)
1867# CLASS_FILE_DIR		Class file directory in $(TEMP_DIR)
1868# FILE_LIST			Base name for lists of files generated
1869# DERIVED_FILE_DIR		Derived source directory in $(TEMP_DIR)
1870# INSTALL_DIR			Directory in $(INSTALL_ROOT) for installations
1871# HEADER_SEARCH_PATHS		Project header directories prepended
1872# FRAMEWORK_SEARCH_PATHS	Product build root appended
1873# DERIVED_FILES			Initialized empty
1874# OBJECT_FILES			Initialized empty
1875# LINKED_FILES			Initialized empty
1876# PRODUCT_FILES			Initialized empty
1877# PRECOMP_TRUSTFILE		List of trusted precompiled headers
1878#
1879rule BeginProduct
1880{
1881    # target representing the build must be a nonfile pseudotarget
1882    NOTFILE $(1) ;
1883
1884    # define the header subdirectory early since we'll use it to
1885    # compute the project header directory
1886    HEADER_SUBDIRECTORY = $(1:B) ;
1887
1888    # the following sequence of tests sets up CC, CPLUSPLUS, LD, and LDPLUSPLUS appropriately,
1889    # depending on whether we're using GCC 2.95.2, 3.1, or 3.3 (either explicitly or implicitly)
1890
1891    # a hack to detect attempt to use GCC 3, and to set the 'GCC_VERSION' build setting accordingly
1892    if $(USE_GCC3) = YES  ||  $(USE_GCC2) = NO  ||  $(CC) = "/usr/bin/gcc3" {
1893        # use either the default gcc version if available or default to 3.1
1894        if $(_DEFAULT_GCC_VERSION) = 3.1 || $(_DEFAULT_GCC_VERSION) = 3.3 {
1895            GCC_VERSION default = $(_DEFAULT_GCC_VERSION) ;
1896        }
1897        else {
1898            GCC_VERSION default = 3.1 ;
1899        }
1900    }
1901    else if $(USE_GCC2) = YES  ||  $(USE_GCC3) = NO  ||  $(CC) = "/usr/bin/gcc2" {
1902        GCC_VERSION default = 2.x ;
1903    }
1904    else {
1905        if $(_DEFAULT_GCC_VERSION) = 3.1 || $(_DEFAULT_GCC_VERSION) = 3.3 {
1906            GCC_VERSION default = $(_DEFAULT_GCC_VERSION) ;
1907        }
1908        else if $(_DEFAULT_GCC_VERSION) = 2.95.2 {
1909            GCC_VERSION default = 2.x ;
1910        }
1911        else {
1912            GCC_VERSION default = unknown ;
1913        }
1914    }
1915
1916    # set up CC, CPLUSPLUS, LD, and LDPLUSPLUS appropriately (this logic is temporary, and is
1917    # expected to be phased out once we have per-build-phase compiler choices)
1918    if $(GCC_VERSION) = 3.3 {
1919        CC default = /usr/bin/gcc-3.3 ;
1920        CPLUSPLUS default = /usr/bin/g++-3.3 ;
1921    }
1922    else if $(GCC_VERSION) = 3.1 {
1923        CC default = /usr/bin/gcc3 ;
1924        CPLUSPLUS default = /usr/bin/g++3 ;
1925    }
1926    else if $(GCC_VERSION) = 2.x {
1927        CC default = /usr/bin/gcc2 ;
1928        CPLUSPLUS default = /usr/bin/g++2 ;
1929    }
1930    else {
1931        CC default = /usr/bin/cc ;
1932        CPLUSPLUS default = /usr/bin/c++ ;
1933    }
1934    LD default = $(CC) ;
1935    LDPLUSPLUS default = $(CPLUSPLUS) ;
1936    _LD_FOR_LINKING = $(LD) ;   # this might get reset to $(LDPLUSPLUS) in the CompileCplusplus rule
1937
1938    # Set reasonable optimization flags for installs if not already set
1939    OPTIMIZATION_CFLAGS default = -Os ;
1940    # precompiled header, C++, Assembly, and Fortran options match C options by default
1941    OTHER_PRECOMP_CPLUSPLUSFLAGS default = $(OTHER_PRECOMP_CFLAGS) ;
1942    OTHER_CPLUSPLUSFLAGS default = $(OTHER_CFLAGS) ;
1943    WARNING_CPLUSPLUSFLAGS default = $(WARNING_CFLAGS) ;
1944    OTHER_ASFLAGS default = $(OTHER_CFLAGS) ;
1945    WARNING_ASFLAGS default = $(WARNING_CFLAGS) ;
1946    OTHER_FFLAGS default = $(OTHER_CFLAGS) ;
1947    WARNING_FFLAGS default = $(WARNING_CFLAGS) ;
1948    # Variant flags and suffixes
1949    for VARIANT in $(BUILD_VARIANTS) {
1950        if $(VARIANT) = profile {
1951            OTHER_CFLAGS_$(VARIANT) default = $(OTHER_CFLAGS) -pg ;
1952            OTHER_ASFLAGS_$(VARIANT) default = $(OTHER_CFLAGS) -pg ;
1953            OTHER_CPLUSPLUSFLAGS_$(VARIANT) default = $(OTHER_CPLUSPLUSFLAGS) -pg ;
1954            OTHER_LDFLAGS_$(VARIANT) default = $(OTHER_LDFLAGS) -pg ;
1955        }
1956        else {
1957            OTHER_CFLAGS_$(VARIANT) default = $(OTHER_CFLAGS) ;
1958            OTHER_ASFLAGS_$(VARIANT) default = $(OTHER_CFLAGS) ;
1959            OTHER_CPLUSPLUSFLAGS_$(VARIANT) default = $(OTHER_CPLUSPLUSFLAGS) ;
1960            OTHER_LDFLAGS_$(VARIANT) default = $(OTHER_LDFLAGS) ;
1961        }
1962        if $(VARIANT) = normal {
1963            VARIANT_SUFFIX_$(VARIANT) = "" ;
1964        }
1965        else {
1966            VARIANT_SUFFIX_$(VARIANT) = _$(VARIANT) ;
1967        }
1968    }
1969    # Set up architecture options for product
1970    INCLUDED_ARCHS default = $(SUPPORTED_ARCHITECTURES) ;
1971    SUPPORTED_ARCHITECTURE_FLAGS = ;
1972    ARCHS = ;
1973    for SUPPORTED_ARCHITECTURE in $(SUPPORTED_ARCHITECTURES) {
1974        if $($(SUPPORTED_ARCHITECTURE)) = YES
1975         && ( $(SUPPORTED_ARCHITECTURE) in $(INCLUDED_ARCHS) )
1976         && ( $(SUPPORTED_ARCHITECTURE) in $(VALID_ARCHS) ) {
1977            SUPPORTED_ARCHITECTURE_FLAGS += -arch $(SUPPORTED_ARCHITECTURE) ;
1978            ARCHS += $(SUPPORTED_ARCHITECTURE) ;
1979        }
1980    }
1981    # if somehow no architecture was found, then use the native architecture
1982    if ! $(ARCHS) {
1983        $(NATIVE_ARCH) = YES ;
1984        RC_$(NATIVE_ARCH) = YES ;
1985        SUPPORTED_ARCHITECTURE_FLAGS += -arch $(NATIVE_ARCH) ;
1986        ARCHS += $(NATIVE_ARCH) ;
1987    }
1988
1989    ARCH_FLAGS default = $(SUPPORTED_ARCHITECTURE_FLAGS) ;
1990    # Initialize the directory variables
1991    # SOURCE_DIR is the location of installed sources
1992    SOURCE_DIR default = $(INSTALL_ROOT) ;
1993    BUILD_DIR default = $(BUILD_ROOT) ;
1994    # create base build dir
1995    Mkdir $(BUILD_DIR) ;
1996    ProductFile $(BUILD_DIR) ;
1997    # create active build dir
1998    if $(TARGET_BUILD_DIR) && ($(TARGET_BUILD_DIR) != $(BUILD_DIR)) {
1999        Mkdir $(TARGET_BUILD_DIR) ;
2000    }
2001    # asides
2002    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
2003        SEPARATE_STRIP = YES ;
2004        ASIDE_DIR default = $(BUILD_ROOT) ;
2005        Mkdir $(ASIDE_DIR) ;
2006        ProductFile $(ASIDE_DIR) ;
2007    }
2008    # define other important locations
2009    TEMP_DIR default = $(TEMP_ROOT)$(/)$(PROJECT_NAME).build$(/)$(TARGET_NAME).build ;
2010    OBJECT_FILE_DIR default = $(TEMP_DIR)$(/)Objects ;
2011    export CLASS_FILE_DIR default = $(TEMP_DIR)$(/)JavaClasses ;
2012    for VARIANT in $(BUILD_VARIANTS) {
2013        OBJECT_FILE_DIR_$(VARIANT) default = $(OBJECT_FILE_DIR)-$(VARIANT) ;
2014        FILE_LIST_$(VARIANT) default = $(OBJECT_FILE_DIR_$(VARIANT))$(/)LinkFileList ;
2015        # initialize file lists
2016        OBJECT_FILES_$(VARIANT) = ;
2017        LINKED_FILES_$(VARIANT) = ;
2018    }
2019    if $(JAVA_ARCHIVE_CLASSES) != YES && ( $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library ) {
2020        export PRODUCT_CLASS_FILE_DIR default = $(TARGET_BUILD_DIR)$(/)$(PRODUCT_NAME) ;
2021    }
2022    DERIVED_FILE_DIR default = $(TEMP_DIR)$(/)DerivedSources ;
2023    if $(INSTALL_PATH) {
2024        INSTALL_DIR default = $(INSTALL_ROOT)$(/)$(INSTALL_PATH) ;
2025    }
2026    else {
2027        INSTALL_DIR default = $(INSTALL_ROOT) ;
2028    }
2029    # Initialize the search paths
2030    if $(TARGET_BUILD_DIR) != $(BUILD_DIR) {
2031        HEADER_SEARCH_PATHS = $(TARGET_BUILD_DIR)$(/)include $(BUILD_DIR)$(/)include $(HEADER_SEARCH_PATHS) ;
2032    }
2033    else {
2034        HEADER_SEARCH_PATHS = $(BUILD_DIR)$(/)include $(HEADER_SEARCH_PATHS) ;
2035    }
2036    FRAMEWORK_SEARCH_PATHS = $(BUILD_ROOT) $(FRAMEWORK_SEARCH_PATHS) ;
2037    REZ_SEARCH_PATHS default = $(BUILT_PRODUCTS_DIR) $(HEADER_SEARCH_PATHS) ;
2038    LIBRARY_SEARCH_PATHS = $(BUILD_ROOT) $(LIBRARY_SEARCH_PATHS) ;
2039    if $(DEPLOYMENT_LOCATION) = YES && $(BUILT_PRODUCTS_DIR) {
2040        HEADER_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR)$(/)include $(HEADER_SEARCH_PATHS) ;
2041        FRAMEWORK_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR) $(FRAMEWORK_SEARCH_PATHS) ;
2042        LIBRARY_SEARCH_PATHS = $(BUILT_PRODUCTS_DIR) $(LIBRARY_SEARCH_PATHS) ;
2043    }
2044    # Initialize the file lists
2045    DERIVED_FILES = ;
2046    DERIVED_FILE_SOURCES = ;
2047    PRODUCT_FILES = ;
2048    PRECOMP_TRUSTFILE default = $(TEMP_DIR)$(/)TrustedPrecomps.txt ;
2049    # Make symlink to product in products dir,
2050    # and also set product mode and ownership
2051    # unless there is no nonempty product name.
2052    if $(DEPLOYMENT_LOCATION) = YES {
2053        if $(WRAPPER)
2054         && $(PRODUCT_TYPE) != Tool
2055         && $(PRODUCT_TYPE) != Library {
2056            # Use WRAPPER when defined for bundle product
2057            _INSTALLED_PRODUCT = $(TARGET_BUILD_DIR)$(/)$(WRAPPER) ;
2058            _PRODUCT_REFERENCE default = $(BUILT_PRODUCTS_DIR:G=ProductRef)$(/)$(WRAPPER) ;
2059            #!!!:cmolick:20020517:this may be bad for non-deployment location
2060            if $(DEPLOYMENT_POSTPROCESSING) = YES {
2061                SetModeOwnerAndGroup $(_INSTALLED_PRODUCT:G=ModeOwnerGroup) : $(_INSTALLED_PRODUCT) ;
2062            }
2063            SymLink $(_PRODUCT_REFERENCE) : $(_INSTALLED_PRODUCT) ;
2064            DEPENDS $(_PRODUCT_REFERENCE) : $(BUILT_PRODUCTS_DIR) ;
2065            DEPENDS $(1) : $(_PRODUCT_REFERENCE) ;
2066        }
2067        else {
2068            if $(1:G=) {
2069                # Use nonempty, ungristed primary target for tool or library product
2070                _INSTALLED_PRODUCT = $(TARGET_BUILD_DIR)$(/)$(1:G=) ;
2071                _PRODUCT_REFERENCE default = $(BUILT_PRODUCTS_DIR:G=ProductRef)$(/)$(1:G=) ;
2072                SymLink $(_PRODUCT_REFERENCE) : $(_INSTALLED_PRODUCT) ;
2073                DEPENDS $(_PRODUCT_REFERENCE) : $(BUILT_PRODUCTS_DIR) ;
2074                DEPENDS $(1) : $(_PRODUCT_REFERENCE) ;
2075            }
2076        }
2077    }
2078    # Set default locations for headers and resources of simple (tool or library) products
2079    if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library {
2080        PUBLIC_HEADER_DIR default = $(TARGET_BUILD_DIR) ;
2081        PRIVATE_HEADER_DIR default = $(TARGET_BUILD_DIR) ;
2082        RESOURCE_DIR default = $(TARGET_BUILD_DIR) ;
2083    }
2084    # Run the hack script to build debug and profile variants, if appropriate.
2085    if $(INTERNAL_BUILD_VARIANTS)
2086     && ( $(RC_JASPER) || $(INTERNAL_BUILD_VARIANTS_ONLY_IN_JASPER) != YES )
2087     && ( $(ACTION) = build || $(ACTION) = install ) {
2088        # build variants list should be used only by this call in this case
2089        _INTERNAL_BUILD_VARIANTS = $(INTERNAL_BUILD_VARIANTS) ;
2090        INTERNAL_BUILD_VARIANTS = ;
2091        INTERNAL_BUILD_VARIANTS on $(1) = $(_INTERNAL_BUILD_VARIANTS) ;
2092        RunVariantHackScript $(1) ;
2093    }
2094}
2095
2096# EndProduct <product>
2097#
2098# Creates BUILD_DIR, OBJECT_FILE_DIR, CLASS_FILE_DIR, DERIVED_FILE_DIR,
2099# and the PROJECT_HEADER_DIR if necessary, then sets up the build action.
2100rule EndProduct
2101{
2102    # Create required directories.  This is done here to allow
2103    # variables to be overridden before this rule is evaluated.
2104    for VARIANT in $(BUILD_VARIANTS) {
2105        Mkdir $(OBJECT_FILE_DIR_$(VARIANT)) ;
2106        PRODUCT_FILES += $(OBJECT_FILE_DIR_$(VARIANT)) ;
2107        DEPENDS $(1) : $(OBJECT_FILE_DIR_$(VARIANT)) ;
2108    }
2109    if $(DEPLOYMENT_LOCATION) {
2110        Mkdir $(BUILT_PRODUCTS_DIR) ;
2111        PRODUCT_FILES += $(BUILT_PRODUCTS_DIR) ;
2112        DEPENDS $(1) : $(BUILT_PRODUCTS_DIR) ;
2113    }
2114    Mkdir $(CLASS_FILE_DIR) ;
2115    PRODUCT_FILES += $(CLASS_FILE_DIR) ;
2116    DEPENDS $(1) : $(CLASS_FILE_DIR) ;
2117    Mkdir $(DERIVED_FILE_DIR) ;
2118    PRODUCT_FILES += $(DERIVED_FILE_DIR) ;
2119    DEPENDS $(1) : $(DERIVED_FILE_DIR) ;
2120    # Set up post-phase processing
2121    if $(POST_PHASE_PRODUCTS) {
2122        DEPENDS $(1) : $(POST_PHASE_PRODUCTS) ;
2123        DEPENDS $(POST_PHASE_PRODUCTS) : $(_BUILD_PHASES) ;
2124    }
2125    # Alternative catch-all mechanism to set mode and ownership of files
2126    # that for some reason require this post build processing.
2127    # !!!:cmolick:20021025 skip this if action is installhdrs since
2128    #  it is not relevant in that case and might even be impossible
2129    if ( $(DEPLOYMENT_POSTPROCESSING) = YES && $(_INSTALLED_PRODUCT) ) {
2130        DEPENDS $(_INSTALLED_PRODUCT:G=ModeOwnerGroup) : $(PRODUCT_FILES) ;
2131    }
2132    if $(DEPLOYMENT_POSTPROCESSING) = YES && $(ACTION) != installhdrs {
2133    PREVIOUS_PERMISSIONS_TARGET = ;
2134    for ALTERNATE_PERMISSIONS_FILE in $(ALTERNATE_PERMISSIONS_FILES) {
2135        ALTERNATE_PERMISSIONS_FILE_PATH = $(INSTALL_DIR)$(/)$(ALTERNATE_PERMISSIONS_FILE) ;
2136        ALTERNATE_PERMISSIONS_TARGET = $(ALTERNATE_PERMISSIONS_FILE:G=AlternatePermissions) ;
2137        if $(PREVIOUS_PERMISSIONS_TARGET) {
2138            DEPENDS $(ALTERNATE_PERMISSIONS_TARGET) : $(PREVIOUS_PERMISSIONS_TARGET) ;
2139        }
2140        else {
2141            if ( $(DEPLOYMENT_POSTPROCESSING) = YES && $(_INSTALLED_PRODUCT) ) {
2142                DEPENDS $(ALTERNATE_PERMISSIONS_TARGET) : $(_INSTALLED_PRODUCT:G=ModeOwnerGroup) ;
2143            }
2144        }
2145        NOTFILE $(ALTERNATE_PERMISSIONS_TARGET) ;
2146        DEPENDS $(1) : $(ALTERNATE_PERMISSIONS_TARGET) ;
2147        DEPENDS $(ALTERNATE_PERMISSIONS_TARGET) : $(_BUILD_PHASES) ;
2148        if $(ALTERNATE_MODE) {
2149            INSTALL_MODE_FLAG on $(ALTERNATE_PERMISSIONS_TARGET) = $(ALTERNATE_MODE) ;
2150        }
2151        if $(ALTERNATE_OWNER) {
2152            INSTALL_OWNER on $(ALTERNATE_PERMISSIONS_TARGET) = $(ALTERNATE_OWNER) ;
2153        }
2154        if $(ALTERNATE_GROUP) {
2155            INSTALL_GROUP on $(ALTERNATE_PERMISSIONS_TARGET) = $(ALTERNATE_GROUP) ;
2156        }
2157        SetModeOwnerAndGroup $(ALTERNATE_PERMISSIONS_TARGET) : $(ALTERNATE_PERMISSIONS_FILE_PATH) ;
2158        PREVIOUS_PERMISSIONS_TARGET = $(ALTERNATE_PERMISSIONS_TARGET) ;
2159    }
2160    }
2161    # Define actions for this target
2162    Actions $(1) ;
2163}
2164
2165# BeginWrappedProduct <product>
2166#
2167# Sets additional variables required for wrapped products,
2168# primarily to assign locations within the product wrapper.
2169# WRAPPER			Local convenience variable
2170# WRAPPER_SUFFIX		Based on WRAPPER_EXTENSION by default
2171# RESOURCE_DIR			Base bundle resources location
2172# APPLESCRIPTS_DIR		Compiled AppleScript files folder
2173# [PUBLIC|PRIVATE]_HEADER_[DIR|LINK|LINK_PATH] Header folders
2174# CURRENT_VERSION_[DIR|LINK|LINK_PATH]
2175# HEADERDOC_DIR			Headerdoc output folder
2176# PRODUCT_CLASS_FILE_DIR	Defined if JAVA_ARCHIVE_CLASSES	is set
2177# 
2178rule BeginWrappedProduct
2179{
2180    # define wrapper using appropriate extension and suffix
2181    if $(WRAPPER_EXTENSION) {
2182        WRAPPER_SUFFIX = .$(WRAPPER_EXTENSION) ;
2183    }
2184    if $(WRAPPER_SUFFIX) {
2185        WRAPPER = $(1:G=:S=$(WRAPPER_SUFFIX)) ;
2186    }
2187    else {
2188        WRAPPER = $(1:G=) ;
2189    }
2190    # set up the basic product variables
2191    BeginProduct $(1) ;
2192    # define and create wrapper and make primary nonfile target depend on it
2193    LOCATE on $(WRAPPER) = $(TARGET_BUILD_DIR) ;
2194    Mkdir $(WRAPPER) ;
2195    PRODUCT_FILES += $(WRAPPER) ;
2196    DEPENDS $(1) : $(WRAPPER) ;
2197    if $(PRODUCT_TYPE) = Application {
2198        # Application wrappers
2199        if $(PURE_JAVA) = YES {
2200            RESOURCE_DIR default = $(WRAPPER) ;
2201        }
2202        else {
2203            RESOURCE_DIR default = $(WRAPPER)$(/)Contents$(/)Resources ;
2204        }
2205        LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
2206        RESOURCE_LINK = "" ;
2207        APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
2208        LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
2209        PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)Headers ;
2210        LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2211        PUBLIC_HEADER_LINK default = "" ;
2212        PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)PrivateHeaders ;
2213        LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2214        PRIVATE_HEADER_LINK default = "" ;
2215        CURRENT_VERSION_DIR default = "" ;
2216        CURRENT_VERSION_LINK default = "" ;
2217    } # application wrappers
2218    else if $(PRODUCT_TYPE) = Framework {
2219        # Framework wrappers
2220        RESOURCE_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Resources ;
2221        LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
2222        RESOURCE_LINK default = $(WRAPPER)$(/)Resources ;
2223        LOCATE on $(RESOURCE_LINK) = $(TARGET_BUILD_DIR) ;
2224        RESOURCE_LINK_PATH default = Versions$(/)Current$(/)Resources ;
2225        APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
2226        LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
2227        HAS_PUBLIC_HEADERS = "NO" ;
2228        PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Headers ;
2229        LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2230        PUBLIC_HEADER_LINK default = $(WRAPPER)$(/)Headers ;
2231        LOCATE on $(PUBLIC_HEADER_LINK) = $(TARGET_BUILD_DIR) ;
2232        PUBLIC_HEADER_LINK_PATH default = Versions$(/)Current$(/)Headers ;
2233        PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)PrivateHeaders ;
2234        LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2235        PRIVATE_HEADER_LINK default = $(WRAPPER)$(/)PrivateHeaders ;
2236        LOCATE on $(PRIVATE_HEADER_LINK) = $(TARGET_BUILD_DIR) ;
2237        PRIVATE_HEADER_LINK_PATH default = Versions$(/)Current$(/)PrivateHeaders ;
2238        CURRENT_VERSION_DIR default = $(WRAPPER:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION) ;
2239        LOCATE on $(CURRENT_VERSION_DIR) = $(TARGET_BUILD_DIR) ;
2240        CURRENT_VERSION_LINK default = $(WRAPPER:G=)$(/)Versions$(/)Current ;
2241        LOCATE on $(CURRENT_VERSION_LINK) = $(TARGET_BUILD_DIR) ;
2242        CURRENT_VERSION_LINK_PATH default = Versions$(/)Current ;
2243        if $(ASIDE_DIR) {
2244            ASIDE_CURRENT_VERSION_DIR default = $(WRAPPER:G=aside)$(/)Versions$(/)$(FRAMEWORK_VERSION) ;
2245            ASIDE_CURRENT_VERSION_LINK default = $(WRAPPER:G=aside)$(/)Versions$(/)Current ;
2246            ASIDE_CURRENT_VERSION_LINK_PATH default = Versions$(/)Current ;
2247            ASIDE_CURRENT_VERSION_LINK_PATH = $(ASIDE_CURRENT_VERSION_LINK_PATH:G=aside) ;
2248            Mkdir $(ASIDE_CURRENT_VERSION_DIR) ;
2249            ProductFileAside $(ASIDE_CURRENT_VERSION_DIR) ;
2250            DEPENDS $(1) : $(ASIDE_CURRENT_VERSION_DIR) ;
2251            NOUPDATE $(ASIDE_CURRENT_VERSION_DIR) ;
2252            SymLink $(ASIDE_CURRENT_VERSION_LINK) : $(FRAMEWORK_VERSION) ;
2253            ProductFileAside $(ASIDE_CURRENT_VERSION_LINK) ;
2254            DEPENDS $(1) : $(ASIDE_CURRENT_VERSION_LINK) ;
2255            DEPENDS $(ASIDE_CURRENT_VERSION_LINK) : $(ASIDE_CURRENT_VERSION_DIR) ;
2256            NOUPDATE $(ASIDE_CURRENT_VERSION_LINK) ;
2257        }
2258        # Create current version directory and link now because
2259        # they are implicit and needed by almost everything else:
2260        # Current version dir
2261        Mkdir $(CURRENT_VERSION_DIR) ;
2262        ProductFile $(CURRENT_VERSION_DIR) ;
2263        DEPENDS $(1) : $(CURRENT_VERSION_DIR) ;  # need this or build phase
2264        NOUPDATE $(CURRENT_VERSION_DIR) ;
2265        # Current version link
2266        SymLink $(CURRENT_VERSION_LINK) : $(FRAMEWORK_VERSION) ;
2267        ProductFile $(CURRENT_VERSION_LINK) ;
2268        DEPENDS $(1) : $(CURRENT_VERSION_LINK) ;  # need this or build phase
2269        DEPENDS $(CURRENT_VERSION_LINK) : $(CURRENT_VERSION_DIR) ;
2270        NOUPDATE $(CURRENT_VERSION_LINK) ;
2271    } # framework wrappers
2272    else {
2273        # Default bundle wrappers
2274        if $(BUNDLE_STYLE) = SHALLOW {
2275            # shallow bundles do not have the Contents/Resources folders
2276            RESOURCE_DIR default = $(WRAPPER) ;
2277            LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
2278            APPLESCRIPTS_DIR default = $(WRAPPER)$(/)Scripts ;
2279            LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
2280            PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Headers ;
2281            LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2282            PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)PrivateHeaders ;
2283            LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2284        }
2285        else {
2286            # else, BUNDLE_STYLE=DEEP bundles do have Contents/Resources folders
2287            RESOURCE_DIR default = $(WRAPPER)$(/)Contents$(/)Resources ;
2288            LOCATE on $(RESOURCE_DIR) = $(TARGET_BUILD_DIR) ;
2289            APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
2290            LOCATE on $(APPLESCRIPTS_DIR) = $(TARGET_BUILD_DIR) ;
2291            PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Contents$(/)Headers ;
2292            LOCATE on $(PUBLIC_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2293            PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)Contents$(/)PrivateHeaders ;
2294            LOCATE on $(PRIVATE_HEADER_DIR) = $(TARGET_BUILD_DIR) ;
2295        }
2296        RESOURCE_LINK default = "" ;
2297        PUBLIC_HEADER_LINK default = "" ;
2298        PRIVATE_HEADER_LINK default = "" ;
2299        CURRENT_VERSION_DIR default = "" ;
2300        CURRENT_VERSION_LINK default = "" ;
2301    } # all bundle layouts
2302    # define location for optional header documentation generation
2303    if $(GENERATE_HEADERDOC) = YES && $(RESOURCE_DIR) {
2304        HEADERDOC_DIR default = $(TARGET_BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Documentation ;
2305        Mkdir $(HEADERDOC_DIR) ;
2306        ProductFile $(HEADERDOC_DIR) ;
2307    }
2308
2309    # wrapped products may define a location for unarchived classes
2310    if $(JAVA_ARCHIVE_CLASSES) != YES {
2311        export PRODUCT_CLASS_FILE_DIR default = $(TARGET_BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Java ;
2312    }
2313}
2314
2315# EndWrappedProduct <product>
2316#
2317# Sets up additional dependence related to object files.
2318# Files depended on by object files should be in compile rules,
2319# and dependence on object files should be in link rules.
2320rule EndWrappedProduct
2321{
2322    # Wrapper touch updates base container directory timestamp
2323    # This must be conditional on the "build" component,
2324    # otherwize installhdrs builds with no headers will fail.
2325    if build in $(BUILD_COMPONENTS) {
2326        WRAPPER_TOUCH = $(1:G=Touch) ;
2327        LOCATE on $(WRAPPER_TOUCH) = $(TARGET_BUILD_DIR) ;
2328        DEPENDS $(WRAPPER_TOUCH) : $(BUILD_PHASE) ;
2329        DEPENDS $(1) : $(WRAPPER_TOUCH) ;
2330        Touch $(WRAPPER_TOUCH) ;
2331    }
2332    # wrapper logic complete, now handle final build issues
2333    EndProduct $(1) ;
2334}
2335# Copyright (c) 1999-2003 Apple Computer, Inc.
2336# All rights reserved.
2337
2338# Rules for target types include Begin and End rules
2339# for Tool, Library, Bundle, Application, and Framework
2340
2341TOOL_SUFFIX default = "" ;
2342rule BeginTool
2343{
2344    export PRODUCT_TYPE = Tool ;
2345    BeginProduct $(1) ;
2346}
2347
2348rule EndTool
2349{
2350    EndProduct $(1) ;
2351}
2352
2353# Library variable names have the form: $(OS)_$(LIBRARY_STYLE)_LIBRARY_$(VARIABLENAME)
2354MACOS_STATIC_LIBRARY_PREFIX = lib ;
2355MACOS_STATIC_LIBRARY_SUFFIX = .a ;
2356MACOS_DYNAMIC_LIBRARY_PREFIX = "" ;
2357MACOS_DYNAMIC_LIBRARY_SUFFIX = "" ;
2358DARWIN_STATIC_LIBRARY_PREFIX = lib ;
2359DARWIN_STATIC_LIBRARY_SUFFIX = .a ;
2360DARWIN_DYNAMIC_LIBRARY_PREFIX = "" ;
2361DARWIN_DYNAMIC_LIBRARY_SUFFIX = "" ;
2362DYNAMIC_LIBRARY_PREFIX = $($(OS)_DYNAMIC_LIBRARY_PREFIX) ;
2363DYNAMIC_LIBRARY_SUFFIX = $($(OS)_DYNAMIC_LIBRARY_SUFFIX) ;
2364
2365rule BeginLibrary
2366{
2367    # These evaluations here to pick up style from target settings
2368    LIBRARY_PREFIX = $($(OS)_$(LIBRARY_STYLE)_LIBRARY_PREFIX) ;
2369    LIBRARY_SUFFIX = $($(OS)_$(LIBRARY_STYLE)_LIBRARY_SUFFIX) ;
2370    export PRODUCT_TYPE = Library ;
2371    BeginProduct $(1) ;
2372}
2373
2374rule EndLibrary
2375{
2376    EndProduct $(1) ;
2377}
2378
2379rule BeginBundle
2380{
2381    export PRODUCT_TYPE = Bundle ;
2382    BeginWrappedProduct $(1) ;
2383}
2384
2385rule EndBundle
2386{
2387    EndWrappedProduct $(1) ;
2388}
2389
2390rule BeginApplication
2391{
2392    export PRODUCT_TYPE = Application ;
2393    BeginWrappedProduct $(1) ;
2394}
2395
2396rule EndApplication
2397{
2398    EndWrappedProduct $(1) ;
2399}
2400
2401rule BeginFramework
2402{
2403    export PRODUCT_TYPE = Framework ;
2404    BeginWrappedProduct $(1) ;
2405}
2406
2407rule EndFramework
2408{
2409    EndWrappedProduct $(1) ;
2410}
2411# Copyright (c) 1999-2003 Apple Computer, Inc.
2412# All rights reserved.
2413
2414# Variables referenced:
2415# BUILD_DIR		Location of built product
2416# RESOURCE_DIR 		Directory for resource files in product
2417# *_LINK, *_LINK_PATH	Wrapper versioning information
2418# *_HEADER_DIR		Directories for headers of product
2419# _INFO_PLIST_FILE_PATH	Path to Info.plist file (if any), generated by PBXCore
2420# _PKGINFO_FILE_PATH	Path to PkgInfo file (if any), generated by PBXCore
2421# _VERSION_PLIST_FILE_PATH     Path to version.plist file (if any), generated by PBXCore
2422# _PBDEVELOPMENT_PLIST_FILE_PATH       Path to pbdevelopment.plist file (if any), generated by PBXCore
2423# VERSIONING_SYSTEM	Versioning system to use for product
2424# JAVA_COMPILE_TARGET	Nonfile target representing all java compiles
2425# REZ_EXECUTABLE	Run Rez directly on executable to produce fork if YES
2426# PRESERVE_RESOURCES	Files to be recopied with CpMac after install tar copy
2427# APPLESCRIPTS_DIR	Directory for compiled AppleScripts
2428#
2429# Variables set:
2430# DERIVED_FILES		Intermediate sources
2431# OBJECT_FILES		Object files produced by compilations
2432# LINKED_FILES		Files to be used by a link rule
2433# PRODUCT_FILES		Files that belong in the built product
2434# INFO_PLIST_FILE	Info.plist file in product wrapper, copied from PRODUCT_SETTINGS_PATH
2435# PKGINFO_FILE		PkgInfo file in product wrapper, copied from _PKGINFO_FILE_PATH
2436# HDRRULE, HDRSCAN	Target specific header scanning information
2437# FLAGS			Target specific compilation flags
2438# HEADER_SEARCH_PATHS, FRAMEWORK_SEARCH_PATHS	Target specific search paths
2439#
2440# Build phase variables:
2441# BUILD_PHASE		Target for current build phase
2442# PREVIOUS_BUILD_PHASE	Target for previous build phase
2443# BUILD_PHASE_PRODUCTS	Products of current build phase
2444# PHASE_TARGETS		List of all phase targets for conflict checks
2445
2446# Source and resource handling rules by extension
2447.h_RULE		= ProcessHeader ;
2448.nib_RULE	= ProcessResource ;
2449.rtf_RULE	= ProcessResource ;
2450.exe_RULE	= ProcessResource ;
2451.java_RULE	= ProcessUsingJavaCompiler ;
2452.applescript_RULE	= ProcessAppleScript ;
2453.c_RULE		= ProcessC ;
2454.adb_RULE	= ProcessC ; # unsupported
2455.ads_RULE	= ProcessC ; # unsupported
2456.C_RULE		= ProcessCplusplus ;
2457.cc_RULE	= ProcessCplusplus ;
2458.cp_RULE	= ProcessCplusplus ;
2459.cpp_RULE	= ProcessCplusplus ;
2460.CPP_RULE       = ProcessCplusplus ;
2461.cxx_RULE	= ProcessCplusplus ;
2462.CXX_RULE	= ProcessCplusplus ;
2463# !!!:cmolick:20020226 note: .C++ not accepted by c++ compiler driver
2464.c++_RULE	= ProcessCplusplus ;
2465.m_RULE		= ProcessC ;
2466.mm_RULE	= ProcessCplusplus ;
2467.M_RULE		= ProcessCplusplus ;
2468.s_RULE		= ProcessAssembly ;
2469.f_RULE		= ProcessFortran ;
2470.for_RULE	= ProcessFortran ;
2471.f77_RULE	= ProcessFortran ;
2472.f90_RULE	= ProcessFortran ;
2473.F_RULE		= ProcessFortran ;
2474.fpp_RULE	= ProcessFortran ;
2475.exp_RULE	= ProcessExportsFile ;
2476.defs_RULE	= ProcessUsingMig ;
2477.mig_RULE	= ProcessUsingMig ;
2478.l_RULE		= ProcessUsingLex ;
2479.lm_RULE	= ProcessUsingLex ;
2480.LM_RULE	= ProcessUsingLex ;
2481.lmm_RULE	= ProcessUsingLex ;
2482.lpp_RULE	= ProcessUsingLex ;
2483.LPP_RULE	= ProcessUsingLex ;
2484.lxx_RULE	= ProcessUsingLex ;
2485.LXX_RULE	= ProcessUsingLex ;
2486.y_RULE		= ProcessUsingYacc ;
2487.ym_RULE	= ProcessUsingYacc ;
2488.YM_RULE	= ProcessUsingYacc ;
2489.ymm_RULE	= ProcessUsingYacc ;
2490.ypp_RULE	= ProcessUsingYacc ;
2491.YPP_RULE	= ProcessUsingYacc ;
2492.yxx_RULE	= ProcessUsingYacc ;
2493.YXX_RULE	= ProcessUsingYacc ;
2494.x_RULE		= ProcessUsingRPCGen ;
2495.jobs_RULE      = ProcessUsingBridget ;
2496.framework_RULE = ProcessFrameworkOrLibrary ;
2497.r_RULE		= ProcessRezFile ;
2498.rsrc_RULE	= ProcessRezFile ;
2499.RSRC_RULE	= ProcessRezFile ;
2500.ppob_RULE	= ProcessRezFile ;
2501
2502# Set the initial list of phase targets to empty
2503PHASE_TARGETS = ;
2504
2505# PhaseTarget <phase target variable> <product> <phase name>
2506# Sets up the given phase target variable based on the target
2507# and phase name and uses the list of phase targets to attempt
2508# avoid collisions between targets for phases with the same name.
2509rule PhaseTarget
2510{
2511    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 ;
2512    local PHASE_TARGET = $(2:G=$(3)) ;
2513    if $(PHASE_TARGET) in $(PHASE_TARGETS) {
2514        # attempt differentiation by adding last nonmatching suffix
2515        for PHASE_SUFFIX in $(PHASE_SUFFIXES) {
2516            ALTERNATE_PHASE_TARGET = $(2:G=$(3)$(PHASE_SUFFIX)) ;
2517            if ! $(ALTERNATE_PHASE_TARGET) in $(PHASE_TARGETS) {
2518                PHASE_TARGET = $(ALTERNATE_PHASE_TARGET) ;
2519            }
2520        }
2521    }
2522    PHASE_TARGETS += $(PHASE_TARGET) ;
2523    $(1) = $(PHASE_TARGET) ;
2524    NOTFILE $(PHASE_TARGET) ;
2525}
2526
2527# BuildPhase <phase> <product> <previous phase>
2528# Set up product (and variant hack) dependence on phase
2529# and phase dependence on previous phase
2530# and defines an action to indicate phase completion
2531rule BuildPhase
2532{
2533    # retain a list of all phases
2534    _BUILD_PHASES += $(1) ;
2535    # retain name for action echo
2536    PHASE_NAME on $(1) = $(1:G) ;
2537    # this build phase depends on the previous phase
2538    if $(3) {
2539        DEPENDS $(1) : $(3) ;
2540    }
2541    # phase required for parent target
2542    DEPENDS $(2) : $(1) ;
2543}
2544actions BuildPhase
2545{
2546    $(ECHO) Completed phase $(PHASE_NAME:Q) for $(1:Q)
2547}
2548
2549# DerivedFiles <derived-files>
2550# Locates derived files in the derived file directory,
2551# sees the derived paths with the derived file directory if necessary,
2552# creates derived subpaths and ads them to derived paths as necessary,
2553# and makes the derived file depend on all derived paths.
2554rule DerivedFiles
2555{
2556    local _DERIVED_FILE ;
2557    for _DERIVED_FILE in $(1) {
2558        # !!!:cmolick:20021110 not all these files should be added to DERIVED_FILES
2559        if $(_BUILD_PHASING) = YES {
2560            BUILD_PHASE_PRODUCTS += $(_DERIVED_FILE) ;
2561        }
2562        # make and depend on containing directory
2563        LOCATE on $(_DERIVED_FILE) = $(DERIVED_FILE_DIR) ;
2564        if ! $(DERIVED_PATHS) {
2565            DERIVED_PATHS = $(DERIVED_FILE_DIR) ;
2566        }
2567        local DIR = $(DERIVED_FILE_DIR)$(/)$(_DERIVED_FILE:D) ;
2568        if ! ( $(DIR) in $(DERIVED_PATHS) ) && ! ( $(DIR)/ in $(DERIVED_PATHS) ) {
2569            Mkdir $(DIR) ;
2570            if $(_BUILD_PHASING) = YES {
2571                BUILD_PHASE_PRODUCTS += $(DIR) ;
2572            }
2573            DERIVED_PATHS += $(DIR) ;
2574        }
2575        DEPENDS $(_DERIVED_FILE) : $(DERIVED_PATHS) ;
2576    }
2577}
2578
2579# ProductFile <product-file>
2580# The product file location is set to BUILD_DIR.
2581# If the reference and containing directory are not already
2582# in the list of product files, then they are added.  They also
2583# become build phase products unless phasing is turned off.
2584rule ProductFile
2585{
2586    LOCATE on $(1) = $(TARGET_BUILD_DIR) ;
2587    if ! $(1) in $(PRODUCT_FILES) {
2588        PRODUCT_FILES += $(1) ;
2589        if $(_BUILD_PHASING) = YES {
2590            BUILD_PHASE_PRODUCTS += $(1) ;
2591        }
2592    }
2593}
2594
2595# ProductFileAside <file>
2596# Same as ProductFile, but default location is ASIDE_DIR.
2597rule ProductFileAside
2598{
2599    LOCATE on $(1) = $(ASIDE_DIR) ;
2600    if ! $(1) in $(PRODUCT_FILES) {
2601        PRODUCT_FILES += $(1) ;
2602        if $(_BUILD_PHASING) = YES {
2603            BUILD_PHASE_PRODUCTS += $(1) ;
2604        }
2605    }
2606}
2607
2608# SetModeOwnerAndGroup <nonfile gristed target> : <base target>
2609# Uses given nonfile gristed target to set mode, owner, and group
2610# of the base product
2611rule SetModeOwnerAndGroup
2612{
2613    NOTFILE $(1) ;
2614    LOCATE on $(1) = $(TARGET_BUILD_DIR) ;
2615    POST_PHASE_PRODUCTS += $(1) ;
2616    if $(INSTALL_MODE_FLAG) {
2617        SetMode $(1) : $(2) ;
2618    }
2619    if $(INSTALL_OWNER) {
2620        if $(INSTALL_GROUP) {
2621            SetOwnerAndGroup $(1) : $(2) ;
2622        }
2623        else {
2624            SetOwner $(1) : $(2) ;
2625        }
2626    }
2627    else if $(INSTALL_GROUP) {
2628        SetGroup $(1) : $(2) ;
2629    }
2630}
2631actions SetMode
2632{
2633     $(CHMOD) -RH $(INSTALL_MODE_FLAG) $(2:G=:Q)
2634}
2635actions SetOwner
2636{
2637    $(CHOWN) -RH $(INSTALL_OWNER) $(2:G=:Q)
2638}
2639actions SetGroup
2640{
2641    $(CHOWN) -RH :$(INSTALL_GROUP) $(2:G=:Q)
2642}
2643actions SetOwnerAndGroup
2644{
2645    $(CHOWN) -RH $(INSTALL_OWNER):$(INSTALL_GROUP) $(2:G=:Q)
2646}
2647
2648rule NoOp
2649{
2650    if $(_BUILD_PHASING) = YES {
2651        PhaseTarget BUILD_PHASE : $(1) : NoOp ;
2652        BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
2653        PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
2654    }
2655}
2656
2657# ProcessHeaders <product> <headers>
2658#
2659# Process individual headers, call Interfacer to generate headers,
2660# precompile and assemble implicitly included headers as necessary,
2661# and run headerdoc.
2662rule ProcessHeaders
2663{
2664    if ( headers in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) )
2665     && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) {
2666        local FILE ;
2667        if $(_BUILD_PHASING) = YES {
2668            PhaseTarget BUILD_PHASE : $(1) : CopyHeaders ;
2669            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
2670#            PREVIOUS_BUILD_PHASE_PRODUCTS = $(BUILD_PHASE_PRODUCTS) ;
2671            BUILD_PHASE_PRODUCTS = ;
2672        }
2673        for FILE in $(2) {
2674            if $(_BUILD_PHASING) = YES {
2675                ProcessHeader $(BUILD_PHASE) : $(FILE) ;
2676            }
2677            else {
2678                ProcessHeader $(1) : $(FILE) ;
2679            }
2680        }
2681        
2682        # conditionally gather documentation generated from headers
2683        if build in $(BUILD_COMPONENTS) && $(GATHERHEADERDOC) && $(GENERATE_HEADERDOC) = YES && $(HEADERDOC_DIR) && HEADERDOC_TARGETS {
2684            GATHERED_HEADERDOC_TARGET = masterTOC.html ;
2685            LOCATE on $(GATHERED_HEADERDOC_TARGET) = $(HEADERDOC_DIR) ;
2686            DEPENDS $(GATHERED_HEADERDOC_TARGET) : $(HEADERDOC_DIR) ;
2687            DEPENDS $(GATHERED_HEADERDOC_TARGET) : $(HEADERDOC_TARGETS) ;
2688            GatheredHeaderDoc $(GATHERED_HEADERDOC_TARGET) ;
2689            if $(_BUILD_PHASING) = YES {
2690                BUILD_PHASE_PRODUCTS += $(GATHERED_HEADERDOC_TARGET) ;
2691            }
2692        }
2693    }
2694    # generate interfacer derived headers
2695    if headers in $(BUILD_COMPONENTS) && $(GENERATE_HEADERS) = YES {
2696        InterfacerHeaders $(1) ;
2697    }
2698    # Prepare to use prefix file, possibly starting with precompiling
2699    # Prefix file preparation and precompling is done only when the build action is "build", but not "installhdrs"
2700    if ( build in $(BUILD_COMPONENTS) )
2701     && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) {
2702        # The prefix file may be compiled for use with cpp-precomp, PFE, or PCH mechanisms
2703        if ( $(PREFIX_HEADER) != ""  &&  $(PRECOMPILE_PREFIX_HEADER) = YES ) {
2704            PFE_FILE_C_DIALECTS default = "c" "objective-c" "c++" "objective-c++" ;
2705            PRECOMP_DESTINATION_DIR default = $(TEMP_DIR)$(/)PrefixHeaders ;
2706            Mkdir $(PRECOMP_DESTINATION_DIR) ;
2707            PRODUCT_FILES += $(PRECOMP_DESTINATION_DIR) ;
2708            if $(_BUILD_PHASING) = YES {
2709                BUILD_PHASE_PRODUCTS += $(PRECOMP_DESTINATION_DIR) ;
2710            }
2711            if ( $(GCC_VERSION) = 2.x ) || ( $(GCC_VERSION) = 3.1 && $(USE_GCC3_PFE_SUPPORT) != YES ) {
2712                # compile prefix file with cpp-precomp
2713                # create header stub in subfolder of TEMP_DIR
2714                local PREFIX_HEADER_STUB = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS) ;
2715                DEPENDS $(PREFIX_HEADER_STUB) : $(PRECOMP_DESTINATION_DIR) ;
2716                AbsolutePathImportStub $(PREFIX_HEADER_STUB) : $(PREFIX_HEADER) ;
2717                INCLUDES $(PREFIX_HEADER_STUB) : $(PREFIX_HEADER) ;
2718                # recompile for C and C++
2719                if ( "c" in $(PFE_FILE_C_DIALECTS) )  ||  ( "objective-c" in $(PFE_FILE_C_DIALECTS) ) {
2720                    C_PRECOMP_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER_STUB:BS="-gcc3.p") ;
2721                    PrecompileHeader $(C_PRECOMP_FILE_DESTINATION_PATH) : $(PREFIX_HEADER_STUB) ;
2722                    PRODUCT_FILES += $(C_PRECOMP_FILE_DESTINATION_PATH) ;
2723                    if $(_BUILD_PHASING) = YES {
2724                        BUILD_PHASE_PRODUCTS += $(C_PRECOMP_FILE_DESTINATION_PATH) ;
2725                    }
2726                }
2727                if ( "c++" in $(PFE_FILE_C_DIALECTS) )  ||  ( "objective-c++" in $(PFE_FILE_C_DIALECTS) ) {
2728                    CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER_STUB:BS="-gcc3.pp") ;
2729                    PrecompileHeader $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) : $(PREFIX_HEADER_STUB) ;
2730                    PRODUCT_FILES += $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) ;
2731                    if $(_BUILD_PHASING) = YES {
2732                        BUILD_PHASE_PRODUCTS += $(CPLUSPLUS_PRECOMP_FILE_DESTINATION_PATH) ;
2733                    }
2734                }
2735                # effective prefix header is now header stub
2736                EFFECTIVE_PREFIX_HEADER = $(PREFIX_HEADER_STUB) ;
2737                # prepare precompile option using -include
2738                # set default flags for precompiled prefix header usage
2739            }
2740            else {
2741                if $(GCC_VERSION) = 3.1 && $(USE_GCC3_PFE_SUPPORT) = YES {
2742                    # prefix file precompiled with PFE support
2743                    # precompile by dialect
2744                    for ARCH in $(ARCHS) {
2745                        EFFECTIVE_PFE_FILE_$(ARCH) = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS="-$(ARCH).pfe") ;
2746                        if ( "c" in $(PFE_FILE_C_DIALECTS) )  ||  ( "objective-c" in $(PFE_FILE_C_DIALECTS) ) {
2747                            MakePFEFile $(EFFECTIVE_PFE_FILE_$(ARCH)) : $(PREFIX_HEADER) ;
2748                        }
2749                        if ( "c++" in $(PFE_FILE_C_DIALECTS) )  ||  ( "objective-c++" in $(PFE_FILE_C_DIALECTS) ) {
2750                            MakePFEFile++ $(EFFECTIVE_PFE_FILE_$(ARCH)) : $(PREFIX_HEADER) ;
2751                        }
2752                        PRODUCT_FILES += $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
2753                        if $(_BUILD_PHASING) = YES {
2754                            BUILD_PHASE_PRODUCTS += $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
2755                        }
2756                    }
2757                    # effective prefix header is empty because no -include flag is passed
2758                    EFFECTIVE_PREFIX_HEADER = ;
2759                    # use flag for picking up PFE
2760                    PREFIX_HEADER_CFLAGS_BASE default = --load-pch ;
2761                }
2762                if $(GCC_VERSION) = 3.3 {
2763                    # prefix file precompiled with PCH support
2764                    # precompile by dialect
2765                    for ARCH in $(ARCHS) {
2766                        EFFECTIVE_PFE_FILE_$(ARCH) = $(PRECOMP_DESTINATION_DIR)$(/)$(PREFIX_HEADER:BS="-$(ARCH)").gch ;
2767                        if ( "c" in $(PFE_FILE_C_DIALECTS) )  ||  ( "objective-c" in $(PFE_FILE_C_DIALECTS) ) {
2768                            ProcessPCH $(EFFECTIVE_PFE_FILE_$(ARCH)) : $(PREFIX_HEADER) ;
2769                        }
2770                        if ( "c++" in $(PFE_FILE_C_DIALECTS) )  ||  ( "objective-c++" in $(PFE_FILE_C_DIALECTS) ) {
2771                            ProcessPCH++ $(EFFECTIVE_PFE_FILE_$(ARCH)) : $(PREFIX_HEADER) ;
2772                        }
2773                        PRODUCT_FILES += $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
2774                        if $(_BUILD_PHASING) = YES {
2775                            BUILD_PHASE_PRODUCTS += $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
2776                        }
2777                    }
2778                    # effective prefix header is empty because no -include flag is passed
2779                    EFFECTIVE_PREFIX_HEADER = ;
2780                    # use inclusion flag for PCH
2781                    PREFIX_HEADER_CFLAGS_BASE default = -include ;
2782                }
2783            }
2784        }
2785        else {
2786            # In this case there may be a prefix header, but no precompile
2787            EFFECTIVE_PREFIX_HEADER = $(PREFIX_HEADER) ;
2788        }
2789    }
2790    # phase end logic
2791    # THIS *MUST* COME *AFTER* ALL OTHER WORK FOR THIS PHASE!!!
2792    # cmolick:20020213 ideally this should be within action conditionals,
2793    #  but that is difficult now that there are three disjointed ones,
2794    #  so checking to see if the build phase is defined is a hack
2795    #  the problem of bad DEPENDS here on clean for now.
2796    if $(_BUILD_PHASING) = YES && $(BUILD_PHASE) {
2797        if $(BUILD_PHASE_PRODUCTS) {
2798            DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
2799        }
2800        PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
2801    }
2802}
2803
2804# ProcessHeader <product or phase> <header>
2805#
2806# Generate headerdoc from header as necessary,
2807# and copy header to subfolders of product as appropriate.
2808rule ProcessHeader
2809{
2810    if source in $(BUILD_COMPONENTS) {
2811        local HEADER_SOURCE_COPY ;
2812        local HEADER_SOURCE_DIR ;
2813        # make directory first if necessary
2814        if $(2:D) {
2815            HEADER_SOURCE_DIR = $(SOURCE_DIR)/$(2:D:G=) ;
2816            Mkdir $(HEADER_SOURCE_DIR) ;
2817            HEADER_SOURCE_COPY = $(HEADER_SOURCE_DIR)/$(2:D=:G=) ;
2818            DEPENDS $(HEADER_SOURCE_COPY) : $(HEADER_SOURCE_DIR) ;
2819        }
2820        else {
2821            HEADER_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ;
2822            DEPENDS $(HEADER_SOURCE_COPY) : $(SOURCE_DIR) ;
2823            Mkdir $(SOURCE_DIR) ;
2824        }
2825        Cp $(HEADER_SOURCE_COPY) : $(2) ;
2826        if $(_BUILD_PHASING) = YES {
2827            BUILD_PHASE_PRODUCTS += $(HEADER_SOURCE_COPY) ;
2828        }
2829    }
2830    if build in $(BUILD_COMPONENTS) {
2831        # Scan this header to see if it includes other headers.
2832        if $(ENABLE_HEADER_DEPENDENCIES) != NO && $(DO_HEADER_SCANNING_IN_JAM) = YES {
2833            HDRRULE on $(2) = ProcessC.HdrRule ;
2834            HDRSCAN on $(2) = $(HDRPATTERN) ;
2835        }
2836        # Set search path for header so dependence analysis will find it
2837        SEARCH on $(2:D=) += $(2:D) ;
2838
2839        # conditionally generate documentation from headers
2840        if $(GENERATE_HEADERDOC) = YES && $(HEADERDOC_DIR) {
2841            HEADERDOC_TARGET = $(2:B)$(/)toc.html ;
2842            LOCATE on $(HEADERDOC_TARGET) = $(HEADERDOC_DIR) ;
2843            HeaderDoc $(HEADERDOC_TARGET) : $(2) ;
2844            DEPENDS $(HEADERDOC_TARGET) : $(HEADERDOC_DIR) ;
2845            if $(_BUILD_PHASING) = YES {
2846                BUILD_PHASE_PRODUCTS += $(HEADERDOC_TARGET) ;
2847            }
2848            HEADERDOC_TARGETS += $(HEADERDOC_TARGET) ;
2849        }
2850    }
2851    local ATTRIBUTES = $($(2)_ATTRIBUTES) ;
2852    local HEADER_ATTRIBUTE ;
2853    for HEADER_ATTRIBUTE in $(ATTRIBUTES) {
2854        switch $(HEADER_ATTRIBUTE) {
2855            case Project :
2856                # Define option as valid, but take no action
2857            case Public :
2858                HAS_PUBLIC_HEADERS = YES ;
2859                # Create a public header directory
2860                if ! $(PUBLIC_HEADER_DIR) in $(PRODUCT_FILES) {
2861                    Mkdir $(PUBLIC_HEADER_DIR) ;
2862                    ProductFile $(PUBLIC_HEADER_DIR) ;
2863                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
2864                        ASIDE_PUBLIC_HEADER_DIR default = $(PUBLIC_HEADER_DIR:G=aside) ;
2865                        Mkdir $(ASIDE_PUBLIC_HEADER_DIR) ;
2866                        ProductFileAside $(ASIDE_PUBLIC_HEADER_DIR) ;
2867                    }
2868                }
2869                # Create symlink to public header dir in versioned frameworks
2870                if $(PUBLIC_HEADER_LINK)
2871                  && ! $(PUBLIC_HEADER_LINK) in $(PRODUCT_FILES) {
2872                    SymLink $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ;
2873                    DEPENDS $(PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_DIR) ;
2874                    ProductFile $(PUBLIC_HEADER_LINK) ;
2875                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
2876                        ASIDE_PUBLIC_HEADER_LINK default = $(PUBLIC_HEADER_LINK:G=aside) ;
2877                        SymLink $(ASIDE_PUBLIC_HEADER_LINK) : $(PUBLIC_HEADER_LINK_PATH) ;
2878                        DEPENDS $(ASIDE_PUBLIC_HEADER_LINK) : $(ASIDE_PUBLIC_HEADER_DIR) ;
2879                        ProductFileAside $(ASIDE_PUBLIC_HEADER_LINK) ;
2880                    }
2881                    NOUPDATE $(PUBLIC_HEADER_LINK) ;
2882                }
2883                if headers in $(BUILD_COMPONENTS) {
2884                    if $(PUBLIC_HEADER_DIR) {
2885                        local HEADER_COPY = $(PUBLIC_HEADER_DIR)$(/)$(2:BS:G=) ;
2886                        DEPENDS $(HEADER_COPY) : $(2) ;
2887                        DEPENDS $(HEADER_COPY) : $(PUBLIC_HEADER_DIR) ;
2888                        PBXCp $(HEADER_COPY) : $(2) ;
2889                        ProductFile $(HEADER_COPY) ;
2890                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
2891                            ASIDE_HEADER_COPY = $(HEADER_COPY:G=aside) ;
2892                            DEPENDS $(ASIDE_HEADER_COPY) : $(2) ;
2893                            DEPENDS $(ASIDE_HEADER_COPY) : $(ASIDE_PUBLIC_HEADER_DIR) ;
2894                            PBXCp $(ASIDE_HEADER_COPY) : $(2) ;
2895                            ProductFileAside $(ASIDE_HEADER_COPY) ;
2896                        }
2897                    }
2898                    else {
2899                        ECHO warning: public header $(2) ignored because PUBLIC_HEADER_DIR has no value ;
2900                    }
2901                }
2902            case Private :
2903                HAS_PRIVATE_HEADERS = YES ;
2904                # create a private header directory
2905                if ! $(PRIVATE_HEADER_DIR) in $(PRODUCT_FILES) {
2906                    Mkdir $(PRIVATE_HEADER_DIR) ;
2907                    ProductFile $(PRIVATE_HEADER_DIR) ;
2908                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
2909                        ASIDE_PRIVATE_HEADER_DIR default = $(PRIVATE_HEADER_DIR:G=aside) ;
2910                        Mkdir $(ASIDE_PRIVATE_HEADER_DIR) ;
2911                        ProductFileAside $(ASIDE_PRIVATE_HEADER_DIR) ;
2912                    }
2913                }
2914                # accompanying link in versioned frameworks
2915                if $(PRIVATE_HEADER_LINK)
2916                  && ! $(PRIVATE_HEADER_LINK) in $(PRODUCT_FILES) {
2917                    SymLink $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
2918                    DEPENDS $(PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_DIR) ;
2919                    ProductFile $(PRIVATE_HEADER_LINK) ;
2920                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
2921                        ASIDE_PRIVATE_HEADER_LINK default = $(PRIVATE_HEADER_LINK:G=aside) ;
2922                        SymLink $(ASIDE_PRIVATE_HEADER_LINK) : $(PRIVATE_HEADER_LINK_PATH) ;
2923                        DEPENDS $(ASIDE_PRIVATE_HEADER_LINK) : $(ASIDE_PRIVATE_HEADER_DIR) ;
2924                        ProductFileAside $(ASIDE_PRIVATE_HEADER_LINK) ;
2925                    }
2926                    NOUPDATE $(PRIVATE_HEADER_LINK) ;
2927                }
2928                if headers in $(BUILD_COMPONENTS) {
2929                    if $(PRIVATE_HEADER_DIR) {
2930                        local HEADER_COPY = $(PRIVATE_HEADER_DIR)$(/)$(2:BS:G=) ;
2931                        DEPENDS $(HEADER_COPY) : $(2) ;
2932                        DEPENDS $(HEADER_COPY) : $(PRIVATE_HEADER_DIR) ;
2933                        PBXCp $(HEADER_COPY) : $(2) ;
2934                        ProductFile $(HEADER_COPY) ;
2935                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
2936                            ASIDE_HEADER_COPY = $(HEADER_COPY:G=aside) ;
2937                            DEPENDS $(ASIDE_HEADER_COPY) : $(ASIDE_PRIVATE_HEADER_DIR) ;
2938                            DEPENDS $(ASIDE_HEADER_COPY) : $(2) ;
2939                            PBXCp $(ASIDE_HEADER_COPY) : $(2) ;
2940                            ProductFileAside $(ASIDE_HEADER_COPY) ;
2941                        }
2942                    }
2943                    else {
2944                        ECHO warning: private header $(2) ignored because PRIVATE_HEADER_DIR has no value ;
2945                    }
2946                }
2947            case * :
2948                if $(HEADER_ATTRIBUTE) != AbsolutePath {
2949                    ECHO jam: warning: Ignoring unknown header attribute $(HEADER_ATTRIBUTE) ;
2950                }
2951        }
2952    }
2953}
2954
2955rule PrecompileHeader
2956{
2957    DEPENDS $(1) : $(2) ;
2958    if $(KERNEL_MODULE) = YES {
2959        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
2960        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
2961        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
2962        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
2963        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
2964        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS_$(ARCH)) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
2965        GLOBAL_CFLAGS on $(1) = ;
2966        if $(ARCH) in ppc {
2967            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
2968        }
2969    }
2970    else {
2971        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS_$(ARCH)) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ;    # We must compile with the extension-specific build flags
2972        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
2973            USE_DYNAMIC_NO_PIC default = YES ;
2974        } else {
2975            USE_DYNAMIC_NO_PIC default = NO ;
2976        }
2977        if $(USE_DYNAMIC_NO_PIC) = YES {
2978            FLAGS on $(1) += -mdynamic-no-pic ;
2979        }
2980    }
2981    FLAGS on $(1) += -pipe ;
2982    if $(GCC_VERSION) != 2.x {
2983        FLAGS on $(1) += -fmessage-length=0 ;
2984    }
2985    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
2986        FLAGS on $(1) += -Werror ;
2987    }
2988    # seed search paths with target-wide values
2989    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
2990    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
2991    # extension-specific build flags
2992    FLAGS on $(1) += $($(2:S)_CFLAGS) ;
2993    # Add debug flags, if appropriate.
2994    if $(DEBUGGING_SYMBOLS) = YES {
2995        FLAGS on $(1) += -g ;
2996    }
2997    # Add profiling flags, if appropriate.
2998    if $(PROFILING_CODE) = YES {
2999        FLAGS on $(1) += -pg ;
3000    }
3001    if $(GCC_VERSION) != 3.3 && $(OS) in MACOS DARWIN {
3002        FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ;
3003    }
3004    if $(CPP_HEADERMAP_FILE) {
3005        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
3006    }
3007    if $(1:S) = .pp {
3008            FLAGS on $(1) += -x objective-c++ ;
3009    }
3010    if YES in $(GENERATE_CPP_ILOG_FILES) {
3011        local INCLUSION_LOG_FILE default = $(PRECOMP_DESTINATION_DIR)$(/)$(1:DB)-$(ARCH).ilog ;
3012        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
3013    }
3014    Mkdir $(PRECOMP_DESTINATION_DIR) ;
3015    DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ;
3016    SEARCH on $(2) = $(SOURCE_ROOT) ;
3017}
3018actions PrecompileHeader
3019{
3020    $(CC) -precomp -o $(1:Q) -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(ARCH_FLAGS) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) -I$(SOURCE_ROOT:Q) $(PREFIX_HEADER_CFLAGS:Q) "$(OTHER_PRECOMP_CFLAGS)" "$(OTHER_CFLAGS)" $(2:Q)
3021}
3022
3023rule MakePFEFile
3024{
3025    DEPENDS $(1) : $(2) ;
3026    if $(KERNEL_MODULE) = YES {
3027        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
3028        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
3029        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
3030        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
3031        if $(ARCH) in ppc {
3032            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
3033        }
3034        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
3035        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS_$(ARCH)) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
3036        GLOBAL_CFLAGS on $(1) = ;
3037    }
3038    else {
3039        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS_$(ARCH)) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ;    # We must compile with the extension-specific build flags
3040        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
3041            USE_DYNAMIC_NO_PIC default = YES ;
3042        } else {
3043            USE_DYNAMIC_NO_PIC default = NO ;
3044        }
3045        if $(USE_DYNAMIC_NO_PIC) = YES {
3046            FLAGS on $(1) += -mdynamic-no-pic ;
3047        }
3048    }
3049    FLAGS on $(1) += -pipe ;
3050    if $(GCC_VERSION) != 2.x {
3051        FLAGS on $(1) += -fmessage-length=0 ;
3052    }
3053    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
3054        FLAGS on $(1) += -Werror ;
3055    }
3056    # seed search paths with target-wide values
3057    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
3058    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
3059    # extension-specific build flags
3060    FLAGS on $(1) += $($(2:S)_CFLAGS) ;
3061    # Add debug flags, if appropriate.
3062    if $(DEBUGGING_SYMBOLS) = YES {
3063        FLAGS on $(1) += -g ;
3064    }
3065    # Add profiling flags, if appropriate.
3066    if $(PROFILING_CODE) = YES {
3067        FLAGS on $(1) += -pg ;
3068    }
3069    if $(CPP_HEADERMAP_FILE) {
3070        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
3071    }
3072    if YES in $(GENERATE_CPP_ILOG_FILES) {
3073        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(2:DB).ilog ;
3074        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
3075    }
3076    ARCH on $(1) = $(ARCH) ;
3077    Mkdir $(PRECOMP_DESTINATION_DIR) ;
3078    DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ;
3079    SEARCH on $(2) = $(SOURCE_ROOT) ;
3080}
3081actions MakePFEFile
3082{
3083    for _c_dialect in $(PFE_FILE_C_DIALECTS) ; do if [ ${_c_dialect} == c -o ${_c_dialect} == objective-c ] ; then dummy_file=`mktemp /tmp/.null-XXXXXXXX`; $(CC) -c -x ${_c_dialect} -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) -I$(SOURCE_ROOT:Q) $(PREFIX_HEADER_CFLAGS:Q) "$(OTHER_PRECOMP_CFLAGS)" "$(OTHER_CFLAGS)" $(2:Q) -o ${dummy_file} --dump-pch $(1:Q) ; exit_code=$? ; rm ${dummy_file} ; if [ ${exit_code} != 0 ] ; then rm -rf $(1:Q) ; exit ${exit_code} ; fi ; fi ; done
3084}
3085
3086rule MakePFEFile++
3087{
3088    DEPENDS $(1) : $(2) ;
3089    PER_ARCH_CPLUSPLUSFLAGS_$(ARCH) default = $(PER_ARCH_CFLAGS_$(ARCH)) ;
3090    if $(KERNEL_MODULE) = YES {
3091        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
3092        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
3093        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
3094        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
3095        if $(ARCH) in ppc {
3096            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
3097        }
3098        KERNEL_COMPILE_OPTIONS += -fapple-kext ;
3099        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
3100        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS_$(ARCH)) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
3101        GLOBAL_CFLAGS on $(1) = ;
3102    }
3103    else {
3104        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS_$(ARCH)) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) ;    # We must compile with the extension-specific build flags
3105        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
3106            USE_DYNAMIC_NO_PIC default = YES ;
3107        } else {
3108            USE_DYNAMIC_NO_PIC default = NO ;
3109        }
3110        if $(USE_DYNAMIC_NO_PIC) = YES {
3111            FLAGS on $(1) += -mdynamic-no-pic ;
3112        }
3113    }
3114    FLAGS on $(1) += -pipe ;
3115    if $(GCC_VERSION) != 2.x {
3116        FLAGS on $(1) += -fmessage-length=0 ;
3117    }
3118    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
3119        FLAGS on $(1) += -Werror ;
3120    }
3121    # seed search paths with target-wide values
3122    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
3123    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
3124    # extension-specific build flags
3125    FLAGS on $(1) += $($(2:S)_CFLAGS) ;
3126    # Add debug flags, if appropriate.
3127    if $(DEBUGGING_SYMBOLS) = YES {
3128        FLAGS on $(1) += -g ;
3129    }
3130    # Add profiling flags, if appropriate.
3131    if $(PROFILING_CODE) = YES {
3132        FLAGS on $(1) += -pg ;
3133    }
3134    if $(CPP_HEADERMAP_FILE) {
3135        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
3136    }
3137    if YES in $(GENERATE_CPP_ILOG_FILES) {
3138        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(2:DB).ilog ;
3139        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
3140    }
3141    ARCH on $(1) = $(ARCH) ;
3142    Mkdir $(PRECOMP_DESTINATION_DIR) ;
3143    DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ;
3144    SEARCH on $(2) = $(SOURCE_ROOT) ;
3145}
3146actions MakePFEFile++
3147{
3148    for _c_dialect in $(PFE_FILE_C_DIALECTS) ; do if [ ${_c_dialect} == c++ -o ${_c_dialect} == objective-c++ ] ; then dummy_file=`mktemp /tmp/.null-XXXXXXXX`; $(CC) -c -x ${_c_dialect} -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) -I$(SOURCE_ROOT:Q) $(PREFIX_HEADER_CFLAGS:Q) "$(OTHER_PRECOMP_CPLUSPLUSFLAGS)" "$(OTHER_CPLUSPLUSFLAGS)" $(2:Q) -o ${dummy_file} --dump-pch $(1:Q) ; exit_code=$? ; rm ${dummy_file} ; if [ ${exit_code} != 0 ] ; then rm -rf $(1:Q) ; exit ${exit_code} ; fi ; fi ; done
3149}
3150
3151rule ProcessPCH
3152{
3153    DEPENDS $(1) : $(2) ;
3154    if $(KERNEL_MODULE) = YES {
3155        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
3156        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
3157        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
3158        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
3159        if $(ARCH) in ppc {
3160            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
3161        }
3162        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
3163        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS_$(ARCH)) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
3164        GLOBAL_CFLAGS on $(1) = ;
3165    }
3166    else {
3167        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS_$(ARCH)) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ;    # We must compile with the extension-specific build flags
3168        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
3169            USE_DYNAMIC_NO_PIC default = YES ;
3170        } else {
3171            USE_DYNAMIC_NO_PIC default = NO ;
3172        }
3173        if $(USE_DYNAMIC_NO_PIC) = YES {
3174            FLAGS on $(1) += -mdynamic-no-pic ;
3175        }
3176    }
3177    FLAGS on $(1) += -pipe ;
3178    if $(GCC_VERSION) != 2.x {
3179        FLAGS on $(1) += -fmessage-length=0 ;
3180    }
3181    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
3182        FLAGS on $(1) += -Werror ;
3183    }
3184    # seed search paths with target-wide values
3185    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
3186    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
3187    # extension-specific build flags
3188    FLAGS on $(1) += $($(2:S)_CFLAGS) ;
3189    # Add debug flags, if appropriate.
3190    if $(DEBUGGING_SYMBOLS) = YES {
3191        FLAGS on $(1) += -g ;
3192    }
3193    # Add profiling flags, if appropriate.
3194    if $(PROFILING_CODE) = YES {
3195        FLAGS on $(1) += -pg ;
3196    }
3197    if $(CPP_HEADERMAP_FILE) {
3198        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
3199    }
3200    if YES in $(GENERATE_CPP_ILOG_FILES) {
3201        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(2:DB).ilog ;
3202        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
3203    }
3204    ARCH on $(1) = $(ARCH) ;
3205    Mkdir $(PRECOMP_DESTINATION_DIR) ;
3206    DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ;
3207    SEARCH on $(2) = $(SOURCE_ROOT) ;
3208}
3209actions ProcessPCH
3210{
3211    mkdir -p $(1:Q)
3212    for _c_dialect in $(PFE_FILE_C_DIALECTS) ; do if [ ${_c_dialect} == c -o ${_c_dialect} == objective-c ] ; then rm -f $(1:Q)$(/)${_c_dialect} ; $(CC) -c -x ${_c_dialect}-header -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) -I$(SOURCE_ROOT:Q) $(PREFIX_HEADER_CFLAGS:Q) "$(OTHER_PRECOMP_CFLAGS)" "$(OTHER_CFLAGS)" $(2:Q) -o $(1:Q)$(/)${_c_dialect} ; exit_code=$? ; if [ ${exit_code} != 0 ] ; then rm -rf $(1:Q)$(/)${_c_dialect} ; touch $(1:Q) ; exit ${exit_code} ; fi ; fi ; done
3213}
3214 
3215rule ProcessPCH++
3216{
3217    DEPENDS $(1) : $(2) ;
3218    PER_ARCH_CPLUSPLUSFLAGS_$(ARCH) default = $(PER_ARCH_CFLAGS_$(ARCH)) ;
3219    if $(KERNEL_MODULE) = YES {
3220        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
3221        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
3222        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
3223        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
3224        if $(ARCH) in ppc {
3225            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
3226        }
3227        KERNEL_COMPILE_OPTIONS += -fapple-kext ;
3228        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
3229        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS_$(ARCH)) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
3230        GLOBAL_CFLAGS on $(1) = ;
3231    }
3232    else {
3233        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS_$(ARCH)) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) ;    # We must compile with the extension-specific build flags
3234        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
3235            USE_DYNAMIC_NO_PIC default = YES ;
3236        } else {
3237            USE_DYNAMIC_NO_PIC default = NO ;
3238        }
3239        if $(USE_DYNAMIC_NO_PIC) = YES {
3240            FLAGS on $(1) += -mdynamic-no-pic ;
3241        }
3242    }
3243    FLAGS on $(1) += -pipe ;
3244    if $(GCC_VERSION) != 2.x {
3245        FLAGS on $(1) += -fmessage-length=0 ;
3246    }
3247    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
3248        FLAGS on $(1) += -Werror ;
3249    }
3250    # seed search paths with target-wide values
3251    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
3252    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
3253    # extension-specific build flags
3254    FLAGS on $(1) += $($(2:S)_CFLAGS) ;
3255    # Add debug flags, if appropriate.
3256    if $(DEBUGGING_SYMBOLS) = YES {
3257        FLAGS on $(1) += -g ;
3258    }
3259    # Add profiling flags, if appropriate.
3260    if $(PROFILING_CODE) = YES {
3261        FLAGS on $(1) += -pg ;
3262    }
3263    if $(CPP_HEADERMAP_FILE) {
3264        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
3265    }
3266    if YES in $(GENERATE_CPP_ILOG_FILES) {
3267        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(2:DB).ilog ;
3268        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
3269    }
3270    ARCH on $(1) = $(ARCH) ;
3271    Mkdir $(PRECOMP_DESTINATION_DIR) ;
3272    DEPENDS $(1) : $(PRECOMP_DESTINATION_DIR) ;
3273    SEARCH on $(2) = $(SOURCE_ROOT) ;
3274}
3275actions ProcessPCH++
3276{
3277    mkdir -p $(1:Q)
3278    for _c_dialect in $(PFE_FILE_C_DIALECTS) ; do if [ ${_c_dialect} == c++ -o ${_c_dialect} == objective-c++ ] ; then rm -f $(1:Q)$(/)${_c_dialect} ; $(CC) -c -x ${_c_dialect}-header -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) -I$(SOURCE_ROOT:Q) $(PREFIX_HEADER_CFLAGS:Q) "$(OTHER_PRECOMP_CFLAGS)" "$(OTHER_CPLUSPLUSFLAGS)" $(2:Q) -o $(1:Q)$(/)${_c_dialect} ; exit_code=$? ; if [ ${exit_code} != 0 ] ; then rm -f $(1:Q)$(/)${_c_dialect} ; touch $(1:Q) ; exit ${exit_code} ; fi ; fi ; done
3279}
3280
3281
3282# ProcessResources <product> <bundle resources>
3283#
3284# Process individual resource files, copy property list settings file,
3285# and write the package info file if appropriate.
3286rule ProcessResources
3287{
3288    if ( build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) )
3289     && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) {
3290        local FILE ;
3291        if $(_BUILD_PHASING) = YES {
3292            PhaseTarget BUILD_PHASE : $(1) : CopyResources ;
3293            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
3294            BUILD_PHASE_PRODUCTS = ;
3295        }
3296        for FILE in $(2) {
3297            if $(_BUILD_PHASING) = YES {
3298                ProcessResource $(BUILD_PHASE) : $(FILE) ;
3299            }
3300            else {
3301                ProcessResource $(1) : $(FILE) ;
3302            }
3303        }
3304        # product settings, version settings, and package info written only during build
3305        if build in $(BUILD_COMPONENTS) {
3306            # product settings property list
3307            if $(_INFO_PLIST_FILE_PATH)
3308             && $(PURE_JAVA) != YES {
3309                # if available and not pure java
3310                if $(PRODUCT_TYPE) = Framework {
3311                    INFO_PLIST_FILE default = $(RESOURCE_DIR)$(/)Info.plist ;
3312                    if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) {
3313                        Mkdir $(RESOURCE_DIR) ;
3314                        ProductFile $(RESOURCE_DIR) ;
3315                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3316                            ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
3317                            Mkdir $(ASIDE_RESOURCE_DIR) ;
3318                            ProductFileAside $(ASIDE_RESOURCE_DIR) ;
3319                        }
3320                    }
3321                    DEPENDS $(INFO_PLIST_FILE) : $(RESOURCE_DIR) ;
3322                    if $(RESOURCE_LINK)
3323                     && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) {
3324                        SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3325                        ProductFile $(RESOURCE_LINK) ;
3326                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3327                            ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
3328                            SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3329                            ProductFileAside $(ASIDE_RESOURCE_LINK) ;
3330                        }
3331                    }
3332                    DEPENDS $(INFO_PLIST_FILE) : $(RESOURCE_LINK) ;
3333                }
3334                else {
3335                    if $(BUNDLE_STYLE) = SHALLOW {
3336                        INFO_PLIST_FILE default = $(1:G=)$(/)Info.plist ;
3337                    }
3338                    else {
3339                        INFO_PLIST_FILE default = $(1:G=)$(/)Contents$(/)Info.plist ;
3340                    }
3341                    INFO_PLIST_DIR = $(INFO_PLIST_FILE:D) ;
3342                    if ! $(INFO_PLIST_DIR) in $(PRODUCT_FILES) {
3343                        Mkdir $(INFO_PLIST_DIR) ;
3344                        ProductFile $(INFO_PLIST_DIR) ;
3345                    }
3346                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3347                        ASIDE_INFO_PLIST_DIR default = $(INFO_PLIST_DIR:G=aside) ;
3348                        if ! $(ASIDE_INFO_PLIST_DIR) in $(PRODUCT_FILES) {
3349                            Mkdir $(ASIDE_INFO_PLIST_DIR) ;
3350                            ProductFileAside $(ASIDE_INFO_PLIST_DIR) ;
3351                        }
3352                    }
3353                    DEPENDS $(INFO_PLIST_FILE) : $(INFO_PLIST_DIR) ;
3354                }
3355                PBXCp $(INFO_PLIST_FILE) : $(_INFO_PLIST_FILE_PATH) ;
3356                ProductFile $(INFO_PLIST_FILE) ;
3357                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3358                    ASIDE_INFO_PLIST_FILE default = $(INFO_PLIST_FILE:G=aside) ;
3359                    DEPENDS $(ASIDE_INFO_PLIST_FILE) : $(ASIDE_INFO_PLIST_DIR) ;
3360                    PBXCp $(ASIDE_INFO_PLIST_FILE) : $(_INFO_PLIST_FILE_PATH) ;
3361                    ProductFileAside $(ASIDE_INFO_PLIST_FILE) ;
3362                }
3363            }
3364            # version settings property list
3365            if $(_VERSION_PLIST_FILE_PATH)
3366             && $(PURE_JAVA) != YES {
3367                # if available and not pure java
3368                if $(PRODUCT_TYPE) = Framework {
3369	            VERSION_PLIST_FILE default = $(RESOURCE_DIR)$(/)version.plist ;
3370                    if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) {
3371                        Mkdir $(RESOURCE_DIR) ;
3372                        ProductFile $(RESOURCE_DIR) ;
3373                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3374                            ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
3375                            Mkdir $(ASIDE_RESOURCE_DIR) ;
3376                            ProductFileAside $(ASIDE_RESOURCE_DIR) ;
3377                        }
3378                    }
3379                    DEPENDS $(VERSION_PLIST_FILE) : $(RESOURCE_DIR) ;
3380                    # create accompanying link in the case of versioned frameworks
3381                    if $(RESOURCE_LINK)
3382                     && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) {
3383                        SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3384                        ProductFile $(RESOURCE_LINK) ;
3385                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3386                            ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
3387                            DEPENDS $(ASIDE_RESOURCE_LINK) : $(ASIDE_RESOURCE_DIR) ;
3388                            SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3389                            ProductFileAside $(ASIDE_RESOURCE_LINK) ;
3390                        }
3391                    }
3392                    DEPENDS $(VERSION_PLIST_FILE) : $(RESOURCE_LINK) ;
3393                }
3394                else {
3395                    if $(BUNDLE_STYLE) = SHALLOW {
3396                        VERSION_PLIST_FILE default = $(1:G=)$(/)version.plist ;
3397                    }
3398                    else {
3399                        VERSION_PLIST_FILE default = $(1:G=)$(/)Contents$(/)version.plist ;
3400                    }
3401                    VERSION_PLIST_DIR = $(VERSION_PLIST_FILE:D) ;
3402                    if ! $(VERSION_PLIST_DIR) in $(PRODUCT_FILES) {
3403                        Mkdir $(VERSION_PLIST_DIR) ;
3404                        ProductFile $(VERSION_PLIST_DIR) ;
3405                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3406                            ASIDE_VERSION_PLIST_DIR default = $(VERSION_PLIST_DIR) ;
3407                            Mkdir $(ASIDE_VERSION_PLIST_DIR) ;
3408                            ProductFileAside $(ASIDE_VERSION_PLIST_DIR) ;
3409                        }
3410                    }
3411                    DEPENDS $(VERSION_PLIST_FILE) : $(VERSION_PLIST_DIR) ;
3412                }
3413                PBXCp $(VERSION_PLIST_FILE) : $(_VERSION_PLIST_FILE_PATH) ;
3414                ProductFile $(VERSION_PLIST_FILE) ;
3415                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3416                    ASIDE_VERSION_PLIST_FILE default = $(VERSION_PLIST_FILE:G=aside) ;
3417                    Cp $(ASIDE_VERSION_PLIST_FILE) : $(_VERSION_PLIST_FILE_PATH) ;
3418                    DEPENDS $(ASIDE_VERSION_PLIST_FILE) : $(ASIDE_VERSION_PLIST_DIR) ;
3419                    ProductFileAside $(ASIDE_VERSION_PLIST_FILE) ;
3420                }
3421            }
3422            # Copy development settings property list unless using deployment locations
3423            if $(DEVELOPMENT_SETTINGS_PATH)
3424             && $(PURE_JAVA) != YES && $(DEPLOYMENT_LOCATION) != YES {
3425                # if available and not pure java
3426                if $(PRODUCT_TYPE) = Framework {
3427	            DEVELOPMENT_PLIST_FILE default = $(RESOURCE_DIR)$(/)pbdevelopment.plist ;
3428                    if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) {
3429                        Mkdir $(RESOURCE_DIR) ;
3430                        ProductFile $(RESOURCE_DIR) ;
3431                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3432                            ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
3433                            Mkdir $(ASIDE_RESOURCE_DIR) ;
3434                            ProductFileAsides $(ASIDE_RESOURCE_DIR) ;
3435                        }
3436                    }
3437                    DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(RESOURCE_DIR) ;
3438                    # create accompanying link in the case of versioned frameworks
3439                    if $(RESOURCE_LINK)
3440                      && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) {
3441                        SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3442                        ProductFile $(RESOURCE_LINK) ;
3443                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3444                            ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
3445                            SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3446                            DEPENDS $(ASIDE_RESOURCE_LINK) : $(ASIDE_RESOURCE_DIR) ;
3447                            ProductFileAside $(ASIDE_RESOURCE_LINK) ;
3448                        }
3449                    }
3450                    DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(RESOURCE_LINK) ;
3451                }
3452                else {
3453                    if $(BUNDLE_STYLE) = SHALLOW {
3454                        DEVELOPMENT_PLIST_FILE default = $(1:G=)$(/)pbdevelopment.plist ;
3455                    }
3456                    else {
3457                        DEVELOPMENT_PLIST_FILE default = $(1:G=)$(/)Contents$(/)pbdevelopment.plist ;
3458                    }
3459                    DEVELOPMENT_PLIST_DIR = $(DEVELOPMENT_PLIST_FILE:D) ;
3460                    if ! $(DEVELOPMENT_PLIST_DIR) in $(PRODUCT_FILES) {
3461                        Mkdir $(DEVELOPMENT_PLIST_DIR) ;
3462                        ProductFile $(DEVELOPMENT_PLIST_DIR) ;
3463                        if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3464                            ASIDE_DEVELOPMENT_PLIST_DIR default = $(DEVELOPMENT_PLIST_DIR:G=aside) ;
3465                            Mkdir $(ASIDE_DEVELOPMENT_PLIST_DIR) ;
3466                            ProductFileAsides $(ASIDE_DEVELOPMENT_PLIST) ;
3467                        }
3468                    }
3469                    DEPENDS $(DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_PLIST_DIR) ;
3470                }
3471                PBXCp $(DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_SETTINGS_PATH) ;
3472                ProductFile $(DEVELOPMENT_PLIST_FILE) ;
3473                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3474                    ASIDE_DEVELOPMENT_PLIST_FILE default = $(DEVELOPMENT_PLIST_FILE:G=aside) ;
3475                    PBXCp $(ASIDE_DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_SETTINGS_PATH) ;
3476                    DEPENDS $(ASIDE_DEVELOPMENT_PLIST_FILE) : $(DEVELOPMENT_PLIST_DIR) ;
3477                    ProductFileAside $(ASIDE_DEVELOPMENT_PLIST_FILE) ;
3478                }
3479            }
3480            # Write package info file with type and creator if available
3481            # and if not framework or oldest layout or pure java
3482            if $(_PKGINFO_FILE_PATH)
3483             && ( $(PRODUCT_TYPE) != Framework
3484             && $(PRODUCT_TYPE) != Bundle
3485             && $(PURE_JAVA) != YES || $(GENERATE_PKGINFO_FILE) = YES ) {
3486                if $(BUNDLE_STYLE) = SHALLOW || $(PRODUCT_TYPE) = Framework {
3487                    PKGINFO_FILE default = $(1:G=)$(/)PkgInfo ;
3488                }
3489                else {
3490                    PKGINFO_FILE default = $(1:G=)$(/)Contents$(/)PkgInfo ;
3491                }
3492                PKGINFO_DIR = $(PKGINFO_FILE:D) ;
3493                if ! $(PKGINFO_DIR) in $(PRODUCT_FILES) {
3494                    Mkdir $(PKGINFO_DIR) ;
3495                    ProductFile $(PKGINFO_DIR) ;
3496                    if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3497                        ASIDE_PKGINFO_DIR default = $(PKGINFO_DIR:G=aside) ;
3498                        Mkdir $(ASIDE_PKGINFO_DIR) ;
3499                        ProductFileAside $(ASIDE_PKGINFO_DIR) ;
3500                    }
3501                }
3502                DEPENDS $(PKGINFO_FILE) : $(PKGINFO_DIR) ;
3503                PBXCp $(PKGINFO_FILE) : $(_PKGINFO_FILE_PATH) ;
3504                ProductFile $(PKGINFO_FILE) ;
3505                if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3506                    ASIDE_PKGINFO_FILE default = $(PKGINFO_FILE:G=aside) ;
3507                    DEPENDS $(ASIDE_PKGINFO_FILE) : $(ASIDE_PKGINFO_DIR) ;
3508                    PBXCp $(ASIDE_PKGINFO_FILE) : $(_PKGINFO_FILE_PATH) ;
3509                    ProductFileAside $(ASIDE_PKGINFO_FILE) ;
3510                }
3511            }
3512        }
3513        if $(_BUILD_PHASING) = YES {
3514            if $(BUILD_PHASE_PRODUCTS) {
3515                DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
3516            }
3517            PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
3518        }
3519    }
3520}
3521
3522# ProcessResource <product or phase> <bundle resource>
3523#
3524# Copies resources to nonlocalized or localized folders as appropriate
3525rule ProcessResource
3526{
3527    if source in $(BUILD_COMPONENTS) {
3528        local RESOURCE_SOURCE_COPY ;
3529        local RESOURCE_SOURCE_DIR ;
3530        # make directory first if necessary
3531        if $(2:D) {
3532            RESOURCE_SOURCE_DIR = $(SOURCE_DIR)/$(2:D:G=) ;
3533            Mkdir $(RESOURCE_SOURCE_DIR) ;
3534            RESOURCE_SOURCE_COPY = $(RESOURCE_SOURCE_DIR)/$(2:D=:G=) ;
3535            DEPENDS $(RESOURCE_SOURCE_COPY) : $(RESOURCE_SOURCE_DIR) ;
3536        }
3537        else {
3538            RESOURCE_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ;
3539            DEPENDS $(RESOURCE_SOURCE_COPY) : $(SOURCE_DIR) ;
3540            Mkdir $(SOURCE_DIR) ;
3541        }
3542        # copy resource to source location
3543        Cp $(RESOURCE_SOURCE_COPY) : $(2) ;
3544        if $(_BUILD_PHASING) = YES {
3545            BUILD_PHASE_PRODUCTS += $(RESOURCE_SOURCE_COPY) ;
3546        }
3547    }
3548    if build in $(BUILD_COMPONENTS) {
3549        local REGION = $($(2)_REGION) ;
3550        local SPECIFIC_REGION ;
3551        # resource directory must exist
3552        if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) {
3553            Mkdir $(RESOURCE_DIR) ;
3554            ProductFile $(RESOURCE_DIR) ;
3555            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3556                ASIDE_RESOURCE_DIR default = $(RESOURCE_DIR:G=aside) ;
3557                Mkdir $(ASIDE_RESOURCE_DIR) ;
3558                ProductFileAside $(ASIDE_RESOURCE_DIR) ;
3559            }
3560        }
3561        # create accompanying link in the case of versioned frameworks
3562        if $(RESOURCE_LINK)
3563         && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) {
3564            SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3565            ProductFile $(RESOURCE_LINK) ;
3566            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3567                ASIDE_RESOURCE_LINK default = $(RESOURCE_LINK:G=aside) ;
3568                SymLink $(ASIDE_RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
3569                DEPENDS $(ASIDE_RESOURCE_LINK) : $(ASIDE_RESOURCE_DIR) ;
3570                ProductFileAside $(ASIDE_RESOURCE_LINK) ;
3571            }
3572        }
3573        if ! $(REGION) {
3574            # non-localized resource
3575            local NONLOCALIZED_RESOURCE_DIR NONLOCALIZED_RESOURCE ;
3576            NONLOCALIZED_RESOURCE_DIR = $(RESOURCE_DIR) ;
3577            if ! $(NONLOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
3578                Mkdir $(NONLOCALIZED_RESOURCE_DIR) ;
3579                ProductFile $(NONLOCALIZED_RESOURCE_DIR) ;
3580            }
3581            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3582                ASIDE_NONLOCALIZED_RESOURCE_DIR = $(NONLOCALIZED_RESOURCE_DIR:G=aside) ;
3583                if ! $(ASIDE_NONLOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
3584                    Mkdir $(ASIDE_NONLOCALIZED_RESOURCE_DIR) ;
3585                    ProductFileAside $(ASIDE_NONLOCALIZED_RESOURCE_DIR) ;
3586                }
3587            }
3588            NONLOCALIZED_RESOURCE = $(NONLOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ;
3589            DEPENDS $(NONLOCALIZED_RESOURCE) : $(NONLOCALIZED_RESOURCE_DIR) ;
3590            DEPENDS $(NONLOCALIZED_RESOURCE) : $(2) ;
3591            PBXCp $(NONLOCALIZED_RESOURCE) : $(2) ;
3592            ProductFile $(NONLOCALIZED_RESOURCE) ;
3593            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3594                ASIDE_NONLOCALIZED_RESOURCE = $(NONLOCALIZED_RESOURCE:G=aside) ;
3595                DEPENDS $(ASIDE_NONLOCALIZED_RESOURCE) : $(2) ;
3596                DEPENDS $(ASIDE_NONLOCALIZED_RESOURCE) : $(ASIDE_NONLOCALIZED_RESOURCE_DIR) ;
3597                PBXCp $(ASIDE_NONLOCALIZED_RESOURCE) : $(2) ;
3598                ProductFileAside $(ASIDE_NONLOCALIZED_RESOURCE) ;
3599            }
3600        } else for SPECIFIC_REGION in $(REGION) {
3601            # for each localization of a resource (only one ever expected)
3602            local LOCALIZED_RESOURCE_DIR LOCALIZED_RESOURCE ;
3603            LOCALIZED_RESOURCE_DIR = $(RESOURCE_DIR)$(/)$(SPECIFIC_REGION:S=.lproj) ;
3604            # localized resource directory must exist
3605            if ! $(LOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
3606                Mkdir $(LOCALIZED_RESOURCE_DIR) ;
3607                ProductFile $(LOCALIZED_RESOURCE_DIR) ;
3608            }
3609            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3610                ASIDE_LOCALIZED_RESOURCE_DIR = $(LOCALIZED_RESOURCE_DIR:G=aside) ;
3611                if ! $(ASIDE_LOCALIZED_RESOURCE_DIR) in $(PRODUCT_FILES) {
3612                    Mkdir $(ASIDE_LOCALIZED_RESOURCE_DIR) ;
3613                    ProductFileAside $(ASIDE_LOCALIZED_RESOURCE_DIR) ;
3614                }
3615            }
3616            LOCALIZED_RESOURCE = $(LOCALIZED_RESOURCE_DIR)$(/)$(2:BS) ;
3617            DEPENDS $(LOCALIZED_RESOURCE) : $(2) ;
3618            DEPENDS $(LOCALIZED_RESOURCE) : $(LOCALIZED_RESOURCE_DIR) ;
3619            PBXCp $(LOCALIZED_RESOURCE) : $(2) ;
3620            ProductFile $(LOCALIZED_RESOURCE) ;
3621            if $(INSTALLED_PRODUCT_ASIDES) = YES && $(DEPLOYMENT_LOCATION) = YES {
3622                ASIDE_LOCALIZED_RESOURCE = $(LOCALIZED_RESOURCE:G=aside) ;
3623                DEPENDS $(ASIDE_LOCALIZED_RESOURCE) : $(2) ;
3624                DEPENDS $(ASIDE_LOCALIZED_RESOURCE) : $(ASIDE_LOCALIZED_RESOURCE_DIR) ;
3625                PBXCp $(ASIDE_LOCALIZED_RESOURCE) : $(2) ;
3626                ProductFileAside $(ASIDE_LOCALIZED_RESOURCE) ;
3627            }
3628        }
3629    }
3630}
3631
3632actions CopyProjectFiles
3633{
3634    if [ -d $(2:Q) ]; then
3635        $(CP) -pRP $(2:Q) $(1:Q)
3636    elif [ -d $(2:S=.pbxproj:Q) ]; then
3637        $(CP) -pRP $(2:S=.pbxproj:Q) $(1:Q)
3638    fi
3639}
3640
3641# ProcessSources <product> <source files>
3642#
3643# Process individual source files and generate versioning stub,
3644# kernel module stub, and use Interfacer to make exports and glue
3645rule ProcessSources
3646{
3647    if build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) {
3648        local FILE ;
3649        if $(_BUILD_PHASING) = YES {
3650            PhaseTarget BUILD_PHASE : $(1) : DeriveAndCompileSources ;
3651            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
3652            BUILD_PHASE_PRODUCTS = ;
3653        }
3654        # copy project files if copying source
3655        if source in $(BUILD_COMPONENTS) {
3656            local PROJECT_FILES = $(SOURCE_ROOT)/$(PROJECT).pbproj ;
3657            local LEGACY_PROJECT_FILES = $(SOURCE_ROOT)/$(PROJECT).pbxproj ;
3658            local PROJECT_FILES_COPY = $(INSTALL_ROOT)/$(PROJECT).pbproj ;
3659            CopyProjectFiles $(PROJECT_FILES_COPY) : $(PROJECT_FILES) : $(LEGACY_PROJECT_FILES) ;
3660            DEPENDS $(PROJECT_FILES_COPY) : $(INSTALL_ROOT) ;
3661            Mkdir $(INSTALL_ROOT) ;
3662            DEPENDS $(PROJECT_FILES_COPY) : $(PROJECT_FILES) ;
3663            NOCARE $(PROJECT_FILES) ;
3664            DEPENDS $(PROJECT_FILES_COPY) : $(LEGACY_PROJECT_FILES) ;
3665            NOCARE $(LEGACY_PROJECT_FILES) ;
3666            BUILD_PHASE_PRODUCTS += $(PROJECT_FILES_COPY) ;
3667        }
3668        for FILE in $(2) {
3669            if $(_BUILD_PHASING) = YES {
3670                ProcessSource $(BUILD_PHASE) : $(FILE) ;
3671            }
3672            else {
3673                ProcessSource $(1) : $(FILE) ;
3674            }
3675        }
3676        # any build component implies handling: header cloning, versioning,
3677        # kernel module generation, and interfacer usage
3678        if build in $(BUILD_COMPONENTS) {
3679            # generate versioning system derived sources
3680            if $(VERSIONING_SYSTEM) {
3681                local RULE = VersioningSystem_$(VERSIONING_SYSTEM) ;
3682                $(RULE) $(1) ;
3683            }
3684            # generate kernel module or extension info source
3685            if $(KERNEL_MODULE) = YES {
3686                KernelModuleGeneratedSource $(1) ;
3687            }
3688            # generate interfacer derived sources
3689            if $(GENERATE_EXPORT_SETS_AND_GLUE) = YES {
3690                InterfacerExportSetsAndGlue $(1) ;
3691            }
3692        }
3693        # compilation depends on derivation
3694        # !!!:cmolick:20021108 this bloats most rebuilds
3695        for VARIANT in $(BUILD_VARIANTS) {
3696            if $(OBJECT_FILES_$(VARIANT)) && $(DERIVED_FILES) {
3697                DEPENDS $(OBJECT_FILES_$(VARIANT)) : $(DERIVED_FILES) ;
3698            }
3699        }
3700        # end of phase logic
3701        if $(_BUILD_PHASING) = YES {
3702            if $(BUILD_PHASE_PRODUCTS) {
3703                DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
3704                # product reference link must be in place before any compiles
3705                if $(PRODUCT_REFERENCE) {
3706                    DEPENDS $(BUILD_PHASE_PRODUCTS) : $(PRODUCT_REFERENCE) ;
3707                }
3708            }
3709            PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
3710        }
3711    }
3712}
3713
3714# ProcessSource <product> <source file>
3715#
3716# Call ProcessFile to process a source file with the correct
3717# extension-specific rule, and start header scanning.
3718rule ProcessSource
3719{
3720    # scan non-Java for header file references in any source
3721    if $(2:S) != ".java" {
3722        if $(ENABLE_HEADER_DEPENDENCIES) != NO && $(DO_HEADER_SCANNING_IN_JAM) = YES {
3723            HDRRULE on $(2) = ProcessC.HdrRule ;
3724            HDRSCAN on $(2) = $(HDRPATTERN) ;
3725        }
3726    }
3727    ProcessFile $(1) : $(2) ;
3728}
3729
3730rule ProcessFiles
3731{
3732    local FILE ;
3733    for FILE in $(2) {
3734        ProcessFile $(1) : $(FILE) ;
3735    }
3736}
3737
3738rule ProcessFile
3739{
3740    local SOURCE_COPY ;
3741    local SOURCE_SUBDIR ;
3742    if source in $(BUILD_COMPONENTS) {
3743        # copy to source location
3744        # make directory first if necessary
3745        if $(2:D) {
3746            SOURCE_SUBDIR = $(SOURCE_DIR)/$(2:D:G=) ;
3747            Mkdir $(SOURCE_SUBDIR) ;
3748            SOURCE_COPY = $(SOURCE_SUBDIR)/$(2:D=:G=) ;
3749            DEPENDS $(SOURCE_COPY) : $(SOURCE_SUBDIR) ;
3750            if $(_BUILD_PHASING) = YES {
3751                BUILD_PHASE_PRODUCTS += $(SOURCE_SUBDIR) ;
3752            }
3753        }
3754        else {
3755            SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ;
3756            DEPENDS $(SOURCE_COPY) : $(SOURCE_DIR) ;
3757            Mkdir $(SOURCE_DIR) ;
3758        }
3759        Cp $(SOURCE_COPY) : $(2) ;
3760        if $(_BUILD_PHASING) = YES {
3761            BUILD_PHASE_PRODUCTS += $(SOURCE_COPY) ;
3762        }
3763    }
3764    if build in $(BUILD_COMPONENTS) {
3765        # process file with rule based on the file suffix
3766        local EXCLUDED_OSS = $($(2)_EXCLUDED_OSS) ;
3767        local INCLUDED_OSS = $($(2)_INCLUDED_OSS) ;
3768        local RULE = $($(2:S)_RULE) ;
3769
3770        if $(EXCLUDED_OSS) && ( $(OS) in $(EXCLUDED_OSS) ) {
3771            # do nothing -- file excluded from build
3772        } else if $(INCLUDED_OSS) && ! ( $(OS) in $(INCLUDED_OSS) ) {
3773            # do nothing -- file excluded from build
3774        } else if $(RULE) {
3775            $(RULE) $(1) : $(2) ;
3776        } else {
3777            ECHO jam: warning: no rule for file $(2) ;
3778        }
3779    }
3780}
3781
3782# ProcessFrameworksAndLibraries <product> <linked files>
3783#
3784# Link object files and/or archive classes
3785rule ProcessFrameworksAndLibraries
3786{
3787    if ( build in $(BUILD_COMPONENTS) )
3788     && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) {
3789        if $(_BUILD_PHASING) = YES {
3790            PhaseTarget BUILD_PHASE : $(1) : LinkWithFrameworksAndLibraries ;
3791            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
3792            BUILD_PHASE_PRODUCTS = $(INNER_PRODUCT) ;
3793        }
3794        for VARIANT in $(BUILD_VARIANTS) {
3795	# add to linked files, including java .jar files even when there are no native object files!
3796        # This was never questioned, but the long comment was added after this
3797        # step was repeatedly moved outside this block by integration errors.
3798	LINKED_FILES_$(VARIANT) += $(2) ;
3799
3800        # only link if there are object files
3801        if $(OBJECT_FILES_$(VARIANT)) {
3802            if ! ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC ) {
3803                SINGLE_MODULE default = YES ;
3804            }
3805            # define products
3806            if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Library {
3807                # simple product
3808                INNER_PRODUCT default = $(1:G=) ;
3809                INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT)$(VARIANT_SUFFIX_$(VARIANT)) ;
3810                INNER_PRODUCT_LINK_$(VARIANT) default = ;
3811                ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
3812                if $(DEPLOYMENT_POSTPROCESSING) = YES {
3813                    SetModeOwnerAndGroup $(INNER_PRODUCT_$(VARIANT):G=ModeOwnerGroup) : $(INNER_PRODUCT_$(VARIANT)) ;
3814                }
3815            }
3816            else {
3817                if $(PRODUCT_TYPE) = Framework {
3818                    # versioned bundle
3819                    INNER_PRODUCT default = $(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:BG=) ;
3820                    INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
3821                    INNER_PRODUCT_LINK default = $(1:G=)$(/)$(1:BG=) ;
3822                    INNER_PRODUCT_LINK_$(VARIANT) default = $(INNER_PRODUCT_LINK)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
3823                    INNER_PRODUCT_LINK_PATH default = Versions$(/)Current$(/)$(1:BG=) ;
3824                    INNER_PRODUCT_LINK_PATH_$(VARIANT) default = $(INNER_PRODUCT_LINK_PATH)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
3825                }
3826                else {
3827                    # standard bundle
3828                    if $(BUNDLE_STYLE) = SHALLOW {
3829                        INNER_PRODUCT default = $(1:G=)$(/)$(1:BG=) ;
3830                    }
3831                    else {
3832                        INNER_PRODUCT default = $(1:G=)$(/)Contents$(/)MacOS$(/)$(1:BG=) ;
3833                    }
3834                    INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT)$(VARIANT_SUFFIX_$(VARIANT))$(TOOL_SUFFIX) ;
3835                    INNER_PRODUCT_LINK_$(VARIANT) default = ;
3836                }
3837                # inner product should always be ready before the link to it
3838                if $(INNER_PRODUCT_LINK_$(VARIANT)) {
3839                    DEPENDS $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
3840                }
3841                # inner product directory needed for all bundle types
3842                INNER_PRODUCT_DIR_$(VARIANT) = $(INNER_PRODUCT_$(VARIANT):D) ;
3843                if ! $(INNER_PRODUCT_DIR_$(VARIANT)) in $(PRODUCT_FILES) {
3844                    Mkdir $(INNER_PRODUCT_DIR_$(VARIANT)) ;
3845                    ProductFile $(INNER_PRODUCT_DIR_$(VARIANT)) ;
3846                }
3847                if $(INNER_PRODUCT_$(VARIANT)) && $(INNER_PRODUCT_DIR_$(VARIANT)) {
3848                    DEPENDS $(INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_DIR_$(VARIANT)) ;
3849                }
3850                # optionally make inner product dir aside
3851                if $(ASIDE_DIR) {
3852                    ASIDE_INNER_PRODUCT_DIR_$(VARIANT) = $(INNER_PRODUCT_DIR_$(VARIANT):G=aside) ;
3853                    if ! $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) in $(PRODUCT_FILES) {
3854                        Mkdir $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
3855                        ProductFileAside $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
3856                    }
3857                }
3858            }
3859            # Link inner product
3860            # By default single module linking is done for all but static libraries.
3861            # If using Interfacer, then a master object file is generated instead.
3862            # Static libraries have ranlib run on them after all other steps are complete.
3863            if $(GENERATE_HEADERS) = YES || $(GENERATE_EXPORT_SETS_AND_GLUE) = YES || $(CFM_BRIDGE) = YES {
3864                GENERATE_MASTER_OBJECT_FILE default = YES ;
3865            }
3866            if $(GENERATE_MASTER_OBJECT_FILE) = YES {
3867                SINGLE_MODULE = NO ;
3868            }
3869	    LINK_FILE_LIST_$(VARIANT) on $(INNER_PRODUCT_$(VARIANT)) = $(FILE_LIST_$(VARIANT)) ;
3870            if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
3871                # stand alone executable
3872                if $(GENERATE_MASTER_OBJECT_FILE) = YES {
3873                    ProcessSingleObjectLink $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : StandaloneExecutable ;
3874                }
3875                else {
3876                    StandaloneExecutable $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) ;
3877                }
3878            }
3879            else {
3880                if $(LIBRARY_STYLE) = STATIC && $(KERNEL_MODULE) != YES {
3881                    # static library
3882                    if $(GENERATE_MASTER_OBJECT_FILE) = YES {
3883                        ProcessSingleObjectLink $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : StaticLibrary ;
3884                    }
3885                    else {
3886                        StaticLibrary $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) ;
3887                    }
3888                }
3889                else {
3890                    # dylibs, bundles, frameworks, and kernel extensions
3891                    if $(GENERATE_MASTER_OBJECT_FILE) = YES {
3892                        ProcessSingleObjectLink $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) : DynamicLibrary ;
3893                    }
3894                    else {
3895                        DynamicLibrary $(INNER_PRODUCT_$(VARIANT)) : $(LINKED_FILES_$(VARIANT)) ;
3896                    }
3897                }
3898            }
3899            ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
3900            DEPENDS $(INNER_PRODUCT_$(VARIANT)) : $(TARGET_BUILD_DIR) ;
3901            # optionally copy inner product aside
3902            if $(ASIDE_DIR) {
3903                ASIDE_INNER_PRODUCT_$(VARIANT) = $(INNER_PRODUCT_$(VARIANT):G=aside) ;
3904                ProductFileAside $(ASIDE_INNER_PRODUCT_$(VARIANT)) ;
3905                PBXCp $(ASIDE_INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
3906                if $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) {
3907                    DEPENDS $(ASIDE_INNER_PRODUCT_$(VARIANT)) : $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
3908                }
3909            }
3910            # preen
3911            if $(DEPLOYMENT_POSTPROCESSING) = YES && $(UNSTRIPPED_PRODUCT) != YES {
3912                STRIPPED_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT_$(VARIANT):G=strip) ;
3913                DEPENDS $(STRIPPED_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
3914                if $(PRODUCT_TYPE) != Tool && $(PRODUCT_TYPE) != Application {
3915                    if ( $(PRODUCT_TYPE) = Bundle
3916                     || ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = BUNDLE ) )
3917                     && $(KERNEL_MODULE) != YES {
3918                        STRIPFLAGS default = -x ;
3919                    }
3920                    else {
3921                        STRIPFLAGS default = -S ;
3922                    }
3923                }
3924                if $(SEPARATE_STRIP) = YES
3925                 || ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC ) 
3926                 || ( $(STRIPFLAGS) && $(STRIPFLAGS) != -s && $(STRIPFLAGS) != -S && $(STRIPFLAGS) != -x ) {
3927                    # static libraries and products with nontrivial STRIPFLAGS get an explicit strip call
3928                    Strip $(STRIPPED_PRODUCT_$(VARIANT)) ;
3929                    if $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC {
3930                        Ranlib $(STRIPPED_PRODUCT_$(VARIANT)) ;
3931                    }
3932                    ProductFile $(STRIPPED_PRODUCT_$(VARIANT)) ;
3933                }
3934                else {
3935                    # all other products get -s or -S supplied to the linker depending on basic STRIPFLAGS usage
3936                    if $(STRIPFLAGS) = -S {
3937                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -Wl,-S ;
3938                    }
3939                    else {
3940                        if $(STRIPFLAGS) = -x {
3941                            FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -Wl,-x ;
3942                        }
3943                        else {
3944                            FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -s ;
3945                        }
3946                    }
3947                }
3948            }
3949            # make inner product symlink, if any
3950            if $(INNER_PRODUCT_LINK_$(VARIANT)) {
3951                SymLink $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
3952                ProductFile $(INNER_PRODUCT_LINK_$(VARIANT)) ;
3953                DEPENDS $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
3954                # optionally copy inner product link aside
3955                if $(ASIDE_DIR) {
3956                    ASIDE_INNER_PRODUCT_LINK_$(VARIANT) = $(INNER_PRODUCT_LINK_$(VARIANT):G=aside) ;
3957                    ProductFileAside $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) ;
3958                    SymLink $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
3959                    DEPENDS $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) : $(ASIDE_INNER_PRODUCT_$(VARIANT)) ;
3960                    DEPENDS $(ASIDE_INNER_PRODUCT_LINK_$(VARIANT)) : $(ASIDE_INNER_PRODUCT_DIR_$(VARIANT)) ;
3961                }
3962            }
3963            # edit symbols
3964            # Symbol editing is done directly with the product with linker flags if possible
3965            # unless a master object file is generated in which case that is edited prior to linking.
3966            if $(EXPORTED_SYMBOLS_FILE) && $(GENERATE_MASTER_OBJECT_FILE) != YES {
3967                if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application
3968                 || ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) != DYNAMIC ) {
3969                    # !!!:cmolick:20021025 edit using nmedit after the link
3970                    EditSymbols $(INNER_PRODUCT_$(VARIANT)) : $(EXPORTED_SYMBOLS_FILE) ;
3971                }
3972                else {
3973                    # !!!:cmolick:20021025 attempt to use linker flag
3974                    FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -Wl,-exported_symbols_list $(EXPORTED_SYMBOLS_FILE) ;
3975                    DEPENDS $(INNER_PRODUCT_$(VARIANT)) : $(EXPORTED_SYMBOLS_FILE) ;
3976                }
3977            }
3978            # static libraries must have ranlib run on them after all else
3979            if $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC {
3980                RANLIB_INNER_PRODUCT_$(VARIANT) default = $(INNER_PRODUCT_$(VARIANT):G=ranlib) ;
3981                # ranlib depends on link, strip, modeownergroup
3982                DEPENDS $(RANLIB_INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_$(VARIANT)) ;
3983                if $(STRIPPED_PRODUCT_$(VARIANT)) {
3984                    DEPENDS $(RANLIB_INNER_PRODUCT_$(VARIANT)) : $(STRIPPED_PRODUCT_$(VARIANT)) ;
3985                }
3986                ProductFile $(RANLIB_INNER_PRODUCT_$(VARIANT)) ;
3987            }
3988            if $(GENERATE_MASTER_OBJECT_FILE) != YES {
3989                # Add prelink flags and libraries to link flags if nonempty
3990                # Because -keep_private_externs was typically specific to prelinking, it is not carried over.
3991                for _PRELINK_FLAG in $(PRELINK_FLAGS) {
3992                    if $(_PRELINK_FLAG) != -keep_private_externs {
3993                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += $(_PRELINK_FLAG) ;
3994                    }
3995                }
3996                for _PRELINK_LIB in $(PRELINK_LIBS) {
3997                    if $(_PRELINK_LIB) != -keep_private_externs {
3998                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += $(_PRELINK_LIB) ;
3999                    }
4000                }
4001            }
4002            # Basic link options determine if this is kext, bundle, or library
4003            if $(KERNEL_MODULE) = YES {
4004                MODULE_OBJECT_PATH = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(MODULE_OBJECT_FILE_$(VARIANT)) ;
4005                FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -static -nostdlib -r -lkmodc++ "$(MODULE_OBJECT_PATH)" -lkmod -lcc_kext ;
4006            }
4007            else {
4008                # Options for products that are not bundles or static libraries
4009                if $(PRODUCT_TYPE) != Bundle
4010                 && ! ( $(PRODUCT_TYPE) = Library && ( $(LIBRARY_STYLE) = BUNDLE || $(LIBRARY_STYLE) = STATIC ) ) {
4011                    if $(PREBINDING) = YES {
4012                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -prebind ;
4013                    }
4014                    if $(SINGLE_MODULE) = YES && $(PRODUCT_TYPE) != Tool && $(PRODUCT_TYPE) != Application {
4015                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -Wl,-single_module ;
4016                    }
4017                }
4018                # Options relating to the type of library desired as output
4019                if $(PRODUCT_TYPE) = Bundle
4020                 || ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = BUNDLE ) {
4021                    FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -bundle ;
4022                } else {
4023                    if $(PRODUCT_TYPE) = Framework
4024                     || ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = DYNAMIC ) {
4025                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -dynamiclib ;
4026                    }
4027                    else {
4028                        if $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = STATIC {
4029                            FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -static ;
4030                        }
4031                    }
4032                }
4033                # Dynamic library link options set version and installed name
4034                if ( $(PRODUCT_TYPE) = Library && $(LIBRARY_STYLE) = DYNAMIC )
4035                 || $(PRODUCT_TYPE) = Framework {
4036                    if $(DYLIB_COMPATIBILITY_VERSION) {
4037                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -compatibility_version "$(DYLIB_COMPATIBILITY_VERSION)" ;
4038                    }
4039                    if $(DYLIB_CURRENT_VERSION) {
4040                        FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -current_version "$(DYLIB_CURRENT_VERSION)" ;
4041                    }
4042                    if ! $(DYLIB_INSTALL_NAME_BASE) {
4043                        if $(INSTALL_PATH) {
4044                            DYLIB_INSTALL_NAME_BASE = $(INSTALL_PATH) ;
4045                        }
4046                    }
4047                    if $(DYLIB_INSTALL_NAME_BASE) {
4048                        DYLIB_INSTALLED_NAME_$(VARIANT) default = $(DYLIB_INSTALL_NAME_BASE)$(/)$(INNER_PRODUCT_$(VARIANT):G=) ;
4049                        INSTALLED_NAME_FLAG on $(INNER_PRODUCT_$(VARIANT)) = -install_name \"`echo \"$(DYLIB_INSTALLED_NAME_$(VARIANT))\" | $(SED) 's!//*!/!g'`\" ;
4050                    }
4051                }
4052            }
4053            # reduce warnings for multiarchitecture builds
4054            if $(WARNING_LDFLAGS) && ( $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application ) {
4055                FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += $(WARNING_LDFLAGS) ;
4056            }
4057            # profiling link option
4058            if $(PROFILING_CODE) = YES {
4059                FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += -pg ;
4060            }
4061            # other link options
4062            if $(OTHER_LDFLAGS_$(VARIANT)) {
4063                FLAGS.o on $(INNER_PRODUCT_$(VARIANT)) += $(OTHER_LDFLAGS_$(VARIANT)) ;
4064            }
4065        }
4066        else {
4067            # no object files present, indicating pure Java
4068            if $(PRODUCT_TYPE) = Framework {
4069                if $(CURRENT_VERSION_LINK) {
4070                    INNER_PRODUCT_$(VARIANT) default = $(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:B)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
4071                    INNER_PRODUCT_LINK_$(VARIANT) default = $(1:G=)$(/)$(1:BG=)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
4072                    INNER_PRODUCT_LINK_PATH_$(VARIANT) default = Versions$(/)Current$(/)$(1:BG=)$(VARIANT_SUFFIX_$(VARIANT))$(DYNAMIC_LIBRARY_SUFFIX) ;
4073                    # inner product link
4074                    SymLink $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
4075                    ProductFile $(INNER_PRODUCT_LINK_$(VARIANT)) ;
4076                    NOUPDATE $(INNER_PRODUCT_LINK_$(VARIANT)) ;
4077                }
4078                else  {
4079                    INNER_PRODUCT_$(VARIANT) default = $(1:G=)$(/)$(1:BG=)_$(VARIANT)$(DYNAMIC_LIBRARY_SUFFIX) ;
4080                }
4081                ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
4082                if $(DYLIB_COMPATIBILITY_VERSION) {
4083                    DYLIB_VERSION_FLAGS on $(INNER_PRODUCT_$(VARIANT)) += -compatibility_version "$(DYLIB_COMPATIBILITY_VERSION)" ;
4084                }
4085                else {
4086                    DYLIB_VERSION_FLAGS on $(INNER_PRODUCT_$(VARIANT)) += -compatibility_version 1 ;
4087                }
4088                if $(DYLIB_CURRENT_VERSION) {
4089                    DYLIB_VERSION_FLAGS on $(INNER_PRODUCT_$(VARIANT)) += -current_version "$(DYLIB_CURRENT_VERSION)" ;
4090                }
4091                else {
4092                    DYLIB_VERSION_FLAGS on $(INNER_PRODUCT_$(VARIANT)) += -current_version 1 ;
4093                }
4094                if ! $(DYLIB_INSTALL_NAME_BASE) {
4095                    if $(INSTALL_PATH) {
4096                        DYLIB_INSTALL_NAME_BASE = $(INSTALL_PATH) ;
4097                    }
4098                }
4099                GenerateFrameworkStub $(INNER_PRODUCT_$(VARIANT)) ;
4100                INNER_PRODUCT_DIR = $(INNER_PRODUCT_$(VARIANT):D) ;
4101                if ! $(INNER_PRODUCT_DIR) in $(PRODUCT_FILES) {
4102                    Mkdir $(INNER_PRODUCT_DIR) ;
4103                    ProductFile $(INNER_PRODUCT_DIR) ;
4104                    DEPENDS $(INNER_PRODUCT_$(VARIANT)) : $(INNER_PRODUCT_DIR) ;
4105                }
4106                if $(INNER_PRODUCT_LINK_$(VARIANT)) {
4107                    SymLink $(INNER_PRODUCT_LINK_$(VARIANT)) : $(INNER_PRODUCT_LINK_PATH_$(VARIANT)) ;
4108                    NOUPDATE $(INNER_PRODUCT_LINK_$(VARIANT)) ; 
4109                    ProductFile $(INNER_PRODUCT_LINK_$(VARIANT)) ;
4110                }
4111            }
4112        }
4113        # Java processing compatible with the presense of object files
4114        if $(COMPILED_JAVA) {
4115            # provide stub executable if necessary
4116            if $(JAVA_ONLY) = YES {
4117                INNER_PRODUCT_$(VARIANT) default = $(1:G=)$(/)Contents$(/)MacOS$(/)$(1:BG=) ;
4118                # must first make subfolder and depend on that
4119                INNER_PRODUCT_SUBDIR = $(INNER_PRODUCT_$(VARIANT):D) ;
4120                if ! $(INNER_PRODUCT_SUBDIR) in $(PRODUCT_FILES) {
4121                    Mkdir $(INNER_PRODUCT_SUBDIR) ;
4122                    ProductFile $(INNER_PRODUCT_SUBDIR) ;
4123                }
4124                Cp $(INNER_PRODUCT_$(VARIANT)) : $(JAVA_APP_STUB) ;
4125                ProductFile $(INNER_PRODUCT_$(VARIANT)) ;
4126            }
4127        }
4128        # Add jar/zip files that are in the link phase to the classpath
4129        if $(OTHER_JAVA_CLASS_PATH) {
4130            export LINKED_CLASS_ARCHIVES = :"$(OTHER_JAVA_CLASS_PATH)" ;
4131        }
4132        else {
4133            export LINKED_CLASS_ARCHIVES = "" ;
4134        }
4135        for JAVA_CLASS_SEARCH_PATH in $(JAVA_CLASS_SEARCH_PATHS) {
4136            LINKED_CLASS_ARCHIVES = "$(LINKED_CLASS_ARCHIVES):$(JAVA_CLASS_SEARCH_PATH)" ;
4137        }
4138        local ARCHIVE ;
4139        
4140        for ARCHIVE in $(LINKED_FILES_$(VARIANT)) {
4141            switch $(ARCHIVE) {
4142            case *.framework :
4143                local FW_SUBDIR ;
4144                for FW_SUBDIR in $(JAVA_FRAMEWORK_RESOURCES_DIRS) {
4145                    LINKED_CLASS_ARCHIVES = $(LINKED_CLASS_ARCHIVES):$(ARCHIVE)$(/)$(FW_SUBDIR)$(/)Java ;
4146                    JAVA_FRAMEWORK_JARS += $(ARCHIVE)$(/)$(FW_SUBDIR)$(/)Java ;
4147                }
4148            case *.jar :
4149                LINKED_CLASS_ARCHIVES = $(LINKED_CLASS_ARCHIVES):$(ARCHIVE) ;
4150                if Merge in $($(ARCHIVE)_ATTRIBUTES) {
4151                    # merge archive contents by unpacking them into hierarchy
4152                    local DESTINATION_TARGET = $(CLASS_FILE_DIR:G=Unarchive$(ARCHIVE)) ;
4153                    NOTFILE $(DESTINATION_TARGET) ;
4154                    DEPENDS $(DESTINATION_TARGET) : $(JAVA_COMPILE_TARGET) ;
4155                    if $(MERGED_ARCHIVES) {
4156                        MERGED_ARCHIVES += $(DESTINATION_TARGET) ;
4157                    }
4158                    else {
4159                        MERGED_ARCHIVES = $(DESTINATION_TARGET) ;
4160                    }
4161                    Unarchive $(DESTINATION_TARGET) : $(ARCHIVE) ;
4162                }
4163            case *.zip :
4164                LINKED_CLASS_ARCHIVES = $(LINKED_CLASS_ARCHIVES):$(ARCHIVE) ;
4165                if Merge in $($(ARCHIVE)_ATTRIBUTES) {
4166                    # merge archive contents by unpacking them into hierarchy
4167                    local DESTINATION_TARGET = $(CLASS_FILE_DIR:G=Unarchive$(ARCHIVE)) ;
4168                    NOTFILE $(DESTINATION_TARGET) ;
4169                    DEPENDS $(DESTINATION_TARGET) : $(JAVA_COMPILE_TARGET) ;
4170                    if $(MERGED_ARCHIVES) {
4171                        MERGED_ARCHIVES += $(DESTINATION_TARGET) ;
4172                    }
4173                    else {
4174                        MERGED_ARCHIVES = $(DESTINATION_TARGET) ;
4175                    }
4176                    Unarchive $(DESTINATION_TARGET) : $(ARCHIVE) ;
4177                }
4178            }
4179        }
4180        # generate an archive if there are compiled or merged classes
4181        if $(COMPILED_JAVA) || $(MERGED_ARCHIVES) || $(COPIED_JAVA_RESOURCES) {
4182	    if $(JAVA_ARCHIVE_CLASSES) != NO {
4183	        # java archive suffix applies to applications and frameworks
4184	        if $(JAVA_ARCHIVE_TYPE) = JAR {
4185		    CLASS_ARCHIVE_SUFFIX default = .jar ;
4186	        }
4187	        else {
4188		    if $(JAVA_ARCHIVE_TYPE) = ZIP {
4189		        CLASS_ARCHIVE_SUFFIX default = .zip ;
4190		    }
4191	        }
4192	        if ( $(PRODUCT_TYPE) = Bundle
4193                  || $(PRODUCT_TYPE) = Application
4194                  || $(PRODUCT_TYPE) = Framework ) {
4195                    # Assume bundled products with object files are Cocoa
4196		    CLASS_ARCHIVE default = $(RESOURCE_DIR)$(/)Java$(/)$(1:B)$(CLASS_ARCHIVE_SUFFIX) ;
4197                    ProductFile $(CLASS_ARCHIVE) ;
4198	        }
4199	        else {
4200                    CLASS_ARCHIVE default = $(1:B:G=)$(CLASS_ARCHIVE_SUFFIX) ;
4201                    # It is critical for the class archive to be declared
4202                    # a product file before any symlinks to it are made
4203                    # which would conditionally involved declaring the
4204                    # symbolic link content to not be a file.
4205                    ProductFile $(CLASS_ARCHIVE) ;
4206                    # ref. w/suffix for tool or library in deployment location
4207                    if $(DEPLOYMENT_LOCATION) = YES {
4208                        _ARCHIVE_REFERENCE default = $(BUILT_PRODUCTS_DIR:G=ArchiveRef)$(/)$(CLASS_ARCHIVE) ;
4209                        SymLink $(_ARCHIVE_REFERENCE) : $(CLASS_ARCHIVE) ;
4210                        DEPENDS $(_ARCHIVE_REFERENCE) : $(BUILT_PRODUCTS_DIR) ;
4211                        DEPENDS $(1) : $(_ARCHIVE_REFERENCE) ;
4212                    }
4213                    # Make a link to the product without extension
4214                    # to allow for references missing extension.
4215                    _SUFFIX_FREE_ARCHIVE_REFERENCE = $(BUILT_PRODUCTS_DIR:G=SuffixFreeArchiveRef)$(/)$(CLASS_ARCHIVE:S=) ;
4216                    SymLink $(_SUFFIX_FREE_ARCHIVE_REFERENCE) : $(CLASS_ARCHIVE) ;
4217                    DEPENDS $(_SUFFIX_FREE_ARCHIVE_REFERENCE) : $(BUILT_PRODUCTS_DIR) ;
4218                    DEPENDS $(1) : $(_SUFFIX_FREE_ARCHIVE_REFERENCE) ;
4219    	        }
4220                # class archive depends on target build dir
4221                DEPENDS $(CLASS_ARCHIVE) : $(TARGET_BUILD_DIR) ;
4222                # class archive depends on class archive dir (if defined)
4223                CLASS_ARCHIVE_DIR = $(CLASS_ARCHIVE:D:G=) ;
4224                if $(CLASS_ARCHIVE_DIR) && ! $(CLASS_ARCHIVE_DIR) in $(PRODUCT_FILES) {
4225                    Mkdir $(CLASS_ARCHIVE_DIR) ;
4226                    ProductFile $(CLASS_ARCHIVE_DIR) ;
4227                }
4228	        # class files unknown, so archive depends on java compile log
4229	        ClassArchive $(CLASS_ARCHIVE) : $(CLASS_FILE_DIR) ;
4230	        if $(MERGED_ARCHIVES) {
4231                    DEPENDS $(CLASS_ARCHIVE) : $(MERGED_ARCHIVES) ;
4232                }
4233                if $(COMPILED_JAVA) {
4234                    DEPENDS $(CLASS_ARCHIVE) : $(JAVA_COMPILE_TARGET) ;
4235                }
4236                if $(COPIED_JAVA_RESOURCES) {
4237                    DEPENDS $(CLASS_ARCHIVE) : $(COPIED_JAVA_RESOURCES) ;
4238                }
4239	    }
4240            if $(JAVA_ARCHIVE_CLASSES) != YES {
4241                # !!!:cmolick:20020123 product class file dir not always made?!
4242                Mkdir $(PRODUCT_CLASS_FILE_DIR) ;
4243                ProductFile $(PRODUCT_CLASS_FILE_DIR) ;
4244                Ditto $(PRODUCT_CLASS_FILE_DIR) : $(CLASS_FILE_DIR) ;
4245	        if $(MERGED_ARCHIVES) {
4246                    DEPENDS $(PRODUCT_CLASS_FILE_DIR) : $(MERGED_ARCHIVES) ;
4247                }
4248                else {
4249                    DEPENDS $(PRODUCT_CLASS_FILE_DIR) : $(JAVA_COMPILE_TARGET) ;
4250                }
4251            }
4252        }
4253	# Export the path to the inner product, if any.
4254	export INNER_PRODUCT_SUBPATH = $(INNER_PRODUCT:G=) ;
4255	# Build phasing bookkeeping
4256        if $(_BUILD_PHASING) = YES {
4257            if $(BUILD_PHASE_PRODUCTS) {
4258                DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
4259            }
4260            PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
4261        }
4262    }
4263    }
4264}
4265
4266rule ProcessFrameworkOrLibrary
4267{
4268    for VARIANT in $(BUILD_VARIANTS) {
4269    LINKED_FILES_$(VARIANT) += $(2) ;
4270    }
4271}
4272
4273# ProcessRezFiles <product> <rez and resmerger input files>
4274#
4275# Processes Rez and ResMerger input files, or if there are none
4276# and type and creator are set uses SetFile to set type and creator.
4277rule ProcessRezFiles
4278{
4279    if ( build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) )
4280     && ( $(ARCHS) || $(NULL_BUILD_IF_NO_VALID_ARCH) != YES ) {
4281        local FILE ;
4282        if $(_BUILD_PHASING) = YES {
4283            PhaseTarget BUILD_PHASE : $(1) : RezResourceManagerFiles ;
4284            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
4285            BUILD_PHASE_PRODUCTS = ;
4286        }
4287        if $(2) {
4288            for FILE in $(2) {
4289                if $(_BUILD_PHASING) = YES {
4290                    ProcessRezFile $(BUILD_PHASE) : $(FILE) ;
4291                }
4292                else {
4293                    ProcessRezFile $(1) : $(FILE) ;
4294                }
4295            }
4296        }
4297        else {
4298            if ( $(MACOS_TYPE) || $(MACOS_CREATOR) ) && $(REZ_EXECUTABLE) = YES {
4299                local RESOURCE_FORK = $(INNER_PRODUCT:G=ResourceFork) ;
4300                if ! $(INNER_PRODUCT) in $(PRESERVE_RESOURCES) {
4301                     PRESERVE_RESOURCES += $(INNER_PRODUCT) ;
4302                }
4303                ProductFile $(RESOURCE_FORK) ;
4304                if $(ALWAYS_REZ) = YES {
4305                    ALWAYS $(RESOURCE_FORK) ;
4306                }
4307                SetFile $(RESOURCE_FORK) ;
4308            }
4309        }
4310        if $(_BUILD_PHASING) = YES {
4311            if $(BUILD_PHASE_PRODUCTS) {
4312                DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
4313            }
4314            PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
4315        }
4316    }
4317}
4318
4319# ProcessRezFile <product or phase> <rez or resmerger input file>
4320#
4321# Sets up the compile of one Rez or ResMerger input file.
4322# RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR	folder for resource collectors
4323# RESOURCE_MANAGER_RESOURCE_COLLECTOR		resource collector
4324# RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)	localized collector
4325# RESOURCE_MANAGER_RESOURCE			final resource destination
4326# RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR	localized final folder
4327# RESOURCE_MANAGER_RESOURCE_$(REGION)		localized final destination
4328rule ProcessRezFile
4329{
4330    if source in $(BUILD_COMPONENTS) {
4331        local REZ_SOURCE_COPY ;
4332        local REZ_SOURCE_DIR ;
4333        # make directory first if necessary
4334        if $(2:D) {
4335            REZ_SOURCE_DIR = $(SOURCE_DIR)/$(2:D:G=) ;
4336            Mkdir $(REZ_SOURCE_DIR) ;
4337            REZ_SOURCE_COPY = $(REZ_SOURCE_DIR)/$(2:D=:G=) ;
4338            DEPENDS $(REZ_SOURCE_COPY) : $(REZ_SOURCE_DIR) ;
4339        }
4340        else {
4341            REZ_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ;
4342            DEPENDS $(REZ_SOURCE_COPY) : $(SOURCE_DIR) ;
4343            Mkdir $(SOURCE_DIR) ;
4344        }
4345        # copy rez files to source location
4346        Cp $(REZ_SOURCE_COPY) : $(2) ;
4347        if $(_BUILD_PHASING) = YES {
4348            BUILD_PHASE_PRODUCTS += $(REZ_SOURCE_COPY) ;
4349        }
4350    }
4351    if build in $(BUILD_COMPONENTS) {
4352        local REGION = $($(2)_REGION) ;
4353        # scan for header files
4354        if $(ENABLE_HEADER_DEPENDENCIES) != NO && $(DO_HEADER_SCANNING_IN_JAM) = YES {
4355            HDRRULE on $(2) = ProcessC.HdrRule ;
4356            HDRSCAN on $(2) = $(HDRPATTERN) ;
4357        }
4358        # all resources require a folder to hold any collector
4359        if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) {
4360            RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR = $(TEMP_DIR)$(/)ResourceManagerResources ;
4361            Mkdir $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ;
4362            ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ;
4363        }
4364        if $(REZ_EXECUTABLE) = YES {
4365            # Optionally accumulate ResourceManager resources
4366            # on a resource fork of the executable
4367            PRESERVE_RESOURCES += $(INNER_PRODUCT) ;
4368            if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) {
4369                RESOURCE_MANAGER_RESOURCE_COLLECTOR = $(INNER_PRODUCT:BG=ResourceManagerResourceCollector) ;
4370                DEPENDS $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ;
4371            }
4372            if $(2:S) = ".r" {
4373                RezCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ;
4374            } else {
4375                ResMergerCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ;
4376            }
4377            # The collector must be declared a product file
4378            # only after the first Collector rule invocation
4379            # to correctly initialize the collector.
4380            ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ;
4381            # location must be set after ProductFile invocation
4382            LOCATE on $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) = $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ;
4383            if ! $(RESOURCE_MANAGER_RESOURCE) {
4384                RESOURCE_MANAGER_RESOURCE = $(INNER_PRODUCT:G=ResourceManagerResource) ;
4385                ProductFile $(RESOURCE_MANAGER_RESOURCE) ;
4386                ResMergerProduct $(RESOURCE_MANAGER_RESOURCE) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ;
4387            }
4388        }
4389        else {
4390            # By default ResourceManager resources are stored in data forks
4391            # as Resources/<product>.rsrc files if non localized, or 
4392            # Resources/<region>.lproj/Localized.rsrc files if localized.
4393            if $(REGION) {
4394                # localized resource collector
4395                if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) {
4396                    RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION) = $(REGION).rsrc ;
4397                    DEPENDS $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ;
4398                }
4399                if $(2:S) = ".r" {
4400                    RezCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) : $(2) ;
4401                } else {
4402                    ResMergerCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) : $(2) ;
4403                }
4404                # collector declared product after first Collector rule invocation
4405                ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) ;
4406                # set location only after ProductFile invocation
4407                LOCATE on $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) = $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ;
4408                # localized resource folder
4409                RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR = $(RESOURCE_DIR)$(/)$(REGION).lproj ;
4410                Mkdir $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ;
4411                ProductFile $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ;
4412                # localized resource
4413                if ! $(RESOURCE_MANAGER_RESOURCE_$(REGION)) {
4414                    RESOURCE_MANAGER_RESOURCE_$(REGION) = $(RESOURCE_DIR)$(/)$(REGION).lproj$(/)Localized.rsrc ;
4415                    ProductFile $(RESOURCE_MANAGER_RESOURCE_$(REGION)) ;
4416                    # folder for localized resource
4417                    RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR = $(RESOURCE_DIR)$(/)$(REGION).lproj ;
4418                    Mkdir $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ;
4419                    ProductFile $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ;
4420                    DEPENDS $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) : $(RESOURCE_DIR) ;
4421                    # get product from collector
4422                    ResMergerProduct $(RESOURCE_MANAGER_RESOURCE_$(REGION)) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_$(REGION)) ;
4423                    DEPENDS $(RESOURCE_MANAGER_RESOURCE_$(REGION)) : $(RESOURCE_MANAGER_RESOURCE_$(REGION)_DIR) ;
4424                }
4425            }
4426            else {
4427                # nonlocalized resource collector
4428                if ! $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) {
4429                    RESOURCE_MANAGER_RESOURCE_COLLECTOR = $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR)$(/)$(1:S=.rsrc:G=) ;
4430                    DEPENDS $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR_DIR) ;
4431                }
4432                if $(2:S) = ".r" {
4433                    RezCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ;
4434                } else {
4435                    ResMergerCollector $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) : $(2) ;
4436                }
4437                # collector declared product after Collector rule invocation
4438                ProductFile $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ;
4439                # nonlocalized resource
4440                if ! $(RESOURCE_MANAGER_RESOURCE) {
4441                    RESOURCE_MANAGER_RESOURCE = $(RESOURCE_DIR)$(/)$(1:S=.rsrc:G=) ;
4442                    ProductFile $(RESOURCE_MANAGER_RESOURCE) ;
4443                    # get product from collector
4444                    ResMergerProduct $(RESOURCE_MANAGER_RESOURCE) : $(RESOURCE_MANAGER_RESOURCE_COLLECTOR) ;
4445                    DEPENDS $(RESOURCE_MANAGER_RESOURCE) : $(RESOURCE_DIR) ;
4446                    if $(ALWAYS_REZ) = YES {
4447                        ALWAYS $(RESOURCE_MANAGER_RESOURCE) ;
4448                    }
4449                }
4450            }
4451
4452            if ! $(RESOURCE_DIR) in $(PRODUCT_FILES) {
4453                Mkdir $(RESOURCE_DIR) ;
4454                ProductFile $(RESOURCE_DIR) ;
4455            }
4456        }
4457        # create accompanying link in the case of versioned frameworks
4458        if $(RESOURCE_LINK) 
4459         && ! $(RESOURCE_LINK) in $(PRODUCT_FILES) {
4460            SymLink $(RESOURCE_LINK) : $(RESOURCE_LINK_PATH) ;
4461            ProductFile $(RESOURCE_LINK) ;
4462        }
4463    }
4464}
4465
4466rule ProcessScriptBuildPhaseFiles
4467{
4468    if source in $(BUILD_COMPONENTS) || headers in $(BUILD_COMPONENTS) || build in $(BUILD_COMPONENTS) {
4469        if $(_BUILD_PHASING) = YES {
4470            PhaseTarget BUILD_PHASE : $(1) : Script ;
4471            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
4472            BUILD_PHASE_PRODUCTS = ;
4473        }
4474        if build in $(BUILD_COMPONENTS)
4475         || ( headers in $(BUILD_COMPONENTS) && $(INSTALLHDRS_SCRIPT_PHASE) = YES ) {
4476            SEARCH on $(2) = $(SOURCE_ROOT) $(TEMP_ROOT) ;
4477            PHASE_SCRIPT_EXECUTION = $(2:G=Execution) ;
4478            NOTFILE $(PHASE_SCRIPT_EXECUTION) ;
4479            ALWAYS $(PHASE_SCRIPT_EXECUTION) ;
4480            DEPENDS $(1) : $(PHASE_SCRIPT_EXECUTION) ;
4481            PhaseScriptExecution $(PHASE_SCRIPT_EXECUTION) : $(2) ;
4482            if ! $(PHASE_SCRIPT_EXECUTION) in $(PRODUCT_FILES) {
4483                if $(_BUILD_PHASING) = YES {
4484                    BUILD_PHASE_PRODUCTS += $(PHASE_SCRIPT_EXECUTION) ;
4485                }
4486            }
4487        }
4488        if $(_BUILD_PHASING) = YES {
4489            if $(BUILD_PHASE_PRODUCTS) {
4490                DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
4491                if $(PREVIOUS_BUILD_PHASE) {
4492                    # !!!:cmolick:20021119 depend on previous phase or products to get timing right?
4493                    DEPENDS $(BUILD_PHASE_PRODUCTS) : $(PREVIOUS_BUILD_PHASE) ;
4494                }
4495            }
4496            PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
4497        }
4498    }
4499}
4500
4501rule PhaseScriptExecution
4502{
4503    JAMSHOULDSETENV on $(1) = YES ;
4504    DEPENDS $(1) : $(2) ;
4505}
4506actions exportvars PhaseScriptExecution
4507{
4508    echo "=== Script ==="
4509    cat $(2:Q)
4510    echo "--- Output ---"
4511    $(2:Q)
4512    _result=$?
4513    echo "=== Exit code: ${_result} ==="
4514    exit ${_result}
4515}
4516
4517rule ProcessCopyFiles
4518{
4519    if $(_BUILD_PHASING) = YES {
4520        PhaseTarget BUILD_PHASE : $(1) : CopyFiles ;
4521        BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
4522        BUILD_PHASE_PRODUCTS = ;
4523    }
4524    if build in $(BUILD_COMPONENTS)
4525     || ( headers in $(BUILD_COMPONENTS) && $(INSTALLHDRS_COPY_PHASE) = YES ) {
4526        SEARCH on $(2) = $(SOURCE_ROOT) ;
4527        for FILE in $(2) {
4528            ProcessCopyFile $(1) : $(FILE) : $(COPYFILES_DESTINATION_PATH) ;
4529        }
4530    }
4531    if $(_BUILD_PHASING) = YES {
4532        if $(BUILD_PHASE_PRODUCTS) {
4533            DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
4534        }
4535        PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
4536    }
4537}
4538
4539rule ProcessCopyFile
4540{
4541    if source in $(BUILD_COMPONENTS) {
4542        local SOURCE_COPY ;
4543        local SOURCE_SUBDIR ;
4544        # copy files to source location
4545        # make directory first if necessary
4546        if $(2:D) {
4547            SOURCE_SUBDIR = $(2:D:G=SourceCopy) ;
4548            Mkdir $(SOURCE_SUBDIR) ;
4549            SOURCE_COPY = $(SOURCE_SUBDIR)/$(2:D=:G=) ;
4550            DEPENDS $(SOURCE_COPY) : $(SOURCE_SUBDIR) ;
4551        }
4552        else {
4553            SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ;
4554            DEPENDS $(SOURCE_COPY) : $(SOURCE_DIR) ;
4555            Mkdir $(SOURCE_DIR) ;
4556        }
4557        Cp $(SOURCE_COPY) : $(2) ;
4558        if $(_BUILD_PHASING) = YES {
4559            BUILD_PHASE_PRODUCTS += $(SOURCE_COPY) ;
4560        }
4561    }
4562    if build in $(BUILD_COMPONENTS) || headers in $(BUILD_COMPONENTS) {
4563        local DESTINATION_DIR = $(3) ;
4564        if ! $(DESTINATION_DIR) in $(PRODUCT_FILES) {
4565            Mkdir $(DESTINATION_DIR) ;
4566            ProductFile $(DESTINATION_DIR) ;
4567        }
4568        local DESTINATION_BASE = $(2:BS) ;
4569        local DESTINATION default = $(DESTINATION_DIR)$(/)$(DESTINATION_BASE) ;
4570        DEPENDS $(DESTINATION) : $(DESTINATION_DIR) ;
4571        DEPENDS $(DESTINATION) : $(2) ;
4572        ProductFile $(DESTINATION) ;
4573        LOCATE on $(DESTINATION) = $(DESTINATION_DIR) ;
4574        PBXCp $(DESTINATION) : $(2) ;
4575    }
4576}
4577
4578rule ProcessJavaResourceFiles
4579{
4580    if build in $(BUILD_COMPONENTS) {
4581        local FILE ;
4582        if $(_BUILD_PHASING) = YES {
4583            PhaseTarget BUILD_PHASE : $(1) : JavaArchiveFiles ;
4584            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
4585            BUILD_PHASE_PRODUCTS = ;
4586        }
4587        LOCATE on $(2) = $(SOURCE_ROOT) ;
4588        for FILE in $(2) {
4589            ProcessJavaResourceFile $(1) : $(FILE) : $(CLASS_FILE_DIR) ;
4590        }
4591        if $(_BUILD_PHASING) = YES {
4592            if $(BUILD_PHASE_PRODUCTS) {
4593                DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
4594            }
4595            PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
4596        }
4597    }
4598}
4599
4600rule ProcessJavaResourceFile
4601{
4602    local ARCHIVE_PATH ;
4603    local ARCHIVE_DESTINATION ;
4604    local ARCHIVE_DESTINATION_FILE ;
4605
4606    # copy any other reference - formulate destination first
4607    if $($(2)_JAVA_ARCHIVE_SUBDIR) {
4608        ARCHIVE_DESTINATION_DIR = $(3)$(/)$($(2)_JAVA_ARCHIVE_SUBDIR) ;
4609    }
4610    else {
4611        # if there's no setting, just copy the file to the root of the archive.
4612        ARCHIVE_DESTINATION_DIR = $(3) ;
4613    }
4614    ARCHIVE_DESTINATION_FILE = $(ARCHIVE_DESTINATION_DIR)/$(2:BS) ;
4615    Mkdir $(ARCHIVE_DESTINATION_DIR) ;
4616    ProductFile $(ARCHIVE_DESTINATION_DIR) ;
4617    PBXCp $(ARCHIVE_DESTINATION_FILE:G=populated) : $(2) ;
4618    ProductFile $(ARCHIVE_DESTINATION_FILE:G=populated) ;
4619    DEPENDS $(ARCHIVE_DESTINATION_FILE:G=populated) : $(ARCHIVE_DESTINATION_DIR) ;
4620
4621    # copied content depends on source
4622    DEPENDS $(ARCHIVE_DESTINATION_FILE) : $(2) ;
4623    # set contents present for archival flag by making COPIED_JAVA_RESOURCES nonempty
4624    COPIED_JAVA_RESOURCES += $(2) ;
4625}
4626
4627# Following rules are used by ProcessSource
4628# to attend to specific types of source file.
4629
4630rule ProcessUsingJavaCompiler
4631{
4632    # Compile .java to .class files using javac or jikes
4633    # Because what class files will be generated by the java compiler
4634    # can't be known in advance, an abstract target is used for this step.
4635    if $(JAVA_COMPILE_TARGET) = "" {
4636        JAVA_COMPILE_TARGET = $(1:G=CompileJava) ;
4637        NOTFILE $(JAVA_COMPILE_TARGET) ;
4638        DEPENDS $(1) : $(JAVA_COMPILE_TARGET) ;
4639        DEPENDS $(JAVA_COMPILE_TARGET) : $(CLASS_FILE_DIR) ;
4640        # bridge derived java to be generated and compiled first
4641        if $(JAVA_BRIDGE_COMPILE_TARGET) {
4642            DEPENDS $(JAVA_COMPILE_TARGET) : $(JAVA_BRIDGE_COMPILE_TARGET) ;
4643        }
4644    }
4645    
4646    export JAVA_SOURCE_PATH default = $(SOURCE_ROOT)$(/)$(JAVA_SOURCE_SUBDIR) ;
4647
4648    # start with the compiler-specific flags.
4649    if $(JAVA_COMPILER:B) = jikes {
4650        export JAVAC_FLAGS = $(JIKES_DEFAULT_FLAGS) ;
4651    }
4652    else if $(JAVA_COMPILER:B) = javac {
4653        export JAVAC_FLAGS = $(JAVAC_DEFAULT_FLAGS) ;
4654    }
4655    else {
4656        export JAVAC_FLAGS = ;
4657    }
4658    
4659    if $(JAVA_COMPILER_DISABLE_WARNINGS) = YES {
4660        JAVAC_FLAGS += "-nowarn" ;
4661    }
4662    if $(JAVA_COMPILER_DEPRECATED_WARNINGS) = YES {
4663        JAVAC_FLAGS += "-deprecation" ;
4664    }
4665    JAVAC_FLAGS += $(JAVA_COMPILER_FLAGS) ;
4666
4667    if $(JAVA_COMPILER_TARGET_VM_VERSION) {
4668        if $(JAVA_COMPILER:B) = jikes {
4669            ECHO warning: Target VM version not supported by jikes ;
4670        }
4671        else {
4672            JAVAC_FLAGS += "-target "$(JAVA_COMPILER_TARGET_VM_VERSION) ;
4673        }
4674    }
4675    
4676    if $(JAVA_COMPILER_DEBUGGING_SYMBOLS) = YES {
4677        JAVAC_FLAGS += "-g" ;
4678    }
4679    
4680    if $(JAVAC_SOURCE_FILE_ENCODING) {
4681        JAVAC_FLAGS += -encoding "$(JAVAC_SOURCE_FILE_ENCODING)" ;
4682    }
4683
4684    if $(JAVA_USE_DEPENDENCIES) = "NO" || ( ! $($(2)_JAVA_IMPORTS) && empty$($(2)_JAVA_IMPORTS) != empty ) {
4685        # With no dependence, or dependence info usage off
4686        # build with combinded compiler invocations but no file list
4687        DEPENDS $(JAVA_COMPILE_TARGET) : $(2) ;
4688        ALWAYS $(JAVA_COMPILE_TARGET) ;
4689        JAVAC_FLAGS on $(JAVA_COMPILE_TARGET) = $(JAVAC_FLAGS) ;
4690        JAVA_COMPILER on $(JAVA_COMPILE_TARGET) = $(JAVA_COMPILER) ;
4691        if $(JAVA_COMPILER:B) = jikes {
4692	    JavaCompile.jikes $(JAVA_COMPILE_TARGET) : $(2) ;
4693        }
4694        else {
4695	    JavaCompile.default $(JAVA_COMPILE_TARGET) : $(2) ;
4696        }
4697        COMPILED_JAVA += $(2) ;
4698        if ! $(JAVA_COMPILE_TARGET) in $(PRODUCT_FILES) {
4699            ProductFile $(JAVA_COMPILE_TARGET) ;
4700        }
4701    }
4702    else {
4703        # Using dependence info, set up file list for java compiles
4704        JAVA_FILE_LIST default = $(TEMP_DIR)$(/)JavaFileList ;
4705        # define and act on target to clear list
4706        if ! $(CLEAR_JAVA_FILE_LIST) {
4707            CLEAR_JAVA_FILE_LIST = $(JAVA_FILE_LIST:G=ClearFileList) ;
4708            ClearJavaFileList $(CLEAR_JAVA_FILE_LIST) ;
4709            DEPENDS $(JAVA_COMPILE_TARGET) : $(CLEAR_JAVA_FILE_LIST) ;
4710        }
4711        # set up compile target to use file list
4712        if ! $(JAVA_COMPILE_TARGET) in $(PRODUCT_FILES) {
4713            JAVAC_FLAGS on $(JAVA_COMPILE_TARGET) = $(JAVAC_FLAGS) ;
4714            JAVA_COMPILER on $(JAVA_COMPILE_TARGET) = $(JAVA_COMPILER) ;
4715            JAVA_FILE_LIST_REFERENCE = @$(JAVA_FILE_LIST) ;
4716            NOTFILE $(JAVA_FILE_LIST_REFERENCE) ;
4717            if $(JAVA_COMPILER:B) = jikes {
4718	        JavaCompile.jikes $(JAVA_COMPILE_TARGET) : $(JAVA_FILE_LIST_REFERENCE) ;
4719            }
4720            else {
4721	        JavaCompile.default $(JAVA_COMPILE_TARGET) : $(JAVA_FILE_LIST_REFERENCE) ;
4722            }
4723            ProductFile $(JAVA_COMPILE_TARGET) ;
4724        }
4725        # set up class file dependence used to add java files to compile list
4726        local CLASS_FILE ;
4727        # use the main class, if it's there
4728        if $($(2)_MAIN_CLASS) {
4729            CLASS_FILE = $(CLASS_FILE_DIR)$(/)$($(2)_MAIN_CLASS) ;
4730        }
4731        else {
4732            local JAVA_SOURCE ;
4733            RemovePrefixPath JAVA_SOURCE : $(JAVA_SOURCE_SUBDIR) : $(2) ;
4734            CLASS_FILE = $(CLASS_FILE_DIR)$(/)$(JAVA_SOURCE:S=.class) ;
4735        }
4736        DEPENDS $(CLASS_FILE) : $(2) ;
4737        if $($(2)_JAVA_IMPORTS) {
4738            DEPENDS $(CLASS_FILE) : $($(2)_JAVA_IMPORTS) ;
4739            DEPENDS $(CLEAR_JAVA_FILE_LIST) : $($(2)_JAVA_IMPORTS) ;
4740        }
4741        DEPENDS $(JAVA_COMPILE_TARGET) : $(CLASS_FILE) ;
4742        JAVA_FILE_LIST on $(CLASS_FILE) = $(JAVA_FILE_LIST) ;
4743        AppendToJavaFileList $(CLASS_FILE) : $(2) ;
4744        DEPENDS $(CLEAR_JAVA_FILE_LIST) : $(2) ;
4745        COMPILED_JAVA += $(2) ;
4746    }
4747}
4748
4749actions quietly together piecemeal ClearJavaFileList
4750{
4751    $(RM) -rf $(JAVA_FILE_LIST:Q) && $(TOUCH) $(JAVA_FILE_LIST:Q)
4752}
4753
4754# Appends reference to list only if not already present
4755actions quietly together piecemeal AppendToJavaFileList
4756{
4757    _grep_result=`/usr/bin/grep -e \""$(2)"\" $(JAVA_FILE_LIST:Q)`
4758    if [ "x$_grep_result" = "x" ]
4759      then $(ECHO) \""$(2)"\" >> $(JAVA_FILE_LIST:Q)
4760    fi
4761}
4762
4763actions together piecemeal JavaCompile.default {
4764    frameworkjars=""
4765    for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done
4766    classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath`
4767    $(JAVA_COMPILER) $(JAVAC_FLAGS) $($(2)_COMPILER_FLAGS) -sourcepath $(JAVA_SOURCE_PATH:Q) -classpath "$classpath" -d "$(CLASS_FILE_DIR)" '$(2)'
4768}
4769actions together piecemeal JavaCompile.jikes {
4770    frameworkjars=""
4771    for i in `echo $(JAVA_FRAMEWORK_JARS)/*.jar $(JAVA_FRAMEWORK_JARS)/*.zip ` ; do if [ -f "$i" ] ; then frameworkjars="$frameworkjars":"$i" ; fi ; done
4772    classpath="$(CLASS_FILE_DIR)$(LINKED_CLASS_ARCHIVES)$frameworkjars:"`$(JAVACONFIG) DefaultClasspath`
4773    $(JAVA_COMPILER) $(JAVAC_FLAGS) $($(2)_COMPILER_FLAGS) -sourcepath $(JAVA_SOURCE_PATH:Q) -classpath "$classpath" -d $(CLASS_FILE_DIR:Q) '$(2)'
4774}
4775
4776rule ProcessApplescripts
4777{
4778    if build in $(BUILD_COMPONENTS) || source in $(BUILD_COMPONENTS) {
4779        local FILE ;
4780        if $(_BUILD_PHASING) = YES {
4781            PhaseTarget BUILD_PHASE : $(1) : CompileAppleScripts ;
4782            BuildPhase $(BUILD_PHASE) : $(1) : $(PREVIOUS_BUILD_PHASE) ;
4783            BUILD_PHASE_PRODUCTS = ;
4784        }
4785        if $(CONTEXTNAME) = ""
4786        {
4787            for FILE in $(2) {
4788                if $(_BUILD_PHASING) = YES {
4789                    ProcessAppleScript $(BUILD_PHASE) : $(FILE) : $(FILE) ;
4790                }
4791                else {
4792                    ProcessAppleScript $(1) : $(FILE) : $(FILE) ;
4793                }
4794            }
4795        }
4796        else
4797        {
4798            ProcessAppleScript $(1) : $(2) : $(CONTEXTNAME) ;
4799        }
4800        if $(_BUILD_PHASING) = YES {
4801            if $(BUILD_PHASE_PRODUCTS) {
4802                DEPENDS $(BUILD_PHASE) : $(BUILD_PHASE_PRODUCTS) ;
4803            }
4804            PREVIOUS_BUILD_PHASE = $(BUILD_PHASE) ;
4805        }
4806    }
4807}
4808
4809rule ProcessAppleScript
4810{
4811    if source in $(BUILD_COMPONENTS) {
4812        # make directory first if necessary
4813        if $(2:D) {
4814            SCRIPT_SOURCE_DIR = $(2:D:G=) ;
4815            Mkdir $(SCRIPT_SOURCE_DIR) ;
4816            SCRIPT_SOURCE_COPY = $(SCRIPT_SOURCE_DIR)/$(2:D=:G=) ;
4817            DEPENDS $(SCRIPT_SOURCE_COPY) : $(SCRIPT_SOURCE_DIR) ;
4818        }
4819        else {
4820            SCRIPT_SOURCE_COPY = $(SOURCE_DIR)/$(2:D=:G=) ;
4821            DEPENDS $(SCRIPT_SOURCE_COPY) : $(SOURCE_DIR) ;
4822            Mkdir $(SOURCE_DIR) ;
4823        }
4824        # copy script to source location
4825        Cp $(SCRIPT_SOURCE_COPY) : $(2) ;
4826        if $(_BUILD_PHASING) = YES {
4827            BUILD_PHASE_PRODUCTS += $(SCRIPT_SOURCE_COPY) ;
4828        }
4829    }
4830    if build in $(BUILD_COMPONENTS) {
4831        if $(2) = $(3) {
4832            # third argument is a file (ignore subfolder for result)
4833            APPLESCRIPT_FILE = $(APPLESCRIPTS_DIR)$(/)$(3:BS=.scpt) ;
4834        }
4835        else {
4836            # third argument is a context name
4837            APPLESCRIPT_FILE = $(APPLESCRIPTS_DIR)$(/)$(3:S=.scpt) ;
4838        }
4839        DEPENDS $(APPLESCRIPT_FILE) : $(APPLESCRIPTS_DIR) ;
4840        if ! $(APPLESCRIPTS_DIR) in $(PRODUCT_FILES) {
4841            Mkdir $(APPLESCRIPTS_DIR) ;
4842            ProductFile $(APPLESCRIPTS_DIR) ;
4843        }
4844        DEPENDS $(APPLESCRIPT_FILE) : $(2) ;
4845        OTHER_OSAFLAGS on $(APPLESCRIPT_FILE) = $(OTHER_OSAFLAGS) $($(APPLESCRIPT_FILE)_COMPILER_FLAGS) ;
4846        OSACompile $(APPLESCRIPT_FILE) : $(2) ;
4847        ProductFile $(APPLESCRIPT_FILE) ;
4848    }
4849}
4850
4851actions OSACompile
4852{
4853    $(OSAC) -d -i $(SYSTEM_LIBRARY_DIR)/Frameworks/AppleScriptKit.framework -U $(2:BSQ) -o $(1:Q) "$(OTHER_OSAFLAGS)" $(2:Q)
4854}
4855
4856rule ProcessC
4857{
4858    for VARIANT in $(BUILD_VARIANTS) {
4859    for ARCH in $(ARCHS) {
4860        local OBJECT_FILE ;
4861        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(ARCH) ;
4862        # $(2)_UNIQUENAME is defined only if the basename of the file isn't unique within the target.
4863        if $($(2)_UNIQUENAME) {
4864            OBJECT_FILE = $($(2)_UNIQUENAME:G=$(VARIANT)-$(ARCH)).o ;
4865        }
4866        else {
4867            OBJECT_FILE = $(2:D=:S=:G=$(VARIANT)-$(ARCH)).o ;
4868        }
4869        DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ;
4870        if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) {
4871            Mkdir $(OBJECT_SUBDIR) ;
4872            PRODUCT_FILES += $(OBJECT_SUBDIR) ;
4873            if $(_BUILD_PHASING) = YES {
4874                BUILD_PHASE_PRODUCTS += $(OBJECT_SUBDIR) ;
4875            }
4876        }
4877        ARCH on $(OBJECT_FILE) = $(ARCH) ;
4878        PER_ARCH_CFLAGS = $(PER_ARCH_CFLAGS_$(ARCH)) ;
4879        if $(JAVA_BRIDGET_TARGET) {
4880            DEPENDS $(OBJECT_FILE) : $(JAVA_BRIDGET_TARGET) ;
4881        }
4882        OTHER_CFLAGS on $(OBJECT_FILE) = $(OTHER_CFLAGS_$(VARIANT)) ;
4883        CompileC $(OBJECT_FILE) : $(2) ;
4884        if $(2:BS) != $(VECTOR_STUB:BS) {
4885            # add object file to object files and phase products
4886            # unless it is the compiled generated vector stub
4887            OBJECT_FILES_$(VARIANT) += $(OBJECT_FILE) ;
4888            OBJECT_FILES_$(VARIANT)_$(ARCH) += $(OBJECT_FILE) ;
4889            if $(_BUILD_PHASING) = YES {
4890                BUILD_PHASE_PRODUCTS += $(OBJECT_FILE) ;
4891            }
4892        }
4893        LOCATE on $(OBJECT_FILE) = $(OBJECT_SUBDIR) ;
4894        if $(2) = $(MODULE_INFO_FILE) {
4895            MODULE_OBJECT_FILE_$(VARIANT) = $(OBJECT_FILE) ;
4896            LOCATE on $(MODULE_OBJECT_FILE_$(VARIANT)) = $(OBJECT_SUBDIR) ;
4897            DEPENDS $(1) : $(MODULE_OBJECT_FILE_$(VARIANT)) ;
4898        }
4899        else {
4900            # object file is added to linked files
4901            # unless it is the compiled generated vector stub
4902            if $(2:BS) != $(VECTOR_STUB:BS) {
4903                LINKED_FILES_$(VARIANT) += $(OBJECT_FILE) ;
4904            }
4905        }
4906    }
4907    }
4908}
4909
4910rule ProcessCplusplus
4911{
4912    for VARIANT in $(BUILD_VARIANTS) {
4913    for ARCH in $(ARCHS) {
4914        local OBJECT_FILE ;
4915        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(ARCH) ;
4916        # $(2)_UNIQUENAME is defined only if the basename of the file isn't unique within the target.
4917        if $($(2)_UNIQUENAME) {
4918            OBJECT_FILE = $($(2)_UNIQUENAME:G=$(VARIANT)-$(ARCH)).o ;
4919        }
4920        else {
4921            OBJECT_FILE = $(2:D=:S=:G=$(VARIANT)-$(ARCH)).o ;
4922        }
4923        DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ;
4924        if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) {
4925            Mkdir $(OBJECT_SUBDIR) ;
4926            if $(_BUILD_PHASING) = YES {
4927                BUILD_PHASE_PRODUCTS += $(OBJECT_SUBDIR) ;
4928            }
4929        }
4930        ARCH on $(OBJECT_FILE) = $(ARCH) ;
4931        PER_ARCH_CPLUSPLUSFLAGS_$(ARCH) default = $(PER_ARCH_CFLAGS_$(ARCH)) ;
4932        PER_ARCH_CPLUSPLUSFLAGS = $(PER_ARCH_CPLUSPLUSFLAGS_$(ARCH)) ;
4933        OTHER_CPLUSPLUSFLAGS on $(OBJECT_FILE) = $(OTHER_CPLUSPLUSFLAGS_$(VARIANT)) ;
4934        CompileCplusplus $(OBJECT_FILE) : $(2) ;
4935        OBJECT_FILES_$(VARIANT) += $(OBJECT_FILE) ;
4936        OBJECT_FILES_$(VARIANT)_$(ARCH) += $(OBJECT_FILE) ;
4937        if $(_BUILD_PHASING) = YES {
4938            BUILD_PHASE_PRODUCTS += $(OBJECT_FILE) ;
4939        }
4940        if $(2) = $(MODULE_INFO_FILE_$(VARIANT)) {
4941            MODULE_OBJECT_FILE_$(VARIANT) = $(OBJECT_FILE) ;
4942            LOCATE on $(MODULE_OBJECT_FILE_$(VARIANT)) = $(OBJECT_SUBDIR) ;
4943            DEPENDS $(1) : $(MODULE_OBJECT_FILE_$(VARIANT)) ;
4944        }
4945        else {
4946            LOCATE on $(OBJECT_FILE) = $(OBJECT_SUBDIR) ;
4947            LINKED_FILES_$(VARIANT) += $(OBJECT_FILE) ;
4948        }
4949    }
4950    }
4951}
4952
4953HDRPATTERN = "^[	 ]*#[	 ]*include[	 ]*[<\"](.*)[\">].*$" ;
4954HDRPATTERN += "^[	 ]*#[	 ]*import[	 ]*[<\"](.*)[\">].*$" ;
4955
4956rule ProcessC.HdrRule
4957{
4958    # header reference in subdirectory source may be to header in that subdirectory
4959    local LOCAL_HEADERS = $(2:D=$(1:D)) ;
4960    # or header reference may be to elsewhere
4961    local FOREIGN_HEADERS = $(2) ;
4962    # compiled sources may include headers in subdirectories
4963    INCLUDES $(1) : $(LOCAL_HEADERS) $(FOREIGN_HEADERS) ;
4964}
4965
4966rule CompileC
4967{
4968    # object file depends on the source file
4969    DEPENDS $(1) : $(2) ;
4970    # Initialize the flags, and set search paths to nothing
4971    if $(KERNEL_MODULE) = YES {
4972        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
4973        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
4974        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
4975        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
4976        if $(ARCH) in ppc {
4977            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
4978        }
4979        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
4980        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
4981        GLOBAL_CFLAGS on $(1) = ;
4982    }
4983    else {
4984        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CFLAGS) ;
4985    }
4986    FLAGS on $(1) += -pipe ;
4987    if $(GCC_VERSION) != 2.x {
4988        FLAGS on $(1) += -fmessage-length=0 ;
4989        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
4990            USE_DYNAMIC_NO_PIC default = YES ;
4991        } else {
4992            USE_DYNAMIC_NO_PIC default = NO ;
4993        }
4994        if $(USE_DYNAMIC_NO_PIC) = YES {
4995            FLAGS on $(1) += -mdynamic-no-pic ;
4996        }
4997    }
4998    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
4999        FLAGS on $(1) += -Werror ;
5000    }
5001    # seed search paths with target-wide values
5002    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
5003    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
5004
5005    # If the source file is in a subdirectory, then search that
5006    # subdirectory for headers
5007    if $(2:D) {
5008        HEADER_SEARCH_PATHS on $(1) += $(2:D) ;
5009    }
5010    # We must compile with the extension-specific build flags
5011    FLAGS on $(1) += $($(2:S)_CFLAGS) ;
5012    # Add debug flags, if appropriate.
5013    if $(DEBUGGING_SYMBOLS) = YES {
5014        FLAGS on $(1) += -g ;
5015    }
5016    # Add profiling flags, if appropriate.
5017    if $(PROFILING_CODE) = YES {
5018        FLAGS on $(1) += -pg ;
5019    }
5020    # Pass the trusted-precomp file name to the compiler to keep track
5021    # of which precompiled headers it has already sanity checked.
5022    if $(GCC_VERSION) != 3.3 && $(OS) in MACOS DARWIN  &&  $(EFFECTIVE_PFE_FILE_$(ARCH)) = "" {
5023        FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ;
5024    }
5025    if $(CPP_HEADERMAP_FILE) {
5026        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
5027    }
5028    if YES in $(GENERATE_CPP_ILOG_FILES) {
5029        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(1:DB).ilog ;
5030        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
5031    }
5032    if $(INDEX_GENERATION_PIPE_NAME) != "" {
5033        FLAGS on $(1) += "-fgen-index=$(INDEX_GENERATION_PIPE_NAME)" ;
5034    }
5035    if $(EFFECTIVE_PFE_FILE_$(ARCH)) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5036        if $($(2)_COMPILER_FLAGS) {
5037            # When per-file flags are used the precompiled header is not valid
5038            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5039        }
5040        else {
5041            if $(PREFIX_HEADER_CFLAGS_BASE) = -include {
5042                # GCC v3.3 PCH
5043                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH):S=)" ;            
5044            }
5045            else {
5046                # GCC v3.1 PFE
5047                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH))" ;
5048            }
5049            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5050                DEPENDS $(1) : $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
5051            }
5052        }
5053    }
5054    if $(EFFECTIVE_PREFIX_HEADER) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5055        if $($(2)_COMPILER_FLAGS) {
5056            # When per-file flags are used the precompiled header is not valid
5057            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5058        }
5059        else {
5060            # GCC v2.95.2 cpp-precomp
5061            PREFIX_HEADER_CFLAGS on $(1) += -include "$(EFFECTIVE_PREFIX_HEADER)" ;
5062            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5063                DEPENDS $(1) : $(EFFECTIVE_PREFIX_HEADER) ;
5064            }
5065        }
5066    }
5067}
5068
5069actions CompileC
5070{
5071    $(CC) -c -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) $(PREFIX_HEADER_CFLAGS:Q) "$(OTHER_CFLAGS)" $($(2)_COMPILER_FLAGS) $(2:Q) -o $(1:Q)
5072}
5073
5074rule CompileCplusplus
5075{
5076    # object file depends on the source file
5077    DEPENDS $(1) : $(2) ;
5078    # Initialize the flags, and set search paths to nothing
5079    if $(KERNEL_MODULE) = YES {
5080        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
5081        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
5082        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
5083        if $(GCC_VERSION) != 2.x {
5084            KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -fno-rtti -fno-exceptions -fcheck-new -msoft-float -fapple-kext ;
5085        }
5086        else {
5087            KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -fno-rtti -fno-exceptions -fcheck-new -fvtable-thunks -msoft-float ;
5088            if $(MODULE_IOKIT) = YES {
5089                KERNEL_COMPILE_OPTIONS += -findirect-virtual-calls ;
5090            }
5091        }
5092        if $(ARCH) in ppc {
5093            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
5094        }
5095        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
5096        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS) -fno-common -nostdinc $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
5097        GLOBAL_CFLAGS on $(1) = ;
5098    }
5099    else {
5100        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_CPLUSPLUSFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_CFLAGS) $(WARNING_CPLUSPLUSFLAGS) ;
5101        if $(2:S) = .CPP {
5102            FLAGS on $(1) += -x c++ ;
5103        }
5104    }
5105    FLAGS on $(1) += -pipe ;
5106    if ( $(GCC_VERSION) != 2.x ) {
5107        FLAGS on $(1) += -fmessage-length=0 ;
5108        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
5109            USE_DYNAMIC_NO_PIC default = YES ;
5110        } else {
5111            USE_DYNAMIC_NO_PIC default = NO ;
5112        }
5113        if $(USE_DYNAMIC_NO_PIC) = YES {
5114            FLAGS on $(1) += -mdynamic-no-pic ;
5115        }
5116    }
5117    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
5118        FLAGS on $(1) += -Werror ;
5119    }
5120    # seed search paths with target-wide values
5121    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
5122    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
5123    # If the source file is in a subdirectory, then search that
5124    # subdirectory for headers
5125    if $(2:D) {
5126        HEADER_SEARCH_PATHS on $(1) += $(2:D) ;
5127    }
5128    # We must compile with the extension-specific build flags
5129    FLAGS on $(1) += $($(2:S)_CC_FLAGS) ;
5130    # Add variant-specific flags
5131    local _VARIANT_FLAGS = $($(CC:BS)_$(VARIANT)_FLAGS) ;
5132    if $(_VARIANT_FLAGS) {
5133        FLAGS on $(1) += $(_VARIANT_FLAGS) ;
5134    }
5135    # Add debug flags, if appropriate.
5136    if $(DEBUGGING_SYMBOLS) = YES {
5137        FLAGS on $(1) += -g ;
5138    }
5139    # Add profiling flags, if appropriate.
5140    if $(PROFILING_CODE) = YES {
5141        FLAGS on $(1) += -pg ;
5142    }
5143    # Pass the trusted-precomp file name to the compiler to keep track
5144    # of which precompiled headers it has already sanity checked.
5145    if $(GCC_VERSION) != 3.3 && $(OS) in MACOS DARWIN  &&  $(EFFECTIVE_PFE_FILE_$(ARCH)) = "" {
5146        FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ;
5147    }
5148    if $(CPP_HEADERMAP_FILE) {
5149        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
5150    }
5151    if YES in $(GENERATE_CPP_ILOG_FILES) {
5152        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(1:DB).ilog ;
5153        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
5154    }
5155    if $(EFFECTIVE_PFE_FILE_$(ARCH)) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5156        if $($(2)_COMPILER_FLAGS) {
5157            # When per-file flags are used the precompiled header is not valid
5158            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5159        }
5160        else {
5161            if $(PREFIX_HEADER_CFLAGS_BASE) = -include {
5162                # GCC v3.3 PCH
5163                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH):S=)" ;            
5164            }
5165            else {
5166                # GCC v3.1 PFE
5167                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH))" ;
5168            }
5169            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5170                DEPENDS $(1) : $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
5171            }
5172        }
5173    }
5174    if $(EFFECTIVE_PREFIX_HEADER) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5175        if $($(2)_COMPILER_FLAGS) {
5176            # When per-file flags are used the precompiled header is not valid
5177            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5178        }
5179        else {
5180            # GCC v2.95.2 cpp-precomp
5181            PREFIX_HEADER_CFLAGS on $(1) += -include "$(EFFECTIVE_PREFIX_HEADER)" ;
5182            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5183                DEPENDS $(1) : $(EFFECTIVE_PREFIX_HEADER) ;
5184            }
5185        }
5186    }
5187    _LD_FOR_LINKING = $(LDPLUSPLUS) ;
5188}
5189
5190actions CompileCplusplus
5191{
5192    $(CPLUSPLUS) -c -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) $(PREFIX_HEADER_CFLAGS:Q) "$(OTHER_CPLUSPLUSFLAGS)" $($(2)_COMPILER_FLAGS) $(2:Q) -o $(1:Q)
5193}
5194
5195rule ProcessAssembly
5196{
5197    for VARIANT in $(BUILD_VARIANTS) {
5198    for ARCH in $(ARCHS) {
5199        local OBJECT_FILE ;
5200        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(ARCH) ;
5201        # $(2)_UNIQUENAME is defined only if the basename of the file isn't unique within the target.
5202        if $($(2)_UNIQUENAME) {
5203            OBJECT_FILE = $($(2)_UNIQUENAME:G=$(VARIANT)-$(ARCH)).o ;
5204        }
5205        else {
5206            OBJECT_FILE = $(2:D=:S=:G=$(VARIANT)-$(ARCH)).o ;
5207        }
5208        DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ;
5209        if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) {
5210            Mkdir $(OBJECT_SUBDIR) ;
5211            PRODUCT_FILES += $(OBJECT_SUBDIR) ;
5212            if $(_BUILD_PHASING) = YES {
5213                BUILD_PHASE_PRODUCTS += $(OBJECT_SUBDIR) ;
5214            }
5215        }
5216        ARCH on $(OBJECT_FILE) = $(ARCH) ;
5217        PER_ARCH_ASFLAGS = $(PER_ARCH_ASFLAGS_$(ARCH)) ;
5218        if $(JAVA_BRIDGET_TARGET) {
5219            DEPENDS $(OBJECT_FILE) : $(JAVA_BRIDGET_TARGET) ;
5220        }
5221        OTHER_ASFLAGS on $(OBJECT_FILE) = $(OTHER_ASFLAGS) $(OTHER_ASFLAGS_$(VARIANT)) ;
5222        CompileC $(OBJECT_FILE) : $(2) ;
5223        if $(2:BS) != $(VECTOR_STUB:BS) {
5224            # add object file to object files and phase products
5225            # unless it is the compiled generated vector stub
5226            OBJECT_FILES_$(VARIANT) += $(OBJECT_FILE) ;
5227            OBJECT_FILES_$(VARIANT)_$(ARCH) += $(OBJECT_FILE) ;
5228            if $(_BUILD_PHASING) = YES {
5229                BUILD_PHASE_PRODUCTS += $(OBJECT_FILE) ;
5230            }
5231        }
5232        LOCATE on $(OBJECT_FILE) = $(OBJECT_SUBDIR) ;
5233        if $(2) = $(MODULE_INFO_FILE) {
5234            MODULE_OBJECT_FILE_$(VARIANT) = $(OBJECT_FILE) ;
5235            LOCATE on $(MODULE_OBJECT_FILE_$(VARIANT)) = $(OBJECT_SUBDIR) ;
5236            DEPENDS $(1) : $(MODULE_OBJECT_FILE_$(VARIANT)) ;
5237        }
5238        else {
5239            # object file is added to linked files
5240            # unless it is the compiled generated vector stub
5241            if $(2:BS) != $(VECTOR_STUB:BS) {
5242                LINKED_FILES_$(VARIANT) += $(OBJECT_FILE) ;
5243            }
5244        }
5245    }
5246    }
5247}
5248
5249rule CompileAssembly
5250{
5251    # object file depends on the source file
5252    DEPENDS $(1) : $(2) ;
5253    # Initialize the flags, and set search paths to nothing
5254    if $(KERNEL_MODULE) = YES {
5255        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
5256        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
5257        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
5258        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
5259        if $(ARCH) in ppc {
5260            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
5261        }
5262        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
5263        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_ASFLAGS) -fno-common -nostdinc $(OPTIMIZATION_ASFLAGS) $(WARNING_ASFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
5264        GLOBAL_CFLAGS on $(1) = ;
5265    }
5266    else {
5267        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_ASFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_ASFLAGS) $(WARNING_ASFLAGS) ;
5268    }
5269    FLAGS on $(1) += -pipe ;
5270    if $(GCC_VERSION) != 2.x {
5271        FLAGS on $(1) += -fmessage-length=0 ;
5272        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
5273            USE_DYNAMIC_NO_PIC default = YES ;
5274        } else {
5275            USE_DYNAMIC_NO_PIC default = NO ;
5276        }
5277        if $(USE_DYNAMIC_NO_PIC) = YES {
5278            FLAGS on $(1) += -mdynamic-no-pic ;
5279        }
5280    }
5281    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
5282        FLAGS on $(1) += -Werror ;
5283    }
5284    # seed search paths with target-wide values
5285    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
5286    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
5287
5288    # If the source file is in a subdirectory, then search that
5289    # subdirectory for headers
5290    if $(2:D) {
5291        HEADER_SEARCH_PATHS on $(1) += $(2:D) ;
5292    }
5293    # We must compile with the extension-specific build flags
5294    FLAGS on $(1) += $($(2:S)_CFLAGS) ;
5295    # Add variant-specific flags
5296    local _VARIANT_FLAGS = $($(CC:BS)_$(VARIANT)_FLAGS) ;
5297    if $(_VARIANT_FLAGS) {
5298        FLAGS on $(1) += $(_VARIANT_FLAGS) ;
5299    }
5300    # Add debug flags, if appropriate.
5301    if $(DEBUGGING_SYMBOLS) = YES {
5302        FLAGS on $(1) += -g ;
5303    }
5304    # Add profiling flags, if appropriate.
5305    if $(PROFILING_CODE) = YES {
5306        FLAGS on $(1) += -pg ;
5307    }
5308    # Pass the trusted-precomp file name to the compiler to keep track
5309    # of which precompiled headers it has already sanity checked.
5310    if $(GCC_VERSION) != 3.3 && $(OS) in MACOS DARWIN  &&  $(EFFECTIVE_PFE_FILE_$(ARCH)) = "" {
5311        FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ;
5312    }
5313    if $(CPP_HEADERMAP_FILE) {
5314        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
5315    }
5316    if YES in $(GENERATE_CPP_ILOG_FILES) {
5317        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(1:DB).ilog ;
5318        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
5319    }
5320    if $(INDEX_GENERATION_PIPE_NAME) != "" {
5321        FLAGS on $(1) += "-fgen-index=$(INDEX_GENERATION_PIPE_NAME)" ;
5322    }
5323    if $(EFFECTIVE_PFE_FILE_$(ARCH)) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5324        if $($(2)_COMPILER_FLAGS) {
5325            # When per-file flags are used the precompiled header is not valid
5326            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5327        }
5328        else {
5329            if $(PREFIX_HEADER_CFLAGS_BASE) = -include {
5330                # GCC v3.3 PCH
5331                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH):S=)" ;            
5332            }
5333            else {
5334                # GCC v3.1 PFE
5335                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH))" ;
5336            }
5337            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5338                DEPENDS $(1) : $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
5339            }
5340        }
5341    }
5342    if $(EFFECTIVE_PREFIX_HEADER) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5343        if $($(2)_COMPILER_FLAGS) {
5344            # When per-file flags are used the precompiled header is not valid
5345            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5346        }
5347        else {
5348            # GCC v2.95.2 cpp-precomp
5349            PREFIX_HEADER_CFLAGS on $(1) += -include "$(EFFECTIVE_PREFIX_HEADER)" ;
5350            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5351                DEPENDS $(1) : $(EFFECTIVE_PREFIX_HEADER) ;
5352            }
5353        }
5354    }
5355}
5356
5357actions CompileAssembly
5358{
5359    $(CC) -c -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) $(PREFIX_HEADER_ASFLAGS:Q) "$(OTHER_ASFLAGS)" $($(2)_COMPILER_FLAGS) $(2:Q) -o $(1:Q)
5360}
5361
5362
5363rule ProcessFortran
5364{
5365    for VARIANT in $(BUILD_VARIANTS) {
5366    for ARCH in $(ARCHS) {
5367        local OBJECT_FILE ;
5368        local OBJECT_SUBDIR = $(OBJECT_FILE_DIR_$(VARIANT))$(/)$(ARCH) ;
5369        # $(2)_UNIQUENAME is defined only if the basename of the file isn't unique within the target.
5370        if $($(2)_UNIQUENAME) {
5371            OBJECT_FILE = $($(2)_UNIQUENAME:G=$(VARIANT)-$(ARCH)).o ;
5372        }
5373        else {
5374            OBJECT_FILE = $(2:D=:S=:G=$(VARIANT)-$(ARCH)).o ;
5375        }
5376        DEPENDS $(OBJECT_FILE) : $(OBJECT_SUBDIR) ;
5377        if ! $(OBJECT_SUBDIR) in $(PRODUCT_FILES) {
5378            Mkdir $(OBJECT_SUBDIR) ;
5379            PRODUCT_FILES += $(OBJECT_SUBDIR) ;
5380            if $(_BUILD_PHASING) = YES {
5381                BUILD_PHASE_PRODUCTS += $(OBJECT_SUBDIR) ;
5382            }
5383        }
5384        ARCH on $(OBJECT_FILE) = $(ARCH) ;
5385        PER_ARCH_FFLAGS = $(PER_ARCH_FFLAGS_$(ARCH)) ;
5386        if $(JAVA_BRIDGET_TARGET) {
5387            DEPENDS $(OBJECT_FILE) : $(JAVA_BRIDGET_TARGET) ;
5388        }
5389        OTHER_FFLAGS on $(OBJECT_FILE) = $(OTHER_FFLAGS) $(OTHER_FFLAGS_$(VARIANT)) ;
5390        CompileFortran $(OBJECT_FILE) : $(2) ;
5391        if $(2:BS) != $(VECTOR_STUB:BS) {
5392            # add object file to object files and phase products
5393            # unless it is the compiled generated vector stub
5394            OBJECT_FILES_$(VARIANT) += $(OBJECT_FILE) ;
5395            OBJECT_FILES_$(VARIANT)_$(ARCH) += $(OBJECT_FILE) ;
5396            if $(_BUILD_PHASING) = YES {
5397                BUILD_PHASE_PRODUCTS += $(OBJECT_FILE) ;
5398            }
5399        }
5400        LOCATE on $(OBJECT_FILE) = $(OBJECT_SUBDIR) ;
5401        if $(2) = $(MODULE_INFO_FILE) {
5402            MODULE_OBJECT_FILE_$(VARIANT) = $(OBJECT_FILE) ;
5403            LOCATE on $(MODULE_OBJECT_FILE_$(VARIANT)) = $(OBJECT_SUBDIR) ;
5404            DEPENDS $(1) : $(MODULE_OBJECT_FILE_$(VARIANT)) ;
5405        }
5406        else {
5407            # object file is added to linked files
5408            # unless it is the compiled generated vector stub
5409            if $(2:BS) != $(VECTOR_STUB:BS) {
5410                LINKED_FILES_$(VARIANT) += $(OBJECT_FILE) ;
5411            }
5412        }
5413    }
5414    }
5415}
5416
5417rule CompileFortran
5418{
5419    # object file depends on the source file
5420    DEPENDS $(1) : $(2) ;
5421    # Initialize the flags, and set search paths to nothing
5422    if $(KERNEL_MODULE) = YES {
5423        local KERNEL_FRAMEWORK = $(SYSTEM_LIBRARY_DIR)/Frameworks/Kernel.framework ;
5424        local KERNEL_HEADERS = $(KERNEL_FRAMEWORK)/Headers ;
5425        local KERNEL_INCLUDE_PATHS = $(KERNEL_HEADERS) $(KERNEL_HEADERS)/bsd $(KERNEL_FRAMEWORK)/PrivateHeaders ;
5426        local KERNEL_COMPILE_OPTIONS = -fno-builtin -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float ;
5427        if $(ARCH) in ppc {
5428            KERNEL_COMPILE_OPTIONS += -mlong-branch ;
5429        }
5430        local KERNEL_DEFINITIONS = -DKERNEL -DKERNEL_PRIVATE -DDRIVER_PRIVATE -DAPPLE -DNeXT ;
5431        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_FFLAGS) -fno-common -nostdinc $(OPTIMIZATION_FFLAGS) $(WARNING_FFLAGS) -I$(KERNEL_INCLUDE_PATHS) -I$(PROJECT_HEADER_DIR) $(KERNEL_COMPILE_OPTIONS) -static $(KERNEL_DEFINITIONS) ;
5432        GLOBAL_CFLAGS on $(1) = ;
5433    }
5434    else {
5435        FLAGS on $(1) = -arch $(ARCH) $(PER_ARCH_FFLAGS) -fno-common -fpascal-strings $(OPTIMIZATION_FFLAGS) $(WARNING_FFLAGS) ;
5436    }
5437    FLAGS on $(1) += -pipe ;
5438    if $(GCC_VERSION) != 2.x {
5439        FLAGS on $(1) += -fmessage-length=0 ;
5440        if $(PRODUCT_TYPE) = Tool || $(PRODUCT_TYPE) = Application {
5441            USE_DYNAMIC_NO_PIC default = YES ;
5442        } else {
5443            USE_DYNAMIC_NO_PIC default = NO ;
5444        }
5445        if $(USE_DYNAMIC_NO_PIC) = YES {
5446            FLAGS on $(1) += -mdynamic-no-pic ;
5447        }
5448    }
5449    if $(GCC_TREAT_WARNINGS_AS_ERRORS) = YES {
5450        FLAGS on $(1) += -Werror ;
5451    }
5452    # seed search paths with target-wide values
5453    HEADER_SEARCH_PATHS on $(1) = $(HEADER_SEARCH_PATHS) ;
5454    FRAMEWORK_SEARCH_PATHS on $(1) = $(FRAMEWORK_SEARCH_PATHS) ;
5455
5456    # If the source file is in a subdirectory, then search that
5457    # subdirectory for headers
5458    if $(2:D) {
5459        HEADER_SEARCH_PATHS on $(1) += $(2:D) ;
5460    }
5461    # We must compile with the extension-specific build flags
5462    FLAGS on $(1) += $($(2:S)_FFLAGS) ;
5463    # Add debug flags, if appropriate.
5464    if $(DEBUGGING_SYMBOLS) = YES {
5465        FLAGS on $(1) += -g ;
5466    }
5467    # Add profiling flags, if appropriate.
5468    if $(PROFILING_CODE) = YES {
5469        FLAGS on $(1) += -pg ;
5470    }
5471    # Pass the trusted-precomp file name to the compiler to keep track
5472    # of which precompiled headers it has already sanity checked.
5473    if $(GCC_VERSION) != 3.3 && $(OS) in MACOS DARWIN  &&  $(EFFECTIVE_PFE_FILE_$(ARCH)) = "" {
5474        FLAGS on $(1) += -precomp-trustfile $(PRECOMP_TRUSTFILE) ;
5475    }
5476    if $(CPP_HEADERMAP_FILE) {
5477        FLAGS on $(1) += "-Wp,-header-mapfile,$(CPP_HEADERMAP_FILE)" ;
5478    }
5479    if YES in $(GENERATE_CPP_ILOG_FILES) {
5480        local INCLUSION_LOG_FILE default = $(OBJECT_FILE_DIR)-$(VARIANT)$(/)$(ARCH)$(/)$(1:DB).ilog ;
5481        FLAGS on $(1) += "-Wp,-inclusion-log-file,$(INCLUSION_LOG_FILE)" ;
5482    }
5483    if $(INDEX_GENERATION_PIPE_NAME) != "" {
5484        FLAGS on $(1) += "-fgen-index=$(INDEX_GENERATION_PIPE_NAME)" ;
5485    }
5486    if $(EFFECTIVE_PFE_FILE_$(ARCH)) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5487        if $($(2)_COMPILER_FLAGS) {
5488            # When per-file flags are used the precompiled header is not valid
5489            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5490        }
5491        else {
5492            if $(PREFIX_HEADER_CFLAGS_BASE) = -include {
5493                # GCC v3.3 PCH
5494                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH):S=)" ;            
5495            }
5496            else {
5497                # GCC v3.1 PFE
5498                PREFIX_HEADER_CFLAGS on $(1) = $(PREFIX_HEADER_CFLAGS_BASE) "$(EFFECTIVE_PFE_FILE_$(ARCH))" ;
5499            }
5500            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5501                DEPENDS $(1) : $(EFFECTIVE_PFE_FILE_$(ARCH)) ;
5502            }
5503        }
5504    }
5505    if $(EFFECTIVE_PREFIX_HEADER) != ""  &&  $(SUPPRESS_PREFIX_HEADER) != YES {
5506        if $($(2)_COMPILER_FLAGS) {
5507            # When per-file flags are used the precompiled header is not valid
5508            FLAGS on $(1) += -include "$(PREFIX_HEADER)" ;
5509        }
5510        else {
5511            # GCC v2.95.2 cpp-precomp
5512            PREFIX_HEADER_CFLAGS on $(1) += -include "$(EFFECTIVE_PREFIX_HEADER)" ;
5513            if $(ENABLE_PREFIX_HEADER_DEPENDENCIES) != NO {
5514                DEPENDS $(1) : $(EFFECTIVE_PREFIX_HEADER) ;
5515            }
5516        }
5517    }
5518}
5519
5520actions CompileFortran
5521{
5522    $(CC) -c -F$(FRAMEWORK_SEARCH_PATHS:Q) -I$(HEADER_SEARCH_PATHS:Q) $(FLAGS:Q) $(GLOBAL_CFLAGS) -I$(DERIVED_PATHS:Q) $(PREFIX_HEADER_FFLAGS:Q) "$(OTHER_FFLAGS)" $($(2)_COMPILER_FLAGS) $(2:Q) -o $(1:Q)
5523}
5524
5525VECTOR_SUFFIX default = ;
5526rule ProcessExportsFile
5527{
5528    if $(CFM_BRIDGE) = YES {
5529        local DYLIB_INSTALLED_NAME ;
5530        VECTOR_STUB default = $(DERIVED_FILE_DIR)$(/)$(1:B)Vector.s ;
5531        VECTOR_OBJECT_FILE default = $(TEMP_DIR)$(/)$(1:B)Vector.o ;
5532        if $(VECTOR_SUFFIX) {
5533            VECTOR_FRAGMENT_NAME default = CFMPriv_$(1:B)$(VECTOR_SUFFIX) ;
5534        }
5535        else {
5536            VECTOR_FRAGMENT_NAME default = CFMPriv_$(1:B) ;
5537        }
5538        DEPENDS $(VECTOR_STUB) : $(CURRENT_VERSION_DIR) ;
5539        DEPENDS $(VECTOR_STUB) : $(DERIVED_FILE_DIR) ;
5540        Mkdir $(CURRENT_VERSION_DIR) ;
5541        if $(INSTALL_PATH) {
5542            DYLIB_INSTALLED_NAME default = $(INSTALL_PATH)$(/)$(1:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)$(1:B:G=) ;
5543            if $(DYNAMIC_LIBRARY_SUFFIX) {
5544                DYLIB_INSTALLED_NAME = $(DYLIB_INSTALLED_NAME)$(DYNAMIC_LIBRARY_SUFFIX) ;
5545            }
5546        }
5547        DYLIB_INSTALLED_NAME on $(1) = $(DYLIB_INSTALLED_NAME) ;
5548        GenerateVectorLibraryIntermediates $(VECTOR_STUB) $(VECTOR_OBJECT_FILE) : $(2) ;
5549        BUILD_PHASE_PRODUCTS += $(VECTOR_STUB) ;
5550    }
5551}
5552
5553rule ProcessUsingMig
5554{
5555    local TEMP_FILES ;
5556    local FILE_BASE = $(2:B) ;
5557
5558     if AbsolutePath in $($(2)_ATTRIBUTES) {
5559        FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ;
5560    }
5561    if Client in $($(2)_ATTRIBUTES) {
5562        TEMP_FILES = $(FILE_BASE)User.c $(FILE_BASE).h ;
5563    }
5564    if Server in $($(2)_ATTRIBUTES) {
5565        TEMP_FILES += $(FILE_BASE)Server.c $(FILE_BASE)Server.h ;
5566    }
5567    if Client in $($(2)_ATTRIBUTES) || Server in $($(2)_ATTRIBUTES) {
5568        Mig $(TEMP_FILES) : $(2) ;
5569        DerivedFiles $(TEMP_FILES) ;
5570        DERIVED_FILES += $(TEMP_FILES) ;
5571        ProcessFiles $(1) : $(TEMP_FILES) ;
5572    }
5573}
5574
5575rule ProcessUsingLex
5576{
5577    local TEMP_FILES ;
5578    local FILE_BASE = $(2:B) ;
5579
5580    if AbsolutePath in $($(2)_ATTRIBUTES) {
5581        FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ;
5582    }
5583    switch $(2:S) {
5584        case ".l" : TEMP_FILES += $(FILE_BASE).c ;
5585        case ".lm" : TEMP_FILES += $(FILE_BASE).m ;
5586        case ".LM" : TEMP_FILES += $(FILE_BASE).M ;
5587        case ".lmm" : TEMP_FILES += $(FILE_BASE).mm ;
5588        case ".lpp" : TEMP_FILES += $(FILE_BASE).cpp ;
5589        case ".LPP" : TEMP_FILES += $(FILE_BASE).CPP ;
5590        case ".lxx" : TEMP_FILES += $(FILE_BASE).cxx ;
5591        case ".LXX" : TEMP_FILES += $(FILE_BASE).CXX ;
5592    }
5593    DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ;
5594    Lex $(TEMP_FILES) : $(2) ;
5595    DerivedFiles $(TEMP_FILES) ;
5596    DERIVED_FILES += $(TEMP_FILES) ;
5597    ProcessFiles $(1) : $(TEMP_FILES) ;
5598}
5599
5600rule ProcessUsingYacc
5601{
5602    local TEMP_FILES ;
5603    local FILE_BASE = $(2:B) ;
5604
5605    if AbsolutePath in $($(2)_ATTRIBUTES) {
5606        FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ;
5607    }
5608    switch $(2:S) {
5609        case ".y" : TEMP_FILES += $(FILE_BASE).c ;
5610        case ".ym" : TEMP_FILES += $(FILE_BASE).m ;
5611        case ".YM" : TEMP_FILES += $(FILE_BASE).M ;
5612        case ".ymm" : TEMP_FILES += $(FILE_BASE).mm ;
5613        case ".ypp" : TEMP_FILES += $(FILE_BASE).cpp ;
5614        case ".YPP" : TEMP_FILES += $(FILE_BASE).CPP ;
5615        case ".yxx" : TEMP_FILES += $(FILE_BASE).cxx ;
5616        case ".YXX" : TEMP_FILES += $(FILE_BASE).CXX ;
5617    }
5618    TEMP_FILES += $(FILE_BASE).h ;
5619    DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ;
5620    Yacc $(TEMP_FILES) : $(2) ;
5621    DerivedFiles $(TEMP_FILES) ;
5622    DERIVED_FILES += $(TEMP_FILES) ;
5623    ProcessFiles $(1) : $(TEMP_FILES) ;
5624}
5625
5626rule ProcessUsingRPCGen
5627{
5628    local FILE_BASE = $(2:B) ;
5629
5630    if AbsolutePath in $($(2)_ATTRIBUTES) {
5631        FILE_BASE = $(DERIVED_FILE_DIR)$(2:DB) ;
5632    }
5633    local TEMP_FILES = $(FILE_BASE)_xdr.c $(FILE_BASE).h ;
5634    DEPENDS $(TEMP_FILES) : $(DERIVED_FILE_DIR) ;
5635    RPCGen $(TEMP_FILES) : $(2) ;
5636    DerivedFiles $(TEMP_FILES) ;
5637    DERIVED_FILES += $(TEMP_FILES) ;
5638    ProcessFiles $(1) : $(TEMP_FILES) ;
5639}
5640
5641rule ProcessUsingBridget
5642{
5643    Bridget $(1) : $(2) ;
5644}
5645# Copyright (c) 1999-2003 Apple Computer, Inc.
5646# All rights reserved.
5647
5648# High level rules for build actions on targets
5649
5650# Actions <product>
5651# Defines all available build actions
5652rule Actions
5653{
5654    Clean clean : $(1) ;
5655    BuildAction build : $(1) ;
5656    BuildAction copysrc : $(1) ;
5657    NOTFILE copysrc ;
5658    BuildAction copyhdrs : $(1) ;
5659    NOTFILE copyhdrs ;
5660    BuildAction copyrsrcs : $(1) ;
5661    NOTFILE copyrsrcs ;
5662    BuildAction install : $(1) ;
5663    BuildAction installdebugonly : $(1) ;
5664    NOTFILE installdebug ;
5665    BuildAction installprofileonly : $(1) ;
5666    NOTFILE installprofile ;
5667    BuildAction installdebugprofileonly : $(1) ;
5668    NOTFILE installdebugprofile ;
5669    BuildAction installsrc : $(1) ;
5670    NOTFILE installsrc ;
5671    BuildAction installhdrs : $(1) ;
5672    NOTFILE installhdrs ;
5673    BuildAction installrsrcs : $(1) ;
5674    NOTFILE installrsrcs ;
5675}
5676
5677# Clean clean : <product>
5678# Deletes the product and the files associated with building it
5679rule Clean
5680{
5681    # locate built product and remove
5682    local BUILT_PRODUCT = $(2:G=) ;
5683    LOCATE on $(BUILT_PRODUCT) = $(TARGET_BUILD_DIR) ;
5684    Clean.Remove clean : $(BUILT_PRODUCT) ;
5685
5686    # remove temporary directories
5687    Clean.Remove clean : $(TEMP_DIR) ;
5688
5689    # Removal of archive in case of tools that are class archives,
5690    # this is which don't necessarily end with TOOL_SUFFIX.
5691    local ARCHIVE_SUFFIX ;
5692    local ARCHIVE_TARGET ;
5693    if $(JAVA_ARCHIVE_TYPE) = JAR {
5694        ARCHIVE_SUFFIX default = .jar ;
5695    }
5696    if $(JAVA_ARCHIVE_TYPE) = ZIP {
5697        ARCHIVE_SUFFIX default = .zip ;
5698    }
5699    ARCHIVE_SUFFIX default = "" ;
5700    ARCHIVE_TARGET = $(2:G=)$(ARCHIVE_SUFFIX) ;
5701    LOCATE on $(ARCHIVE_TARGET) = $(TARGET_BUILD_DIR) ;
5702    Clean.RemoveArchive clean : $(ARCHIVE_TARGET) ;
5703    # whole project content to remove on full clean
5704    Clean.Remove clean : $(PRECOMP_TRUSTFILE) ;
5705}
5706
5707actions quietly piecemeal together existing Clean.Remove 
5708{
5709    $(RM) -rf $(2:Q)
5710}
5711
5712actions quietly piecemeal together existing Clean.RemoveArchive
5713{
5714    if [ -f $(2:Q) ]; then
5715        $(RM) -rf $(2:Q)
5716    fi
5717}
5718
5719rule BuildAction
5720{
5721    local ACTION_TARGET = $(2:G=$(1)BuildAction) ;
5722    ACTION on $(2) = $(ACTION) ;
5723    DEPENDS $(1) : $(ACTION_TARGET) ;
5724    DEPENDS $(ACTION_TARGET) : $(2) ;
5725    NOTFILE $(ACTION_TARGET) ;
5726}
5727
5728# RunVariantHackScript varianthack : <product>
5729# Runs /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuild.sh,
5730rule RunVariantHackScript
5731{
5732    if $(RC_JASPER) || $(INTERNAL_BUILD_VARIANTS_ONLY_IN_JASPER) != YES {
5733        local VARIANT_HACK_TARGET = $(1:G=varianthack) ;
5734        DEPENDS $(1) : $(VARIANT_HACK_TARGET) ;
5735        NOTFILE $(VARIANT_HACK_TARGET) ;
5736    }
5737}
5738actions exportvars RunVariantHackScript
5739{
5740    /bin/sh /AppleInternal/Developer/Tools/AppleInternalDebugAndProfileBuilder.sh $(INTERNAL_BUILD_VARIANTS)
5741}
5742# Copyright (c) 1999-2003 Apple Computer, Inc.
5743# All rights reserved.
5744
5745include $(JAMFILE) ;
5746