aboutsummaryrefslogtreecommitdiff
path: root/ndk-build
diff options
context:
space:
mode:
authorAndrew Hsieh <andrewhsieh@google.com>2012-12-19 16:45:00 +0800
committerAndrew Hsieh <andrewhsieh@google.com>2013-01-08 18:17:57 +0800
commit8fbff41d699dad1386dcdf58e02b7263939abe41 (patch)
treef5d757dd6efe471c8a09cb969811552a65d538a5 /ndk-build
parent9753f9385a4bfee5c6db0ec6038ecff826accc09 (diff)
downloadndk-8fbff41d699dad1386dcdf58e02b7263939abe41.tar.gz
Add static code analyzer NDK_ANALYZE=1
With NDK_ANALYZE=1, ndk-build uses scan-build which builds project twice: 1) calls clang to analyze code and generate dignostics. If no error, 2) calls NDK toolchain as usual Change-Id: I51a9259675deb160b430e6232da5191f3178ed48
Diffstat (limited to 'ndk-build')
-rwxr-xr-xndk-build113
1 files changed, 97 insertions, 16 deletions
diff --git a/ndk-build b/ndk-build
index ef7fef10d..a8b811084 100755
--- a/ndk-build
+++ b/ndk-build
@@ -50,7 +50,7 @@ esac
# If NDK_LOG is set to 1 or true in the environment, or the command-line
# then enable log messages below
-# Also normalize NDK_HOST_32BIT to 1 or 0
+# Also normalize NDK_HOST_32BIT and NDK_ANALYZE to 1 or 0
if [ -z "$NDK_LOG" ]; then
NDK_LOG=0
fi
@@ -59,21 +59,47 @@ if [ -z "$NDK_HOST_32BIT" ]; then
NDK_HOST_32BIT=0
fi
+if [ -z "$NDK_ANALYZE" ]; then
+ NDK_ANALYZE=0
+fi
+
+PROJECT_PATH=
+PROJECT_PATH_NEXT=
for opt; do
- case $opt in
- NDK_LOG=1|NDK_LOG=true)
- NDK_LOG=1
- ;;
- NDK_LOG=*)
- NDK_LOG=0
- ;;
- NDK_HOST_32BIT=1|NDK_HOST_32BIT=true)
- NDK_HOST_32BIT=1
- ;;
- NDK_HOST_32BIT=*)
- NDK_HOST_32BIT=0
- ;;
- esac
+ if [ -z "$PROJECT_PATH" -a "$PROJECT_PATH_NEXT" = "yes" ] ; then
+ PROJECT_PATH=$opt
+ PROJECT_PATH_NEXT=
+ else
+ case $opt in
+ NDK_LOG=1|NDK_LOG=true)
+ NDK_LOG=1
+ ;;
+ NDK_LOG=*)
+ NDK_LOG=0
+ ;;
+ NDK_HOST_32BIT=1|NDK_HOST_32BIT=true)
+ NDK_HOST_32BIT=1
+ ;;
+ NDK_HOST_32BIT=*)
+ NDK_HOST_32BIT=0
+ ;;
+ NDK_ANALYZE=1|NDK_ANALYZE=true)
+ NDK_ANALYZE=1
+ ;;
+ NDK_ANALYZE=*)
+ NDK_ANALYZE=0
+ ;;
+ NDK_TOOLCHAIN_VERSION=*)
+ NDK_TOOLCHAIN_VERSION=${opt#NDK_TOOLCHAIN_VERSION=}
+ ;;
+ APP_ABI=*)
+ APP_ABI=${opt#APP_ABI=}
+ ;;
+ -C)
+ PROJECT_PATH_NEXT="yes"
+ ;;
+ esac
+ fi
done
if [ "$NDK_LOG" = "true" ]; then
@@ -84,6 +110,10 @@ if [ "$NDK_HOST_32BIT" = "true" ]; then
NDK_HOST_32BIT=1
fi
+if [ "$NDK_ANALYZE" = "true" ]; then
+ NDK_ANALYZE=1
+fi
+
if [ "$NDK_LOG" = "1" ]; then
log () {
echo "$@"
@@ -213,4 +243,55 @@ if [ "$OSTYPE" = "cygwin" ] ; then
log "Cygwin-compatible GNU make detected"
fi
-$GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@"
+if [ "$NDK_ANALYZE" = 1 ]; then
+ . $PROGDIR/build/tools/dev-defaults.sh # for DEFAULT_LLVM_VERSION
+
+ # Return flags send in env. or command line which are enough to retrive APP_ABI and TOOLCHAIN_PREFIX later
+ gen_flags ()
+ {
+ local FLAGS=
+
+ if [ -n "$PROJECT_PATH" ] ; then
+ FLAGS=$FLAGS" -C $PROJECT_PATH"
+ fi
+ if [ -n "$APP_ABI" ] ; then
+ FLAGS=$FLAGS" APP_ABI=$APP_ABI"
+ fi
+ if [ -n "$NDK_HOST_32BIT" ] ; then
+ FLAGS=$FLAGS" NDK_HOST_32BIT=$NDK_HOST_32BIT"
+ fi
+ if [ -n "$NDK_TOOLCHAIN_VERSION" ] ; then
+ FLAGS=$FLAGS" NDK_TOOLCHAIN_VERSION=$NDK_TOOLCHAIN_VERSION"
+ fi
+ echo "$FLAGS"
+ }
+
+ get_build_var ()
+ {
+ local VAR=$1
+ local FLAGS=`gen_flags`
+ $GNUMAKE --no-print-dir -f $PROGDIR/build/core/build-local.mk $FLAGS DUMP_${VAR} | tail -1
+ }
+
+ get_build_var_for_abi ()
+ {
+ local VAR=$1
+ local ABI=$2
+ local FLAGS=`gen_flags`
+ $GNUMAKE --no-print-dir -f $PROGDIR/build/core/build-local.mk $FLAGS DUMP_${VAR} APP_ABI=${ABI} | tail -1
+ }
+
+ APP_ABIS=`get_build_var APP_ABI`
+ for ABI in $APP_ABIS; do
+ TOOLCHAIN_PREFIX=`get_build_var_for_abi TOOLCHAIN_PREFIX $ABI`
+ $PROGDIR/prebuilt/common/scan-build/scan-build \
+ --use-analyzer $PROGDIR/toolchains/llvm-${DEFAULT_LLVM_VERSION}/prebuilt/$HOST_TAG/bin/${ABI}/analyzer \
+ --use-cc ${TOOLCHAIN_PREFIX}gcc \
+ --use-c++ ${TOOLCHAIN_PREFIX}g++ \
+ --status-bugs -v -v \
+ $GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@" APP_ABI=$ABI
+ done
+else
+ $GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@"
+fi
+