# # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # This Makefile is used exclusively by `xref' to generate and maintain # cross-reference databases (right now: cscope, ctags, and etags). # # By default, the cross-reference is built for all files underneath the # currrent working directory that match the criteria specified in the # xref.files rule below, and any files that would also be hauled over as # part of a `bringover' of the working directory (though this can be # turned off via the -f flag to `xref'). # # However, this behavior can be customized in each directory of the build # tree through the following Makefile macros, if necessary: # # XRDIRS: The list of directories to include; defaults to `.'. # The more interesting directories should be listed earlier. # XRPRUNE: The list of directories to prune out. # XRADD: The list of additional filename globs to include. # XRDEL: The list of additional filename globs to exclude. # XRINCDIRS: The list of additional include paths, in "foo bar" format. # XRINCS: The list of additional include paths, in "-Ifoo -Ibar" format. # # Note that XRINCDIRS and XRINCS are for specifying header paths that are # not already included in CPPFLAGS and HDRDIR. # # These macros are assumed to be set in a file named `Makefile', but this # too can be overridden via the -m option to `xref'. # # This Makefile should *never* be included by other Makefiles. # XRMAKEFILE=Makefile include $(SRC)/Makefile.master # # Default values for the cross-reference tools; these can be overridden # either in the environment or in XRMAKEFILE. To use regular cscope, set # CSCOPE to cscope and CSFLAGS to -b. # CSCOPE = $(BUILD_TOOLS)/onbld/bin/$(MACH)/cscope-fast CSFLAGS = -bq CTAGS = /usr/bin/ctags CTFLAGS = -wt ETAGS = $(SPRO_VROOT)/bin/etags ETFLAGS = -t FLGFLP = $(BUILD_TOOLS)/onbld/bin/flg.flp XRDIRS = . XRINCS = $(XRINCDIRS:%=-I%) $(HDRDIR:%=-I%) $(CPPFLAGS) include $(XRMAKEFILE) XRADDLIST = $(XRADD) *.[Ccdshlxy] Makefile* *.il* *.cc llib-* *.xml \ *.dtd.* *.ndl XRDELLIST = $(XRDEL) *.ln XRPRUNELIST = $(XRPRUNE) .hg XRFINDADD = $(XRADDLIST:%=-o -name '%') XRFINDDEL = $(XRDELLIST:%=-a ! -name '%') XRFINDPRUNE = $(XRPRUNELIST:%=-o -name '%') XRSEDPRUNE = $(XRPRUNELIST:%=/\/%\//d; /^%\//d;) .KEEP_STATE: .PRECIOUS: cscope.out cscope.in.out cscope.po.out tags TAGS # # Build the list of files to be included in the cross-reference database. # # Please note that: # # * Any additional FLG-related source files are in xref.flg. # # * We use relative pathnames for the file list; this makes it easier # to share the resulting cross-reference across machines. We also # strip the leading './' off of pathnames (if necessary) so that we # don't trip up vi (since it thinks foo.c and ./foo.c are different # files). # # * We strip out any duplicate file names, being careful not to # disturb the order of the file list. # # * We put all the Makefiles at the end of the file list, since they're # not really source files and thus can cause problems. # # * We otherwise do not sort the file list, since we assume that if # the order matters, then XRDIRS would've been set so that the more # important directories are first. # xref.files: $(TOUCH) xref.flg $(FIND) $(XRDIRS) `$(CAT) xref.flg` \ -type d \( -name SCCS $(XRFINDPRUNE) \) -prune -o \ -type f \( \( -name '' $(XRFINDADD) \) $(XRFINDDEL) \) -print |\ $(PERL) -ne 's:^\./::; next if ($$seen{$$_}++); print' > xref.tmp > xref.files -$(GREP) -v Makefile xref.tmp >> xref.files -$(GREP) Makefile xref.tmp >> xref.files $(RM) xref.tmp # # Use the .flg files to assemble a list of other source files that are # important for building the sources in XRDIRS. So that the list can be # fed to the $(FIND) in xref.files, we tell $(FLGFLP) to generate relative # pathnames. We filter out any files that are along paths that are being # pruned. # xref.flg: > xref.tmp for dir in $(XRDIRS); do \ $(FLGFLP) -r $$dir >> xref.tmp; \ done $(SED) '$(XRSEDPRUNE)' < xref.tmp | $(SORT) -u > xref.flg $(RM) xref.tmp # # Note that we don't remove the old cscope.out since cscope is smart enough # to rebuild only what has changed. It can become confused, however, if files # are renamed or removed, so it may be necessary to do an `xref -c' if # a lot of reorganization has occured. # xref.cscope: xref.files -$(ECHO) $(XRINCS) | $(XARGS) -n1 | $(GREP) '^-I' | \ $(CAT) - xref.files > cscope.files $(CSCOPE) $(CSFLAGS) xref.cscope.clobber: xref.clean -$(RM) cscope.out cscope.in.out cscope.po.out cscope.files # # Create tags databases, similar to above. # # Since assembler files contain C fragments for lint, the lint fragments will # allow tags to "work" on assembler. Please note that: # # * We order the tags file such that source files that tags seems to # get along with best are earlier in the list, and so that structure # definitions are ordered before their uses. # # * We *don't* sort the file list within a given suffix, since we # assume that if someone cared about ordering, they would've already # set XRDIRS so that the more important directories are first. # # * We include "/dev/null" in the xref.ctags rule to prevent ctags # from barfing if "xref.tfiles" ends up empty (alas, ctags is # too lame to read its file list from stdin like etags does). # xref.ctags: xref.tfiles $(CTAGS) $(CTFLAGS) /dev/null `$(CAT) xref.tfiles` xref.ctags.clobber: xref.clean -$(RM) tags xref.etags: xref.tfiles $(CAT) xref.tfiles | $(ETAGS) $(ETFLAGS) - xref.etags.check: @$(CAT) /dev/null | $(ETAGS) - xref.etags.clobber: xref.clean -$(RM) TAGS xref.tfiles: xref.files > xref.tfiles -for suffix in h c C cc l y s; do \ $(GREP) "\.$${suffix}$$" xref.files >> xref.tfiles; \ done # # Note that we put `cscope.files' in clobber rather than clean because # cscope will whine if it doesn't exist (unless it's passed -d). # xref.clean: -$(RM) xref.tfiles xref.files xref.tmp xref.flg ncscope.*