summaryrefslogtreecommitdiff
path: root/run-cppcheck.sh
diff options
context:
space:
mode:
Diffstat (limited to 'run-cppcheck.sh')
-rwxr-xr-xrun-cppcheck.sh119
1 files changed, 119 insertions, 0 deletions
diff --git a/run-cppcheck.sh b/run-cppcheck.sh
new file mode 100755
index 0000000000..c505fd184d
--- /dev/null
+++ b/run-cppcheck.sh
@@ -0,0 +1,119 @@
+#!/usr/bin/env bash
+
+# This script automatically runs the basic cppcheck and sloccount tools to generate a static analysis report.
+
+usage()
+{
+ echo "Usage: run-cppcheck.sh [options] [files]"
+ echo "Option: Description"
+ echo " --no-sloccount Don't run sloccount"
+ echo " --no-cppcheck Don't run cppcheck"
+ echo " --cppcheck-out <file> Output file for cppcheck step. Default cppcheck.xml"
+ echo " --sloccount-out <file> Output file for sloccount step. Default sloccount.sc"
+ echo "Files:"
+ echo " files Files to run cppcheck through. Default src/**"
+}
+
+check_dependencies()
+{
+ # Check presence of cppcheck on the path
+ if [ "$RunCppCheck" == true ]
+ then
+ hash cppcheck 2>/dev/null || { echo >&2 "Please install cppcheck before running this script"; exit 1; }
+ fi
+
+ # Check presence of sloccount on the path
+ if [ "$RunSlocCount" == true ]
+ then
+ hash sloccount 2>/dev/null || { echo >&2 "Please install sloccount before running this script"; exit 1; }
+ fi
+}
+
+ProjectRoot="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+RunSlocCount=true
+RunCppCheck=true
+Files="$ProjectRoot/src/**"
+FilesFromArgs=""
+CppCheckOutput="cppcheck.xml"
+SloccountOutput="sloccount.sc"
+# Get the number of processors available to the scheduler
+# Other techniques such as `nproc` only get the number of
+# processors available to a single process.
+if [ `uname` = "FreeBSD" ]; then
+NumProc=`sysctl hw.ncpu | awk '{ print $2+1 }'`
+elif [ `uname` = "NetBSD" ]; then
+NumProc=$(($(getconf NPROCESSORS_ONLN)+1))
+else
+NumProc=$(($(getconf _NPROCESSORS_ONLN)+1))
+fi
+
+while [[ $# > 0 ]]
+do
+ opt="$1"
+ shift
+ case $opt in
+ -?|-h|--help)
+ usage
+ exit 1
+ ;;
+ --no-sloccount)
+ RunSlocCount=false
+ ;;
+ --no-cppcheck)
+ RunCppCheck=false
+ ;;
+ --cppcheck-out)
+ CppCheckOutput=$1
+ shift
+ ;;
+ --sloccount-out)
+ SloccountOutput=$1
+ shift
+ ;;
+ --*)
+ echo "Unrecognized option: $opt"
+ usage
+ exit 1
+ ;;
+ *)
+ FilesFromArgs="$FilesFromArgs $opt"
+ esac
+done
+
+if [ "$FilesFromArgs" != "" ];
+then
+ Files=$FilesFromArgs
+fi
+
+if [ "$CppCheckOutput" == "" ];
+then
+ echo "Expected: file for cppcheck output"
+ usage
+ exit 1
+fi
+
+if [ "$SloccountOutput" == "" ];
+then
+ echo "Expected: file for sloccount output"
+ usage
+ exit 1
+fi
+
+check_dependencies
+
+if [ "$RunCppCheck" == true ]
+then
+ echo "Running cppcheck for files: $Files"
+ cppcheck --enable=all -j $NumProc --xml --xml-version=2 --force $Files 2> $CppCheckOutput
+ CppCheckOutputs="$CppCheckOutput (cppcheck)"
+fi
+
+if [ "$RunSlocCount" == true ]
+then
+ echo "Running sloccount for files: $Files"
+ sloccount --wide --details $Files > $SloccountOutput
+ SlocCountOutputs="$SloccountOutput (sloccount)"
+fi
+
+echo Check finished. Results can be found in: $CppCheckOutputs $SlocCountOutputs
+exit 0