home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Makefiles / project / common.make < prev    next >
Text File  |  1997-02-17  |  34KB  |  939 lines

  1. ###############################################################################
  2. #  NeXT common.make
  3. #  Copyright 1992, NeXT Computer, Inc.
  4. #
  5. #  This makefile is common to all project-types (apps, subprojects,
  6. #  bundles, and palettes).  It can also prove useful to custom Makefiles
  7. #  needing generic project-building functionality, but users should be aware
  8. #  that interfaces supported at this level are private to the makefiles
  9. #  and may change from release to release.
  10. #  
  11. ###############################################################################
  12.  
  13. ifndef LOCAL_MAKEFILEDIR
  14.     LOCAL_MAKEFILEDIR = $(NEXT_ROOT)/LocalDeveloper/Makefiles/project
  15. endif
  16.  
  17. # extremely large projects may have to override this name to something shorter
  18. STRIPNAME = STRIPPED
  19.  
  20. -include $(LOCAL_MAKEFILEDIR)/common.make.preamble
  21.  
  22. # Non-optional source files for the project.
  23. SRCFILES = PB.project $(CLASSES) $(MFILES) $(CFILES) \
  24.     $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) \
  25.     $(HFILES) $(PSWFILES) $(PSWMFILES) $(DBMODELAFILES) \
  26.     $(GLOBAL_RESOURCES) $(LOCAL_RESOURCES) $(HELP_FILES) \
  27.     $(OTHERSRCS) $(OTHERLINKED) $(OTHER_SOURCEFILES)
  28. # Optional source files for the project.
  29. SUPPORTFILES = Makefile $(ICONHEADER) $(APPICON) $(DOCICONS) 
  30.  
  31. # What OS are we running on?
  32. -include $(MAKEFILEDIR)/platform.make
  33.  
  34. include $(MAKEFILEDIR)/$(PLATFORM_OS)-specific.make
  35.  
  36. # Use the OS-specific versions of some variables, if they exist.
  37.  
  38. OS_SPECIFIC_INSTALLDIR = $($(OS_PREFIX)INSTALLDIR)
  39. ifneq ("$(OS_SPECIFIC_INSTALLDIR)", "")
  40. INSTALLDIR := $(OS_SPECIFIC_INSTALLDIR)
  41. endif
  42.  
  43. OS_SPECIFIC_BUILDDIR = $($(OS_PREFIX)BUILD_OUTPUT_DIR)
  44. ifneq ("$(OS_SPECIFIC_BUILDDIR)", "")
  45. BUILD_OUTPUT_DIR := $(OS_SPECIFIC_BUILDDIR)
  46. endif
  47.  
  48. OS_SPECIFIC_PB_CFLAGS = $($(OS_PREFIX)PB_CFLAGS)
  49. ifneq ("$(OS_SPECIFIC_PB_CFLAGS)", "")
  50. PB_CFLAGS := $(OS_SPECIFIC_PB_CFLAGS)
  51. endif
  52.  
  53. OS_SPECIFIC_PB_LDFLAGS = $($(OS_PREFIX)PB_LDFLAGS)
  54. ifneq ("$(OS_SPECIFIC_PB_LDFLAGS)", "")
  55. PB_LDFLAGS := $(OS_SPECIFIC_PB_LDFLAGS)
  56. endif
  57.  
  58. OS_SPECIFIC_PUBLIC_HEADER_DIR = $($(OS_PREFIX)PUBLIC_HEADERS_DIR)
  59. ifneq ("$(OS_SPECIFIC_PUBLIC_HEADER_DIR)", "")
  60. PUBLIC_HEADER_DIR := $(OS_SPECIFIC_PUBLIC_HEADER_DIR)
  61. endif
  62.  
  63. ifndef BUILD_OUTPUT_DIR
  64.      BUILD_OUTPUT_DIR = .
  65. endif
  66. ifndef SYMROOT
  67.     SYMROOT = $(BUILD_OUTPUT_DIR)
  68. endif
  69. ifndef OBJROOT
  70.     OBJROOT = $(BUILD_OUTPUT_DIR)
  71. endif
  72.  
  73. ### Compute all the possible derived files and directories for them:
  74.  
  75. SRCROOT = `pwd`
  76. DERIVED_SRC_DIR_NAME = derived_src
  77.  
  78. # Directory for .o files (can be thrown away) 
  79. OFILE_DIR = $(OBJROOT)/obj
  80. # Directory for all other derived files (contains symbol info. for debugging)
  81. SYM_DIR = $(SYMROOT)/$(DERIVED_SRC_DIR_NAME)
  82. # Directory for all public headers of the entire project tree
  83. LOCAL_HEADER_DIR = $(SYMROOT)/Headers/$(NAME)
  84.  
  85. # For compatibility:
  86. DERIVED_DIR = $(OFILE_DIR)
  87. DERIVED_SRC_DIR = $(SYM_DIR)
  88.  
  89. # Auto-created directories
  90. $(SYMROOT) $(OFILE_DIR) $(SYM_DIR) $(PUBLIC_HEADER_DIR) $(DSTROOT)$(INSTALLDIR) $(PRODUCT_ROOT) $(RESOURCES_ROOT):
  91.     @$(MKDIRS) $@ $(BURY_STDERR) || ($(ECHO) \'$(MKDIRS) $@\' failed in `pwd` ; exit 1)
  92.  
  93. # Versioning of wrapper directories
  94. CURRENTLY_ACTIVE_VERSION = YES
  95. DEPLOY_WITH_VERSION_NAME = A
  96. COMPATIBILITY_PROJECT_VERSION = 1
  97.  
  98. MSGOFILES = $(MSGFILES:.msg=Speaker.o) $(MSGFILES:.msg=Listener.o)
  99. MSGDERIVEDMFILES = $(MSGFILES:.msg=Speaker.m) $(MSGFILES:.msg=Listener.m)
  100.  
  101. ALLMIGFILES = $(MIGFILES) $(DEFSFILES)
  102.  
  103. MIGOFILES = $(MIGFILES:.mig=User.o) $(MIGFILES:.mig=Server.o)
  104. DEFSOFILES = $(DEFSFILES:.defs=User.o) $(DEFSFILES:.defs=Server.o)
  105. ALLMIGOFILES = $(MIGOFILES) $(DEFSOFILES)
  106.  
  107. MIGDERIVEDCFILES = $(MIGFILES:.mig=User.c) $(MIGFILES:.mig=Server.c)
  108. MIGDERIVEDHFILES = $(MIGFILES:.mig=.h)
  109. DEFSDERIVEDCFILES = $(DEFSFILES:.defs=User.c) $(DEFSFILES:.defs=Server.c)
  110. DEFSDERIVEDHFILES = $(DEFSFILES:.defs=.h)
  111. ALLMIGDERIVEDCFILES = $(MIGDERIVEDCFILES) $(DEFSDERIVEDCFILES)
  112. ALLMIGDERIVEDSRCFILES = $(ALLMIGDERIVEDCFILES) $(MIGDERIVEDHFILES) $(DEFSDERIVEDHFILES)
  113.  
  114. RPCOFILES = $(RPCDERIVEDCFILES:.c=.o)
  115. RPCDERIVEDCFILES = $(RPCFILES:.x=_clnt.c) \
  116.                    $(RPCFILES:.x=_svc.c) \
  117.                    $(RPCFILES:.x=_xdr.c)
  118. ALLRPCDERIVEDSRCFILES = $(RPCFILES:.x=.h) $(RPCDERIVEDCFILES)
  119.  
  120. EARLY_HFILES = $(PSWFILES:.psw=.h) $(PSWMFILES:.pswm=.h) $(RPCFILES:.x=.h)
  121. EARLY_OFILES = $(PSWFILES:.psw=.o) $(PSWMFILES:.pswm=.o)
  122.  
  123. ALL_PRECOMPS = $(PRECOMPILED_HEADERS:.h=.p) $(PRECOMPS)
  124.  
  125. INITIAL_FILES = $(INITIAL_INITIAL_TARGETS) $(PROJECTTYPE_SPECIFIC_INITIAL_TARGETS) $(EARLY_HFILES) $(MSGOFILES) $(ALLMIGOFILES) export_headers refresh_precomps $(OTHER_INITIAL_TARGETS)
  126.  
  127. # Creating initial files and directories is tricky in the parallel build case
  128.  
  129. .PHONY : all initial_targets initial_dirs
  130.  
  131. initial_targets: $(INITIAL_FILES)
  132. INITIAL_DIRS = $(OFILE_DIR)/.initial_dirs 
  133. INITIAL_DIRECTORIES = $(OFILE_DIR) $(SYM_DIR) 
  134. $(INITIAL_FILES): $(INITIAL_DIRS)
  135.  
  136. $(INITIAL_DIRS):
  137.     @$(MKDIRS) $(INITIAL_DIRECTORIES)
  138.     @$(TOUCH) $(INITIAL_DIRS)
  139.  
  140. SUBPROJ_OFILES = $(SUBPROJECTS:.subproj=_subproj.o)
  141. SUBPROJ_OFILELISTS = $(SUBPROJECTS:.subproj=_subproj.ofileList)
  142. NON_SUBPROJ_OFILES = $(CLASSES:.m=.o) $(MFILES:.m=.o) $(CFILES:.c=.o) \
  143.     $(CCFILES:.cc=.o) $(CAPCFILES:.C=.o) $(CAPMFILES:.M=.o) \
  144.     $(CXXFILES:.cxx=.o) $(CPPFILES:.cpp=.o) $(EARLY_OFILES) \
  145.     $(OTHERLINKEDOFILES) 
  146. OFILES = $(NON_SUBPROJ_OFILES) $(SUBPROJ_OFILES)
  147.  
  148. #    Note: It would be nice to put $(OTHERRELOCATABLES) in this list someday
  149. #          when PB provides full paths for the contents of this variable.
  150.  
  151. # Derived resources:
  152. DBMODELS = $(DBMODELAFILES:.dbmodela=.dbmodel)
  153.  
  154. PROJECT_INFO_FILE = Info-$(PLATFORM_OS).plist
  155. USER_INFO_FILE = CustomInfo.plist
  156. # Note: OTHER_INFO_FILES can be used for platform-specific Info.plist hackery
  157.  
  158. HELP_OUTPUT_FILE = Help.plist
  159. HELP_OUTPUT_FILE_DIR = $(RESOURCES_ROOT)
  160.  
  161. ### Set defaults for many values used throughout the Makefiles
  162.  
  163. PB_MAKEFILES = Makefile
  164. PROJECT_HEADERS_DIR_NAME = ProjectHeaders
  165.  
  166. PRODUCT_DEPENDS = $(OFILES) $(OTHER_OFILES) $(DBMODELS) \
  167.     $(ICONHEADER) $(APPICON) $(DOCICONS) $(PB_MAKEFILES) \
  168.     $(OTHER_GENERATED_OFILES) $(OTHER_PRODUCT_DEPENDS)
  169.  
  170. GARBAGE = $(PROJECT_TYPE_SPECIFIC_GARBAGE) \
  171.     $(OBJROOT)/*_obj $(OBJROOT)/obj $(OFILE_DIR) \
  172.     $(SYMROOT)/$(DERIVED_SRC_DIR_NAME) $(SYMROOT)/$(PROJECT_HEADERS_DIR_NAME) \
  173.     $(SYMROOT)/sym *~ $(LANGUAGE).lproj/*~ $(VERS_FILE) \
  174.     Makefile.dependencies $(SYMROOT)/$(CHANGES_FILE_BASE)* gmon.out \
  175.     $(ALL_PRECOMPS) $(OTHER_INITIAL_TARGETS) $(OTHER_GARBAGE)
  176.  
  177. # Default name for file to use as "reference time of last build"
  178. CHANGES_FILE_BASE = .lastBuildTime
  179.  
  180. # Compiler flags that may be overridden in Makefile.postamble
  181. OPTIMIZATION_CFLAG = -O
  182. DEBUG_SYMBOLS_CFLAG = -g
  183. WARNING_CFLAGS = -Wmost
  184. DEBUG_BUILD_CFLAGS = -DDEBUG
  185. PROFILE_BUILD_CFLAGS = -pg -g -DPROFILE
  186. POSIX_BUILD_CFLAGS = -D_POSIX_LIB
  187. SHLIB_BUILD_CFLAGS =  -I/LocalDeveloper/Headers/libsys -i/LocalDeveloper/Headers/libsys/shlib.h -DSHLIB
  188. KERNEL_BUILD_CFLAGS =  -DKERNEL
  189.  
  190. # Default compiler options
  191. ALL_FRAMEWORK_CFLAGS = $(FRAMEWORK_PATHS) $(PROPOGATED_FRAMEWORK_CFLAGS)
  192. PROJECT_SPECIFIC_CFLAGS = $(CFLAGS) $(OTHER_CFLAGS) $(HEADER_PATHS) $(PB_CFLAGS) 
  193. COMMON_CFLAGS = $(DEBUG_SYMBOLS_CFLAG) $(WARNING_CFLAGS) $(PIPE_CFLAG)    
  194. all_target_CFLAGS = $(COMMON_CFLAGS) $(OPTIMIZATION_CFLAG)
  195. debug_target_CFLAGS = $(COMMON_CFLAGS) $(DEBUG_BUILD_CFLAGS)
  196. profile_target_CFLAGS = $(COMMON_CFLAGS) $(PROFILE_BUILD_CFLAGS) $(OPTIMIZATION_CFLAG) 
  197. app_target_CFLAGS = $(all_target_CFLAGS)
  198. library_target_CFLAGS = $(all_target_CFLAGS)
  199. framework_target_CFLAGS = $(all_target_CFLAGS)
  200. bundle_target_CFLAGS = $(all_target_CFLAGS)
  201. palette_target_CFLAGS = $(all_target_CFLAGS)
  202. posix_target_CFLAGS = $(COMMON_CFLAGS) $(POSIX_BUILD_CFLAGS) $(OPTIMIZATION_CFLAG) 
  203. shlib_target_CFLAGS = $(COMMON_CFLAGS) $(SHLIB_BUILD_CFLAGS) $(OPTIMIZATION_CFLAG) 
  204. kernel_target_CFLAGS = $(COMMON_CFLAGS) $(KERNEL_BUILD_CFLAGS) $(OPTIMIZATION_CFLAG) 
  205. OBJCFLAG = -ObjC
  206.  
  207. # ...and the actual flags used in compilation (see basicrules.make)
  208. ALL_CFLAGS = $(BUILD_TYPE_CFLAGS) $(ALL_FRAMEWORK_CFLAGS) $(PROPOGATED_CFLAGS) $(PROJECT_SPECIFIC_CFLAGS) -I$(DEV_PROJECT_HEADER_DIR) -I$(SYM_DIR) $(RC_CFLAGS) $(EXTRA_CFLAGS)
  209. ALL_PRECOMP_CFLAGS = $(BUILD_TYPE_CFLAGS) $(ALL_FRAMEWORK_CFLAGS) $(PROPOGATED_CFLAGS) $(PROJECT_SPECIFIC_CFLAGS) -I$(DEV_PROJECT_HEADER_DIR) -I$(SYM_DIR) $(RC_CFLAGS) $(ALL_ARCH_FLAGS) $(EXTRA_CFLAGS)
  210.  
  211. # Link editor options:
  212. all_target_LDFLAGS = $(SECTORDER_FLAGS)
  213. debug_target_LDFLAGS =
  214. profile_target_LDFLAGS = -pg
  215. app_target_LDFLAGS = $(all_target_LDFLAGS)
  216. library_target_LDFLAGS = $(all_target_LDFLAGS)
  217. framework_target_LDFLAGS = $(all_target_LDFLAGS)
  218. bundle_target_LDFLAGS = $(all_target_LDFLAGS)
  219. ALL_LDFLAGS = $(LIBRARY_PATHS) $(BUILD_TYPE_LDFLAGS) $(PB_LDFLAGS) $(LDFLAGS) $(OTHER_LDFLAGS) $(EXTRA_LDFLAGS)
  220.  
  221. # Yacc options
  222. YFLAGS = -d
  223.  
  224.  
  225. PUSHD = pushed_dir=`pwd` ; cd 
  226. POPD = cd $$pushed_dir
  227.  
  228. DEFAULT_BUNDLE_EXTENSION = bundle
  229.  
  230. # Set VPATH via a variable so clients of common.make can reuse it when overriding VPATH
  231. NORMAL_VPATH = $(OFILE_DIR):$(SYM_DIR):$(LANGUAGE).lproj:$(PRODUCT_ROOT):$(PRODUCT_ROOT)/$(LANGUAGE).lproj
  232. VPATH = $(VPATH_PREAMBLE)$(NORMAL_VPATH)$(VPATH_POSTAMBLE)
  233.  
  234.  
  235. # Generation of a version string if project lives in correct directory name
  236. # To activate this feature, put your source code in a directory named 
  237. # $(NAME).%d[.%d][.%d] and set OTHER_GENERATED_OFILES = $(VERS_OFILE).
  238. VERS_FILE = $(SYM_DIR)/$(NAME)_vers.c
  239. VERS_OFILE = $(OFILE_DIR)/$(NAME)_vers.o
  240.  
  241. $(VERS_OFILE): $(VERS_FILE)
  242.  
  243. $(VERS_FILE): 
  244.     @($(RM) -f $(VERS_FILE) ; \
  245.     cname=`echo $(NAME) | sed 's/[^0-9A-Za-z]/_/g'`; \
  246.         $(VERS_STRING) -c $(NAME) \
  247.                 | sed s/SGS_VERS/$${cname}_VERS_STRING/ \
  248.                 | sed s/VERS_NUM/$${cname}_VERS_NUM/ > $@)
  249.  
  250. ### Use a set of basic suffix-style rules:
  251.  
  252. include $(MAKEFILEDIR)/basicrules.make
  253.  
  254. ### Some utility definitions used throughout the PB Makefiles
  255.  
  256. process_target_archs = \
  257.     if [ -n "$(RC_ARCHS)" ] ; then \
  258.         archs="$(RC_ARCHS)" ; \
  259.     else \
  260.         if [ -n "$(TARGET_ARCHS)" ] ; then \
  261.         archs="$(TARGET_ARCHS)" ; \
  262.         else \
  263.         archs=`$(ARCH_CMD)` ; \
  264.         fi ; \
  265.     fi ; \
  266.     if [ -z "$$archs" ] ; then \
  267.         archs=`$(ARCH_CMD)` ; \
  268.     fi ; \
  269.     archless_rcflags=`$(DEARCHIFY) $(RC_CFLAGS)` ; \
  270.     arch_flags=`$(ARCHIFY) $$archs` 
  271.  
  272. set_build_output_dirs = true
  273.  
  274.  
  275. # Various little pieces of shared logic...
  276.  
  277. set_bundle_ext = \
  278.     if [ -z "$(BUNDLE_EXTENSION)" ] ; then \
  279.        bundle_ext=$(DEFAULT_BUNDLE_EXTENSION) ; \
  280.     else \
  281.        bundle_ext=$(BUNDLE_EXTENSION) ; \
  282.     fi 
  283.  
  284. DYNAMIC_CFLAGS = -fno-common
  285.  
  286. set_dynamic_flags = \
  287.     if [ "$@" = "shlib" ] ; then \
  288.            dynamic_cflags="$(STATIC_CODE_GEN_CFLAG)" ; \
  289.     else \
  290.            if [ "$(CODE_GEN_STYLE)" = "DYNAMIC" ] ; then \
  291.                 buildtype="dynamic" ; \
  292.                 dynamic_cflags="$(DYNAMIC_CODE_GEN_CFLAG) $(DYNAMIC_CFLAGS)" ; \
  293.           library_ext="$(DYNALIB_EXT)" ; \
  294.            else \
  295.                 buildtype="static" ; \
  296.                 dynamic_cflags="$(STATIC_CODE_GEN_CFLAG)" ; \
  297.           library_ext="$(STATICLIB_EXT)" ; \
  298.            fi ; \
  299.            if [ "$(LIBRARY_STYLE)" = "STATIC" ] ; then \
  300.           library_ext="$(STATICLIB_EXT)" ; \
  301.            fi ; \
  302.         fi ; \
  303.         if [ "$@" = "shlib" -o "$@" = "posix" -o "$@" = "kernel" ] ; then \
  304.             buildtype="$@" ; \
  305.         fi
  306.  
  307. # Use of $(AWK) is temporary workaround until vers_string gets fixed.
  308.  
  309. CURRENT_PROJECT_VERSION = `$(VERS_STRING) -n $(BURY_STDERR) | $(AWK) -F. '$$3 ~ /^[0-9][0-9]*$$/ && $$2 ~ /^[0-9][0-9]*$$/ && $$1 ~ /^[0-9][0-9]*$$/ {print $$1"."$$2"."$$3; next} $$2 ~ /^[0-9][0-9]*$$/ && $$1 ~ /^[0-9][0-9]*$$/ {print $$1"."$$2; next} $$1 ~ /^[0-9][0-9]*$$/ {print $$1}'`
  310.  
  311.  
  312. set_dynamic_link_flags = \
  313.         if [ "$(CODE_GEN_STYLE)" = "DYNAMIC" ]; then \
  314.         if [ "$(LIBRARY_STYLE)" != "STATIC" ] ; then \
  315.                 dynamic_libtool_flags="$(DYNAMIC_LIBTOOL_FLAGS)" ; \
  316.         if [ -n "$(COMPATIBILITY_PROJECT_VERSION)" \
  317.             -a -n "$(CURRENT_PROJECT_VERSION)" ] ; then \
  318.            dynamic_libtool_flags="$$dynamic_libtool_flags -compatibility_version $(COMPATIBILITY_PROJECT_VERSION) -current_version $(CURRENT_PROJECT_VERSION)" ; \
  319.         fi ; \
  320.          else \
  321.                 dynamic_libtool_flags="$(STATIC_LIBTOOL_FLAGS)" ; \
  322.          fi ; \
  323.              dynamic_ldflags="$(DYNAMIC_LDFLAGS)" ; \
  324.              dynamic_bundle_flags="-bundle $(DYNAMIC_BUNDLE_UNDEFINED_FLAGS)" ; \
  325.         else \
  326.              dynamic_libtool_flags="$(STATIC_LIBTOOL_FLAGS)" ; \
  327.              dynamic_bundle_flags="$(STATIC_CODE_GEN_CFLAG) -nostdlib -r" ; \
  328.         fi
  329.  
  330. DYNAMIC_BUILD_TYPE_SUFFIX = ""
  331. DEBUG_BUILD_TYPE_SUFFIX = ""
  332. PROFILE_BUILD_TYPE_SUFFIX = "_profile"
  333.  
  334. set_objdir = \
  335.    case "$@" in                                                       \
  336.       debug | common_debug_install)                                     \
  337.            objdir="debug_obj" ;                                            \
  338.     build_type_suffix=$(DEBUG_BUILD_TYPE_SUFFIX) ;;            \
  339.       profile | common_profile_install)                    \
  340.     objdir="profile_obj" ;                        \
  341.     build_type_suffix=$(PROFILE_BUILD_TYPE_SUFFIX) ;;            \
  342.       *)                                \
  343.         objdir="obj" ;                            \
  344.         build_type_suffix=$(DYNAMIC_BUILD_TYPE_SUFFIX) ;;             \
  345.    esac
  346.  
  347. set_should_build = \
  348.     should_build=yes; \
  349.     for excluded_platform in $(EXCLUDED_PLATFORMS) none ; do \
  350.         if [ "$(PLATFORM_OS)" = "$$excluded_platform" ] ; then \
  351.             should_build=no; \
  352.         fi ; \
  353.     done ; \
  354.     if [ -n "$(INCLUDED_PLATFORMS)" ] ; then \
  355.        should_build=no; \
  356.        for included_platform in $(INCLUDED_PLATFORMS) none ; do \
  357.            if [ "$(PLATFORM_OS)" = "$$included_platform" ] ; then \
  358.               should_build=yes; \
  359.            fi ; \
  360.        done ; \
  361.     fi ; \
  362.     if [ -z "$$arch" ] ; then \
  363.        arch="$(TARGET_ARCH)" ; \
  364.     fi ; \
  365.     if [ "$$should_build" = "yes" -a -n "$$arch" ] ; then \
  366.        for excluded_arch in $(EXCLUDED_ARCHS) none ; do \
  367.           if [ "$$arch" = "$$excluded_arch" ] ; then \
  368.              should_build=no; \
  369.           fi ; \
  370.        done ; \
  371.        if [ -n "$(INCLUDED_ARCHS)" ] ; then \
  372.           should_build=no; \
  373.           for included_arch in $(INCLUDED_ARCHS) none ; do \
  374.              if [ "$$arch" = "$$included_arch" ] ; then \
  375.                 should_build=yes; \
  376.              fi ; \
  377.           done ; \
  378.        fi ; \
  379.     fi
  380.  
  381.  
  382. ### Define all the targets necessary at every level of the project-hierarchy:
  383.  
  384. # The following rules and rule fragments do the recursion into "sub" projects
  385. # of this project and does a 'make project' for each one in its
  386. # respective directories.  This insures that we do not rely on the directory
  387. # timestamp or "hack" file to know whether or not something has changed.  
  388.  
  389. CHANGES_COMMAND = $(CHANGES) $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE_BASE).$(TARGET_ARCH) $(BUILD_TARGET)
  390.  
  391. use_default_directory_args = \
  392.     top_prod_root=`$(ECHO) $(TOP_PRODUCT_ROOT) | $(DOTDOTIFY_PATH)` ; \
  393.     prod_root=`$(ECHO) $(PRODUCT_ROOT) | $(DOTDOTIFY_PATH)` ; \
  394.     ofile_dir=`$(ECHO) $(OFILE_DIR) | $(DOTDOTIFY_PATH)` ; \
  395.     sym_dir=`$(ECHO) $(SYM_DIR) | $(DOTDOTIFY_PATH)` ; \
  396.     header_base=`$(ECHO) $(DEV_HEADER_DIR_BASE) | $(DOTDOTIFY_PATH)` ; \
  397.     project_header_base=`$(ECHO) $(DEV_PROJECT_HEADER_DIR_BASE) | $(DOTDOTIFY_PATH)` ; \
  398.         propogated_cflags=`$(ECHO) $(PROPOGATED_CFLAGS) | $(DOTDOTIFY_IPATHS)`
  399.  
  400. use_absolute_directory_args = \
  401.       if [ -d "$(PRODUCT_ROOT)" ] ; then \
  402.        $(PUSHD) $(PRODUCT_ROOT) ; abs_prod_root=`pwd` ; $(POPD) ; \
  403.            prod_root=$$abs_prod_root ; \
  404.       fi ; \
  405.       if [ -d "$(TOP_PRODUCT_ROOT)" ] ; then \
  406.           $(PUSHD) $(TOP_PRODUCT_ROOT) ; abs_top_prod_root=`pwd` ; $(POPD) ; \
  407.           top_prod_root=$$abs_top_prod_root ; \
  408.       fi ; \
  409.       if [ -d "$(OFILE_DIR)" ] ; then \
  410.           $(PUSHD) $(OFILE_DIR) ; abs_ofile_dir=`pwd` ; $(POPD) ; \
  411.           ofile_dir=$$abs_ofile_dir ; \
  412.       fi ; \
  413.       if [ -d "$(SYM_DIR)" ] ; then \
  414.           $(PUSHD) $(SYM_DIR) ; abs_sym_dir=`pwd` ; $(POPD) ; \
  415.           sym_dir=$$abs_sym_dir ; \
  416.       fi ; \
  417.       if [ -d "$(DEV_HEADER_DIR_BASE)" ] ; then \
  418.           $(PUSHD) $(DEV_HEADER_DIR_BASE) ; abs_header_base=`pwd` ; $(POPD) ; \
  419.           header_base=$$abs_header_base ; \
  420.       fi ; \
  421.       if [ -d "$(DEV_PROJECT_HEADER_DIR_BASE)" ] ; then \
  422.           $(PUSHD) $(DEV_PROJECT_HEADER_DIR_BASE) ; abs_project_header_base=`pwd` ; $(POPD) ; \
  423.           project_header_base=$$abs_project_header_base ; \
  424.       fi ; \
  425.       propogated_cflags="$(PROPOGATED_CFLAGS)"
  426.  
  427.  
  428. ALL_SUBPROJECTS = $(BUILD_TOOLS) $(SUBPROJECTS) $(BUNDLES) $(FRAMEWORK_SUBPROJECTS) $(LIBRARIES) $(TOOLS) $(LEGACIES) $(AGGREGATES) $(PALETTES)
  429. IS_TOPLEVEL = 
  430.  
  431. # may not be right if tool is renamed without renaming directory name
  432. TOOL_NAMES = $(TOOLS=.tproj=)
  433.  
  434. .PHONY : all_subprojects
  435.  
  436. all_subprojects: $(TOP_PRODUCT_ROOT)
  437.     @(if [ -z "$(ONLY_SUBPROJECT)" ] ; then \
  438.         if [ -n "$(BUILD_ALL_SUBPROJECTS)" ] ; then \
  439.         subdirectories="$(ALL_SUBPROJECTS)" ; \
  440.         else \
  441.             subdirectories=`$(CHANGES_COMMAND) $(ALL_SUBPROJECTS)` ; \
  442.         fi ; \
  443.     else \
  444.         subdirectories="$(ONLY_SUBPROJECT)" ; \
  445.     fi ; \
  446.     target=project ; \
  447.     beginning_msg="Making" ; ending_msg="Finished making" ; \
  448.     $(recurse_on_subdirectories))
  449.     @(if [ -n "$(RESOURCES_ROOT)" ] ; then \
  450.            actual_prod_root=$(RESOURCES_ROOT) ; \
  451.         else \
  452.            actual_prod_root=$(PRODUCT_ROOT) ; \
  453.         fi ; \
  454.     $(check_tools))
  455.     @(if [ "$(IS_TOPLEVEL)" = "YES" -a -z "$(ONLY_SUBPROJECT)" ] ; then \
  456.        $(RM) -f $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE_BASE).$(TARGET_ARCH) ; \
  457.        $(ECHO) $(BUILD_TARGET) > $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE_BASE).$(TARGET_ARCH) ; \
  458.     fi)
  459.  
  460. $(SUBPROJ_OFILES):
  461.     @(if [ "$(BE_PARANOID)" = "YES" -a ! -r "$(OFILE_DIR)/$@" ] ; then \
  462.        $(ECHO) $(OFILE_DIR)/$@ does not exist....rebuilding. ; \
  463.        subdirectories="`$(BASENAME) $@ | $(SED) s/_subproj.o/.subproj/`"; \
  464.        target=project; \
  465.        beginning_msg="Making" ; ending_msg="Finished making" ; \
  466.          $(recurse_on_subdirectories) ; \
  467.     fi)
  468.  
  469. TOOL_NAMES = $(TOOLS:.tproj=)
  470. check_tools = \
  471.       if [ "$(BE_PARANOID)" = "YES" ] ; then \
  472.     for tool in $(TOOL_NAMES) none ; do \
  473.        if [ $$tool = "none" ] ; then break; fi ; \
  474.        tool_file="$$actual_prod_root/$${tool}$(BUILD_TYPE_SUFFIX).$(TARGET_ARCH)$(EXECUTABLE_EXT)" ; \
  475.        if [ ! -s $$tool_file ] ; then \
  476.           $(ECHO) $$tool_file does not exist...; \
  477.           subdirectories=$$tool.tproj; \
  478.           target=project; \
  479.           beginning_msg="Making" ; ending_msg="Finished making" ; \
  480.             $(recurse_on_subdirectories) ; \
  481.        fi ; \
  482.     done ; \
  483.       fi
  484.  
  485. recurse_on_subdirectories = \
  486.           $(use_default_directory_args) ; \
  487.     for sub in $$subdirectories none ; do \
  488.        if [ "$$sub" = "none" ] ; then break; fi ; \
  489.        if [ -h "$$sub" ] ; then \
  490.         $(use_absolute_directory_args) ; \
  491.        fi ; \
  492.            $(PUSHD) $$sub; \
  493.        if [ -n "$$beginning_msg" ] ; then \
  494.         $(ECHO) $$beginning_msg $$sub; \
  495.        fi ; \
  496.        $(MAKE) $$target $(exported_vars) $(stop_if_error_in_sub) ; \
  497.        $(POPD) ; \
  498.        if [ -n "$$ending_msg" ] ; then \
  499.         $(ECHO) $$ending_msg $$sub ; \
  500.        fi ; \
  501.     done
  502.  
  503.  
  504. exported_vars = \
  505.     "PRODUCT_ROOT = $$prod_root" \
  506.     "TOP_PRODUCT_ROOT = $$top_prod_root" \
  507.     "OFILE_DIR = $$ofile_dir/$$sub" \
  508.     "PRODUCT_PREFIX = $$ofile_dir/$$sub" \
  509.     "BUNDLE_DIR = $$prod_root/$$sub" \
  510.     "REL_BUNDLE_DIR = $$sub" \
  511.     "SYM_DIR = $$sym_dir/$$sub" \
  512.     "TARGET_ARCH = $(TARGET_ARCH)" \
  513.     "BUILD_TARGET = $(BUILD_TARGET)" \
  514.     "MAKEFILEDIR = $(MAKEFILEDIR)" \
  515.     "DEST = $(DEST)/$$sub" \
  516.     "SRCROOT = $(SRCROOT)" \
  517.     "OBJROOT = $(OBJROOT)" \
  518.     "SYMROOT = $(SYMROOT)" \
  519.     "DSTROOT = $(DSTROOT)" \
  520.     "IS_TOPLEVEL = NO" \
  521.     "PROPOGATED_CFLAGS = $(PROJECT_SPECIFIC_CFLAGS) $$propogated_cflags -I$$sym_dir" \
  522.     "PROPOGATED_FRAMEWORK_CFLAGS = $(ALL_FRAMEWORK_CFLAGS)" \
  523.     "DEV_PROJECT_HEADER_DIR_BASE = $$project_header_base" \
  524.     "PROJECT_HEADERS_DIR_NAME = $(PROJECT_HEADERS_DIR_NAME)" \
  525.     "MULTIPLE_ARCHS = $(MULTIPLE_ARCHS)" \
  526.     "SINGLE_ARCH = $(SINGLE_ARCH)" \
  527.     "DEPENDENCIES =" \
  528.     "ONLY_SUBPROJECT =" \
  529.     "RC_ARCHS = $(RC_ARCHS)" \
  530.     "RC_CFLAGS = $(RC_CFLAGS)" \
  531.     "ALL_ARCH_FLAGS = $(ALL_ARCH_FLAGS)" \
  532.     $(projectType_specific_exported_vars)
  533.  
  534.  
  535. stop_if_error_in_sub = \
  536.         || ($(ECHO) ---- Stopping build due to failure in $$sub ; exit 1)
  537.  
  538. stop_if_error_in_arch = \
  539.         || ($(ECHO) ---- Stopping build due to failure in build of architecture $$arch ; exit 1) 
  540.  
  541. stop_if_error_in_name = \
  542.         || ($(ECHO) ---- Stopping build due to failure in $(NAME) ; exit 1) 
  543.  
  544. continuep = \
  545.         || ($(ECHO) $(MFLAGS) | $(SEARCH) "k") 
  546.  
  547. # Finalizing build (e.g. lipo/ln the arch-specific binaries into place)
  548.  
  549. .PHONY : configure_for_target_archs
  550.  
  551. configure_for_target_archs_exported_vars = \
  552.     $(exported_vars) \
  553.     $(extra_configure_for_target_archs_exported_vars)
  554.  
  555. configure_for_target_archs::
  556.     @($(set_should_build) ; \
  557.     if [ "$$should_build" != "no" ] ; then \
  558.        subdirectories="$(ALL_SUBPROJECTS)"; \
  559.        target=configure_for_target_archs ; \
  560.              $(use_default_directory_args) ; \
  561.        for sub in $$subdirectories none ; do \
  562.           if [ $$sub = "none" ] ; then break; fi ; \
  563.           if [ -h $$sub ] ; then \
  564.           $(use_absolute_directory_args) ; \
  565.           fi ; \
  566.               $(PUSHD) $$sub; \
  567.           $(MAKE) $$target $(configure_for_target_archs_exported_vars) ; \
  568.           $(POPD) ; \
  569.        done ; \
  570.     fi)
  571.  
  572.  
  573. # Finalizing installation
  574.  
  575. STRIP_ON_INSTALL = YES
  576.  
  577. finalize_install_exported_vars = \
  578.     "DSTROOT = $(DSTROOT)" \
  579.     "SRCROOT = $(SRCROOT)" \
  580.     "OBJROOT = $(OBJROOT)" \
  581.     "SYMROOT = $(SYMROOT)" \
  582.     "SYM_DIR = $(SYM_DIR)" \
  583.     "DEVROOT = $(DEVROOT)" \
  584.     "INSTALLDIR = $(INSTALLDIR)" \
  585.     "PRODUCT_ROOT = $(PRODUCT_ROOT)" \
  586.     "RESOURCES_ROOT = $(RESOURCES_ROOT)" \
  587.     "PRODUCT = $(PRODUCT)" \
  588.     "OFILE_DIR = $(OFILE_DIR)" \
  589.     "MAKEFILEDIR = $(MAKEFILEDIR)" \
  590.     "RC_CFLAGS = $(RC_CFLAGS)" \
  591.     "RC_ARCHS = $(RC_ARCHS)" \
  592.     $(extra_finalize_install_exported_vars)
  593.  
  594. # Finalizing build (e.g. lipo/ln the arch-specific binaries into place)
  595.  
  596. finalize_install:: strip_myself after_install
  597.     @(subdirectories="$(ALL_SUBPROJECTS)"; \
  598.     target=finalize_install ; \
  599.     for sub in $$subdirectories none ; do \
  600.        if [ $$sub = "none" ] ; then break; fi ; \
  601.            $(PUSHD) $$sub; \
  602.        $(MAKE) $$target $(finalize_install_exported_vars) ; \
  603.        $(POPD) ; \
  604.     done)
  605.  
  606. strip_myself::
  607.  
  608. after_install::
  609.  
  610. .PHONY : before_install install after_install strip_myself finalize_install
  611.  
  612. # These Makefiles are now strictly dependent on GNU make functionality (plus 
  613. # a couple of simple NEXT-specific additions that will be eventually not be 
  614. # required).  To insure we are running on a proper GNU make implementation,
  615. # the built-in variable GNUMAKE is examined.
  616.  
  617. check_for_gnumake = \
  618.     if [ "$(GNUMAKE)" != "YES" ] ; then \
  619.         $(ECHO) These Makefiles only work with GNU make. ; \
  620.         $(ECHO) Please do not attempt to use an improper make tool. ; \
  621.         exit 1 ; \
  622.     fi
  623.  
  624. # Resources stuff:
  625.  
  626. ENABLE_INFO_DICTIONARY = YES
  627.  
  628.  
  629. # The following rule insures that resources for this particular level in the project hierarchy get copied over to the appropriate place.  Note that we depend on VPATH including $(LANGUAGE).lproj so that the LOCAL_RESOURCES are found correctly.  FASTCP is used to minimize the copying of files, since most resources are likely to be up to date most of the time.
  630.  
  631. .PHONY : resources
  632.  
  633. resources: $(RESOURCES_ROOT) $(RESOURCE_OFILE) $(OTHER_RESOURCES) $(HELP_OUTPUT_FILE_DIR)/$(HELP_OUTPUT_FILE) 
  634.     @(if [ -n "$(RESOURCES_ROOT)" ] ; then \
  635.          if [ -n "$(LOCAL_RESOURCES)" ] ; then \
  636.            $(MKDIRS) $(RESOURCES_ROOT)/$(LANGUAGE).lproj ; \
  637.            relative_resources_dir=`$(ECHO) $(RESOURCES_ROOT)/$(LANGUAGE).lproj | $(DOTDOTIFY_PATH)` ; \
  638.            (cd $(LANGUAGE).lproj; $(FASTCP) $(LOCAL_RESOURCES) $$relative_resources_dir) ; \
  639.         fi ; \
  640.          if [ -n "$(GLOBAL_RESOURCES)" -o -n "$(OTHER_RESOURCES)" ] ; then \
  641.             $(FASTCP) $(GLOBAL_RESOURCES) $(OTHER_RESOURCES) $(RESOURCES_ROOT) ; \
  642.         fi ; \
  643.         if [ -r "$(USER_INFO_FILE)" ] ; then \
  644.             mergeInfoArgs="$(USER_INFO_FILE)" ; \
  645.         fi ; \
  646.         if [ -n "$(REG_FILE)" -a -r "$(RESOURCES_ROOT)/$(REG_FILE)" ] ; then \
  647.             mergeInfoArgs="$$mergeInfoArgs -regFile $(REG_FILE)" ; \
  648.         fi ; \
  649.         if [ -x $(MERGEINFO) -a "$(ENABLE_INFO_DICTIONARY)" = "YES" ] ; then \
  650.            $(RM) -f $(RESOURCES_ROOT)/$(PROJECT_INFO_FILE) ; \
  651.            cmd="$(MERGEINFO) PB.project $$mergeInfoArgs $(OTHER_INFO_FILES) -o $(RESOURCES_ROOT)/$(PROJECT_INFO_FILE)" ; \
  652.         $$cmd ; \
  653.         fi ; \
  654.     fi)
  655.  
  656. $(RESOURCE_OFILE):
  657.     @(cmd="$(REGGEN) -o $(OFILE_DIR)/$(RESOURCE_OFILE) -project PB.project -rc $(RC_CMD) -regFile $(RESOURCES_ROOT)/$(REG_FILE)" ; \
  658.            echo $$cmd ; $$cmd)
  659.  
  660. $(HELP_OUTPUT_FILE_DIR)/$(HELP_OUTPUT_FILE): $(HELP_FILES)
  661.     @(if [ -x $(COMPILEHELP) ] ; then \
  662.         $(RM) -f $(RESOURCES_ROOT)/$(HELP_OUTPUT_FILE) ; \
  663.         for sub in $(SUBPROJECTS) none ; do \
  664.         if [ "$$sub" = "none" ] ; then break ; fi ; \
  665.         help_plist="$(DERIVED_SRC_DIR)/$$sub/$(HELP_OUTPUT_FILE)" ; \
  666.         if [ -r $$help_plist ] ; then \
  667.            subproj_help_plists="$$subproj_help_plists -m $$help_plist" ; \
  668.         fi ; \
  669.         done ; \
  670.         if [ -n "$(HELP_FILES)" -o -n "$$subproj_help_plists" ] ; then \
  671.             $(MKDIRS) $(HELP_OUTPUT_FILE_DIR) ; \
  672.             cmd="$(COMPILEHELP) -f $(HELP_FILES) $$subproj_help_plists -o $(HELP_OUTPUT_FILE_DIR)/$(HELP_OUTPUT_FILE)" ; \
  673.          $(ECHO) $$cmd ; $$cmd ; \
  674.         fi ; \
  675.      fi)
  676.  
  677. # rules for copying, cleaning and making dependencies
  678.  
  679. .PHONY : installsrc copy 
  680.  
  681. installsrc:: SRCROOT
  682.     @($(MAKE) copy "DEST = $(SRCROOT)" \
  683.                "SRCROOT = $(SRCROOT)" \
  684.             "OBJROOT = $(OBJROOT)" \
  685.             "SYMROOT = $(SYMROOT)" \
  686.                "MAKEFILEDIR = $(MAKEFILEDIR)" )
  687.  
  688. copy:: DEST $(DEST) $(SRCFILES)
  689.     @($(ECHO) "$(TAR) cf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -)"; \
  690.     $(TAR) cf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -) ; \
  691.     for i in $(SUPPORTFILES) none ; do \
  692.         if [ -r $$i -a ! -r $(DEST)/$$i ] ; then \
  693.         supportfiles="$$supportfiles $$i" ; \
  694.         fi ; \
  695.     done ; \
  696.     if [ -n "$$supportfiles" ] ; then \
  697.        $(ECHO) "$(TAR) cf - $$supportfiles | (cd $(DEST); $(TAR) xf -)" ; \
  698.        $(TAR) cf - $$supportfiles | (cd $(DEST); $(TAR) xf -) ; \
  699.     fi)
  700.     @(subdirectories="$(ALL_SUBPROJECTS)" ; \
  701.     target=copy; \
  702.     beginning_msg="Copying" ; ending_msg="Finished copying" ; \
  703.     $(recurse_on_subdirectories))
  704.  
  705. SRCROOT DEST:
  706.     @if [ -n "${$@}" ]; then exit 0; \
  707.     else $(ECHO) Must define $@; exit 1; fi
  708.  
  709. $(DEST):
  710.     @$(MKDIRS) $(DEST)
  711.  
  712. # Build a set of dependencies for current level into Makefile.depndencies 
  713.  
  714. Makefile.dependencies::
  715.     @echo Warning: 'depend' target currently non-functional.
  716.  
  717.    
  718. .broken.Makefile.dependencies:: $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) $(INITIAL_TARGETS)
  719.     @($(RM) -f Makefile.dependencies ; \
  720.     if [ "`$(ECHO) $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) | wc -w`" != "       0" ] ; then \
  721.         cmd="$(CC) -MM $(PROJECT_SPECIFIC_CFLAGS) $(PROPOGATED_CFLAGS) -I$(SYM_DIR)  $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) > Makefile.dependencies" ; \
  722.         echo $$cmd ; $$cmd || ($(RM) -f Makefile.dependencies ; exit 1) ; \
  723.     fi)
  724.  
  725.         
  726. # Header stuff:
  727.  
  728. DEV_HEADER_DIR_BASE = $(SYMROOT)
  729. DEV_PROJECT_HEADER_DIR_BASE = $(SYMROOT)
  730. DEV_PUBLIC_HEADER_DIR  = $(DEV_HEADER_DIR_BASE)/Headers
  731. DEV_PROJECT_HEADER_DIR = $(DEV_PROJECT_HEADER_DIR_BASE)/$(PROJECT_HEADERS_DIR_NAME)
  732. DEV_PRIVATE_HEADER_DIR = $(DEV_HEADER_DIR_BASE)/PrivateHeaders
  733.  
  734. set_header_dirs = \
  735.     public_header_dir="$(PUBLIC_HEADER_DIR)" ; \
  736.     private_header_dir="$(PRIVATE_HEADER_DIR)"
  737.  
  738. .PHONY : installhdrs installhdrs_recursively copy_my_headers after_installhdrs export_headers export_headers_recursively
  739.  
  740. installhdrs:: $(OTHER_INSTALLHDRS_DEPENDS)
  741.     @(if [ "$(PROJECT_TYPE)" != "Aggregate" ] ; then \
  742.         $(ECHO) Making installhdrs for $(NAME) ; \
  743.         $(set_header_dirs) ; \
  744.         $(MAKE) installhdrs_recursively \
  745.         "PUBLIC_HEADER_DEST_DIR = $(DSTROOT)$$public_header_dir" \
  746.         "PROJECT_HEADER_DEST_DIR =" \
  747.         "PRIVATE_HEADER_DEST_DIR = $(DSTROOT)$$private_header_dir" \
  748.         "HEADER_COPY_CMD = $(FASTCP)" \
  749.         "BUILD_TARGET = $@" \
  750.            "MAKEFILEDIR = $(MAKEFILEDIR)" \
  751.            "RC_CFLAGS = $(RC_CFLAGS)" \
  752.            "SRCROOT = $(SRCROOT)" \
  753.            "SYMROOT = $(SYMROOT)" \
  754.            "OBJROOT = $(OBJROOT)" \
  755.            "DSTROOT = $(DSTROOT)" ; \
  756.         $(ECHO) Finished installhdrs for $(NAME) ; \
  757.     fi)
  758.  
  759. installhdrs_recursively::
  760.     @($(set_should_build) ; \
  761.     if [ "$$should_build" != "no" ] ; then \
  762.         $(ECHO) ...for $(NAME) ; \
  763.         $(MAKE) copy_my_headers after_installhdrs \
  764.         "PUBLIC_HEADER_DEST_DIR = $(PUBLIC_HEADER_DEST_DIR)" \
  765.         "PROJECT_HEADER_DEST_DIR = $(PROJECT_HEADER_DEST_DIR)" \
  766.         "PRIVATE_HEADER_DEST_DIR = $(PRIVATE_HEADER_DEST_DIR)" \
  767.         "HEADER_COPY_CMD = $(HEADER_COPY_CMD)" \
  768.         "BUILD_TARGET = $(BUILD_TARGET)" \
  769.         "MAKEFILEDIR = $(MAKEFILEDIR)" \
  770.         "DSTROOT = $(DSTROOT)" \
  771.         "SRCROOT = $(SRCROOT)" \
  772.         "OBJROOT = $(OBJROOT)" \
  773.         "SYMROOT = $(SYMROOT)" \
  774.         "SYM_DIR = $(SYM_DIR)" ; \
  775.                subdirectories="$(ALL_SUBPROJECTS)" ; \
  776.         target=installhdrs_recursively ; \
  777.           $(recurse_on_subdirectories) ; \
  778.     fi)
  779.  
  780. export_headers:
  781.     @(if [ "$(SKIP_EXPORTING_HEADERS)" != "YES" ] ; then \
  782.         if [ "$(IS_TOPLEVEL)" = "YES" ] ; then \
  783.         $(ECHO) Exporting headers... ; \
  784.         $(MAKE) export_headers_recursively \
  785.             "TOP_PRODUCT_ROOT = $(TOP_PRODUCT_ROOT)" \
  786.             "BUILD_TARGET = $(BUILD_TARGET)" \
  787.             "MAKEFILEDIR = $(MAKEFILEDIR)" \
  788.             "DSTROOT = $(DSTROOT)" \
  789.             "SRCROOT = $(SRCROOT)" \
  790.             "OBJROOT = $(OBJROOT)" \
  791.             "SYMROOT = $(SYMROOT)" \
  792.             "SYM_DIR = $(SYM_DIR)" ; \
  793.         $(ECHO) Done exporting headers. ; \
  794.         fi ; \
  795.     fi)
  796.  
  797. export_headers_recursively:
  798.     @($(set_should_build) ; \
  799.     if [ "$$should_build" != "no" ] ; then \
  800.         $(ECHO) ...for $(NAME) ; \
  801.         $(MAKE) copy_my_headers \
  802.         "PUBLIC_HEADER_DEST_DIR = $(DEV_PUBLIC_HEADER_DIR)" \
  803.         "PROJECT_HEADER_DEST_DIR = $(DEV_PROJECT_HEADER_DIR)" \
  804.         "PRIVATE_HEADER_DEST_DIR = $(DEV_PRIVATE_HEADER_DIR)" \
  805.         "HEADER_COPY_CMD = $(CLONEHDRS)" \
  806.         "BUILD_TARGET = $(BUILD_TARGET)" \
  807.         "MAKEFILEDIR = $(MAKEFILEDIR)" \
  808.         "DSTROOT = $(DSTROOT)" \
  809.         "SRCROOT = $(SRCROOT)" \
  810.         "OBJROOT = $(OBJROOT)" \
  811.         "SYMROOT = $(SYMROOT)" \
  812.         "SYM_DIR = $(SYM_DIR)" ; \
  813.        subdirectories=`$(CHANGES_COMMAND) $(ALL_SUBPROJECTS)` ; \
  814.        target=export_headers_recursively ; \
  815.          $(recurse_on_subdirectories) ;\
  816.     fi)
  817.  
  818. copy_my_headers:: $(SYM_DIR) $(PUBLIC_HEADERS) $(OTHER_PUBLIC_HEADERS) $(PROJECT_HEADERS) $(OTHER_PROJECT_HEADERS) $(PRIVATE_HEADERS) $(OTHER_PRIVATE_HEADERS)
  819.     @(if [ \( -n "$(PUBLIC_HEADERS)" -o \
  820.            -n "$(OTHER_PUBLIC_HEADERS)" \) -a \
  821.            -n "$(PUBLIC_HEADER_DEST_DIR)" ] ; then \
  822.        header_dir="`$(ECHO) $(PUBLIC_HEADER_DEST_DIR)$(PUBLIC_HEADER_DIR_SUFFIX) | $(TR) -d ' '`" ; \
  823.        $(MKDIRS) $$header_dir ; \
  824.        $(HEADER_COPY_CMD) $(PUBLIC_HEADERS) $(OTHER_PUBLIC_HEADERS) $$header_dir ; \
  825.     fi ; \
  826.     if [ \( -n "$(PROJECT_HEADERS)" -o \
  827.          -n "$(OTHER_PROJECT_HEADERS)" \) -a \
  828.          -n "$(PROJECT_HEADER_DEST_DIR)" ] ; then \
  829.        $(MKDIRS) $(PROJECT_HEADER_DEST_DIR) ; \
  830.        $(HEADER_COPY_CMD) $(PROJECT_HEADERS) $(OTHER_PROJECT_HEADERS) $(PROJECT_HEADER_DEST_DIR) ; \
  831.     fi ; \
  832.     if [ \( -n "$(PRIVATE_HEADERS)" -o \
  833.          -n "$(OTHER_PRIVATE_HEADERS)" \) -a \
  834.          -n "$(PRIVATE_HEADER_DEST_DIR)" ] ; then \
  835.        header_dir="`$(ECHO) $(PRIVATE_HEADER_DEST_DIR)$(PRIVATE_HEADER_DIR_SUFFIX) | $(TR) -d ' '`" ; \
  836.        $(MKDIRS) $$header_dir ; \
  837.        $(HEADER_COPY_CMD) $(PRIVATE_HEADERS) $(OTHER_PRIVATE_HEADERS) $$header_dir ; \
  838.     fi)
  839.  
  840. # precompiled headers are only supported on NEXTSTEP right now
  841.  
  842. after_installhdrs::
  843.     @(if [ -n "$(PUBLIC_PRECOMPILED_HEADERS)" \
  844.             -a -n "$(PUBLIC_HEADER_DEST_DIR)" \
  845.             -a -z "$(DISABLE_PRECOMPS)" ] ; then \
  846.        cd $(PUBLIC_HEADER_DEST_DIR) ; \
  847.        for header in $(PUBLIC_PRECOMPILED_HEADERS) none ; do \
  848.           if [ $$header = "none" ] ; then break; fi ; \
  849.           cmd="$(CC) -precomp $(PUBLIC_PRECOMPILED_HEADERS_CFLAGS) $(RC_CFLAGS) $$header";\
  850.           $(ECHO) $$cmd ; $$cmd ; \
  851.        done ; \
  852.     fi)
  853.  
  854.  
  855. # making the stripped target
  856.  
  857. ifeq ("$(PLATFORM_OS)", "winnt")
  858.  
  859. STRIPO = $(NEXT_ROOT)/NextDeveloper/Libraries/gcc-lib/`$(ARCH_CMD)`/StabsToCodeview.exe
  860. STRIPDIRS = $(OBJROOT)/$(STRIPNAME) $(SYMROOT)/$(STRIPNAME)
  861. GARBAGE += $(STRIPDIRS)
  862.  
  863. CLONE_AND_STRIP = $(FIND) . '(' -name $(STRIPNAME) -prune ')' \
  864.   -o '(' -type d -exec $(MKDIRS) $(STRIPNAME)/'{}' ';' ')' \
  865.   -o '(' -name '*.exe' -o -name '*.dll' -o -name '*.lib' -name 'lib*.a' ')' \
  866.   -o '(' -name '*.EXE' -o -name '*.DLL' -o -name '*.LIB' -name 'LIB*.A' ')' \
  867.   -o '(' -name '*.ofileList' -o -name '*.ofilelist' -o -name '$(CHANGES_FILE_BASE)*' ')' \
  868.   -o '(' -name '*.o' -exec $(STRIPO) -g0 '{}' -o $(STRIPNAME)/'{}' ';' ')' \
  869.   -o -exec $(CP) -p '{}' $(STRIPNAME)/'{}' ';'
  870.  
  871. .PHONY: clone_and_strip reinstall_stripped
  872.  
  873. clone_and_strip:
  874.     $(MKDIRS) $(OBJROOT)/$(STRIPNAME) $(SYMROOT)/$(STRIPNAME)
  875.     cd $(OBJROOT) && $(CLONE_AND_STRIP)
  876.     cd $(SYMROOT) && $(CLONE_AND_STRIP)
  877.  
  878. reinstall_stripped: clone_and_strip 
  879.     @if $(ECHO) $(OBJROOT) | $(GREP) -v $(STRIPNAME) $(BURY_STDERR) ; then \
  880.        cmd='$(MAKE) install OBJROOT=$(OBJROOT)/$(STRIPNAME) SYMROOT=$(SYMROOT)/$(STRIPNAME) DEBUG_SYMBOLS_CFLAG= SKIP_EXPORTING_HEADERS=YES' ; \
  881.        $(ECHO) $$cmd ; $$cmd ; \
  882.     fi
  883.  
  884. endif
  885.  
  886. # Cleaning stuff:    
  887.  
  888. .PHONY : clean actual_clean really_clean
  889.  
  890. clean:: 
  891.     @(echo == Making clean for $(NAME) == ; \
  892.     $(set_bundle_ext) ; \
  893.     $(process_target_archs) ; \
  894.     if [ -n "$(CLEAN_ALL_SUBPROJECTS)" ] ; then \
  895.        $(MAKE) actual_clean really_clean \
  896.            "DEV_HEADER_DIR_BASE = $(DEV_HEADER_DIR_BASE)" \
  897.               "BUNDLE_EXTENSION = $$bundle_ext" \
  898.            "SRCROOT = $(SRCROOT)" \
  899.                  "SYMROOT = $(SYMROOT)" \
  900.            "OBJROOT = $(OBJROOT)" ; \
  901.     else \
  902.        $(MAKE) actual_clean \
  903.            "BUNDLE_EXTENSION = $$bundle_ext" \
  904.            "DEV_HEADER_DIR_BASE = $(DEV_HEADER_DIR_BASE)" \
  905.            "SRCROOT = $(SRCROOT)" \
  906.            "SYMROOT = $(SYMROOT)" \
  907.            "OBJROOT = $(OBJROOT)" ; \
  908.     fi )
  909.     
  910. actual_clean:: 
  911.     @if [ ! -w . ] ; then $(ECHO) '***' project write-protected; exit 1 ; fi
  912.     $(RM) -rf $(GARBAGE)
  913.  
  914. really_clean::
  915.     @(subdirectories="$(ALL_SUBPROJECTS)" ;\
  916.     target="actual_clean really_clean"; \
  917.     beginning_msg="Cleaning" ; ending_msg="Finished cleaning" ; \
  918.     $(recurse_on_subdirectories))
  919.  
  920.  
  921. # Indexing support:
  922. #  - through the use of conditional gnumake makefile assignments context
  923. #    can be set up in preambles and postambles
  924.  
  925. .PHONY : echo_makefile_variable
  926.  
  927. set_additional_makefile_context = true
  928.  
  929. echo_makefile_variable:
  930.     @($(set_additional_makefile_context) ; \
  931.     $(ECHO) $($(VAR_NAME)))
  932.  
  933. echo_makefile_expression:
  934.     @($(set_additional_makefile_context) ; \
  935.     $(ECHO) $(EXPR_STRING))
  936.  
  937. -include $(LOCAL_MAKEFILEDIR)/common.make.postamble
  938.  
  939.