#!/bin/rc # # POSIX standard c89 # # standard options: -c, -D name[=val], -E (preprocess to stdout), # -g, -L dir, -o outfile, -O, -s, -U name # (and operands can have -l lib interspersed) # # nonstandard but specified options: -S (assembly language left in .s), # -Wx,arg1[,arg2...] (pass arg(s) to phase x, where x is p (cpp) # 0 (compiler), or l (loader) # nonstandard option: -v (echo real commands to stdout as they execute) rfork e fn searchlib { switch($1){ case c echo /$objtype/lib/ape/libap.a case m echo /$objtype/lib/ape/libap.a case l echo /$objtype/lib/libl.a case y echo /$objtype/lib/liby.a case * y=() for(a in $libdirs /$objtype/lib/ape) if (test -r $a/lib$1.a) if(~ $#y 0) y=$a/lib$1.a if(! ~ $#y 0) echo $y } } switch($objtype){ case mips CC=vc LD=vl O=v case 68020 CC=2c LD=2l O=2 case sparc CC=kc LD=kl O=k case 386 CC=8c LD=8l O=8 case hobbit CC=zc LD=zl O=z } oname=a.out srcs=() objs=() libdirs=() cppargs=() ccargs=(-B -J -D_POSIX_SOURCE) ldargs=() cflag=0 vflag=0 Eflag=0 Sflag=0 while(! ~ $#* 0){ switch($1){ case -c cflag=1 case -l if (~ $#2 0) echo cc: no arg for -l if not { y=`{searchlib $2} if(~ $#y 0) echo cc: cannot find lib $2 if not objs=($objs $y) shift } case -l* y=`{echo $1 | sed 's/-l//'} y=`{searchlib $y} if(~ $#y 0) echo cc: cannot find lib $2 if not objs=($objs $y) case -o if (~ $#2 0) echo cc: no arg for -o if not { oname=$2 shift } case -[DIU] if (~ $#2 0) echo cc: no arg for $1 if not { cppargs=($cppargs $2) shift } case -[DIU]* cppargs=($cppargs $1) case -E Eflag=1 cflag=1 case -g ; case -s ; case -O ; case -Wp,* y=`{echo $1 | sed 's/-Wp,// s/,/ /g'} cppargs=($cppargs $y) case -W0,* y=`{echo $1 | sed 's/-W0,// s/,/ /g'} ccargs=($ccargs $y) case -Wl,* y=`{echo $1 | sed 's/-Wl,// s/,/ /g'} ldargs=($ldargs $y) case -v vflag=1 ldargs=($ldargs -v) case -S Sflag=1 case -* echo cc: flag $1 ignored case * switch(`{echo $1 | sed 's/.*(\..*)$/\1/'}){ case .c b=`{/$cputype/bin/ape/basename $1 .c} d=`{/$cputype/bin/ape/dirname $1} srcs=($srcs $d/$b) objs=($objs $b.o) case .o objs=($objs $1) case .$O objs=($objs $1) case .a objs=($objs $1) case .a$O objs=($objs $1) case * echo cc: argument $1 ignored } } shift } if(~ $#objs 0){ echo cc: no files to compile or load! exit nofiles } for(f in $srcs){ # $f is the full pathname without the extension # -N turns off default includes if (~ $vflag 1) echo cpp -D__STDC__'='1 -N $cppargs -I/$objtype/include/ape -I/sys/include/ape $f.c $f.i if (! cpp -D__STDC__'='1 -N $cppargs -I/$objtype/include/ape -I/sys/include/ape $f.c $f.i) exit cpperr if (~ $Eflag 1){ cat $f.i rm $f.i } if not{ bf=`{/$cputype/bin/ape/basename $f} if (~ $Sflag 1) { if (~ $vflag 1) echo $CC $ccargs -S $f.i '>' $bf.s if(! $CC $ccargs -S $f.i > $bf.s) exit ccerr } if not { if (~ $vflag 1) echo $CC $ccargs $f.i if (! $CC $ccargs $f.i) exit ccerr mv $bf.i.$O $bf.o rm $f.i } } } if(~ $cflag 0){ if (~ $vflag 1) echo $LD -o $oname $ldargs $objs if (! $LD -o $oname $ldargs $objs) exit lderr if(~ $#objs 1 && ~ $#srcs 1) rm $objs } exit ''