#!/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/x.y/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 "$@"