Home | History | Annotate | Download | only in scripts
      1 #
      2 # CDDL HEADER START
      3 #
      4 # The contents of this file are subject to the terms of the
      5 # Common Development and Distribution License (the "License").
      6 # You may not use this file except in compliance with the License.
      7 #
      8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9 # or http://www.opensolaris.org/os/licensing.
     10 # See the License for the specific language governing permissions
     11 # and limitations under the License.
     12 #
     13 # When distributing Covered Code, include this CDDL HEADER in each
     14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15 # If applicable, add the following below this CDDL HEADER, with the
     16 # fields enclosed by brackets "[]" replaced with your own identifying
     17 # information: Portions Copyright [yyyy] [name of copyright owner]
     18 #
     19 # CDDL HEADER END
     20 #
     21 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     22 # Use is subject to license terms.
     23 #
     24 # This Makefile is used exclusively by `xref' to generate and maintain
     25 # cross-reference databases (right now: cscope, ctags, and etags).
     26 #
     27 # By default, the cross-reference is built for all files underneath the
     28 # currrent working directory that match the criteria specified in the
     29 # xref.files rule below, and any files that would also be hauled over as
     30 # part of a `bringover' of the working directory (though this can be
     31 # turned off via the -f flag to `xref').
     32 #
     33 # However, this behavior can be customized in each directory of the build
     34 # tree through the following Makefile macros, if necessary:
     35 #
     36 #   XRDIRS:	The list of directories to include; defaults to `.'.
     37 #		The more interesting directories should be listed earlier.
     38 #   XRPRUNE:	The list of directories to prune out.
     39 #   XRADD:	The list of additional filename globs to include.
     40 #   XRDEL:	The list of additional filename globs to exclude.
     41 #   XRINCDIRS:	The list of additional include paths, in "foo bar" format.
     42 #   XRINCS:	The list of additional include paths, in "-Ifoo -Ibar" format.
     43 #
     44 # Note that XRINCDIRS and XRINCS are for specifying header paths that are
     45 # not already included in CPPFLAGS and HDRDIR.
     46 #	
     47 # These macros are assumed to be set in a file named `Makefile', but this
     48 # too can be overridden via the -m option to `xref'.
     49 #
     50 # This Makefile should *never* be included by other Makefiles.
     51 #
     52 
     53 XRMAKEFILE=Makefile
     54 include $(SRC)/Makefile.master
     55 
     56 #
     57 # Default values for the cross-reference tools; these can be overridden
     58 # either in the environment or in XRMAKEFILE.  To use regular cscope, set
     59 # CSCOPE to cscope and CSFLAGS to -b.
     60 #
     61 CSCOPE	= $(BUILD_TOOLS)/onbld/bin/$(MACH)/cscope-fast
     62 CSFLAGS	= -bq
     63 CTAGS	= /usr/bin/ctags
     64 CTFLAGS	= -wt
     65 ETAGS	= $(SPRO_VROOT)/bin/etags
     66 ETFLAGS	= -t
     67 FLGFLP	= $(BUILD_TOOLS)/onbld/bin/flg.flp
     68 
     69 XRDIRS	= .
     70 XRINCS	= $(XRINCDIRS:%=-I%) $(HDRDIR:%=-I%) $(CPPFLAGS)
     71 
     72 include $(XRMAKEFILE)
     73 
     74 XRADDLIST	= $(XRADD) *.[Ccdshlxy] Makefile* *.il* *.cc llib-* *.xml \
     75 		  *.dtd.* *.ndl
     76 XRDELLIST	= $(XRDEL) *.ln
     77 XRPRUNELIST	= $(XRPRUNE) .hg
     78 XRFINDADD	= $(XRADDLIST:%=-o -name '%')
     79 XRFINDDEL	= $(XRDELLIST:%=-a ! -name '%')
     80 XRFINDPRUNE	= $(XRPRUNELIST:%=-o -name '%')
     81 XRSEDPRUNE	= $(XRPRUNELIST:%=/\/%\//d; /^%\//d;)
     82 
     83 .KEEP_STATE:
     84 .PRECIOUS: cscope.out cscope.in.out cscope.po.out tags TAGS
     85 
     86 #
     87 # Build the list of files to be included in the cross-reference database.
     88 #
     89 # Please note that:
     90 #
     91 #	* Any additional FLG-related source files are in xref.flg.
     92 #
     93 #	* We use relative pathnames for the file list; this makes it easier
     94 #	  to share the resulting cross-reference across machines.  We also
     95 #	  strip the leading './' off of pathnames (if necessary) so that we
     96 #	  don't trip up vi (since it thinks foo.c and ./foo.c are different
     97 #	  files).
     98 #
     99 #	* We strip out any duplicate file names, being careful not to
    100 #	  disturb the order of the file list.
    101 #
    102 #	* We put all the Makefiles at the end of the file list, since they're
    103 #	  not really source files and thus can cause problems.
    104 #
    105 #	* We otherwise do not sort the file list, since we assume that if
    106 #	  the order matters, then XRDIRS would've been set so that the more
    107 #	  important directories are first.
    108 #
    109 xref.files:
    110 	$(TOUCH) xref.flg
    111 	$(FIND) $(XRDIRS) `$(CAT) xref.flg` 			\
    112 	    -type d \( -name SCCS $(XRFINDPRUNE) \) -prune -o	\
    113 	    -type f \( \( -name '' $(XRFINDADD) \) $(XRFINDDEL) \) -print |\
    114 	    $(PERL) -ne 's:^\./::; next if ($$seen{$$_}++); print' > xref.tmp
    115 	> xref.files
    116 	-$(GREP) -v Makefile xref.tmp >> xref.files
    117 	-$(GREP) Makefile xref.tmp >> xref.files
    118 	$(RM) xref.tmp
    119 
    120 #
    121 # Use the .flg files to assemble a list of other source files that are
    122 # important for building the sources in XRDIRS.  So that the list can be
    123 # fed to the $(FIND) in xref.files, we tell $(FLGFLP) to generate relative
    124 # pathnames.  We filter out any files that are along paths that are being
    125 # pruned.
    126 #
    127 xref.flg:
    128 	> xref.tmp
    129 	for dir in $(XRDIRS); do					\
    130 		$(FLGFLP) -r $$dir >> xref.tmp;				\
    131 	done
    132 	$(SED) '$(XRSEDPRUNE)' < xref.tmp | $(SORT) -u > xref.flg
    133 	$(RM) xref.tmp
    134 
    135 #
    136 # Note that we don't remove the old cscope.out since cscope is smart enough
    137 # to rebuild only what has changed.  It can become confused, however, if files
    138 # are renamed or removed, so it may be necessary to do an `xref -c' if 
    139 # a lot of reorganization has occured.
    140 #
    141 xref.cscope: xref.files
    142 	-$(ECHO) $(XRINCS) | $(XARGS) -n1 | $(GREP) '^-I' | 		\
    143 	    $(CAT) - xref.files > cscope.files
    144 	$(CSCOPE) $(CSFLAGS)
    145 
    146 xref.cscope.clobber: xref.clean
    147 	-$(RM) cscope.out cscope.in.out cscope.po.out cscope.files
    148 
    149 #
    150 # Create tags databases, similar to above.
    151 #
    152 # Since assembler files contain C fragments for lint, the lint fragments will
    153 # allow tags to "work" on assembler.  Please note that:
    154 #
    155 #	* We order the tags file such that source files that tags seems to
    156 #	  get along with best are earlier in the list, and so that structure
    157 #	  definitions are ordered before their uses.
    158 #
    159 #	* We *don't* sort the file list within a given suffix, since we
    160 #	  assume that if someone cared about ordering, they would've already
    161 #	  set XRDIRS so that the more important directories are first.
    162 #
    163 #	* We include "/dev/null" in the xref.ctags rule to prevent ctags
    164 #	  from barfing if "xref.tfiles" ends up empty (alas, ctags is
    165 #	  too lame to read its file list from stdin like etags does).
    166 #
    167 
    168 xref.ctags: xref.tfiles
    169 	$(CTAGS) $(CTFLAGS) /dev/null `$(CAT) xref.tfiles`
    170 
    171 xref.ctags.clobber: xref.clean
    172 	-$(RM) tags
    173 
    174 xref.etags: xref.tfiles
    175 	$(CAT) xref.tfiles | $(ETAGS) $(ETFLAGS) -
    176 
    177 xref.etags.check:
    178 	@$(CAT) /dev/null | $(ETAGS) -
    179 
    180 xref.etags.clobber: xref.clean
    181 	-$(RM) TAGS
    182 
    183 xref.tfiles: xref.files
    184 	> xref.tfiles
    185 	-for suffix in h c C cc l y s; do				\
    186 		$(GREP) "\.$${suffix}$$" xref.files >> xref.tfiles;	\
    187 	done
    188 
    189 #
    190 # Note that we put `cscope.files' in clobber rather than clean because
    191 # cscope will whine if it doesn't exist (unless it's passed -d).
    192 #
    193 xref.clean:
    194 	-$(RM) xref.tfiles xref.files xref.tmp xref.flg ncscope.*
    195