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