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