[cfe-commits] r158682 - in /cfe/trunk/tools/diag-build: ./ diag-build.sh

Jordan Rose jordan_rose at apple.com
Mon Jun 18 14:31:37 PDT 2012


Author: jrose
Date: Mon Jun 18 16:31:37 2012
New Revision: 158682

URL: http://llvm.org/viewvc/llvm-project?rev=158682&view=rev
Log:
Add new tool 'diag-build' for showing enabled warnings in a project.

diag-build acts as a wrapper for 'diagtool show-enabled', in the same way
that scan-build acts as a wrapper for the static analyzer. The common case is
simple: use 'diag-build make' or 'diag-build xcodebuild' to list the warnings
enabled for the first compilation command we see. Other build systems require
you to manually specify "dry-run" and "use $CC and $CXX"; if there is a build
system you are interested in, please add it to the switch statement.

diag-build is fairly stupid right now, but it serves its basic purpose.
Hopefully it can grow to meet any additional requirements.

Added:
    cfe/trunk/tools/diag-build/
    cfe/trunk/tools/diag-build/diag-build.sh   (with props)

Added: cfe/trunk/tools/diag-build/diag-build.sh
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/diag-build/diag-build.sh?rev=158682&view=auto
==============================================================================
--- cfe/trunk/tools/diag-build/diag-build.sh (added)
+++ cfe/trunk/tools/diag-build/diag-build.sh Mon Jun 18 16:31:37 2012
@@ -0,0 +1,115 @@
+#!/bin/bash
+
+print_usage () {
+    echo 'Usage: diag-build.sh [-v] xcodebuild [flags]'
+    echo '       diag-build.sh [-v] make [flags]'
+    echo '       diag-build.sh [-v] <other build command>'
+    echo
+    echo 'diagtool must be in your PATH'
+    echo 'If using an alternate build command, you must ensure that'
+    echo 'the compiler used matches the CC environment variable.'
+}
+
+# Mac OS X's BSD sed uses -E for extended regular expressions,
+# but GNU sed uses -r. Find out which one this system accepts.
+EXTENDED_SED_FLAG='-E'
+echo -n | sed $EXTENDED_SED_FLAG 's/a/b/' 2>/dev/null || EXTENDED_SED_FLAG='-r'
+
+if [[ "$1" == "-v" ]]; then
+    verbose=$1
+    shift
+fi
+
+guessing_cc=0
+
+if [[ -z "$CC" ]]; then
+    guessing_cc=1
+    if [[ -x $(dirname $0)/clang ]]; then
+	CC=$(dirname $0)/clang
+    elif [[ ! -z $(which clang) ]]; then
+	CC=$(which clang)
+    else
+	echo -n 'Error: could not find an appropriate compiler'
+	echo ' to generate build commands.' 1>&2
+	echo 'Use the CC environment variable to set one explicitly.' 1>&2
+	exit 1
+    fi
+fi
+
+if [[ -z "$CXX" ]]; then
+    if [[ -x $(dirname $0)/clang++ ]]; then
+	CXX=$(dirname $0)/clang++
+    elif [[ ! -z $(which clang++) ]]; then
+	CXX=$(which clang++)
+    else
+	CXX=$CC
+    fi
+fi
+
+diagtool=$(which diagtool)
+if [[ -z "$diagtool" ]]; then
+    if [[ -x $(dirname $0)/diagtool ]]; then
+	diagtool=$(dirname $0)/diagtool
+    else
+	echo 'Error: could not find diagtool.' 1>&2
+	exit 1
+    fi
+fi
+
+
+tool=$1
+shift
+
+if [[ -z "$tool" ]]; then
+    print_usage
+    exit 1
+elif [[ "$tool" == "xcodebuild" ]]; then
+    dry_run='-dry-run'
+    set_compiler="CC='$CC' CXX='$CXX'"
+elif [[ "$tool" == "make" ]]; then
+    dry_run='-n'
+    set_compiler="CC='$CC' CXX='$CXX'"
+else
+    echo "Warning: unknown build system '$tool'" 1>&2
+    if [[ $guessing_cc -eq 1 ]]; then
+	# FIXME: We really only need $CC /or/ $CXX
+	echo 'Error: $CC must be set for other build systems' 1>&2
+	exit 1
+    fi
+fi
+
+escape () {
+    echo $@ | sed 's:[]:\\|/.+*?^$(){}[]:\\&:g'
+}
+
+escCC=$(escape $CC)
+escCXX=$(escape $CXX)
+command=$(
+    eval $tool $dry_run $set_compiler $@ 2>/dev/null |
+    # Remove "if" early on so we can find the right command line.
+    sed $EXTENDED_SED_FLAG "s:^[[:blank:]]*if[[:blank:]]{1,}::g" |
+    # Combine lines with trailing backslashes
+    sed -e :a -e '/\\$/N; s/\\\n//; ta' |
+    grep -E "^[[:blank:]]*($escCC|$escCXX)" |
+    head -n1 |
+    sed $EXTENDED_SED_FLAG "s:($escCC|$escCXX):${diagtool//:/\\:} show-enabled:g"
+)
+
+if [[ -z "$command" ]]; then
+    echo 'Error: could not find any build commands.' 1>&2
+    if [[ "$tool" != "xcodebuild" ]]; then
+	# xcodebuild always echoes the compile commands on their own line,
+	# but other tools give no such guarantees.
+	echo -n 'This may occur if your build system embeds the call to ' 2>&1
+	echo -n 'the compiler in a larger expression. ' 2>&1
+    fi
+    exit 2
+fi
+
+# Chop off trailing '&&', '||', and ';'
+command=${command%%&&*}
+command=${command%%||*}
+command=${command%%;*}
+
+[[ -n "$verbose" ]] && echo $command
+eval $command

Propchange: cfe/trunk/tools/diag-build/diag-build.sh
------------------------------------------------------------------------------
    svn:executable = *





More information about the cfe-commits mailing list