?RCS: $Id: Loc.U,v 3.0.1.10 1997/02/28 15:04:16 ram Exp $ ?RCS: ?RCS: Copyright (c) 1991-1993, Raphael Manfredi ?RCS: ?RCS: You may redistribute only under the terms of the Artistic Licence, ?RCS: as specified in the README file that comes with the distribution. ?RCS: You may reuse parts of this distribution only within the terms of ?RCS: that same Artistic Licence; a copy of which may be found at the root ?RCS: of the source tree for dist 3.0. ?RCS: ?RCS: $Log: Loc.U,v $ ?RCS: Revision 3.0.1.10 1997/02/28 15:04:16 ram ?RCS: patch61: allow users to specify paths on the command line ?RCS: patch61: will now substitute cp for ln if not supported ?RCS: ?RCS: Revision 3.0.1.9 1995/09/25 09:11:24 ram ?RCS: patch59: commented the purpose of the #un-def directive ?RCS: patch59: abort Configure run when mandatory command is missing ?RCS: ?RCS: Revision 3.0.1.8 1995/07/25 13:40:40 ram ?RCS: patch56: now knows about OS/2 platforms ?RCS: ?RCS: Revision 3.0.1.7 1995/01/11 15:13:37 ram ?RCS: patch45: protected "sh -c" within backquotes for Linux and SGI ?RCS: patch45: added path lookup for the 'comm' program ?RCS: ?RCS: Revision 3.0.1.6 1994/10/29 15:56:14 ram ?RCS: patch36: added ?F: line for metalint file checking ?RCS: patch36: be careful and guard against wildcard searching (ADO) ?RCS: ?RCS: Revision 3.0.1.5 1994/06/20 06:54:55 ram ?RCS: patch30: now locates find ?RCS: ?RCS: Revision 3.0.1.4 1994/05/13 15:18:15 ram ?RCS: patch27: added byacc to the trylist (ADO) ?RCS: patch27: lint lines reformatted (ADO) ?RCS: ?RCS: Revision 3.0.1.3 1994/01/24 14:01:44 ram ?RCS: patch16: added metalint hint on changed PATH variable ?RCS: ?RCS: Revision 3.0.1.2 1993/12/15 08:16:52 ram ?RCS: patch15: now set _test variable when test is built-in ?RCS: patch15: fixed rare cases where echo is not needed ?RCS: ?RCS: Revision 3.0.1.1 1993/09/13 15:47:13 ram ?RCS: patch10: test program not always in /bin/test (WAD) ?RCS: ?RCS: Revision 3.0 1993/08/18 12:05:05 ram ?RCS: Baseline for dist 3.0 netwide release. ?RCS: ?X: ?X: This unit produces a shell script "loc" which can be used to find out ?X: where in a list of directories something is. It then uses loc to ?X: determine the location of commonly used programs. It leaves loc sitting ?X: around for other Configure units to use, but arranges for its demise ?X: at the end of Configure. ?X: ?X: To add a new program to find, add it both to the ?MAKE: line and to either ?X: the loclist or trylist variable. ?X: ?X: I put startsh at the end of the dependency list, in order to avoid the ?X: loading of the spitshell unit before the instructions. ?X: ?MAKE:Loc Mcc awk ar bash bison byacc cat chgrp chmod chown \ comm compress cp cpio cpp csh date echo egrep emacs expr find flex \ gcc gzip grep inews ksh less line lint ln lp lpr ls mail mailx \ make mkdir more mv nroff perl pg pmake pr rm rmail sed sendmail \ shar sleep smail sort submit tail tar tbl test touch tr troff \ uname uniq uuname vi zcat zip: eunicefix n c Instruct Myread \ startsh ?MAKE: -pick weed $@ %< ?LINT:describe Loc Mcc awk ar bash bison byacc cat chgrp chmod chown \ comm compress cp cpio cpp csh date echo egrep emacs expr find flex \ gcc gzip grep inews ksh less line lint ln lp lpr ls mail mailx \ make mkdir more mv nroff perl pg pmake pr rm rmail sed sendmail \ shar sleep smail sort submit tail tar tbl test touch tr troff \ uname uniq uuname vi zcat zip ?V::pth loclist trylist ?F:./loc ?T:thisthing thing xxx dir file say _test ?LINT:change PATH : find out where common programs are echo " " echo "Locating common programs..." >&4 cat <loc $startsh case \$# in 0) exit 1;; esac thing=\$1 shift dflt=\$1 shift for dir in \$*; do case "\$thing" in .) if test -d \$dir/\$thing; then echo \$dir exit 0 fi ;; *) ?X: Be careful in case thing includes wildcards that might expand to multiple ?X: files. Choose the last one. This happens when searching for shared ?X: libraries with version numbers. How to choose which one we want is ?X: probably an insoluble problem, in general. ?X: Some folks leave things like libc.so.orig around w/o read ?X: permission. A -r test would handle that, but since ./loc is ?X: also used to find executables (which are installed w/o read ?X: permission on SCO ODT 3.0, we can't include the -r test. for thisthing in \$dir/\$thing; do : just loop through to pick last item done if test -f \$thisthing; then echo \$thisthing exit 0 elif test -f \$dir/\$thing.exe; then : on Eunice apparently echo \$dir/\$thing exit 0 fi ;; esac done echo \$dflt exit 1 EOSC chmod +x loc $eunicefix loc loclist=" ?awk:awk ?cat:cat ?chgrp:chgrp ?chmod:chmod ?chown:chown ?comm:comm ?cp:cp ?echo:echo ?expr:expr ?find:find ?grep:grep ?ls:ls ?make:make ?mkdir:mkdir ?mv:mv ?rm:rm ?sed:sed ?sleep:sleep ?sort:sort ?tail:tail ?touch:touch ?tr:tr ?uniq:uniq " trylist=" ?Mcc:Mcc ?ar:ar ?bash:bash ?bison:bison ?byacc:byacc ?compress:compress ?cpio:cpio ?cpp:cpp ?csh:csh ?date:date ?egrep:egrep ?emacs:emacs ?flex:flex ?gcc:gcc ?gzip:gzip ?inews:inews ?ksh:ksh ?less:less ?line:line ?lint:lint ?ln:ln ?lp:lp ?lpr:lpr ?mail:mail ?mailx:mailx ?more:more ?nroff:nroff ?perl:perl ?pg:pg ?pmake:pmake ?pr:pr ?rmail:rmail ?sendmail:sendmail ?shar:shar ?smail:smail ?submit:submit ?tar:tar ?tbl:tbl ?test:test ?troff:troff ?uname:uname ?uuname:uuname ?vi:vi ?zcat:zcat ?zip:zip " ?LINT:set Loc Mcc awk ar bash bison byacc cat chgrp chmod chown \ comm compress cp cpio cpp csh date echo egrep emacs expr find flex \ gcc gzip grep inews ksh less line lint ln lp lpr ls mail mailx \ make mkdir more mv nroff perl pg pmake pr rm rmail sed sendmail \ shar sleep smail sort submit tail tar tbl test touch tr troff \ uname uniq uuname vi zcat zip pth=`echo $PATH | sed -e "s/$p_/ /g"` pth="$pth /lib /usr/lib" for file in $loclist; do ?X: ?X: Allow them to -Dmake=pmake on the command line for instance... ?X: If the file is not fully qualified, as in -Dmake=pmake, then we ?X: look the for the specified command (pmake here). If they say ?X: -Dmake=/sbin/make for instance, then we make sure the file ?X: exists, or we die... ?X: eval xxx=\$$file case "$xxx" in /*|?:[\\/]*) if test -f "$xxx"; then : ok else echo "WARNING: no $xxx -- ignoring your setting for $file." >&4 xxx=`./loc $file $file $pth` fi ;; '') xxx=`./loc $file $file $pth`;; *) xxx=`./loc $xxx $xxx $pth`;; esac eval $file=$xxx eval _$file=$xxx case "$xxx" in /*) echo $file is in $xxx. ;; ?X: Under OS/2, we have PC-like paths ?:[\\/]*) echo $file is in $xxx. ;; *) echo "I don't know where '$file' is, and my life depends on it." >&4 echo "Go find a public domain implementation or fix your PATH setting!" >&4 exit 1 ;; esac done echo " " echo "Don't worry if any of the following aren't found..." say=offhand for file in $trylist; do ?X: Allow them to -Dmake=pmake on the command line for instance (see above) eval xxx=\$$file case "$xxx" in /*|?:[\\/]*) if test -f "$xxx"; then : ok else echo "WARNING: no $xxx -- ignoring your setting for $file." >&4 xxx=`./loc $file $file $pth` fi ;; '') xxx=`./loc $file $file $pth`;; *) xxx=`./loc $xxx $xxx $pth`;; esac eval $file=$xxx eval _$file=$xxx case "$xxx" in /*) echo $file is in $xxx. ;; ?X: Under OS/2, we have PC-like paths ?:[\\/]*) echo $file is in $xxx. ;; *) echo "I don't see $file out there, $say." say=either ;; esac done case "$egrep" in egrep) echo "Substituting grep for egrep." egrep=$grep ;; esac @if ln case "$ln" in ln) echo "Substituting cp for ln." ln=$cp ;; esac @end case "$test" in test) echo "Hopefully test is built into your sh." ;; *) if `sh -c "PATH= test true" >/dev/null 2>&1`; then echo "Using the test built into your sh." ?X: ?X: We need to set both test and _test, since Oldconfig.U will use the _test ?X: value to systematically restore computed paths, which may be wrong if ?X: we choose to load an old config.sh generated on another platform. ?X: test=test _test=test fi ;; esac ?LINT:change n c case "$echo" in echo) echo "Hopefully echo is built into your sh." ;; ?X: For those rare cases where we don't need $echo... '') ;; *) echo " " echo "Checking compatibility between $echo and builtin echo (if any)..." >&4 $echo $n "hi there$c" >foo1 echo $n "hi there$c" >foo2 if cmp foo1 foo2 >/dev/null 2>&1; then echo "They are compatible. In fact, they may be identical." else case "$n" in '-n') n='' c='\c';; *) n='-n' c='';; esac cat <$c" $echo "*" fi $rm -f foo1 foo2 ;; esac