diff options
-rw-r--r-- | build/core/default-build-commands.mk | 8 | ||||
-rwxr-xr-x | build/tools/build-analyzer.sh | 110 | ||||
-rwxr-xr-x | build/tools/build-host-prebuilts.sh | 3 | ||||
-rwxr-xr-x | build/tools/build-llvm.sh | 69 | ||||
-rwxr-xr-x | build/tools/package-release.sh | 3 | ||||
-rwxr-xr-x | ndk-build | 113 |
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 @@ -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 + |