diff options
-rw-r--r-- | .clang-tidy | 21 | ||||
-rw-r--r-- | wscript | 66 |
2 files changed, 73 insertions, 14 deletions
diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..17b9b27 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,21 @@ +Checks: > + *, + -*-magic-numbers, + -*-narrowing-conversions, + -*-uppercase-literal-suffix, + -android-cloexec-fopen, + -bugprone-branch-clone, + -bugprone-suspicious-string-compare, + -cert-err34-c, + -cert-msc30-c, + -cert-msc50-cpp, + -clang-analyzer-core.NullDereference, + -cppcoreguidelines-init-variables, + -google-readability-casting, + -hicpp-multiway-paths-covered, + -hicpp-signed-bitwise, + -llvm-header-guard, + -readability-else-after-return, +WarningsAsErrors: '*' +HeaderFilterRegex: '.*' +FormatStyle: file @@ -4,7 +4,7 @@ import os import subprocess import sys -from waflib import Logs, Options +from waflib import Build, Logs, Options from waflib.extras import autowaf # Library and package version (UNIX style major, minor, micro) @@ -39,6 +39,12 @@ def configure(conf): 'BUILD_BENCH': Options.options.bench, 'BUILD_STATIC': Options.options.static}) + if Options.options.strict: + # Check for programs used by lint target + conf.find_program("flake8", var="FLAKE8", mandatory=False) + conf.find_program("clang-tidy", var="CLANG_TIDY", mandatory=False) + conf.find_program("iwyu_tool", var="IWYU_TOOL", mandatory=False) + if Options.options.ultra_strict: autowaf.add_compiler_flags(conf.env, '*', { 'clang': [ @@ -234,23 +240,55 @@ def build(bld): bld.add_post_fun(autowaf.run_ldconfig) +class LintContext(Build.BuildContext): + fun = cmd = 'lint' + + def lint(ctx): "checks code for style issues" - import subprocess + import glob + import subprocess + + st = 0 + + if "FLAKE8" in ctx.env: + Logs.info("Running flake8") + st = subprocess.call([ctx.env.FLAKE8[0], + "wscript", + "--ignore", + "E101,E129,W191,E221,W504,E251,E241,E741"]) + else: + Logs.warn("Not running flake8") + + if "IWYU_TOOL" in ctx.env: + Logs.info("Running include-what-you-use") + cmd = [ctx.env.IWYU_TOOL[0], "-o", "clang", "-p", "build"] + output = subprocess.check_output(cmd).decode('utf-8') + if 'error: ' in output: + sys.stdout.write(output) + st += 1 + else: + Logs.warn("Not running include-what-you-use") + + if "CLANG_TIDY" in ctx.env and "clang" in ctx.env.CC[0]: + Logs.info("Running clang-tidy") + sources = glob.glob('zix/*.c') + glob.glob('test/*.c*') + sources = list(map(os.path.abspath, sources)) + procs = [] + for source in sources: + cmd = [ctx.env.CLANG_TIDY[0], "--quiet", "-p=.", source] + procs += [subprocess.Popen(cmd, cwd="build")] + + for proc in procs: + stdout, stderr = proc.communicate() + st += proc.returncode + else: + Logs.warn("Not running clang-tidy") + + if st != 0: + sys.exit(st) - subprocess.call( - ['flake8', '--ignore', 'E221,W504,E302,E305,E251', 'wscript']) - - files = ['../%s' % x for x in glob.glob('**/*.c')] - checks = ['*', - '-clang-analyzer-valist.Uninitialized', - '-llvm-header-guard', - '-misc-unused-parameters', - '-readability-else-after-return'] - subprocess.call(['clang-tidy', '-p=.', '-header-filter=.*', - '-checks="%s"' % ','.join(checks)] + files, - cwd='build') def build_dir(ctx, subdir): if autowaf.is_child(): |