From 6fa09e6a70d4116e22df36d33e2f7533cbcbe098 Mon Sep 17 00:00:00 2001 From: Kurtis Rader Date: Fri, 1 Apr 2016 16:28:36 -0700 Subject: add make targets to lint the code Fixes #2818 --- build_tools/lint.fish | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 build_tools/lint.fish (limited to 'build_tools') diff --git a/build_tools/lint.fish b/build_tools/lint.fish new file mode 100755 index 00000000..3fd90b24 --- /dev/null +++ b/build_tools/lint.fish @@ -0,0 +1,95 @@ +#!/usr/bin/env fish +# +# This is meant to be run by "make lint" or "make lint-all". It is not meant to +# be run directly from a shell prompt. +# +set cppchecks warning,performance,portability,information,missingInclude +set cppcheck_args +set c_files +set all no + +set -gx CXX $argv[1] +set -e argv[1] + +if test "$argv[1]" = "--all" + set all yes + set c_files src/ + set cppchecks "$cppchecks,unusedFunction" + set -e argv[1] +end + +# We only want -D and -I options to be passed thru to cppcheck. +for arg in $argv + if string match -q -- '-D*' $arg + set cppcheck_args $cppcheck_args $arg + else if string match -q -- '-I*' $arg + set cppcheck_args $cppcheck_args $arg + end +end +if test (uname -m) = "x86_64" + set cppcheck_args -D__x86_64__ -D__LP64__ $cppcheck_args +end + +if test $all = no + # We haven't been asked to lint all the source. If there are uncommitted + # changes lint those, else lint the files in the most recent commit. + set pending (git status --porcelain --short --untracked-files=all | sed -e 's/^ *//') + if count $pending > /dev/null + # There are pending changes so lint those files. + for arg in $pending + set files $files (string split -m 1 ' ' $arg)[2] + end + else + # No pending changes so lint the files in the most recent commit. + set files (git show --porcelain --name-only --pretty=oneline head | tail --lines=+2) + end + + # Filter out the non-C/C++ files. + set c_files (string match -r '.*\.c(?:pp)?$' -- $files) +else + set c_files src/*.cpp +end + +# We now have a list of files to check so run the linters. +if set -q c_files[1] + if type -q cppcheck + echo + echo ======================================== + echo Running cppcheck + echo ======================================== + cppcheck -q --verbose --std=posix --std=c11 --language=c++ \ + --inline-suppr --enable=$cppchecks $cppcheck_args $c_files + end + + if type -q oclint + echo + echo ======================================== + echo Running oclint + echo ======================================== + if test (uname -s) = "Darwin" + if not test -f compile_commands.json + xcodebuild > xcodebuild.log + oclint-xcodebuild xcodebuild.log > /dev/null + end + if test $all = yes + oclint-json-compilation-database -e '/pcre2-10.20/' \ + -- -enable-global-analysis + else + set i_files + for f in $c_files + set i_files $i_files -i $f + end + echo oclint-json-compilation-database -e '/pcre2-10.20/' $i_files + oclint-json-compilation-database -e '/pcre2-10.20/' $i_files + end + else + # Presumably we're on Linux or other platform not requiring special + # handling for oclint to work. + oclint $c_files -- $argv + end + end +else + echo + echo 'WARNING: No C/C++ files to check' + echo +end -- cgit v1.2.3