gcc-scc.sh (1318B)
1 #!/bin/sh 2 3 set -e 4 5 while getopts gr:O:a:s:o:c o 6 do 7 case $o in 8 g) 9 g=-g 10 ;; 11 O) 12 opti=-O1 13 ;; 14 r) 15 root=$OPTARG 16 ;; 17 a) 18 abi=$OPTARG 19 ;; 20 s) 21 sys=$OPTARG 22 ;; 23 o) 24 out=$OPTARG 25 ;; 26 c) 27 onlycc=1 28 ;; 29 *) 30 echo >&2 "usage: gcc-scc [-o outfile] [-c] [-r root] [-a abi] [-s sys] file" 31 exit 1 32 ;; 33 esac 34 done 35 shift $((OPTIND-1)) 36 37 sys=${sys:-`uname | tr 'A-Z' 'a-z'`} 38 abi=${abi:-amd64} 39 out=${out:-a.out} 40 root=${root:-${SCCPREFIX:-`dirname $0`/..}} 41 inc=$root/include/scc 42 arch_inc=$inc/bits/$abi 43 sys_inc=$inc/bits/$sys 44 sys_arch_inc=$inc/bits/$sys/$abi 45 lib=$root/lib/scc/${abi}-${sys} 46 crt=$root/lib/scc/${abi}-${sys}/crt.o 47 obj=${1%.c}.o 48 cc=${CROSS_COMPILE}cc 49 ld=${CROSS_COMPILE}ld 50 51 case `uname` in 52 OpenBSD) 53 nopie=-no-pie 54 ;; 55 esac 56 57 includes="-nostdinc -I$inc -I$arch_inc -I$sys_inc -I$sys_arch_inc" 58 cflags="$opti -std=c99 -w -fno-pie -fno-stack-protector -ffreestanding -static" 59 ldflags="-z nodefaultlib -static -L$lib" 60 61 if test ${onlycc:-0} -eq 1 62 then 63 $cc $cflags $includes -c "$@" 64 else 65 for i 66 do 67 case $i in 68 *.c) 69 $cc $g $cflags $includes -c "$i" 70 ;; 71 esac 72 done 73 74 # convert *.c args to *.o while correctly maintaing IFS chars 75 for i 76 do 77 shift 78 case $i in 79 *.c) 80 set -- "$@" "${i%c}o" 81 ;; 82 *) 83 set -- "$@" "$i" 84 ;; 85 esac 86 done 87 88 $ld $g $ldflags $nopie $crt "$@" -lc -lcrt -o "$out" 89 fi