X-Git-Url: http://nitlanguage.org diff --git a/bin/gccx b/bin/gccx index 8da5452..ef8af1f 100755 --- a/bin/gccx +++ b/bin/gccx @@ -19,24 +19,29 @@ OPTS="-g" # option for compiler call objs="" # List of .o files -CC="gcc --ansi --pedantic -Wall -Wextra -Wformat-security -Wcast-align -Wno-uninitialized -Wno-unused-variable -Wno-unused-label -Wno-unused-parameter" # Default compiler call +CC="gcc --ansi --pedantic -Wall -Wextra -Wformat-security -Wcast-align -Wno-uninitialized -Wno-unused-variable -Wno-unused-label -Wno-unused-parameter -Wno-missing-field-initializers" # Default compiler call ext="_savo _sav" # Default flavor to reuse out="a.out" # Default output binary filename dir="" # Default tmp dir -nolibgc="false" # Try to use libgc ? +nolibgc="true" # Disable boehm libgc? CKSUM="cksum" # Tool that perfors checksum. cksum seems to be very portable +recompile="false" usage() { e=`basename "$0"` cat</dev/null >/dev/null; then + cache=ccache +fi + stop=false +verbose=false +vverbose=false while [ $stop = false ]; do case $1 in + -R) recompile=true; shift;; -O) OPTS="$OPTS -O2" ext="_savo"; shift;; -i) CC="/opt/intel/cc/10.1.015/bin/icc -O2" ext="_savi"; shift;; + -ll) CC="clang --ansi --pedantic -O3"; ext="_savll"; shift;; -I) OPTS="$OPTS -I $2"; shift; shift;; -o) out="$2"; shift; shift;; -d) dir="$2/"; shift; shift;; --nolibgc) nolibgc=true; shift;; -x) OPTS="$OPTS $2"; shift; shift;; + -vv) vverbose=true; verbose=true; shift;; + -v) verbose=true; shift;; -h|"") usage; exit;; *) stop=true esac @@ -80,32 +96,68 @@ if [ $nolibgc != true ] && test_libgc; then OPTS="$OPTS -DWITH_LIBGC -lgc" fi +if [ $cache = "ccache" ]; then + CC="ccache $CC" +fi + for i in "$@"; do j=`basename "$i" .c` + transformed=`echo "$i" | sed " + /\.nit_compile\/.*_sep\.c/s/\.nit_compile\/\(.*\)\._sep\.c/Module \1/ + /\.nit_compile\/.*_glob\.c/s/\.nit_compile\/\(.*\)\._glob\.c/Module \1/ + /\.nit_compile[1-9]\/.*_sep\.c/s/\.nit_compile[1-9]\/\(.*\)\._sep\.c/Module \1/ + /\.nit_compile[1-9]\/.*_glob\.c/s/\.nit_compile[1-9]\/\(.*\)\._glob\.c/Module \1/ + /\/nit_main\.c/s/.*\/nit_main\.c/Main/ + /\.nit_compile\/.*\._tables\.c/s/.*/Tables/ + /\.nit_compile[1-9]\/.*\._tables\.c/s/.*/Tables/ + /\/\/.*_nit\.c/s/.*\/\/\(.*\)_nit.c/Native \1/ + s/.*\/gc.c/Garbage Collector/ + s/.*\/gc_static_objects_list.c/Garbage Collector object list/ + "` + found="false" + if [ $cache != true ]; then + o="$dir$j.o" + if [ $vverbose = true ] ; then + echo "* $CC $OPTS -c $i -o $o" >&2 + fi + $CC $OPTS -c $i -o $o || exit 1 + else # We remove starting # to be path independent (after preprocess, there are the only # remainings) cksum=`gcc -E $OPTS $i 2> /dev/null | grep -v "^#" | $CKSUM` for e in $ext; do o="$dir$j.$e.o" cksumfile="$dir$j.$e.cksum" - if [ -f "$cksumfile" -a -f "$o" ]; then + if [ -f "$cksumfile" -a -f "$o" -a "x$recompile" != "xtrue" ]; then cksumtry=`cat $cksumfile` if [ "x$cksum" = "x$cksumtry" ]; then + if [ $vverbose = true ] ; then + echo "* $transformed up-to-date" + fi found=true break fi fi done if [ $found = false ]; then - echo "* $CC $OPTS -c $i -o $o" >&2 + if [ $verbose = true ] ; then + if [ $vverbose = true ] ; then + echo "* $CC $OPTS -c $i -o $o" >&2 + else + echo "* $transformed" + fi + fi if $CC $OPTS -c $i -o $o; then echo "$cksum" > "$cksumfile" else exit 1 fi fi +fi objs="$objs $o" done -echo "* $CC $OPTS -lm $objs -o $out" >&2 +if [ $vverbose = true ] ; then + echo "* $CC $OPTS -lm $objs -o $out" >&2 +fi $CC $OPTS -lm $objs -o "$out"