?RCS: $Id$
?RCS:
?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
?RCS:
?RCS: You may redistribute only under the terms of the Artistic License,
?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 License; a copy of which may be found at the root
?RCS: of the source tree for dist 4.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 awk ar bash bison byacc cat chgrp chmod chown \
	comm compress cp cpio cpp csh date echo egrep emacs expr find flex \
	gmake gzip grep inews ksh less line lint ln lp lpr ls mail mailx \
	make mkdir more mv nm nroff perl pg pmake pr rm rmail sed sendmail \
	shar sleep smail sort submit tail tar tbl tee test touch tr troff \
	uname uniq uuname vi zcat zip:  eunicefix n c startsh Instruct Warn
?MAKE:	-pick weed $@ %<
?LINT:describe awk ar bash bison byacc cat chgrp chmod chown \
	comm compress cp cpio cpp csh date echo egrep emacs expr find flex \
	gmake gzip grep inews ksh less line lint ln lp lpr ls mail mailx \
	make mkdir more mv nm nroff perl pg pmake pr rm rmail sed sendmail \
	shar sleep smail sort submit tail tar tbl tee test touch tr troff \
	uname uniq uuname vi zcat zip
?V::pth loclist trylist
?F:./loc
?T:thisthing thing xxx dir file say DJGPP
?T:_test _grep _cp _gmake _egrep _ln _make dflt
?LINT: change PATH
: find out where common programs are
echo " "
echo "Locating common programs..." >&4
cat <<EOSC >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 \$thisthing$_exe; then
		echo \$thisthing
		exit 0
	elif test -f \$dir/\$thing.exe; then
		if test -n "$DJGPP"; then
			echo \$dir/\$thing.exe
		else
			: on Eunice apparently
			echo \$dir/\$thing
		fi
		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
?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
?gmake:gmake
?gzip:gzip
?inews:inews
?ksh:ksh
?less:less
?line:line
?lint:lint
?ln:ln
?lp:lp
?lpr:lpr
?mail:mail
?mailx:mailx
?make:make
?more:more
?nm:nm
?nroff:nroff
?perl:perl
?pg:pg
?pmake:pmake
?pr:pr
?rmail:rmail
?sendmail:sendmail
?shar:shar
?smail:smail
?submit:submit
?tar:tar
?tbl:tbl
?tee:tee
?test:test
?troff:troff
?uname:uname
?uuname:uuname
?vi:vi
?zcat:zcat
?zip:zip
"
?LINT:set awk ar bash bison byacc cat chgrp chmod chown \
	comm compress cp cpio cpp csh date echo emacs expr find flex \
	gmake gzip grep inews ksh less line lint lp lpr ls mail mailx \
	mkdir more mv nm nroff perl pg pmake pr rm rmail sed sendmail \
	shar sleep smail sort submit tail tar tbl tee 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
			./warn "no $xxx -- ignoring your setting for $file."
			xxx=`./loc $file $file $pth`
		fi
		;;
	'') xxx=`./loc $file $file $pth`;;
	*) xxx=`./loc $xxx $xxx $pth`;;
	esac
	eval $file=$xxx$_exe
	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
			./warn "no $xxx -- ignoring your setting for $file."
			xxx=`./loc $file $file $pth`
		fi
		;;
	'') xxx=`./loc $file $file $pth`;;
	*) xxx=`./loc $xxx $xxx $pth`;;
	esac
	eval $file=$xxx$_exe
	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
	_egrep=$_grep
	;;
esac
@if ln
case "$ln" in
ln)
	echo "Substituting cp for ln."
	ln=$cp
	_ln=$_cp
	;;
esac
@end
@if make || gmake
case "$make" in
make)
	case "$gmake" in
	gmake)
	echo "I can't find make or gmake, and my life depends on it." >&4
	echo "Go find a public domain implementation or fix your PATH setting!" >&4
	exit 1
	;;
	esac
	;;
esac
case "$gmake" in
gmake)	;;
*)	# We can't have osname yet.
	if test -f "/system/gnu_library/bin/ar.pm"; then # Stratus VOS
		# Assume that gmake, if found, is definitely GNU make
		# and prefer it over the system make.
		echo "Substituting gmake for make."
		make=$gmake
		_make=$_gmake
	fi
	;;
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 <<FOO
They are not compatible!  You are probably running ksh on a non-USG system.
I'll have to use $echo instead of the builtin, since Bourne shell doesn't
have echo built in and we may have to run some Bourne shell scripts.  That
means I'll have to use '$n$c' to suppress newlines now.  Life is ridiculous.

FOO
		$echo $n "The star should be here-->$c"
		$echo "*"
	fi
	$rm -f foo1 foo2
	;;
esac

