#!/bin/sh

# This script is invoked by Android build system "WITH_SYNTAX_CHECK=1 make ..." and
# accepts command line in the following format:
#
#    ccc-syntax ARCH LOCAL_CC ...
#
# It calls "clang -fsyntax-only ..." to utilize clang's better diagnostics
# before calling "LOCAL_CC ..." for code generation.  ARCH is translated
# into "-target XXX" (see below) to get proper pre-defined preprocessor
# symbols/macros.  Some clang-specific warnings are disabled to be compatible
# with Android toolchain mostly gcc.
#
# The compilation time is slightly longer, and the generated object file
# should be the same as w/o WITH_SYNTAX_CHECK
#
# Note that although Android build system doesn't call LOCAL_CC with any of
# the following flags, this script should check and skip "clang -fsyntax-only"
# if options contain any of the following: '-print-*', '-dump*', '@*', '-E',
# '-' or '-M', for use elsewhere.
#

ARCH="$1"
LOCAL_CC="$2"
shift ; shift

# Turn on syntax-only
CLANG_FLAGS="-fsyntax-only"

# Turn off warning about unused options
CLANG_FLAGS="$CLANG_FLAGS -Qunused-arguments"

# Turn off unknown warning options
CLANG_FLAGS="$CLANG_FLAGS -Wno-unknown-warning-option"

# Define WITH_SYNTAX_CHECK for code wish to behave differently when check
CLANG_FLAGS="$CLANG_FLAGS -DWITH_SYNTAX_CHECK"

# If LOCAL_CC is not clang and not compiling in c++ mode, turn on -std=gnu89 by default
# and let "$@" later override it, if any
test "$LOCAL_CC" != "${LOCAL_CC%-x c++}" -o "$LOCAL_CC" = "${LOCAL_CC%-xc++}" && cxx_mode=true
if [ "$LOCAL_CC" = "${LOCAL_CC%clang}" -a "$cxx_mode" != "true" ] ; then
    CLANG_FLAGS="$CLANG_FLAGS -std=gnu89"
fi

# Turn off warnings which aren't useful in this context
CLANG_FLAGS="$CLANG_FLAGS -Wno-ignored-attributes -Wno-pedantic -Wno-builtin-requires-header -Wno-gnu -Wno-gnu-designator -Wno-knr-promoted-parameter"

if [ "$ARCH" != "host" ]; then
    # Add target to get proper pre-defined preprocessor symbols/macros.
    case $ARCH in
        arm) CLANG_FLAGS="$CLANG_FLAGS -target armv5te-none-linux-androideabi"
            ;;
        mips) CLANG_FLAGS="$CLANG_FLAGS -target mipsel-none-linux-android"
            ;;
        x86) CLANG_FLAGS="$CLANG_FLAGS -target i686-none-linux-android"
            ;;
    esac
    if [ "$LOCAL_CC" != "${LOCAL_CC%clang*}" ]; then
        # Don't look for its own lib/clang/3.3/include when LOCAL_CC is clang
        # which is rebuilt from source w/o installing its include as well
        CLANG_FLAGS="$CLANG_FLAGS -nostdinc"
    fi
else
    # Note that unlike target flags where Android build system explicitly specify
    # everything in command line, host tools have their own sysroot and --sysroot
    # isn't explicitly added in the commmand line.  Likelywise for other gcc implicit
    # search directories.
    #
    # We can query search paths by doing "gcc -v" and parsing the output with
    # sed -n '1,/BEGIN/!{ /END/,/BEING/!p; }' (*1), but forking gcc here adds overhead.
    # Because host tool refresh only once 1-2 year, here we hard-code the path obtained by (*2).
    # ToDo: The build system can do it once for each module, although it still needs to
    # prepare both -m32 and -m64 versions, anding 2 more args in additional to $ARCH
    # and $LOCAL_CC
    #
    # (*1) as described in http://sed.sourceforge.net/sedfaq4.html#s4.24
    # (*2) prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1/bin/i686-apple-darwin10-gcc -m64 -v -E - < /dev/null 2>&1 | \
    #         sed -n '1,/> search starts here/!{ /End of search list/,/> search starts here/!p; }' |\
    #         sed -e 's/^/-I/'
    #      Likewise for -m32
    #
        read -d '' CLANG_FLAGS_END <<"EOF"
 -I prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1/lib/gcc/i686-apple-darwin10/4.2.1/include
EOF
fi

# Turn off warnings (at the end) on features we exploit
CLANG_FLAGS_END="$CLANG_FLAGS_END -Wno-return-type-c-linkage"

# Call it
`dirname $0`/analyzer $CLANG_FLAGS "$@" $CLANG_FLAGS_END
if [ "$?" != 0 ]; then
    test $WITH_SYNTAX_CHECK -ge 2 && echo '*** ERROR ***': `dirname $0`/analyzer $CLANG_FLAGS "$@" $CLANG_FLAGS_END
    exit 1
fi
$LOCAL_CC "$@"