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