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