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