diff options
Diffstat (limited to 'scripts/coccicheck')
| -rwxr-xr-x | scripts/coccicheck | 115 | 
1 files changed, 94 insertions, 21 deletions
diff --git a/scripts/coccicheck b/scripts/coccicheck index 1bb1a1bd2da..bbf901afb60 100755 --- a/scripts/coccicheck +++ b/scripts/coccicheck @@ -1,22 +1,54 @@ -#!/bin/sh +#!/bin/bash + +# +# This script requires at least spatch +# version 1.0.0-rc11. +#  SPATCH="`which ${SPATCH:=spatch}`" +trap kill_running SIGTERM SIGINT +declare -a SPATCH_PID + +# The verbosity may be set by the environmental parameter V= +# as for example with 'make V=1 coccicheck' + +if [ -n "$V" -a "$V" != "0" ]; then +	VERBOSE="$V" +else +	VERBOSE=0 +fi + +if [ -z "$J" ]; then +	NPROC=$(getconf _NPROCESSORS_ONLN) +else +	NPROC="$J" +fi + +FLAGS="$SPFLAGS --very-quiet" + +# spatch only allows include directories with the syntax "-I include" +# while gcc also allows "-Iinclude" and "-include include" +COCCIINCLUDE=${LINUXINCLUDE//-I/-I } +COCCIINCLUDE=${COCCIINCLUDE//-include/-I} +  if [ "$C" = "1" -o "$C" = "2" ]; then      ONLINE=1 -# This requires Coccinelle >= 0.2.3 -#    FLAGS="-ignore_unknown_options -very_quiet" -#    OPTIONS=$* - -# Workaround for Coccinelle < 0.2.3 -    FLAGS="-I $srctree/include -very_quiet" +    # Take only the last argument, which is the C file to test      shift $(( $# - 1 )) -    OPTIONS=$1 +    OPTIONS="$COCCIINCLUDE $1"  else      ONLINE=0 -    FLAGS="-very_quiet" -    OPTIONS="-dir $srctree" +    if [ "$KBUILD_EXTMOD" = "" ] ; then +        OPTIONS="--dir $srctree $COCCIINCLUDE" +    else +        OPTIONS="--dir $KBUILD_EXTMOD $COCCIINCLUDE" +    fi +fi + +if [ "$KBUILD_EXTMOD" != "" ] ; then +    OPTIONS="--patch $srctree $OPTIONS"  fi  if [ ! -x "$SPATCH" ]; then @@ -26,13 +58,21 @@ fi  if [ "$MODE" = "" ] ; then      if [ "$ONLINE" = "0" ] ; then -	echo 'You have not explicitly specified the mode to use. Using default "chain" mode.' -	echo 'All available modes will be tried (in that order): patch, report, context, org' +	echo 'You have not explicitly specified the mode to use. Using default "report" mode.' +	echo 'Available modes are the following: patch, report, context, org'  	echo 'You can specify the mode with "make coccicheck MODE=<mode>"' +	echo 'Note however that some modes are not implemented by some semantic patches.' +    fi +    MODE="report" +fi + +if [ "$MODE" = "chain" ] ; then +    if [ "$ONLINE" = "0" ] ; then +	echo 'You have selected the "chain" mode.' +	echo 'All available modes will be tried (in that order): patch, report, context, org'      fi -    MODE="chain"  elif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then -    FLAGS="$FLAGS -no_show_diff" +    FLAGS="$FLAGS --no-show-diff"  fi  if [ "$ONLINE" = "0" ] ; then @@ -42,16 +82,40 @@ if [ "$ONLINE" = "0" ] ; then      echo ''  fi +run_cmd() { +	local i +	if [ $VERBOSE -ne 0 ] ; then +		echo "Running ($NPROC in parallel): $@" +	fi +	for i in $(seq 0 $(( NPROC - 1)) ); do +		eval "$@ --max $NPROC --index $i &" +		SPATCH_PID[$i]=$! +		if [ $VERBOSE -eq 2 ] ; then +			echo "${SPATCH_PID[$i]} running" +		fi +	done +	wait +} + +kill_running() { +	for i in $(seq $(( NPROC - 1 )) ); do +		if [ $VERBOSE -eq 2 ] ; then +			echo "Killing ${SPATCH_PID[$i]}" +		fi +		kill ${SPATCH_PID[$i]} 2>/dev/null +	done +} +  coccinelle () {      COCCI="$1"      OPT=`grep "Option" $COCCI | cut -d':' -f2` -#   The option '-parse_cocci' can be used to syntactically check the SmPL files. +#   The option '--parse-cocci' can be used to syntactically check the SmPL files.  #  #    $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null -    if [ "$ONLINE" = "0" ] ; then +    if [ $VERBOSE -ne 0 -a $ONLINE -eq 0 ] ; then  	FILE=`echo $COCCI | sed "s|$srctree/||"` @@ -87,12 +151,21 @@ coccinelle () {      fi      if [ "$MODE" = "chain" ] ; then -	$SPATCH -D patch   $FLAGS -sp_file $COCCI $OPT $OPTIONS               || \ -	$SPATCH -D report  $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || \ -	$SPATCH -D context $FLAGS -sp_file $COCCI $OPT $OPTIONS               || \ -	$SPATCH -D org     $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || exit 1 +	run_cmd $SPATCH -D patch   \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS               || \ +	run_cmd $SPATCH -D report  \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || \ +	run_cmd $SPATCH -D context \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS               || \ +	run_cmd $SPATCH -D org     \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || exit 1 +    elif [ "$MODE" = "rep+ctxt" ] ; then +	run_cmd $SPATCH -D report  \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff && \ +	run_cmd $SPATCH -D context \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1      else -	$SPATCH -D $MODE   $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1 +	run_cmd $SPATCH -D $MODE   $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1      fi  }  | 
