#!/bin/sh

# This script is invoked by Android build system "WITH_SYNTAX_CHECK=1 make ..." and
# accepts command line in the following format:
#
#    cxx-syntax ARCH LOCAL_CXX ...
#
# It calls "clang++ -fsyntax-only ..." to utilize clang's better diagnostics
# before calling "LOCAL_CXX ..." 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_CXX 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_CXX="$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"

# Ignore C standard like -std=gnu99 in LOCAL_CFLAGS but get
# passed for C++ compilation by build system
CLANG_FLAGS="$CLANG_FLAGS -Qignore-c-std-not-allowed-with-cplusplus"

# 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_CXX" != "${LOCAL_CXX%clang++*}" ]; then
        # Don't look for its own lib/clang/3.3/include when LOCAL_CXX 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 "g++ -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_CXX
    #
    # (*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-g++ -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`/clang++ $CLANG_FLAGS "$@" $CLANG_FLAGS_END
if [ "$?" != 0 ]; then
    test $WITH_SYNTAX_CHECK -ge 2 && echo '*** ERROR ***': `dirname $0`/clang++ $CLANG_FLAGS "$@" $CLANG_FLAGS_END
    exit 1
fi
$LOCAL_CXX "$@"
