aboutsummaryrefslogtreecommitdiffhomepage
path: root/build_tools
diff options
context:
space:
mode:
authorGravatar Kurtis Rader <krader@skepticism.us>2016-04-01 16:28:36 -0700
committerGravatar Kurtis Rader <krader@skepticism.us>2016-04-01 16:29:06 -0700
commit6fa09e6a70d4116e22df36d33e2f7533cbcbe098 (patch)
treec98697f5573bd0c7e9968315ca19625f86b143fe /build_tools
parent4f5d42858c558af73575b1f38e6ad0bc58912b46 (diff)
add make targets to lint the code
Fixes #2818
Diffstat (limited to 'build_tools')
-rwxr-xr-xbuild_tools/lint.fish95
1 files changed, 95 insertions, 0 deletions
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