xref: /illumos-gate/usr/src/tools/scripts/xref.sh (revision e44e85a7f9935f0428e188393e3da61b17e83884)
1#! /bin/ksh -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22#
23# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24# Use is subject to license terms.
25#
26# xref: build and maintain source cross-reference databases.
27#
28
29ONBLDDIR=$(dirname $(whence $0))
30
31PATH=/usr/bin:/usr/ccs/bin:${BUILD_TOOLS:-/opt}/teamware/bin:$ONBLDDIR
32export PATH
33PROG=`basename $0`
34XREFMK=`dirname $0`/xref.mk
35XRMAKEFILE=Makefile export XRMAKEFILE
36
37#
38# The CSCOPEOPTIONS variable can cause problems if it's set in the environment
39# when using cscope; remove it.
40#
41unset CSCOPEOPTIONS
42
43#
44# The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout
45# under certain circumstances, which can really screw things up; unset it.
46#
47unset CDPATH
48
49#
50# Print the provided failure message and exit with an error.
51#
52fail()
53{
54        echo $PROG: $@ > /dev/stderr
55        exit 1
56}
57
58#
59# Print the provided warning message.
60#
61warn()
62{
63        echo $PROG: warning: $@ > /dev/stderr
64}
65
66#
67# Print the provided informational message.
68#
69info()
70{
71        echo $PROG: $@
72}
73
74#
75# Print the provided informational message, and the current value of $SECONDS
76# in a user-friendly format.
77#
78timeinfo()
79{
80	typeset -Z2 sec
81	typeset -i min seconds
82
83	((seconds = SECONDS))
84	((min = seconds / 60))
85	((sec = seconds % 60))
86
87	info "$1 in ${min}m${sec}s"
88}
89
90which_scm | read SCM_MODE CODEMGR_WS || exit 1
91
92if [[ $SCM_MODE == "unknown" ]];then
93	print -u2 "Unable to determine SCM type currently in use."
94	exit 1
95fi
96
97export CODEMGR_WS
98SRC=$CODEMGR_WS/usr/src export SRC
99MACH=`uname -p` export MACH
100
101[ -f $XREFMK ] || fail "cannot locate xref.mk"
102
103clobber=
104noflg=
105xrefs=
106
107while getopts cfm:px: flag; do
108	case $flag in
109	c)
110		clobber=y
111		;;
112	f)
113		noflg=y
114		;;
115	m)
116		XRMAKEFILE=$OPTARG
117		;;
118	p)
119		#
120		# The ENVCPPFLAGS* environment variables contain the include
121		# paths to our proto areas; clear 'em so that they don't end
122		# up in CPPFLAGS, and thus don't end up in XRINCS in xref.mk.
123		#
124		ENVCPPFLAGS1=
125		ENVCPPFLAGS2=
126		ENVCPPFLAGS3=
127		ENVCPPFLAGS4=
128		;;
129 	x)
130		xrefs=$OPTARG
131		;;
132	\?)
133		echo "usage: $PROG [-cfp] [-m <makefile>]"\
134		     "[-x cscope|ctags|etags[,...]] [<subtree> ...]"\
135		      > /dev/stderr
136		exit 1
137		;;
138	esac
139done
140
141shift $((OPTIND - 1))
142
143#
144# Get the list of directories before we reset $@.
145#
146dirs=$@
147[ -z "$dirs" ] && dirs=.
148
149#
150# Get the canonical path to the workspace.  This allows xref to work
151# even in the presence of lofs(7FS).
152#
153cd $CODEMGR_WS
154CODEMGR_WS=`/bin/pwd`
155cd - > /dev/null
156
157#
158# Process the xref format list.  For convenience, support common synonyms
159# for the xref formats.
160#
161if [ -z "$xrefs" ]; then
162	#
163	# Disable etags if we can't find it.
164	#
165	xrefs="cscope ctags"
166	make -e -f $XREFMK xref.etags.check 2>/dev/null 1>&2 && \
167	    xrefs="$xrefs etags"
168else
169	oldifs=$IFS
170	IFS=,
171	set -- $xrefs
172	IFS=$oldifs
173
174	xrefs=
175	for xref; do
176		case $xref in
177		cscope|cscope.out)
178			xrefs="$xrefs cscope"
179			;;
180		ctags|tags)
181			xrefs="$xrefs ctags"
182			;;
183		etags|TAGS)
184			xrefs="$xrefs etags"
185			;;
186		*)
187			warn "ignoring unknown cross-reference \"$xref\""
188			;;
189 		esac
190 	done
191
192	[ -z "$xrefs" ] && fail "no known cross-reference formats specified"
193fi
194
195#
196# Process the requested list of directories.
197#
198for dir in $dirs; do
199	if [ ! -d $dir ]; then
200		warn "directory \"$dir\" does not exist; skipping"
201		continue
202	fi
203
204	#
205	# NOTE: we cannot use $PWD because it will mislead in the presence
206	# of lofs(7FS).
207	#
208	cd $dir || fail "cannot change to directory $dir"
209	pwd=`/bin/pwd`
210	reldir=${pwd##${CODEMGR_WS}/}
211	if [ "$reldir" = "$pwd" ]; then
212		warn "directory \"$pwd\" is not beneath \$CODEMGR_WS; skipping"
213		cd - > /dev/null
214		continue
215	fi
216
217	#
218	# If we're building cross-references, then run `xref.clean' first
219	# to purge any crud that may be lying around from previous aborted runs.
220	#
221	if [ -z "$clobber" ]; then
222		make -e -f $XREFMK xref.clean > /dev/null
223	fi
224
225	#
226	# Find flg-related source files, if requested.
227	#
228	if [ -z "$noflg" -a -z "$clobber" ]; then
229		SECONDS=0
230    		info "$reldir: finding flg-related source files"
231		make -e -f $XREFMK xref.flg > /dev/null
232		if [ $? -ne 0 ]; then
233			warn "$reldir: unable to find flg-related source files"
234		else
235			nfiles=`wc -l < xref.flg`
236			if [ "$nfiles" -eq 1 ]; then
237				msg="found 1 flg-related source file"
238			else
239				msg="found $nfiles flg-related source files"
240			fi
241			timeinfo "$reldir: $msg"
242		fi
243	fi
244
245	#
246	# Build or clobber all of the requested cross-references.
247	#
248	for xref in $xrefs; do
249		if [ -n "$clobber" ]; then
250			info "$reldir: clobbering $xref cross-reference"
251			make -e -f $XREFMK xref.${xref}.clobber > /dev/null ||
252 			    warn "$reldir: cannot clobber $xref cross-reference"
253			continue
254		fi
255
256		SECONDS=0
257		info "$reldir: building $xref cross-reference"
258		make -e -f $XREFMK xref.${xref} > /dev/null ||
259		    fail "$reldir: cannot build $xref cross-reference"
260		timeinfo "$reldir: built $xref cross-reference"
261 	done
262
263	make -e -f $XREFMK xref.clean > /dev/null ||
264	    warn "$reldir: cannot clean up temporary files"
265	cd - > /dev/null
266done
267exit 0
268