xref: /illumos-gate/usr/src/contrib/ast/src/cmd/INIT/C+probe (revision b30d1939)
1*b30d1939SAndy Fiddaman:
2*b30d1939SAndy Fiddaman### this script contains archaic constructs that work with all sh variants ###
3*b30d1939SAndy Fiddaman# Glenn Fowler
4*b30d1939SAndy Fiddaman# AT&T Research
5*b30d1939SAndy Fiddaman#
6*b30d1939SAndy Fiddaman# @(#)C probe (AT&T Research) 2012-02-29
7*b30d1939SAndy Fiddaman#
8*b30d1939SAndy Fiddaman# probe [ -d ] c-compiler-path [ attributes ]
9*b30d1939SAndy Fiddaman#
10*b30d1939SAndy Fiddaman# common C probe preamble for the tool specific probes
11*b30d1939SAndy Fiddaman#
12*b30d1939SAndy Fiddaman# NOTE: some cc -E's do syntax analysis!
13*b30d1939SAndy Fiddaman
14*b30d1939SAndy Fiddaman#
15*b30d1939SAndy Fiddaman# probe_* are first eval'd and then attempted from left to right
16*b30d1939SAndy Fiddaman#
17*b30d1939SAndy Fiddaman
18*b30d1939SAndy Fiddamanprobe_binding="-dy -dn -Bdynamic -Bstatic '-Wl,-ashared -Wl,+s' -Wl,-aarchive -call_shared -non_shared -dynamic -static -bshared -bstatic '' -static"
19*b30d1939SAndy Fiddamanprobe_env="CC_OPTIONS CCOPTS LD_OPTIONS LDOPTS LIBPATH LPATH"
20*b30d1939SAndy Fiddamanprobe_include="stdio.h iostream.h complex.h ctype.h plot.h stdarg.h varargs.h ranlib.h hash.h sys/types.h stab.h cmath cstdio iostream string"
21*b30d1939SAndy Fiddamanprobe_longlong="long 'long long'"
22*b30d1939SAndy Fiddamanprobe_longlong_t="__int64_t _int64_t __int64 _int64 int64"
23*b30d1939SAndy Fiddamanprobe_l="l yyreject m sin mopt sin"
24*b30d1939SAndy Fiddamanprobe_lxx="C exit ++ exit g++ exit"
25*b30d1939SAndy Fiddamanprobe_ppprefix="a n"
26*b30d1939SAndy Fiddamanprobe_size="size"
27*b30d1939SAndy Fiddamanprobe_src="cxx C cc c"
28*b30d1939SAndy Fiddamanprobe_sa=".sa"
29*b30d1939SAndy Fiddamanprobe_sd=".dll .lib .dll .x"
30*b30d1939SAndy Fiddamanprobe_sdb=".pdb"
31*b30d1939SAndy Fiddamanprobe_so=".dylib .so .sl"
32*b30d1939SAndy Fiddamanprobe_symprefix="_"
33*b30d1939SAndy Fiddamanprobe_verbose="'-v -v' '-# -#' '-d -d' -dryrun '-V -V'"
34*b30d1939SAndy Fiddamanprobe_version="--version -V -version -v"
35*b30d1939SAndy Fiddaman
36*b30d1939SAndy Fiddaman#
37*b30d1939SAndy Fiddaman# the following are set by the preamble for the tool specific probe
38*b30d1939SAndy Fiddaman#
39*b30d1939SAndy Fiddaman
40*b30d1939SAndy Fiddamancc=cc
41*b30d1939SAndy Fiddamandebug=
42*b30d1939SAndy Fiddamandir=.
43*b30d1939SAndy Fiddamandll=.dll
44*b30d1939SAndy Fiddamandynamic=
45*b30d1939SAndy Fiddamanexe=exe
46*b30d1939SAndy Fiddamanexecutable="test -x"
47*b30d1939SAndy Fiddamanhosted=
48*b30d1939SAndy Fiddamanifs=${IFS-'
49*b30d1939SAndy Fiddaman	 '}
50*b30d1939SAndy Fiddamanobj=o
51*b30d1939SAndy Fiddamanppenv=
52*b30d1939SAndy Fiddamanppopt=
53*b30d1939SAndy Fiddamanpredef=
54*b30d1939SAndy Fiddamanprepred=
55*b30d1939SAndy Fiddamansa=
56*b30d1939SAndy Fiddamansd=
57*b30d1939SAndy Fiddamansdb=
58*b30d1939SAndy Fiddamanso=
59*b30d1939SAndy Fiddamansov=
60*b30d1939SAndy Fiddamanstatic=
61*b30d1939SAndy Fiddamanstdlib=
62*b30d1939SAndy Fiddamanstdpp=
63*b30d1939SAndy Fiddamansuffix_command=
64*b30d1939SAndy Fiddamanif	test "" != "$TMPDIR" -a -d "$TMPDIR"
65*b30d1939SAndy Fiddamanthen	tmpdir=$TMPDIR
66*b30d1939SAndy Fiddamanelse	tmpdir=/tmp
67*b30d1939SAndy Fiddamanfi
68*b30d1939SAndy Fiddamantmpdir=$tmpdir/probe$$
69*b30d1939SAndy Fiddamanundef="define defined elif else endif error if ifdef ifndef include line pragma undef __STDC__ __STDPP__ __ARGC__ __BASE__ __BASE_FILE__ __DATE__ __FILE__ __FUNCTION__ __INCLUDE_LEVEL__ __LINE__ __PATH__ __TIME__ __TIMESTAMP__ __VERSION__"
70*b30d1939SAndy Fiddamanversion_flags=
71*b30d1939SAndy Fiddamanversion_stamp=
72*b30d1939SAndy Fiddamanversion_string=
73*b30d1939SAndy Fiddaman
74*b30d1939SAndy Fiddaman#
75*b30d1939SAndy Fiddaman# constrain the environment
76*b30d1939SAndy Fiddaman#
77*b30d1939SAndy Fiddaman
78*b30d1939SAndy FiddamanDISPLAY=
79*b30d1939SAndy FiddamanLC_ALL=C
80*b30d1939SAndy Fiddamanexport DISPLAY LC_ALL
81*b30d1939SAndy Fiddaman
82*b30d1939SAndy Fiddaman#
83*b30d1939SAndy Fiddaman# now the common probes
84*b30d1939SAndy Fiddaman#
85*b30d1939SAndy Fiddaman
86*b30d1939SAndy Fiddamanwhile	:
87*b30d1939SAndy Fiddamando	case $1 in
88*b30d1939SAndy Fiddaman	-d)	debug=1 ;;
89*b30d1939SAndy Fiddaman	-*)	set ''; break ;;
90*b30d1939SAndy Fiddaman	*)	break ;;
91*b30d1939SAndy Fiddaman	esac
92*b30d1939SAndy Fiddaman	shift
93*b30d1939SAndy Fiddamandone
94*b30d1939SAndy Fiddaman
95*b30d1939SAndy Fiddamancc=$1
96*b30d1939SAndy Fiddamancase $cc in
97*b30d1939SAndy Fiddaman[\\/]*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]:\\*)
98*b30d1939SAndy Fiddaman	;;
99*b30d1939SAndy Fiddaman*)	echo "Usage: $0 [ -d ] c-compiler-path [ attributes ]" >&2
100*b30d1939SAndy Fiddaman	exit 1
101*b30d1939SAndy Fiddaman	;;
102*b30d1939SAndy Fiddamanesac
103*b30d1939SAndy FiddamanATTRIBUTES=
104*b30d1939SAndy Fiddamaneval $2
105*b30d1939SAndy Fiddaman_probe_PATH=$PATH
106*b30d1939SAndy FiddamanPATH=/usr/bin:/bin:$PATH
107*b30d1939SAndy Fiddaman
108*b30d1939SAndy Fiddamancase $0 in
109*b30d1939SAndy Fiddaman*[\\/]*)	dir=`echo $0 | sed -e 's,[\\/][\\/]*[^\\/]*\$,,'` ;;
110*b30d1939SAndy Fiddamanesac
111*b30d1939SAndy Fiddaman
112*b30d1939SAndy Fiddaman$executable . 2>/dev/null || executable='test -r'
113*b30d1939SAndy Fiddaman
114*b30d1939SAndy Fiddamancase $SHELL in
115*b30d1939SAndy Fiddaman[\\/]*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]:\\*)
116*b30d1939SAndy Fiddaman	sh=$SHELL
117*b30d1939SAndy Fiddaman	;;
118*b30d1939SAndy Fiddaman*)	sh=/bin/sh
119*b30d1939SAndy Fiddaman	;;
120*b30d1939SAndy Fiddamanesac
121*b30d1939SAndy Fiddaman
122*b30d1939SAndy Fiddamantrap 'code=$?; cd ..; rm -rf $tmpdir; exit $code' 0 1 2 3
123*b30d1939SAndy Fiddamanmkdir $tmpdir
124*b30d1939SAndy Fiddamancd $tmpdir
125*b30d1939SAndy Fiddaman
126*b30d1939SAndy Fiddamanexec 3>&1 4>&2 </dev/null
127*b30d1939SAndy Fiddamancase $debug in
128*b30d1939SAndy Fiddaman"")	exec >/dev/null 2>&1
129*b30d1939SAndy Fiddaman	(ulimit -c 0) >/dev/null 2>&1 && ulimit -c 0
130*b30d1939SAndy Fiddaman	;;
131*b30d1939SAndy Fiddaman*)	PS4='+$LINENO+ '
132*b30d1939SAndy Fiddaman	set -x
133*b30d1939SAndy Fiddaman	;;
134*b30d1939SAndy Fiddamanesac
135*b30d1939SAndy Fiddaman
136*b30d1939SAndy Fiddamanif	(xxx=xxx; unset xxx)
137*b30d1939SAndy Fiddamanthen	UNSET=1
138*b30d1939SAndy Fiddamanelse	UNSET=
139*b30d1939SAndy Fiddamanfi
140*b30d1939SAndy Fiddamaneval set x $probe_env
141*b30d1939SAndy Fiddamanwhile	:
142*b30d1939SAndy Fiddamando	shift
143*b30d1939SAndy Fiddaman	case $# in
144*b30d1939SAndy Fiddaman	0)	break ;;
145*b30d1939SAndy Fiddaman	esac
146*b30d1939SAndy Fiddaman	eval x='$'$1
147*b30d1939SAndy Fiddaman	case $x in
148*b30d1939SAndy Fiddaman	'')	continue ;;
149*b30d1939SAndy Fiddaman	esac
150*b30d1939SAndy Fiddaman	case $1 in
151*b30d1939SAndy Fiddaman	*PATH)	_probe_export="$_probe_export $1='$x'" ;;
152*b30d1939SAndy Fiddaman	esac
153*b30d1939SAndy Fiddaman	case $UNSET in
154*b30d1939SAndy Fiddaman	'')	eval $1=
155*b30d1939SAndy Fiddaman		export $1
156*b30d1939SAndy Fiddaman		;;
157*b30d1939SAndy Fiddaman	*)	unset $1
158*b30d1939SAndy Fiddaman		;;
159*b30d1939SAndy Fiddaman	esac
160*b30d1939SAndy Fiddamandone
161*b30d1939SAndy Fiddaman
162*b30d1939SAndy Fiddamanif	test -f "$dir/probe.ini"
163*b30d1939SAndy Fiddamanthen	. "$dir/probe.ini"
164*b30d1939SAndy Fiddaman	IFS=$ifs
165*b30d1939SAndy Fiddamanfi
166*b30d1939SAndy Fiddaman
167*b30d1939SAndy Fiddamanmkdir suffix
168*b30d1939SAndy Fiddamancd suffix
169*b30d1939SAndy Fiddamanfor src in $probe_src
170*b30d1939SAndy Fiddamando	echo "int main(){return 0;}" > ../test.$src
171*b30d1939SAndy Fiddaman	rm -f test*
172*b30d1939SAndy Fiddaman	if	$cc -c ../test.$src
173*b30d1939SAndy Fiddaman	then	set test.*
174*b30d1939SAndy Fiddaman		if	test -f "$1"
175*b30d1939SAndy Fiddaman		then	o="$*"
176*b30d1939SAndy Fiddaman			mv $* ..
177*b30d1939SAndy Fiddaman			for i in $o
178*b30d1939SAndy Fiddaman			do	if	$cc -o test.exe ../$i
179*b30d1939SAndy Fiddaman				then	obj=`echo "$i" | sed -e 's,test.,,'`
180*b30d1939SAndy Fiddaman					$executable test.exe || executable="test -r"
181*b30d1939SAndy Fiddaman					set test*
182*b30d1939SAndy Fiddaman					rm *
183*b30d1939SAndy Fiddaman					if	$cc -o test ../$i
184*b30d1939SAndy Fiddaman					then	rm $*
185*b30d1939SAndy Fiddaman						set test.*
186*b30d1939SAndy Fiddaman						if	$executable "$1"
187*b30d1939SAndy Fiddaman						then	exe=`echo "$1" | sed -e 's,test.,,'`
188*b30d1939SAndy Fiddaman							suffix_command=.$exe
189*b30d1939SAndy Fiddaman						fi
190*b30d1939SAndy Fiddaman					fi
191*b30d1939SAndy Fiddaman					break 2
192*b30d1939SAndy Fiddaman				fi
193*b30d1939SAndy Fiddaman			done
194*b30d1939SAndy Fiddaman		fi
195*b30d1939SAndy Fiddaman	fi
196*b30d1939SAndy Fiddamandone
197*b30d1939SAndy Fiddamancd ..
198*b30d1939SAndy Fiddaman
199*b30d1939SAndy Fiddamancase $src in
200*b30d1939SAndy Fiddamanc)	;;
201*b30d1939SAndy Fiddaman*)	echo '// (
202*b30d1939SAndy Fiddamanint
203*b30d1939SAndy Fiddamanmain()
204*b30d1939SAndy Fiddaman{
205*b30d1939SAndy Fiddaman	class { public: int i; } j;
206*b30d1939SAndy Fiddaman	j.i = 0;
207*b30d1939SAndy Fiddaman	int k = j.i + 1;
208*b30d1939SAndy Fiddaman	return k;
209*b30d1939SAndy Fiddaman}' > dialect.$src
210*b30d1939SAndy Fiddaman	if	$cc -c dialect.$src && $cc -o dialect.$exe dialect.$obj && $executable dialect.$exe
211*b30d1939SAndy Fiddaman	then	mv dialect.$src dialect.c
212*b30d1939SAndy Fiddaman		rm -f dialect.$obj dialect.$exe
213*b30d1939SAndy Fiddaman		if	$cc -c dialect.c && $cc -o dialect.$exe dialect.$obj && $executable dialect.$exe
214*b30d1939SAndy Fiddaman		then	src=c
215*b30d1939SAndy Fiddaman		else	set x $cc
216*b30d1939SAndy Fiddaman			while	:
217*b30d1939SAndy Fiddaman			do	shift
218*b30d1939SAndy Fiddaman				case $# in
219*b30d1939SAndy Fiddaman				0)	break ;;
220*b30d1939SAndy Fiddaman				esac
221*b30d1939SAndy Fiddaman				case $1 in
222*b30d1939SAndy Fiddaman				*=*)	continue ;;
223*b30d1939SAndy Fiddaman				esac
224*b30d1939SAndy Fiddaman				case `echo $1 | sed -e 's,.*/,,'` in
225*b30d1939SAndy Fiddaman				*CC*|*++*|*[xX][xX]*|*[pP][lL][uU][sS]*) ;;
226*b30d1939SAndy Fiddaman				*)	src=c ;;
227*b30d1939SAndy Fiddaman				esac
228*b30d1939SAndy Fiddaman				break
229*b30d1939SAndy Fiddaman			done
230*b30d1939SAndy Fiddaman		fi
231*b30d1939SAndy Fiddaman	else	src=c
232*b30d1939SAndy Fiddaman	fi
233*b30d1939SAndy Fiddaman	;;
234*b30d1939SAndy Fiddamanesac
235*b30d1939SAndy Fiddaman
236*b30d1939SAndy Fiddamanset x x '(' 1 'int x;' 0
237*b30d1939SAndy Fiddamanwhile	:
238*b30d1939SAndy Fiddamando	shift
239*b30d1939SAndy Fiddaman	shift
240*b30d1939SAndy Fiddaman	case $# in
241*b30d1939SAndy Fiddaman	[01])	break ;;
242*b30d1939SAndy Fiddaman	esac
243*b30d1939SAndy Fiddaman	rm -f test.$obj
244*b30d1939SAndy Fiddaman	echo "$1" > test.$src
245*b30d1939SAndy Fiddaman	$cc -c test.$src
246*b30d1939SAndy Fiddaman	r=$?
247*b30d1939SAndy Fiddaman	case $r in
248*b30d1939SAndy Fiddaman	0)	test -f test.$obj || r=1 ;;
249*b30d1939SAndy Fiddaman	*)	r=1 ;;
250*b30d1939SAndy Fiddaman	esac
251*b30d1939SAndy Fiddaman	case $2:$r in
252*b30d1939SAndy Fiddaman	0:0)	;;
253*b30d1939SAndy Fiddaman	0:1)	echo "$cc: not a C compiler: failed to compile \`\`$1''" >&4
254*b30d1939SAndy Fiddaman		exit 1
255*b30d1939SAndy Fiddaman		;;
256*b30d1939SAndy Fiddaman	1:0)	echo "$cc: not a C compiler: successfully compiled \`\`$1''" >&4
257*b30d1939SAndy Fiddaman		exit 1
258*b30d1939SAndy Fiddaman		;;
259*b30d1939SAndy Fiddaman	esac
260*b30d1939SAndy Fiddamandone
261*b30d1939SAndy Fiddaman
262*b30d1939SAndy Fiddamanhosttype=`package CC="$cc" || $SHELL -c "package CC='$cc'"`
263*b30d1939SAndy Fiddamancase $hosttype in
264*b30d1939SAndy Fiddaman*[Uu][Ss][Aa][Gg][Ee]:*)
265*b30d1939SAndy Fiddaman	hosttype=`PATH=$_probe_PATH; export PATH; package CC="$cc" || $SHELL -c "package CC='$cc'"`
266*b30d1939SAndy Fiddaman	;;
267*b30d1939SAndy Fiddamanesac
268*b30d1939SAndy Fiddaman
269*b30d1939SAndy Fiddamanecho '#include <stdio.h>
270*b30d1939SAndy Fiddamanint main(){printf("hello");return 0;}' > dynamic.$src
271*b30d1939SAndy Fiddamanecho 'extern int sfclose() { return 0; }' > fun.$src
272*b30d1939SAndy Fiddamanif	$cc -c dynamic.$src && $cc -c fun.$src
273*b30d1939SAndy Fiddamanthen	eval set x $probe_so
274*b30d1939SAndy Fiddaman	while	:
275*b30d1939SAndy Fiddaman	do	shift
276*b30d1939SAndy Fiddaman		case $# in
277*b30d1939SAndy Fiddaman		0)	break ;;
278*b30d1939SAndy Fiddaman		esac
279*b30d1939SAndy Fiddaman		for i in foo junk
280*b30d1939SAndy Fiddaman		do	rm -f dynamic.$exe
281*b30d1939SAndy Fiddaman			if	$cc -L. -o dynamic.$exe dynamic.$obj -l$i
282*b30d1939SAndy Fiddaman			then	: "there's really a -l$i"?
283*b30d1939SAndy Fiddaman			else	rm -f dynamic.$exe
284*b30d1939SAndy Fiddaman				cat fun.$obj > lib$i$1
285*b30d1939SAndy Fiddaman				$cc -L. -o dynamic.$exe dynamic.$obj -l$i && $executable dynamic.$exe
286*b30d1939SAndy Fiddaman				x=$?
287*b30d1939SAndy Fiddaman				rm lib$i$1
288*b30d1939SAndy Fiddaman				case $x in
289*b30d1939SAndy Fiddaman				0)	so=$1
290*b30d1939SAndy Fiddaman					rm -f dynamic.$exe > lib$i$1.1
291*b30d1939SAndy Fiddaman					$cc -L. -o dynamic.$exe dynamic.$obj -l$i && $executable dynamic.$exe
292*b30d1939SAndy Fiddaman					x=$?
293*b30d1939SAndy Fiddaman					rm lib$i$1.1
294*b30d1939SAndy Fiddaman					case $x in
295*b30d1939SAndy Fiddaman					0)	sov=1 ;;
296*b30d1939SAndy Fiddaman					esac
297*b30d1939SAndy Fiddaman					break 2
298*b30d1939SAndy Fiddaman					;;
299*b30d1939SAndy Fiddaman				*)	break
300*b30d1939SAndy Fiddaman					;;
301*b30d1939SAndy Fiddaman				esac
302*b30d1939SAndy Fiddaman			fi
303*b30d1939SAndy Fiddaman		done
304*b30d1939SAndy Fiddaman		k=
305*b30d1939SAndy Fiddaman		for i in "" .1 .2 .3 .4 .5 .6 .7 .8 .9
306*b30d1939SAndy Fiddaman		do	rm -f dynamic.$exe > libc$1$i
307*b30d1939SAndy Fiddaman			$cc -L. -o dynamic.$exe dynamic.$obj && $executable dynamic.$exe
308*b30d1939SAndy Fiddaman			x=$?
309*b30d1939SAndy Fiddaman			(cd ..; rm $tmpdir/libc$1$i)
310*b30d1939SAndy Fiddaman			case $x in
311*b30d1939SAndy Fiddaman			0)	;;
312*b30d1939SAndy Fiddaman			*)	k=X$k
313*b30d1939SAndy Fiddaman				case $k in
314*b30d1939SAndy Fiddaman				XXX)	break ;;
315*b30d1939SAndy Fiddaman				esac
316*b30d1939SAndy Fiddaman				;;
317*b30d1939SAndy Fiddaman			esac
318*b30d1939SAndy Fiddaman		done
319*b30d1939SAndy Fiddaman		case $k in
320*b30d1939SAndy Fiddaman		XXX)	so=$1
321*b30d1939SAndy Fiddaman			sov=1
322*b30d1939SAndy Fiddaman			break
323*b30d1939SAndy Fiddaman			;;
324*b30d1939SAndy Fiddaman		?*)	so=$1
325*b30d1939SAndy Fiddaman			break
326*b30d1939SAndy Fiddaman			;;
327*b30d1939SAndy Fiddaman		esac
328*b30d1939SAndy Fiddaman	done
329*b30d1939SAndy Fiddaman	rm -f dynamic.$exe
330*b30d1939SAndy Fiddaman	if	$cc -o dynamic.$exe dynamic.$obj 2>e && $executable dynamic.$exe
331*b30d1939SAndy Fiddaman	then	e=`wc -l e`
332*b30d1939SAndy Fiddaman		maybe=
333*b30d1939SAndy Fiddaman		eval set x x $probe_binding
334*b30d1939SAndy Fiddaman		while	:
335*b30d1939SAndy Fiddaman		do	shift
336*b30d1939SAndy Fiddaman			shift
337*b30d1939SAndy Fiddaman			case $# in
338*b30d1939SAndy Fiddaman			0)	break ;;
339*b30d1939SAndy Fiddaman			esac
340*b30d1939SAndy Fiddaman			rm -f dynamic.$exe
341*b30d1939SAndy Fiddaman			$cc -o dynamic.$exe $1 dynamic.$obj 2>e && $executable dynamic.$exe || continue
342*b30d1939SAndy Fiddaman			case $1 in
343*b30d1939SAndy Fiddaman			?*)	case $maybe in
344*b30d1939SAndy Fiddaman				"")	maybe=$1 ;;
345*b30d1939SAndy Fiddaman				*)	maybe=-- ;;
346*b30d1939SAndy Fiddaman				esac
347*b30d1939SAndy Fiddaman				;;
348*b30d1939SAndy Fiddaman			esac
349*b30d1939SAndy Fiddaman			case `wc -l e` in
350*b30d1939SAndy Fiddaman			$e)	;;
351*b30d1939SAndy Fiddaman			*)	continue ;;
352*b30d1939SAndy Fiddaman			esac
353*b30d1939SAndy Fiddaman			d=`ls -s dynamic.$exe`
354*b30d1939SAndy Fiddaman			rm -f dynamic.$exe
355*b30d1939SAndy Fiddaman			$cc -o dynamic.$exe $2 dynamic.$obj 2>e && $executable dynamic.$exe || continue
356*b30d1939SAndy Fiddaman			case `wc -l e` in
357*b30d1939SAndy Fiddaman			$e)	;;
358*b30d1939SAndy Fiddaman			*)	continue ;;
359*b30d1939SAndy Fiddaman			esac
360*b30d1939SAndy Fiddaman			case `ls -s dynamic.$exe` in
361*b30d1939SAndy Fiddaman			$d)	;;
362*b30d1939SAndy Fiddaman			*)	dynamic=$1
363*b30d1939SAndy Fiddaman				static=$2
364*b30d1939SAndy Fiddaman				maybe=
365*b30d1939SAndy Fiddaman				break
366*b30d1939SAndy Fiddaman				;;
367*b30d1939SAndy Fiddaman			esac
368*b30d1939SAndy Fiddaman		done
369*b30d1939SAndy Fiddaman		case $maybe in
370*b30d1939SAndy Fiddaman		""|--)	;;
371*b30d1939SAndy Fiddaman		*)	rm -f dynamic.$exe
372*b30d1939SAndy Fiddaman			if	$cc -o dynamic.$exe $maybe dynamic.$obj 2>e && $executable dynamic.$exe
373*b30d1939SAndy Fiddaman			then	e=`wc -l e`
374*b30d1939SAndy Fiddaman				if	$cc -o dynamic.$exe $maybe-bogus-bogus-bogus dynamic.$obj 2>e && $executable dynamic.$exe
375*b30d1939SAndy Fiddaman				then	case `wc -l e` in
376*b30d1939SAndy Fiddaman					$e)	;;
377*b30d1939SAndy Fiddaman					*)	dynamic=$maybe ;;
378*b30d1939SAndy Fiddaman					esac
379*b30d1939SAndy Fiddaman				else	dynamic=$maybe
380*b30d1939SAndy Fiddaman				fi
381*b30d1939SAndy Fiddaman			fi
382*b30d1939SAndy Fiddaman			;;
383*b30d1939SAndy Fiddaman		esac
384*b30d1939SAndy Fiddaman	fi
385*b30d1939SAndy Fiddamanfi
386*b30d1939SAndy Fiddaman
387*b30d1939SAndy Fiddamaneval set x $probe_version
388*b30d1939SAndy Fiddamanshift
389*b30d1939SAndy Fiddamanfor o in "$@"
390*b30d1939SAndy Fiddamando	if	$cc $o > version.out 2>&1
391*b30d1939SAndy Fiddaman	then	version_string=`sed -e '/ is /d' -e 's/;/ /g' version.out | sed -e 1q`
392*b30d1939SAndy Fiddaman		case $version_string in
393*b30d1939SAndy Fiddaman		''|*[Ee][Rr][Rr][Oo][Rr]*|*[Ff][Aa][Tt][Aa][Ll]*|*[Ww][Aa][Rr][Nn][Ii][Nn][Gg]*|*[Oo][Pp][Tt][Ii][Oo][Nn]*)
394*b30d1939SAndy Fiddaman			;;
395*b30d1939SAndy Fiddaman		*)	version_flags=$o
396*b30d1939SAndy Fiddaman			version_stamp=";VERSION;$o;$version_string;PATH;$cc"
397*b30d1939SAndy Fiddaman			break
398*b30d1939SAndy Fiddaman			;;
399*b30d1939SAndy Fiddaman		esac
400*b30d1939SAndy Fiddaman	fi
401*b30d1939SAndy Fiddamandone
402*b30d1939SAndy Fiddamancase $version_stamp in
403*b30d1939SAndy Fiddaman'')	eval set x $probe_version
404*b30d1939SAndy Fiddaman	shift
405*b30d1939SAndy Fiddaman	echo 'int main() { return 0; }' > version.i
406*b30d1939SAndy Fiddaman	for o in "$@"
407*b30d1939SAndy Fiddaman	do	if	$cc -c $o version.i > version.out 2>&1
408*b30d1939SAndy Fiddaman		then	version_string=`sed -e '/ is /d' -e 's/;/ /g' version.out | sed -e 1q`
409*b30d1939SAndy Fiddaman			case $version_string in
410*b30d1939SAndy Fiddaman			''|*[Ee][Rr][Rr][Oo][Rr]*|*[Ff][Aa][Tt][Aa][Ll]*|*[Ww][Aa][Rr][Nn][Ii][Nn][Gg]*|*[Oo][Pp][Tt][Ii][Oo][Nn]*)
411*b30d1939SAndy Fiddaman				;;
412*b30d1939SAndy Fiddaman			*)	version_flags=$o
413*b30d1939SAndy Fiddaman				break
414*b30d1939SAndy Fiddaman				;;
415*b30d1939SAndy Fiddaman			esac
416*b30d1939SAndy Fiddaman		fi
417*b30d1939SAndy Fiddaman	done
418*b30d1939SAndy Fiddaman	;;
419*b30d1939SAndy Fiddamanesac
420*b30d1939SAndy Fiddaman
421*b30d1939SAndy Fiddamanecho 'int main(){return 0;}' > hosted.$src
422*b30d1939SAndy Fiddaman$cc -o hosted.$exe hosted.$src && ./hosted.$exe && hosted=1
423*b30d1939SAndy Fiddaman
424*b30d1939SAndy Fiddamanecho '#!'$sh'
425*b30d1939SAndy Fiddamanecho "" $@' > cpp
426*b30d1939SAndy Fiddamanchmod +x cpp
427*b30d1939SAndy Fiddamancase `./cpp -Dprobe` in
428*b30d1939SAndy Fiddaman*-Dprobe*)
429*b30d1939SAndy Fiddaman	;;
430*b30d1939SAndy Fiddaman*)	cp /bin/echo cpp
431*b30d1939SAndy Fiddaman	chmod u+w cpp
432*b30d1939SAndy Fiddaman	;;
433*b30d1939SAndy Fiddamanesac
434*b30d1939SAndy Fiddamanfor prefix in $probe_ppprefix `echo $cc | sed -e '/cc\$/!d' -e 's,cc\$,,' -e 's,.*/,,'`
435*b30d1939SAndy Fiddamando	cp cpp ${prefix}cpp
436*b30d1939SAndy Fiddamandone
437*b30d1939SAndy Fiddaman
438*b30d1939SAndy Fiddamanecho "" > flags.$src
439*b30d1939SAndy Fiddamanecho '#pragma pp:version' > libpp.$src
440*b30d1939SAndy Fiddaman
441*b30d1939SAndy Fiddamanif	test `realcppC=./cpp $cc -Dprobe -E flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
442*b30d1939SAndy Fiddamanthen	ppenv='realcppC=${ppcmd}'
443*b30d1939SAndy Fiddamanelif	test `cppC=./cpp $cc -Dprobe -E flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
444*b30d1939SAndy Fiddamanthen	ppenv='cppC=${ppcmd}'
445*b30d1939SAndy Fiddamanelif	test `_CPPNAME=./cpp $cc -Dprobe -E flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
446*b30d1939SAndy Fiddamanthen	ppenv='_CPPNAME=${ppcmd}'
447*b30d1939SAndy Fiddamanelif	test `_CPP=./cpp $cc -Dprobe -E flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
448*b30d1939SAndy Fiddamanthen	ppenv='_CPP=${ppcmd}'
449*b30d1939SAndy Fiddamanelif	test `$cc -Dprobe -E -%p+. flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1 && test `$cc -Dprobe -E -%p+. flags.$src | wc -l` -eq 1
450*b30d1939SAndy Fiddamanthen	ppopt='-%p+${ppdir}'
451*b30d1939SAndy Fiddamanelif	test `$cc -Dprobe -E -Yp,. flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
452*b30d1939SAndy Fiddamanthen	ppopt='-Yp,${ppdir}'
453*b30d1939SAndy Fiddamanelif	test `$cc -Dprobe -E -Qpath $tmpdir flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
454*b30d1939SAndy Fiddamanthen	ppopt='-Qpath ${ppdir}'
455*b30d1939SAndy Fiddamanelif	test `$cc -Dprobe -E -tp -B./ flags.$src 2>err.out | tee cpp.out | grep -c '[-]Dprobe'` -eq 1 -a ! -s err.out
456*b30d1939SAndy Fiddamanthen	ppopt='-tp -B${ppdir}/'
457*b30d1939SAndy Fiddamanelif	test `$cc -Dprobe -E -B./ flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
458*b30d1939SAndy Fiddamanthen	ppopt='-B${ppdir}/'
459*b30d1939SAndy Fiddamanelif	test `$cc -Dprobe -E -tp -h./ -B flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
460*b30d1939SAndy Fiddamanthen	ppopt='-tp -h${ppdir}/ -B'
461*b30d1939SAndy Fiddamanelif	test `$cc -Dprobe -E -t p,./cpp flags.$src | tee cpp.out | grep -c '[-]Dprobe'` -eq 1
462*b30d1939SAndy Fiddamanthen	ppopt='-t p,${ppcmd}'
463*b30d1939SAndy Fiddamanelse	{
464*b30d1939SAndy Fiddaman		eval set x $probe_verbose
465*b30d1939SAndy Fiddaman		shift
466*b30d1939SAndy Fiddaman		for o in "$@"
467*b30d1939SAndy Fiddaman		do	$cc -E $o flags.$src
468*b30d1939SAndy Fiddaman		done
469*b30d1939SAndy Fiddaman	} 2>&1 | sed -e "s/['\"]//g" > cpp.out
470*b30d1939SAndy Fiddamanfi
471*b30d1939SAndy Fiddaman
472*b30d1939SAndy Fiddamanset x `sed -e 's,[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]:\\\\,/,g' -e 's,\\\\,/,g' cpp.out`
473*b30d1939SAndy Fiddamandef=
474*b30d1939SAndy Fiddamandefinclude="-I+C -I-H"
475*b30d1939SAndy Fiddamanstdinclude=$definclude
476*b30d1939SAndy Fiddamancase $hosted in
477*b30d1939SAndy Fiddaman"")	usrinclude= ;;
478*b30d1939SAndy Fiddamanesac
479*b30d1939SAndy Fiddamancmdinclude=
480*b30d1939SAndy Fiddamanwhile	:
481*b30d1939SAndy Fiddamando	case $# in
482*b30d1939SAndy Fiddaman	0|1)	break ;;
483*b30d1939SAndy Fiddaman	esac
484*b30d1939SAndy Fiddaman	shift
485*b30d1939SAndy Fiddaman	case $1 in
486*b30d1939SAndy Fiddaman	-A)	case $2 in
487*b30d1939SAndy Fiddaman		*\(*\))	shift
488*b30d1939SAndy Fiddaman			prepred="$prepred `echo $1 | sed 's/\(.*\)(\(.*\))/\1 \2/'`"
489*b30d1939SAndy Fiddaman			;;
490*b30d1939SAndy Fiddaman		esac
491*b30d1939SAndy Fiddaman		;;
492*b30d1939SAndy Fiddaman	-A\(*\))
493*b30d1939SAndy Fiddaman		prepred="$prepred `echo $1 | sed 's/-A\(.*\)(\(.*\))/\1 \2/'`"
494*b30d1939SAndy Fiddaman		;;
495*b30d1939SAndy Fiddaman	-[DI][-+][ABCDEFGHIJKLMNOPQRSTUVWXYZ]*)
496*b30d1939SAndy Fiddaman		stdpp=1
497*b30d1939SAndy Fiddaman		case $1 in
498*b30d1939SAndy Fiddaman		-I?[CH])	case $def in
499*b30d1939SAndy Fiddaman				?*)	definclude="$definclude $1" ;;
500*b30d1939SAndy Fiddaman				*)	stdinclude="$stdinclude $1" ;;
501*b30d1939SAndy Fiddaman				esac
502*b30d1939SAndy Fiddaman				;;
503*b30d1939SAndy Fiddaman		-I-S*|-YI,*)	usrinclude="`echo $1 | sed 's/....//'`" ;;
504*b30d1939SAndy Fiddaman		-Y?,*)		;;
505*b30d1939SAndy Fiddaman		-Y*)		usrinclude="`echo $1 | sed 's/..//'`" ;;
506*b30d1939SAndy Fiddaman		esac
507*b30d1939SAndy Fiddaman		;;
508*b30d1939SAndy Fiddaman	-D)	shift
509*b30d1939SAndy Fiddaman		case $1 in
510*b30d1939SAndy Fiddaman		[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*=*)
511*b30d1939SAndy Fiddaman			predef="$predef
512*b30d1939SAndy Fiddaman`echo $1 | sed -e 's/=.*//'`"
513*b30d1939SAndy Fiddaman			;;
514*b30d1939SAndy Fiddaman		[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*)
515*b30d1939SAndy Fiddaman			predef="$predef
516*b30d1939SAndy Fiddaman$1"
517*b30d1939SAndy Fiddaman			;;
518*b30d1939SAndy Fiddaman		esac
519*b30d1939SAndy Fiddaman		;;
520*b30d1939SAndy Fiddaman	-Dprobe);;
521*b30d1939SAndy Fiddaman	-D*)	case $1 in
522*b30d1939SAndy Fiddaman		-D[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*=*)
523*b30d1939SAndy Fiddaman			predef="$predef
524*b30d1939SAndy Fiddaman`echo $1 | sed -e 's/^-D//' -e 's/=.*//'`"
525*b30d1939SAndy Fiddaman			;;
526*b30d1939SAndy Fiddaman		-D[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*)
527*b30d1939SAndy Fiddaman			predef="$predef
528*b30d1939SAndy Fiddaman`echo $1 | sed -e 's/^-D//'`"
529*b30d1939SAndy Fiddaman			;;
530*b30d1939SAndy Fiddaman		esac
531*b30d1939SAndy Fiddaman		;;
532*b30d1939SAndy Fiddaman	-I)	shift
533*b30d1939SAndy Fiddaman		case $1 in
534*b30d1939SAndy Fiddaman		/*)	case $def in
535*b30d1939SAndy Fiddaman			?*)	definclude="$definclude $1" ;;
536*b30d1939SAndy Fiddaman			*)	stdinclude="$stdinclude $1" ;;
537*b30d1939SAndy Fiddaman			esac
538*b30d1939SAndy Fiddaman			cmdinclude="$cmdinclude $1"
539*b30d1939SAndy Fiddaman			;;
540*b30d1939SAndy Fiddaman		esac
541*b30d1939SAndy Fiddaman		;;
542*b30d1939SAndy Fiddaman	-I/*)	f=`echo X$1 | sed 's/X-I//'`
543*b30d1939SAndy Fiddaman		case $def in
544*b30d1939SAndy Fiddaman		?*)	definclude="$definclude $f" ;;
545*b30d1939SAndy Fiddaman		*)	stdinclude="$stdinclude $f" ;;
546*b30d1939SAndy Fiddaman		esac
547*b30d1939SAndy Fiddaman		cmdinclude="$cmdinclude $f"
548*b30d1939SAndy Fiddaman		;;
549*b30d1939SAndy Fiddaman	-U)	shift
550*b30d1939SAndy Fiddaman		undef="$undef $1"
551*b30d1939SAndy Fiddaman		;;
552*b30d1939SAndy Fiddaman	-U*)	undef="$undef `echo $1 | sed 's/^-U//'`"
553*b30d1939SAndy Fiddaman		;;
554*b30d1939SAndy Fiddaman	flags.$src)def=
555*b30d1939SAndy Fiddaman		;;
556*b30d1939SAndy Fiddaman	esac
557*b30d1939SAndy Fiddamandone
558*b30d1939SAndy Fiddamanstdinclude="$stdinclude $definclude"
559*b30d1939SAndy Fiddamancase " $stdinclude " in
560*b30d1939SAndy Fiddaman*\ $usrinclude\ *)
561*b30d1939SAndy Fiddaman	case $usrinclude in
562*b30d1939SAndy Fiddaman	/usr/include)
563*b30d1939SAndy Fiddaman		usrinclude=
564*b30d1939SAndy Fiddaman		;;
565*b30d1939SAndy Fiddaman	*)	case " $stdinclude " in
566*b30d1939SAndy Fiddaman		*\ /usr/include\ *)
567*b30d1939SAndy Fiddaman			usrinclude=
568*b30d1939SAndy Fiddaman			;;
569*b30d1939SAndy Fiddaman		*)	usrinclude=/usr/include
570*b30d1939SAndy Fiddaman			;;
571*b30d1939SAndy Fiddaman		esac
572*b30d1939SAndy Fiddaman		;;
573*b30d1939SAndy Fiddaman	esac
574*b30d1939SAndy Fiddaman	;;
575*b30d1939SAndy Fiddamanesac
576*b30d1939SAndy Fiddaman
577*b30d1939SAndy Fiddamantstinclude=`$cc -v -E flags.$src 2>&1 | sed -e '1,/[iI][nN][cC][lL][uU][dD][eE][ 	]*<[.][.][.]>/d' -e '/^[eE][nN][dD] [oO][fF] [sS][eE][aA][rR][cC][hH]/,\$d'`
578*b30d1939SAndy Fiddamanj=$tstinclude
579*b30d1939SAndy Fiddamancase $j in
580*b30d1939SAndy Fiddaman*/*)	;;
581*b30d1939SAndy Fiddaman*)	j=$cmdinclude ;;
582*b30d1939SAndy Fiddamanesac
583*b30d1939SAndy Fiddamantstinclude=
584*b30d1939SAndy Fiddamangood=
585*b30d1939SAndy Fiddamannogood=
586*b30d1939SAndy Fiddamanc_hdr="stdio.h ctype.h"
587*b30d1939SAndy FiddamanC_hdr="libc.h"
588*b30d1939SAndy Fiddamanfor i in $j
589*b30d1939SAndy Fiddamando	if	test -d "$i"
590*b30d1939SAndy Fiddaman	then	tstinclude="$tstinclude $i"
591*b30d1939SAndy Fiddaman		h=
592*b30d1939SAndy Fiddaman		for f in $c_hdr
593*b30d1939SAndy Fiddaman		do	if	test -f "$i/$f"
594*b30d1939SAndy Fiddaman			then	case $i in
595*b30d1939SAndy Fiddaman				*/CC)	nogood=1 ;;
596*b30d1939SAndy Fiddaman				*)	good=1 ;;
597*b30d1939SAndy Fiddaman				esac
598*b30d1939SAndy Fiddaman			else	h="$h $f"
599*b30d1939SAndy Fiddaman			fi
600*b30d1939SAndy Fiddaman		done
601*b30d1939SAndy Fiddaman		c_hdr=$h
602*b30d1939SAndy Fiddaman		h=
603*b30d1939SAndy Fiddaman		for f in $C_hdr
604*b30d1939SAndy Fiddaman		do	if	test -f "$i/$f"
605*b30d1939SAndy Fiddaman			then	case $i in
606*b30d1939SAndy Fiddaman				*/CC)	nogood=1 ;;
607*b30d1939SAndy Fiddaman				*)	good=1 ;;
608*b30d1939SAndy Fiddaman				esac
609*b30d1939SAndy Fiddaman			else	h="$h $f"
610*b30d1939SAndy Fiddaman			fi
611*b30d1939SAndy Fiddaman		done
612*b30d1939SAndy Fiddaman		C_hdr=$h
613*b30d1939SAndy Fiddaman	fi
614*b30d1939SAndy Fiddamandone
615*b30d1939SAndy Fiddamancase $nogood in
616*b30d1939SAndy Fiddaman1)	good=0 ;;
617*b30d1939SAndy Fiddamanesac
618*b30d1939SAndy Fiddamancase $good in
619*b30d1939SAndy Fiddaman1)	case $c_hdr in
620*b30d1939SAndy Fiddaman	?*)	bad=1
621*b30d1939SAndy Fiddaman		usrinclude=/usr/include
622*b30d1939SAndy Fiddaman		set '' $tstinclude /usr/include
623*b30d1939SAndy Fiddaman		;;
624*b30d1939SAndy Fiddaman	*)	set '' $tstinclude
625*b30d1939SAndy Fiddaman		;;
626*b30d1939SAndy Fiddaman	esac
627*b30d1939SAndy Fiddaman	shift
628*b30d1939SAndy Fiddaman	stdinclude=$*
629*b30d1939SAndy Fiddaman	echo "#include <sys/types.h>" > include.$src
630*b30d1939SAndy Fiddaman	$cc -E include.$src | sed -e '/# 1 "[\\/]/!d' -e 's,[^"]*",,' -e 's,[\\/][^\\/]*".*,,' -e 's,[\\/]sys,,' > include.out
631*b30d1939SAndy Fiddaman	for f in `cat include.out`
632*b30d1939SAndy Fiddaman	do	if	test -d "$f"
633*b30d1939SAndy Fiddaman		then	g=`echo $f | sed -e 's,[\\/][\\/]*[^\\/]*$,,'`
634*b30d1939SAndy Fiddaman			case " $stdinclude " in
635*b30d1939SAndy Fiddaman			*\ $f\ *|*\ $g\ *)
636*b30d1939SAndy Fiddaman				;;
637*b30d1939SAndy Fiddaman			*)	stdinclude="$stdinclude $f"
638*b30d1939SAndy Fiddaman				case $f in
639*b30d1939SAndy Fiddaman				/usr/include)	usrinclude=$f ;;
640*b30d1939SAndy Fiddaman				esac
641*b30d1939SAndy Fiddaman				bad=1
642*b30d1939SAndy Fiddaman				;;
643*b30d1939SAndy Fiddaman			esac
644*b30d1939SAndy Fiddaman		fi
645*b30d1939SAndy Fiddaman	done
646*b30d1939SAndy Fiddaman	;;
647*b30d1939SAndy Fiddaman*)	case $ppopt$ppenv in
648*b30d1939SAndy Fiddaman	?*)	echo '#!'$sh'
649*b30d1939SAndy Fiddaman		echo $VIRTUAL_ROOT | sed "s/:.*//"' > cpp
650*b30d1939SAndy Fiddaman		chmod +x cpp
651*b30d1939SAndy Fiddaman		ppcmd=cpp
652*b30d1939SAndy Fiddaman		ppdir=.
653*b30d1939SAndy Fiddaman		eval x='`'$ppenv '$'cc -E $ppopt flags.$src'`'
654*b30d1939SAndy Fiddaman		case $x in
655*b30d1939SAndy Fiddaman		?*)	tstinclude=$x/usr/include
656*b30d1939SAndy Fiddaman			;;
657*b30d1939SAndy Fiddaman		esac
658*b30d1939SAndy Fiddaman		cp /bin/echo cpp
659*b30d1939SAndy Fiddaman		chmod u+w cpp
660*b30d1939SAndy Fiddaman		;;
661*b30d1939SAndy Fiddaman	esac
662*b30d1939SAndy Fiddaman
663*b30d1939SAndy Fiddaman	eval set x $probe_include
664*b30d1939SAndy Fiddaman	while	:
665*b30d1939SAndy Fiddaman	do	shift
666*b30d1939SAndy Fiddaman		case $# in
667*b30d1939SAndy Fiddaman		0)	break ;;
668*b30d1939SAndy Fiddaman		esac
669*b30d1939SAndy Fiddaman		echo "#include <$1>" > include.$src
670*b30d1939SAndy Fiddaman		$cc -E include.$src
671*b30d1939SAndy Fiddaman	done > include.out
672*b30d1939SAndy Fiddaman
673*b30d1939SAndy Fiddaman	ccinclude=
674*b30d1939SAndy Fiddaman	x=$stdinclude
675*b30d1939SAndy Fiddaman	stdinclude=
676*b30d1939SAndy Fiddaman	subinclude=
677*b30d1939SAndy Fiddaman	for f in $x $tstinclude `sed -e 's,\\\\,/,g' -e 's,///*,/,g' -e 's,"[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]:/,"/,g' -e '/^#[line 	]*[0123456789][0123456789]*[ 	][ 	]*"[\\/]/!d' -e 's/^#[line 	]*[0123456789][0123456789]*[ 	][ 	]*"\(.*\)[\\/].*".*/\1/' include.out | sort -u`
678*b30d1939SAndy Fiddaman	do	case $f in
679*b30d1939SAndy Fiddaman		-*)	;;
680*b30d1939SAndy Fiddaman		*/)	f=`echo $f | sed -e 's,//*\$,,'` ;;
681*b30d1939SAndy Fiddaman		*/.)	f=`echo $f | sed -e 's,//*.\$,,'` ;;
682*b30d1939SAndy Fiddaman		esac
683*b30d1939SAndy Fiddaman		case $f in
684*b30d1939SAndy Fiddaman		-I*)	;;
685*b30d1939SAndy Fiddaman		*/cc)	ccinclude=1
686*b30d1939SAndy Fiddaman			;;
687*b30d1939SAndy Fiddaman		*/sys)	continue
688*b30d1939SAndy Fiddaman			;;
689*b30d1939SAndy Fiddaman		*/include/*/*)
690*b30d1939SAndy Fiddaman			;;
691*b30d1939SAndy Fiddaman		*/include/*)
692*b30d1939SAndy Fiddaman			subinclude="$subinclude $f"
693*b30d1939SAndy Fiddaman			continue
694*b30d1939SAndy Fiddaman			;;
695*b30d1939SAndy Fiddaman		esac
696*b30d1939SAndy Fiddaman		if	test -d "$f"
697*b30d1939SAndy Fiddaman		then	case " $stdinclude " in
698*b30d1939SAndy Fiddaman			*\ $f\ *)	;;
699*b30d1939SAndy Fiddaman			*)	stdinclude="$stdinclude $f" ;;
700*b30d1939SAndy Fiddaman			esac
701*b30d1939SAndy Fiddaman		fi
702*b30d1939SAndy Fiddaman	done
703*b30d1939SAndy Fiddaman	rm include.out
704*b30d1939SAndy Fiddaman	case $ccinclude in
705*b30d1939SAndy Fiddaman	?*)	eval set x $probe_include
706*b30d1939SAndy Fiddaman		while	:
707*b30d1939SAndy Fiddaman		do	shift
708*b30d1939SAndy Fiddaman			case $# in
709*b30d1939SAndy Fiddaman			0)	break ;;
710*b30d1939SAndy Fiddaman			esac
711*b30d1939SAndy Fiddaman			echo "#include <cc/$1>" > include.$src
712*b30d1939SAndy Fiddaman			if	$cc -E include.$src > /dev/null
713*b30d1939SAndy Fiddaman			then	break
714*b30d1939SAndy Fiddaman			fi
715*b30d1939SAndy Fiddaman		done
716*b30d1939SAndy Fiddaman		case $# in
717*b30d1939SAndy Fiddaman		0)	;;
718*b30d1939SAndy Fiddaman		*)	x=$stdinclude
719*b30d1939SAndy Fiddaman			stdinclude=
720*b30d1939SAndy Fiddaman			for f in $x
721*b30d1939SAndy Fiddaman			do	case $f in
722*b30d1939SAndy Fiddaman				*/cc)	;;
723*b30d1939SAndy Fiddaman				*)	stdinclude="$stdinclude $f" ;;
724*b30d1939SAndy Fiddaman				esac
725*b30d1939SAndy Fiddaman			done
726*b30d1939SAndy Fiddaman			;;
727*b30d1939SAndy Fiddaman		esac
728*b30d1939SAndy Fiddaman		;;
729*b30d1939SAndy Fiddaman	esac
730*b30d1939SAndy Fiddaman	case $subinclude in
731*b30d1939SAndy Fiddaman	?*)	for i in $subinclude
732*b30d1939SAndy Fiddaman		do	for j in $stdinclude
733*b30d1939SAndy Fiddaman			do	case $i in
734*b30d1939SAndy Fiddaman				$j/*/*)	;;
735*b30d1939SAndy Fiddaman				$j/*)	both=
736*b30d1939SAndy Fiddaman					eval set x $probe_include
737*b30d1939SAndy Fiddaman					while	:
738*b30d1939SAndy Fiddaman					do	shift
739*b30d1939SAndy Fiddaman						case $# in
740*b30d1939SAndy Fiddaman						0)	for k in $both
741*b30d1939SAndy Fiddaman							do	echo "#include <$k>" > include.$src
742*b30d1939SAndy Fiddaman								$cc -E include.$src > include.out
743*b30d1939SAndy Fiddaman								I=`grep -c $i/$k < include.out`
744*b30d1939SAndy Fiddaman								J=`grep -c $j/$k < include.out`
745*b30d1939SAndy Fiddaman								case $I:$J in
746*b30d1939SAndy Fiddaman								0:*)	;;
747*b30d1939SAndy Fiddaman								*:0)	stdinclude="$i $stdinclude"
748*b30d1939SAndy Fiddaman									break
749*b30d1939SAndy Fiddaman									;;
750*b30d1939SAndy Fiddaman								esac
751*b30d1939SAndy Fiddaman							done
752*b30d1939SAndy Fiddaman							continue 3
753*b30d1939SAndy Fiddaman							;;
754*b30d1939SAndy Fiddaman						esac
755*b30d1939SAndy Fiddaman						if	test -f $i/$1
756*b30d1939SAndy Fiddaman						then	if	test ! -f $j/$1
757*b30d1939SAndy Fiddaman							then	break 2
758*b30d1939SAndy Fiddaman							fi
759*b30d1939SAndy Fiddaman							both="$both $1"
760*b30d1939SAndy Fiddaman						fi
761*b30d1939SAndy Fiddaman					done
762*b30d1939SAndy Fiddaman					;;
763*b30d1939SAndy Fiddaman				$j)	continue 2
764*b30d1939SAndy Fiddaman				;;
765*b30d1939SAndy Fiddaman				esac
766*b30d1939SAndy Fiddaman			done
767*b30d1939SAndy Fiddaman			stdinclude="$i $stdinclude"
768*b30d1939SAndy Fiddaman		done
769*b30d1939SAndy Fiddaman		;;
770*b30d1939SAndy Fiddaman	esac
771*b30d1939SAndy Fiddaman
772*b30d1939SAndy Fiddaman	{
773*b30d1939SAndy Fiddaman
774*b30d1939SAndy Fiddaman	for i in $stdinclude
775*b30d1939SAndy Fiddaman	do
776*b30d1939SAndy Fiddaman		case $i in
777*b30d1939SAndy Fiddaman		$usrinclude)	;;
778*b30d1939SAndy Fiddaman		*)		echo $i $i ;;
779*b30d1939SAndy Fiddaman		esac
780*b30d1939SAndy Fiddaman	done
781*b30d1939SAndy Fiddaman
782*b30d1939SAndy Fiddaman	eval set x $probe_include
783*b30d1939SAndy Fiddaman	while	:
784*b30d1939SAndy Fiddaman	do	shift
785*b30d1939SAndy Fiddaman		case $# in
786*b30d1939SAndy Fiddaman		0)	break ;;
787*b30d1939SAndy Fiddaman		esac
788*b30d1939SAndy Fiddaman		echo "#include <$1>" > t.c
789*b30d1939SAndy Fiddaman		p=
790*b30d1939SAndy Fiddaman		for j in `$cc -E t.c | grep "$1" | sed -e 's,\\\\,/,g' -e 's,"[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]:/,"/,g' -e '/^#[line 	]*1[ 	][ 	]*"[\\/]/!d' -e 's/^#[line 	]*1[ 	][ 	]*"\(.*\)[\\/].*".*/\1/'`
791*b30d1939SAndy Fiddaman		do	j=`echo $j | sed -e 's,///*,/,g' -e 's,/$,,'`
792*b30d1939SAndy Fiddaman			case $p in
793*b30d1939SAndy Fiddaman			?*)	echo $p $j ;;
794*b30d1939SAndy Fiddaman			esac
795*b30d1939SAndy Fiddaman			p=$j
796*b30d1939SAndy Fiddaman		done
797*b30d1939SAndy Fiddaman	done
798*b30d1939SAndy Fiddaman
799*b30d1939SAndy Fiddaman	case $usrinclude in
800*b30d1939SAndy Fiddaman	?*)	echo $usrinclude $usrinclude ;;
801*b30d1939SAndy Fiddaman	esac
802*b30d1939SAndy Fiddaman
803*b30d1939SAndy Fiddaman	} | tsort > tmp.tmp
804*b30d1939SAndy Fiddaman	tstinclude=`cat tmp.tmp`
805*b30d1939SAndy Fiddaman	bad=
806*b30d1939SAndy Fiddaman	for i in $stdinclude
807*b30d1939SAndy Fiddaman	do	case "
808*b30d1939SAndy Fiddaman$tstinclude
809*b30d1939SAndy Fiddaman" in
810*b30d1939SAndy Fiddaman		*"
811*b30d1939SAndy Fiddaman$i
812*b30d1939SAndy Fiddaman"*)			;;
813*b30d1939SAndy Fiddaman		*)	bad=1
814*b30d1939SAndy Fiddaman			break
815*b30d1939SAndy Fiddaman			;;
816*b30d1939SAndy Fiddaman		esac
817*b30d1939SAndy Fiddaman	done
818*b30d1939SAndy Fiddaman	;;
819*b30d1939SAndy Fiddamanesac
820*b30d1939SAndy Fiddaman
821*b30d1939SAndy Fiddamancase $bad in
822*b30d1939SAndy Fiddaman"")	x=$stdinclude
823*b30d1939SAndy Fiddaman	stdinclude=
824*b30d1939SAndy Fiddaman	z=
825*b30d1939SAndy Fiddaman	for i in $tstinclude
826*b30d1939SAndy Fiddaman	do	case " $x " in
827*b30d1939SAndy Fiddaman		*" $i "*)
828*b30d1939SAndy Fiddaman			stdinclude="$stdinclude $i"
829*b30d1939SAndy Fiddaman			z=$i
830*b30d1939SAndy Fiddaman			;;
831*b30d1939SAndy Fiddaman		esac
832*b30d1939SAndy Fiddaman	done
833*b30d1939SAndy Fiddaman	case $usrinclude in
834*b30d1939SAndy Fiddaman	'')	usrinclude=$z ;;
835*b30d1939SAndy Fiddaman	esac
836*b30d1939SAndy Fiddaman	;;
837*b30d1939SAndy Fiddamanesac
838*b30d1939SAndy Fiddamancase $hosted in
839*b30d1939SAndy Fiddaman"")	case $usrinclude in
840*b30d1939SAndy Fiddaman	/usr/include)	usrinclude= ;;
841*b30d1939SAndy Fiddaman	esac
842*b30d1939SAndy Fiddaman	;;
843*b30d1939SAndy Fiddamanesac
844*b30d1939SAndy Fiddaman
845*b30d1939SAndy Fiddamancase $usrinclude in
846*b30d1939SAndy Fiddaman?*)	case " $stdinclude " in
847*b30d1939SAndy Fiddaman	*\ $usrinclude\ *)
848*b30d1939SAndy Fiddaman		x=$stdinclude
849*b30d1939SAndy Fiddaman		stdinclude=
850*b30d1939SAndy Fiddaman		for f in $x
851*b30d1939SAndy Fiddaman		do	case $f in
852*b30d1939SAndy Fiddaman			$usrinclude)	;;
853*b30d1939SAndy Fiddaman			*)		stdinclude="$stdinclude $f" ;;
854*b30d1939SAndy Fiddaman			esac
855*b30d1939SAndy Fiddaman		done
856*b30d1939SAndy Fiddaman		;;
857*b30d1939SAndy Fiddaman	esac
858*b30d1939SAndy Fiddaman	;;
859*b30d1939SAndy Fiddamanesac
860*b30d1939SAndy Fiddaman
861*b30d1939SAndy Fiddaman# drop dups -- they creep in somehow
862*b30d1939SAndy Fiddaman
863*b30d1939SAndy Fiddamanx=$stdinclude
864*b30d1939SAndy Fiddamanstdinclude=
865*b30d1939SAndy Fiddamanfor f in $x
866*b30d1939SAndy Fiddamando	case " $stdinclude $usrinclude " in
867*b30d1939SAndy Fiddaman	*" $f "*)	;;
868*b30d1939SAndy Fiddaman	*)		stdinclude="$stdinclude $f" ;;
869*b30d1939SAndy Fiddaman	esac
870*b30d1939SAndy Fiddamandone
871