aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/core/default-build-commands.mk8
-rwxr-xr-xbuild/tools/build-analyzer.sh110
-rwxr-xr-xbuild/tools/build-host-prebuilts.sh3
-rwxr-xr-xbuild/tools/build-llvm.sh69
-rwxr-xr-xbuild/tools/package-release.sh3
-rwxr-xr-xndk-build113
6 files changed, 290 insertions, 16 deletions
diff --git a/build/core/default-build-commands.mk b/build/core/default-build-commands.mk
index 85aaa4b13..1f1c23066 100644
--- a/build/core/default-build-commands.mk
+++ b/build/core/default-build-commands.mk
@@ -102,10 +102,18 @@ TARGET_LDLIBS := -lc -lm
# the toolchain's setup.mk script.
#
+ifneq ($(findstring ccc-analyzer,$(CC)),)
+TARGET_CC = $(CC)
+else
TARGET_CC = $(TOOLCHAIN_PREFIX)gcc
+endif
TARGET_CFLAGS =
+ifneq ($(findstring c++-analyzer,$(CXX)),)
+TARGET_CXX = $(CXX)
+else
TARGET_CXX = $(TOOLCHAIN_PREFIX)g++
+endif
TARGET_CXXFLAGS = $(TARGET_CFLAGS) -fno-exceptions -fno-rtti
TARGET_LD = $(TOOLCHAIN_PREFIX)ld
diff --git a/build/tools/build-analyzer.sh b/build/tools/build-analyzer.sh
new file mode 100755
index 000000000..d56c3d900
--- /dev/null
+++ b/build/tools/build-analyzer.sh
@@ -0,0 +1,110 @@
+#!/bin/sh
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This shell script is used to copy clang tool "scan-build"
+# for the Android NDK.
+#
+
+# include common function and variable definitions
+. `dirname $0`/prebuilt-common.sh
+
+PROGRAM_PARAMETERS="<src-dir> <ndk-dir> <toolchain>"
+
+PROGRAM_DESCRIPTION=\
+"Copy clang static code analyzer for the Android NDK.
+
+Where <src-dir> is the location of toolchain sources, <ndk-dir> is
+the top-level NDK installation path and <toolchain> is the name of
+the toolchain to use (e.g. llvm-3.1)."
+
+RELEASE=`date +%Y%m%d`
+
+PACKAGE_DIR=
+register_var_option "--package-dir=<path>" PACKAGE_DIR "Create archive tarball in specific directory"
+
+extract_parameters "$@"
+
+set_parameters ()
+{
+ SRC_DIR="$1"
+ NDK_DIR="$2"
+ TOOLCHAIN="$3"
+
+ # Check source directory
+ #
+ if [ -z "$SRC_DIR" ] ; then
+ echo "ERROR: Missing source directory parameter. See --help for details."
+ exit 1
+ fi
+
+ SCAN_BUILD_SRC_DIR=$SRC_DIR/$TOOLCHAIN/clang/tools/scan-build
+ if [ ! -d "$SCAN_BUILD_SRC_DIR" ] ; then
+ echo "ERROR: Source directory does not contain scan-build: $SCAN_BUILD_SRC_DIR"
+ exit 1
+ fi
+
+ LICENSE_FILE=$SRC_DIR/$TOOLCHAIN/clang/LICENSE.TXT
+ if [ ! -f "$LICENSE_FILE" ] ; then
+ echo "ERROR: Source directory does not contain clang license file: $LICENSE_FILE"
+ exit 1
+ fi
+
+ log "Using source directory: $SRC_DIR"
+
+ # Check NDK installation directory
+ #
+ if [ -z "$NDK_DIR" ] ; then
+ echo "ERROR: Missing NDK directory parameter. See --help for details."
+ exit 1
+ fi
+
+ if [ ! -d "$NDK_DIR" ] ; then
+ mkdir -p $NDK_DIR
+ fail_panic "Could not create target NDK installation path: $NDK_DIR"
+ fi
+
+ log "Using NDK directory: $NDK_DIR"
+
+ # Check toolchain name
+ #
+ if [ -z "$TOOLCHAIN" ] ; then
+ echo "ERROR: Missing toolchain name parameter. See --help for details."
+ exit 1
+ fi
+}
+
+set_parameters $PARAMETERS
+
+if [ "$PACKAGE_DIR" ]; then
+ mkdir -p "$PACKAGE_DIR"
+ fail_panic "Could not create package directory: $PACKAGE_DIR"
+fi
+
+# copy scan_build
+SCAN_BUILD_SUBDIR="prebuilt/common/scan-build"
+run copy_directory "$SCAN_BUILD_SRC_DIR" "$NDK_DIR/$SCAN_BUILD_SUBDIR"
+cp -p "$LICENSE_FILE" "$NDK_DIR/$SCAN_BUILD_SUBDIR"
+
+# remove unneeded file(s)
+rm -f $NDK_DIR/$SCAN_BUILD_SUBDIR/scan-build.1
+
+if [ "$PACKAGE_DIR" ]; then
+ ARCHIVE="scan-build.tar.bz2"
+ dump "Packaging $ARCHIVE"
+ pack_archive "$PACKAGE_DIR/$ARCHIVE" "$NDK_DIR" "$SCAN_BUILD_SUBDIR"
+fi
+
+dump "Done."
diff --git a/build/tools/build-host-prebuilts.sh b/build/tools/build-host-prebuilts.sh
index a3e0f0a0b..ff78b8dae 100755
--- a/build/tools/build-host-prebuilts.sh
+++ b/build/tools/build-host-prebuilts.sh
@@ -292,6 +292,9 @@ for SYSTEM in $SYSTEMS; do
# We're done for this system
done
+# Build tools common to all system
+run $BUILDTOOLS/build-analyzer.sh "$SRC_DIR" "$NDK_DIR" "llvm-$DEFAULT_LLVM_VERSION" --package-dir="$PACKAGE_DIR"
+
if [ "$PACKAGE_DIR" ]; then
echo "Done, please look at $PACKAGE_DIR"
else
diff --git a/build/tools/build-llvm.sh b/build/tools/build-llvm.sh
index 44ad80530..9057747db 100755
--- a/build/tools/build-llvm.sh
+++ b/build/tools/build-llvm.sh
@@ -270,6 +270,75 @@ done
# copy to toolchain path
run copy_directory "$TOOLCHAIN_BUILD_PREFIX" "$TOOLCHAIN_PATH"
+# create analyzer/++ scripts
+for ABI in $PREBUILT_ABIS; do
+ ANALYZER_PATH="$TOOLCHAIN_PATH/bin/$ABI"
+ ANALYZER="$ANALYZER_PATH/analyzer"
+ mkdir -p "$ANALYZER_PATH"
+ case "$ABI" in
+ armeabi)
+ LLVM_TARGET=armv5te-none-linux-androideabi
+ ;;
+ armeabi-v7a)
+ LLVM_TARGET=armv7-none-linux-androideabi
+ ;;
+ x86)
+ LLVM_TARGET=i686-none-linux-android
+ ;;
+ mips)
+ LLVM_TARGET=mipsel-none-linux-android
+ ;;
+ *)
+ dump "ERROR: Unsupported NDK ABI: $ABI"
+ exit 1
+ esac
+
+ cat > "${ANALYZER}" <<EOF
+if [ "\$1" != "-cc1" ]; then
+ \`dirname \$0\`/../clang -target $LLVM_TARGET "\$@"
+else
+ # target/triple already spelled out.
+ \`dirname \$0\`/../clang "\$@"
+fi
+EOF
+ cat > "${ANALYZER}++" <<EOF
+if [ "\$1" != "-cc1" ]; then
+ \`dirname \$0\`/../clang++ -target $LLVM_TARGET "\$@"
+else
+ # target/triple already spelled out.
+ \`dirname \$0\`/../clang++ "\$@"
+fi
+EOF
+ chmod 0755 "${ANALYZER}" "${ANALYZER}++"
+
+ if [ -n "$HOST_EXE" ] ; then
+ cat > "${ANALYZER}.cmd" <<EOF
+@echo off
+if "%1" == "-cc1" goto :L
+%~dp0\\..\\clang${HOST_EXE} -target $LLVM_TARGET %*
+if ERRORLEVEL 1 exit /b 1
+goto :done
+:L
+rem target/triple already spelled out.
+%~dp0\\..\\clang${HOST_EXE} %*
+if ERRORLEVEL 1 exit /b 1
+:done
+EOF
+ cat > "${ANALYZER}++.cmd" <<EOF
+@echo off
+if "%1" == "-cc1" goto :L
+%~dp0\\..\\clang++${HOST_EXE} -target $LLVM_TARGET %*
+if ERRORLEVEL 1 exit /b 1
+goto :done
+:L
+rem target/triple already spelled out.
+%~dp0\\..\\clang++${HOST_EXE} %*
+if ERRORLEVEL 1 exit /b 1
+:done
+EOF
+ fi
+done
+
if [ "$PACKAGE_DIR" ]; then
ARCHIVE="$TOOLCHAIN-$HOST_TAG.tar.bz2"
SUBDIR=$(get_toolchain_install_subdir $TOOLCHAIN $HOST_TAG)
diff --git a/build/tools/package-release.sh b/build/tools/package-release.sh
index b6f196cf4..6c70de8c3 100755
--- a/build/tools/package-release.sh
+++ b/build/tools/package-release.sh
@@ -439,6 +439,9 @@ for SYSTEM in $SYSTEMS; do
fi
fi
+ # Unpack other host tools
+ unpack_prebuilt scan-build
+
# Create an archive for the final package. Extension depends on the
# host system.
case "$SYSTEM" in
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
+