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