diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
commit | 3950ffe2a485479f6561c27364d3d7df5a21d124 (patch) | |
tree | 468c6e14449d1b1e279222ec32f676b0311917d2 /src/cmd/INIT/cc.mvs.390 | |
download | ksh-upstream.tar.gz |
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/cmd/INIT/cc.mvs.390')
-rwxr-xr-x | src/cmd/INIT/cc.mvs.390 | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/src/cmd/INIT/cc.mvs.390 b/src/cmd/INIT/cc.mvs.390 new file mode 100755 index 0000000..50bc7d5 --- /dev/null +++ b/src/cmd/INIT/cc.mvs.390 @@ -0,0 +1,279 @@ +: mvs.390 cc wrapper for unix message and exit code semantics : 2012-01-20 : + +HOSTTYPE=mvs.390 + +case " $* " in +*" -dumpmachine "*) echo $HOSTTYPE; exit ;; +esac + +ar=ar +cc=/bin/c89 +CC=/bin/c++ +ccflags="-D_ALL_SOURCE -Wc,dll" +objmax=60 +tmpfiles= +unbotch= + +# -n as *first* arg shows but does not do +# -Wc,exportall => -Wl,dll +# -Bdynamic => .c,.o dynamic +# -Bstatic => .c,.o static +# *.C => cc=$CC +# *.cpp => cc=$CC +# *.cxx => cc=$CC +# no optimization until the optimizer is fixed: +# -O dropped (no optimization) +# -0 dropped (no optimization) +# -1 -O (default level 1 optimization) +# -2 -2 (maximal level 2 optimization) + +let argc=0 cmp=0 dll=0 libc=0 dynamic=1 dynamic_objc=0 static_objc=0 relc=0 botched=0 +case $1 in +-n) exec=print + shift + ;; +*) exec= + ;; +esac +export _CC_ACCEPTABLE_RC=1 +export _C89_ACCEPTABLE_RC=$_CC_ACCEPTABLE_RC +export _CXX_ACCEPTABLE_RC=$_CC_ACCEPTABLE_RC +case " $* " in +*.C" "*)let dll=2 + cc=$CC + export _CXXSUFFIX=C + ;; +*.cpp" "*)let dll=2 + cc=$CC + export _CXXSUFFIX=cpp + ;; +*.cxx" "*)let dll=2 + cc=$CC + export _CXXSUFFIX=cxx + ;; +esac +exe= +xxx= +while : +do case $# in + 0) break ;; + esac + arg=$1 + case $arg in + -1) arg=-O + ;; + -Bdynamic) + let dynamic=1 + ;; + -Bstatic) + let dynamic=0 + ;; + -c) let cmp=1 + ;; + -D_ALL_SOURCE|-D_ALL_SOURCE=*) + arg= + ;; + -D*[\ \(\)]*) + arg=${arg#-D} + botch_macro[botched]=${arg%%=*} + botch_value[botched]=${arg#*=} + let botched=botched+1 + arg= + ;; + -o) argv[argc]=$arg + let argc=argc+1 + shift + arg=$1 + exe=$arg + rm -f "$exe" + ;; + -[O0]) arg= + ;; + -Wc,dll)arg= + ;; + -Wc,exportall) + let dll=1 + ;; + -Wl,dll)arg= + let dll=1 + ;; + *.c) if [[ $botched != 0 ]] + then src=$arg + arg=${arg##*/} + unbotch="$unbotch ${arg%.c}.o" + arg=__$arg + tmpfiles="$tmpfiles $arg" + { + while [[ $botched != 0 ]] + do let botched=botched-1 + print -r -- "#define ${botch_macro[botched]} ${botch_value[botched]}" + done + cat $src + } > $arg + fi + ;; + *.o) if test 0 != $dynamic + then let dynamic_objc=dynamic_objc+1 + else let static_objc=static_objc+1 + fi + ;; + *.x) a=${arg%.x}.a + if test -f $a + then argv[argc]=$a + let argc=argc+1 + xxx=-Wl,dll + case $a in + ast.a|*/ast.a) + cc="$CC -u_ast_init" + ;; + esac + fi + ;; + esac + case $arg in + ?*) argv[argc]=$arg + let argc=argc+1 + ;; + esac + shift +done + +tmp=/tmp/cc.${USER:-$LOGNAME}.$$.err +tmpfiles="$tmp $tmpfiles" + +# if any dll .o's are in .a then a .x gets generated +# but the native cc doesn't jcl for the .x +# -Wl,dll does that, so we nuke the .x and keep the exe + +test 0 != $dll && xxx= +case $xxx in +?*) case $exe in + ?*) a=${exe##*/} + a=${a%.*} + case $exe in + */*) tmpfiles="$tmpfiles ${exe%/*}/${a}.x" ;; + *) tmpfiles="$tmpfiles ${a}.x" ;; + esac + ;; + esac + ;; +esac +if test 0 != $dll +then if test 0 != $cmp + then xxx="-D_SHARE_EXT_VARS $xxx" + else xxx="-Wl,dll $xxx" + fi +fi +set -- $xxx "${argv[@]}" + +# can't handle more than objmax .o's +# -r into intermediates doesn't work, but the cat trick does +# also, the runtime dll file must be executable but cc -Wl,dll forgets + +if test 0 != $dll -a \( $dynamic_objc -ge $objmax -o 0 != $static_objc \) +then unset argv + argc=0 libc=0 dynamic=1 dynamic_objc=0 static_objc=0 endc=0 + while : + do case $# in + 0) break ;; + esac + case $1 in + -Bdynamic) + let dynamic=1 + ;; + -Bstatic) + let dynamic=0 + ;; + *.o) if test 0 != $dynamic + then dynamic_objv[dynamic_objc]=$1 + let dynamic_objc=dynamic_objc+1 + else static_objv[static_objc]=$1 + let static_objc=static_objc+1 + fi + ;; + -l*) libv[libc]=$1 + let libc=libc+1 + ;; + -o) argv[argc]=$1 + let argc=argc+1 + shift + argv[argc]=$1 + let argc=argc+1 + exe=$1 + ;; + *) argv[argc]=$1 + let argc=argc+1 + ;; + esac + shift + done + if test 0 != $static_objc + then case $exe in + ?*) $exec $ar cr ${exe%.*}.a "${static_objv[@]}" ;; + esac + fi + if test 0 != $dynamic_objc + then cat=0.0.o + tmpfiles="$tmpfiles $cat" + cat "${dynamic_objv[@]}" > $cat || exit + else cat= + fi + set -- "${argv[@]}" $cat "${libv[@]}" +fi + +# grep through the warning/error messages to get the true exit code +# some annoying messages are dropped while we're at it + +trap 'rm -f $tmpfiles' 0 1 2 15 +$exec $cc $ccflags "$@" 2> $tmp +code=$? +for i in $unbotch +do test -f __$i && mv __$i $i +done +typeset -l lc +while : +do if read line + then lc=$line + case $lc in + *'#include file'*'not found'*) + code=1 + ;; + *'#pragma ignored'*) + continue + ;; + *'definition side file is not defined'*) + continue + ;; + *'step ended with return code 4'*) + code=0 + continue + ;; + *'step ended with return code'*) + code=1 + continue + ;; + *'try again'*) + code=1 + continue + ;; + *'unknown preprocessing directive'*) + code=1 + case $lc in + 'warning '*) + set -- $line + shift + line=$* + ;; + esac + ;; + *'unresolved writable static references are detected'*) + test 0 != $dll && continue + ;; + esac + else case $code:$exe in + 0:?*) $exec chmod +x $exe ;; + esac + exit $code + fi + echo "$line" >&2 +done < $tmp |