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