diff options
author | Andrew Hsieh <andrewhsieh@google.com> | 2013-09-05 12:03:21 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-09-05 12:03:21 +0000 |
commit | 693487aee5be4e2757a476b7698c5f5c83010e1c (patch) | |
tree | aec85cf29cebd234a7fdf0836017b44a8b630a85 | |
parent | bba7eb9ee3ec2af12b926023256dbe4799995645 (diff) | |
parent | cc490dcffb59c9ff575bb935a9f4546fdf3f0f3f (diff) | |
download | 3.3-693487aee5be4e2757a476b7698c5f5c83010e1c.tar.gz |
Merge "Add ccc-syntax/cxx-syntax"
-rwxr-xr-x | bin/ccc-syntax | 115 | ||||
-rwxr-xr-x | bin/cxx-syntax | 118 |
2 files changed, 233 insertions, 0 deletions
diff --git a/bin/ccc-syntax b/bin/ccc-syntax new file mode 100755 index 0000000..ab8dc8c --- /dev/null +++ b/bin/ccc-syntax @@ -0,0 +1,115 @@ +#!/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/tools/gcc-sdk/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 + # + # Please refer to prebuilts/tools/gcc-sdk/gcc for similar trick to determine + # bitness + options=" ${@} " # sentinel prefix/suffix space to simplify pattern match below + suffix_m32=${options##* -m32 } # suffix after the last -m32 + suffix_m64=${options##* -m64 } # suffix after the last -m64 + len_m32=${#suffix_m32} # length of suffix after the last -m32 + len_m64=${#suffix_m64} # length of suffix after the last -m64 + if [ $len_m32 -ge $len_m64 ] ; then + read -d '' CLANG_FLAGS_END <<"EOF" + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/lib/gcc/x86_64-linux/4.6.x-google/include + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/lib/gcc/x86_64-linux/4.6.x-google/include-fixed + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/x86_64-linux/include + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/sysroot/usr/include +EOF + else + read -d '' CLANG_FLAGS_END <<"EOF" + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/lib/gcc/i686-linux/4.6.x-google/include + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/lib/gcc/i686-linux/4.6.x-google/include-fixed + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/i686-linux/include + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/sysroot/usr/include +EOF + fi +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_CC "$@"
\ No newline at end of file diff --git a/bin/cxx-syntax b/bin/cxx-syntax new file mode 100755 index 0000000..839dace --- /dev/null +++ b/bin/cxx-syntax @@ -0,0 +1,118 @@ +#!/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/tools/gcc-sdk/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 + # + # Please refer to prebuilts/tools/gcc-sdk/gcc for similar trick to determine + # bitness + options=" ${@} " # sentinel prefix/suffix space to simplify pattern match below + suffix_m32=${options##* -m32 } # suffix after the last -m32 + suffix_m64=${options##* -m64 } # suffix after the last -m64 + len_m32=${#suffix_m32} # length of suffix after the last -m32 + len_m64=${#suffix_m64} # length of suffix after the last -m64 + if [ $len_m32 -ge $len_m64 ] ; then + read -d '' CLANG_FLAGS_END <<"EOF" + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/x86_64-linux/include/c++/4.6.x-google + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/x86_64-linux/include/c++/4.6.x-google/x86_64-linux + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/x86_64-linux/include/c++/4.6.x-google/backward + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/lib/gcc/x86_64-linux/4.6.x-google/include + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/lib/gcc/x86_64-linux/4.6.x-google/include-fixed + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/x86_64-linux/include + -I prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/sysroot/usr/include +EOF + else + read -d '' CLANG_FLAGS_END <<"EOF" + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/i686-linux/include/c++/4.6.x-google + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/i686-linux/include/c++/4.6.x-google/i686-linux + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/i686-linux/include/c++/4.6.x-google/backward + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/lib/gcc/i686-linux/4.6.x-google/include + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/lib/gcc/i686-linux/4.6.x-google/include-fixed + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/i686-linux/include + -I prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/sysroot/usr/include +EOF + fi +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 "$@" |