home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Makefiles / app / common.make < prev    next >
Encoding:
Text File  |  1993-07-14  |  13.6 KB  |  404 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 app makefiles
  9. #  and may change from release to release.
  10. #  
  11. ###############################################################################
  12.  
  13.  
  14. all::
  15.  
  16. SUPPORTFILES = IB.nproj Makefile makefile $(NAME).iconheader \
  17.     Makefile.preamble Makefile.postamble *.project SGS_ENV
  18.  
  19. SRCFILES = $(CLASSES) \
  20.     $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CXXFILES) $(CPPFILES) \
  21.     $(HFILES) $(PSWFILES) $(PSWMFILES) $(DBMODELAFILES) \
  22.     $(GLOBAL_RESOURCES) \
  23.     $(OTHERSRCS) $(OTHERLINKED) $(OTHER_SOURCEFILES)
  24.  
  25. ### Compute all the possible derived files and directories for them:
  26.  
  27. # Defaults for NeXT-specific Release Control options
  28. SRCROOT = .
  29. SYMROOT = .
  30. OBJROOT = .
  31. RC_ARCHS = `/usr/bin/arch`
  32. RC_CFLAGS = -arch `/usr/bin/arch`
  33.  
  34. # Directory for .o files (can be thrown away) 
  35. OFILE_DIR = $(OBJROOT)/$(ARCH_LIST)obj
  36. # Directory for all other derived files (contains symbol info. for debugging)
  37. SYM_DIR = $(SYMROOT)/sym
  38. # For compatibility:
  39. DERIVED_DIR = $(OFILE_DIR)
  40. DERIVED_SRC_DIR = $(SYM_DIR)
  41.  
  42. $(OFILE_DIR) $(SYM_DIR):
  43.     @$(MKDIRS) $@
  44.  
  45. MSGOFILES = $(MSGFILES:.msg=Speaker.o) $(MSGFILES:.msg=Listener.o)
  46. MSGDERIVEDMFILES = $(MSGFILES:.msg=Speaker.m) $(MSGFILES:.msg=Listener.m)
  47.  
  48. ALLMIGFILES = $(MIGFILES) $(DEFSFILES)
  49.  
  50. MIGOFILES = $(MIGFILES:.mig=User.o) $(MIGFILES:.mig=Server.o)
  51. DEFSOFILES = $(DEFSFILES:.defs=User.o) $(DEFSFILES:.defs=Server.o)
  52. ALLMIGOFILES = $(MIGOFILES) $(DEFSOFILES)
  53.  
  54. MIGDERIVEDCFILES = $(MIGFILES:.mig=User.c) $(MIGFILES:.mig=Server.c)
  55. DEFSDERIVEDCFILES = $(DEFSFILES:.defs=User.c) $(DEFSFILES:.defs=Server.c)
  56. ALLMIGDERIVEDCFILES = $(MIGDERIVEDCFILES) $(DEFSDERIVEDCFILES)
  57.  
  58. EARLY_OFILES = $(PSWFILES:.psw=.o) $(PSWMFILES:.pswm=.o)
  59.  
  60. INITIAL_TARGETS = $(OFILE_DIR) $(SYM_DIR) $(EARLY_OFILES) $(MSGOFILES) $(ALLMIGOFILES) $(PRECOMPS) $(OTHER_INITIAL_TARGETS)
  61.  
  62. SUBPROJ_OFILES = $(SUBPROJECTS:.subproj=_subproj.o)
  63. OFILES = $(SUBPROJ_OFILES) $(CLASSES:.m=.o) $(MFILES:.m=.o) $(CFILES:.c=.o) \
  64.     $(CCFILES:.cc=.o) $(CAPCFILES:.C=.o) $(CXXFILES:.cxx=.o) \
  65.     $(CPPFILES:.cpp=.o) $(EARLY_OFILES) $(OTHERLINKEDOFILES) 
  66. #    Note: It would be nice to put $(OTHERRELOCATABLES) in this list someday
  67. #          when PB provides full paths for the contents of this variable.
  68.  
  69. # Derived resources:
  70. DBMODELS = $(DBMODELAFILES:.dbmodela=.dbmodel)
  71.  
  72. HELP_DIRS = Help
  73. HELP_STORES = $(HELP_DIRS:=.store) $(OTHER_HELP_DIRS:=.store)
  74.  
  75. ### Set defaults for many values used throughout the app Makefiles
  76.  
  77. # Default extension for bundles (directories containing object code and resources)
  78.  
  79. MAKEFILES = Makefile
  80.  
  81. PRODUCT_DEPENDS = $(OFILES) $(OTHER_OFILES) $(DBMODELS) \
  82.     $(ICONHEADER) $(APPICON) $(DOCICONS) $(MAKEFILES) \
  83.     $(OTHER_PRODUCT_DEPENDS)
  84.  
  85. GARBAGE = $(PSWFILES:.psw=.c) $(PSWMFILES:.pswm=.m) \
  86.     $(PSWFILES:.psw=.h) $(PSWMFILES:.pswm=.m) \
  87.     $(SYMROOT)/$(NAME).app $(SYMROOT)/$(NAME).debug \
  88.     $(SYMROOT)/$(NAME).profile $(SYMROOT)/$(NAME).$(BUNDLE_EXTENSION) \
  89.     $(SYMROOT)/$(NAME) $(SYMROOT)/$(NAME).palette \
  90.     $(OBJROOT)/*_obj $(SYM_DIR) *~ $(LANGUAGE).lproj/*~ \
  91.     Makefile.dependencies $(OTHER_GARBAGE) gmon.out \
  92.     $(PRECOMPS) $(OTHER_INITIAL_TARGETS)
  93.  
  94. # Default name for file to use as "reference time of last build"
  95. CHANGES_FILE = .lastBuildTime
  96.  
  97. # Defaults for who to chown executables to when installing
  98. INSTALL_AS_USER = root
  99. INSTALL_AS_GROUP = wheel
  100.  
  101. # Default compiler options
  102. OPTIMIZATION_CFLAG = -O
  103. NORMAL_CFLAGS = -g $(OPTIMIZATION_CFLAG) -Wall
  104. DEBUG_CFLAGS = -g -Wall -DDEBUG
  105. PROFILE_CFLAGS = -g -pg $(OPTIMIZATION_CFLAG) -Wall -DPROFILE
  106. OBJCFLAG = -ObjC
  107. C++CFLAGS = 
  108.  
  109. # Defaults strip options
  110. RELOCATABLE_STRIP_OPTS = -x -u
  111. DYLD_APP_STRIP_OPTS = -A -n
  112. APP_STRIP_OPTS =   # Set this to $(DYLD_APP_STRIP_OPTS) when doing dynaloading yourself
  113. TOOL_STRIP_OPTS =  # (ditto)
  114.  
  115. # Various commands:
  116. SHELL  = /bin/sh
  117. FASTCP = /usr/lib/fastcp
  118. CHANGES = /usr/lib/changes
  119. ARCH_TOOL = /usr/lib/arch_tool
  120. ARCHIFY = /usr/lib/arch_tool -archify_list
  121. CHOWN  = /etc/chown
  122. CHMOD  = /bin/chmod
  123. TAR    = /usr/bin/gnutar
  124. STRIP  = /bin/strip
  125. RM     = /bin/rm
  126. LN     = /bin/ln
  127. ECHO   = /bin/echo
  128. MKDIRS = /bin/mkdirs
  129. TOUCH  = /usr/bin/touch
  130. AWK    = /bin/awk
  131. PSWRAP = /usr/bin/pswrap
  132. MSGWRAP = /usr/bin/msgwrap
  133. MIG    = /usr/bin/mig
  134. DBC    = /NextDeveloper/Apps/DBModeler.app/dbcompiler
  135. COMPRESSHELP = /usr/bin/compresshelp
  136.  
  137. PUSHD = pushed_dir=`pwd` ; cd 
  138. POPD = cd $$pushed_dir
  139.  
  140. ADAPTOR_SEARCH_PATH = $(HOME)/Library/Adaptors /LocalLibrary/Adaptors /NextLibrary/Adaptors
  141.  
  142. DEFAULT_BUNDLE_EXTENSION = bundle
  143.  
  144. # Set VPATH via a variable so clients of common.make can reuse it when overriding VPATH
  145. NORMAL_VPATH = $(OFILE_DIR):$(SYM_DIR):$(LANGUAGE).lproj:$(PRODUCT_ROOT):$(PRODUCT_ROOT)/$(LANGUAGE).lproj
  146. VPATH = $(VPATH_PREAMBLE)$(NORMAL_VPATH)$(VPATH_POSTAMBLE)
  147.  
  148.  
  149. ### Use a set of basic suffix-style rules:
  150.  
  151. COMMON_APP_MAKEFILE_DIR = /NextDeveloper/Makefiles/app
  152. include $(COMMON_APP_MAKEFILE_DIR)/basicrules.make
  153.  
  154. ### Some utility definitions used throughout the PB Makefiles
  155.  
  156. process_target_archs = \
  157.     if [ -n "$(TARGET_ARCHS)" ] ; then \
  158.         archs="$(TARGET_ARCHS)" ; \
  159.         arch_cflags=`$(ARCHIFY) $$archs`; \
  160.     else \
  161.         archs="$(RC_ARCHS)" ; \
  162.         arch_cflags="$(RC_CFLAGS)" ; \
  163.     fi ; \
  164.     obj_dir=`$(ARCH_TOOL) -choose_obj_dir $$archs`
  165.  
  166. set_bundle_ext = \
  167.     if [ -z "$(BUNDLE_EXTENSION)" ] ; then \
  168.        bundle_ext=$(DEFAULT_BUNDLE_EXTENSION) ; \
  169.     else \
  170.        bundle_ext=$(BUNDLE_EXTENSION) ; \
  171.     fi 
  172.  
  173. ### Define all the targets necessary at every level of the project-hierarchy:
  174.  
  175. # The following rules and rule fragments do the recursion into "sub" projects
  176. # of this project and does a 'make project' for each one in its
  177. # respective directories.  This insures that we do not rely on the directory
  178. # timestamp or "hacK" file to know whether or not something has changed.  
  179.  
  180. CHANGES_COMMAND = $(CHANGES) $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE) "$(OFILE_DIR)"
  181.  
  182. use_default_directory_args = \
  183.     prod_root=`echo $(PRODUCT_ROOT) | sed '/^[^/]/s:^:../:'` ; \
  184.     ofile_dir=`echo $(OFILE_DIR) | sed '/^[^/]/s:^:../:'` ;\
  185.     sym_dir=`echo $(SYM_DIR) | sed '/^[^/]/s:^:../:'` 
  186.  
  187. use_absolute_directory_args = \
  188.       $(PUSHD) $(PRODUCT_ROOT) ; abs_prod_root=`pwd` ; $(POPD) ; \
  189.       prod_root=$$abs_prod_root ; \
  190.       $(PUSHD) $(OFILE_DIR) ; abs_ofile_dir=`pwd` ; $(POPD) ; \
  191.       ofile_dir=$$abs_ofile_dir ; \
  192.       $(PUSHD) $(SYM_DIR) ; abs_sym_dir=`pwd` ; $(POPD) ; \
  193.       sym_dir=$$abs_sym_dir 
  194.  
  195. subprojs $(SUBPROJ_OFILES):
  196.     @(targets=`$(CHANGES_COMMAND) $(SUBPROJECTS)`;\
  197.     for ofile in $(SUBPROJ_OFILES) none ; do \
  198.        if [ $$ofile = "none" ] ; then break; fi ; \
  199.        if [ ! -f $(OFILE_DIR)/$$ofile ] ; then \
  200.           targets="$(SUBPROJECTS)" ; break; \
  201.        fi ; \
  202.     done ; \
  203.     $(use_default_directory_args) ;\
  204.     for sub in $$targets none ; do \
  205.        if [ $$sub = "none" ] ; then break; fi ;\
  206.        if [ -h $$sub ] ; then \
  207.         $(use_absolute_directory_args) ; \
  208.        fi ; \
  209.        $(PUSHD) $$sub; $(ECHO) Making $$sub ; \
  210.        $(MAKE) project "NAME = $$sub" \
  211.                   "PRODUCT_ROOT = $$prod_root" \
  212.                 "TOP_PRODUCT_ROOT = $(TOP_PRODUCT_ROOT)" \
  213.                "OFILE_DIR = $$ofile_dir/$$sub" \
  214.                "SUBPROJ_OFILE_DIR = $$ofile_dir" \
  215.                "SYM_DIR = $$sym_dir/$$sub" \
  216.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  217.                "SRCROOT = $(SRCROOT)" \
  218.                "OBJROOT = $(OBJROOT)" \
  219.                "SYMROOT = $(SYMROOT)" \
  220.                "PROJ_CFLAGS = $(CFLAGS) -I$$sym_dir $(PROJ_CFLAGS) $(OTHER_CFLAGS)" \
  221.                "RC_CFLAGS = $(RC_CFLAGS)" ; \
  222.        $(POPD) ; $(ECHO) Finished making $$sub ; \
  223.     done )
  224.  
  225. bundles:
  226.     @(targets=`$(CHANGES_COMMAND) $(BUNDLES)` ; \
  227.     $(use_default_directory_args) ;\
  228.     for bun in $$targets none ; do \
  229.        if [ $$bun = "none" ] ; then break; fi ; \
  230.        if [ -h $$bun ] ; then \
  231.           $(use_absolute_directory_args) ; \
  232.        fi ; \
  233.        $(PUSHD) $$bun; $(ECHO) Making $$bun ; \
  234.        $(MAKE) project "NAME = $$bun" \
  235.                 "TOP_PRODUCT_ROOT = $(TOP_PRODUCT_ROOT)" \
  236.                        "BUNDLE_DIR = $$prod_root/$$bun" \
  237.                        "BUNDLE_PARENT_PRODUCT_DIR = $$prod_root" \
  238.                        "REL_BUNDLE_DIR = $$bun" \
  239.                "OFILE_DIR = $$ofile_dir/$$bun" \
  240.                "SYM_DIR = $$sym_dir/$$bun" \
  241.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  242.                "SRCROOT = $(SRCROOT)" \
  243.                "OBJROOT = $(OBJROOT)" \
  244.                "SYMROOT = $(SYMROOT)" \
  245.                "PROJ_CFLAGS = $(CFLAGS) -I$$sym_dir $(PROJ_CFLAGS) $(OTHER_CFLAGS)" \
  246.                "RC_CFLAGS = $(RC_CFLAGS)" ; \
  247.        $(POPD) ; $(ECHO) Finished making $$bun ; \
  248.     done )
  249.  
  250. tools:
  251.     @(targets=`$(CHANGES_COMMAND) $(TOOLS)` ; \
  252.     $(use_default_directory_args) ;\
  253.     for tool in $$targets none ; do \
  254.        if [ $$tool = "none" ] ; then break; fi ; \
  255.        if [ -h $$tool ] ; then \
  256.           $(use_absolute_directory_args) ; \
  257.        fi ; \
  258.        $(PUSHD) $$tool; $(ECHO) Making $$tool ; \
  259.        $(MAKE) project "NAME = $$tool" \
  260.                 "TOP_PRODUCT_ROOT = $(TOP_PRODUCT_ROOT)" \
  261.                        "PRODUCT_ROOT = $$prod_root" \
  262.                "OFILE_DIR = $$ofile_dir/$$tool" \
  263.                "SYM_DIR = $$sym_dir/$$tool" \
  264.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  265.                "SRCROOT = $(SRCROOT)" \
  266.                "OBJROOT = $(OBJROOT)" \
  267.                "SYMROOT = $(SYMROOT)" \
  268.                "PROJ_CFLAGS = $(CFLAGS) -I$$sym_dir $(PROJ_CFLAGS) $(OTHER_CFLAGS)" \
  269.                "RC_CFLAGS = $(RC_CFLAGS)" ; \
  270.        $(POPD) ; $(ECHO) Finished making $$tool ; \
  271.     done )
  272.  
  273. .bproj.strip .tproj.strip:
  274.     @(cd $<; \
  275.     $(MAKE) strip "DSTROOT = $(DSTROOT)" \
  276.               "PARENT_DIR = $(PARENT_DIR)" \
  277.               "NAME=$*")
  278.         
  279. strip:: strip_myself $(BUNDLES:.bproj=.strip) $(TOOLS:.tproj=.strip)
  280.  
  281. strip_myself::
  282.  
  283.  
  284. # The following rule insures that resources for this particular level in the project hierarchy get copied over to the appropriate place in the PRODUCT_ROOT.  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.
  285.  
  286. resources:: $(LOCAL_RESOURCES) $(GLOBAL_RESOURCES) $(HELP_STORES) $(OTHER_RESOURCES)
  287.     @(if [ "$(PRODUCT_ROOT)" != "." ] ; then \
  288.         $(MKDIRS) $(PRODUCT_ROOT)/$(LANGUAGE).lproj ; \
  289.     fi ; \
  290.     if [ "$(LOCAL_RESOURCES)" != "" ] ; then \
  291.        locals="" ; \
  292.        for resource in $(LOCAL_RESOURCES) none ; do   \
  293.           insert="true"; \
  294.           for helpdir in $(HELP_DIRS) $(OTHER_HELP_DIRS) none ; do \
  295.              if [ "$$resource" = "$$helpdir" ] ; \
  296.                then insert="false"; \
  297.          fi ; \
  298.           done ; \
  299.           if [ "$$insert" = "true" ] ; then \
  300.              locals="$$locals $$resource" ; \
  301.           fi ; \
  302.        done ; \
  303.        $(FASTCP) $$locals $(PRODUCT_ROOT)/$(LANGUAGE).lproj ; \
  304.     fi ; \
  305.     if [ "$(GLOBAL_RESOURCES)" != "" ] ; then \
  306.        $(FASTCP) $(GLOBAL_RESOURCES) $(PRODUCT_ROOT) ; \
  307.     fi )
  308.  
  309.  
  310. # rules for copying, cleaning and making dependencies
  311.  
  312. .bproj.copy .subproj.copy .tproj.copy:
  313.     @(cd $<; $(MAKE) copy "NAME=$*" "DEST=$(DEST)/$<")
  314.  
  315. .bproj.clean .subproj.clean .tproj.clean:
  316.     @(echo Cleaning $<... ; cd $<; \
  317.       $(MAKE) clean "NAME=$*")
  318.  
  319. .bproj.depend .subproj.depend .tproj.depend:
  320.     @(sym_dir=`echo $(SYM_DIR) | sed '/^[^/]/s:^:../:'` ; \
  321.     cd $<; \
  322.     $(MAKE) depend "NAME=$*" \
  323.                        "PROJ_CFLAGS = $(CFLAGS) $(PROJ_CFLAGS) $(OTHER_CFLAGS) -I$$sym_dir/$<" )
  324.  
  325. SRCROOT DEST:
  326.     @if [ -n "${$@}" ]; then exit 0; \
  327.     else $(ECHO) Must define $@; exit 1; fi
  328.  
  329. $(DEST)::
  330.     -$(RM) -rf $(DEST)
  331.     @$(MKDIRS) $(DEST)
  332.  
  333. $(NAME).copy:: DEST $(DEST) $(SRCFILES)
  334.     @(if [ "$(SRCFILES)" != "" ] ; then \
  335.            $(ECHO) "$(TAR) chf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -)" ; \
  336.            $(TAR) chf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -) ; \
  337.     fi ; \
  338.     $(MKDIRS) $(DEST)/$(LANGUAGE).lproj ; \
  339.     if [ "$(LOCAL_RESOURCES)" != "" ] ; then \
  340.        $(ECHO) "(cd $(LANGUAGE).lproj; $(TAR) chf - $(LOCAL_RESOURCES)) | (cd $(DEST)/$(LANGUAGE).lproj; $(TAR) xf - )" ; \
  341.        (cd $(LANGUAGE).lproj; $(TAR) chf - $(LOCAL_RESOURCES)) | (cd $(DEST)/$(LANGUAGE).lproj; $(TAR) xf -) ; \
  342.     fi ; \
  343.     supportfiles="" ; \
  344.     for i in $(SUPPORTFILES) $(APPICON) $(DOCICONS) none ; do \
  345.         if [ -r $$i -a ! -r $(DEST)/$$i ] ; then \
  346.         supportfiles="$$supportfiles $$i" ; \
  347.         fi ; \
  348.     done ; \
  349.     if [ "$$supportfiles" != "" ] ; then \
  350.        $(ECHO) "$(TAR) chf - $$supportfiles | (cd $(DEST); $(TAR) xf -)" ; \
  351.        $(TAR) chf - $$supportfiles | (cd $(DEST); $(TAR) xf -) ; \
  352.     fi)
  353.  
  354. $(NAME).clean::
  355.     @if [ ! -w . ] ; then $(ECHO) '***' project write-protected; exit 1 ; fi
  356.     $(RM) -rf $(GARBAGE)
  357.  
  358.  
  359. # Build a set of dependencies for current level into Makefile.dependencies 
  360.    
  361. Makefile.dependencies:: $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CXXFILES) $(CPPFILES) $(INITIAL_TARGETS)
  362.     $(RM) -f Makefile.dependencies 
  363.     @if [ "$(ENGLISH)" = "YES" -o "$(JAPANESE)" != "YES" ] ; then \
  364.         language_cflags="" ; \
  365.     else \
  366.         language_cflags="-DKANJI" ; \
  367.     fi ; \
  368.     echo "$(CC) -MM $(ALL_CFLAGS) $$language_cflags $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CXXFILES) $(CPPFILES) > Makefile.dependencies" ; \
  369.     $(CC) -MM $(ALL_CFLAGS) $$language_cflags $(CLASSES) $(MFILES) $(CFILES) \
  370.                 $(CCFILES) $(CAPCFILES) $(CXXFILES) $(CPPFILES) \
  371.        >  Makefile.dependencies
  372.         
  373.  
  374. copy:: $(NAME).copy $(BUNDLES:.bproj=.copy) \
  375.             $(SUBPROJECTS:.subproj=.copy) \
  376.             $(TOOLS:.tproj=.copy)
  377.  
  378. writable::
  379.     @chmod -R +w *
  380.  
  381. protected::
  382.     @chmod -R a-w *
  383.  
  384. installsrc:: SRCROOT
  385.     @($(MAKE) copy "DEST=$(SRCROOT)")
  386.  
  387. installhdrs::
  388.  
  389. clean:: 
  390.     @(if [ -z "$(BUNDLE_EXTENSION)" ] ; then \
  391.        bundle_ext=$(DEFAULT_BUNDLE_EXTENSION) ; \
  392.     else \
  393.        bundle_ext=$(BUNDLE_EXTENSION) ; \
  394.     fi ; \
  395.     $(MAKE) actual_clean "BUNDLE_EXTENSION = $$bundle_ext")
  396.     
  397. actual_clean:: $(NAME).clean $(BUNDLES:.bproj=.clean) \
  398.                  $(SUBPROJECTS:.subproj=.clean) \
  399.                  $(TOOLS:.tproj=.clean)
  400.  
  401.  
  402.  
  403.  
  404.