Get clang_tidy check running.
Running, but not passing. Also, presubmit steps that are not yet
passing can be added to the "broken" program so they can be easily
tested.
I think it needs '-warnings-as-errors' but I get errors when adding
that. It also complains about '-Wno-psabi'.
Change-Id: I72d92cce16f6a764b523d83d36280d6ce3350440
Bug: 45
diff --git a/env_setup/cipd/update.py b/env_setup/cipd/update.py
index 74c1f22..53ba1aa 100755
--- a/env_setup/cipd/update.py
+++ b/env_setup/cipd/update.py
@@ -90,11 +90,16 @@
os.makedirs(args.install_dir)
paths = []
+ env = {
+ 'CIPD_INSTALL_DIR': args.install_dir,
+ 'CIPD_CACHE_DIR': args.cache_dir,
+ }
default_ensures = os.path.join(SCRIPT_ROOT, '*.ensure')
for ensure_file in args.ensure_file or glob.glob(default_ensures):
install_dir = os.path.join(args.install_dir,
os.path.basename(ensure_file))
+
cmd = [
args.cipd,
'ensure',
@@ -110,6 +115,12 @@
paths.append(install_dir)
paths.append(os.path.join(install_dir, 'bin'))
+ name = ensure_file
+ if os.path.splitext(name)[1] == '.ensure':
+ name = os.path.splitext(name)[0]
+ name = os.path.basename(name)
+ env['{}_CIPD_INSTALL_DIR'.format(name.upper())] = install_dir
+
for path in paths:
print('adding {} to path'.format(path), file=sys.stderr)
@@ -121,10 +132,9 @@
prefix='cipdsetup') as temp:
print('PATH="{}"'.format(os.pathsep.join(paths)), file=temp)
print('export PATH', file=temp)
- print('CIPD_INSTALL_DIR="{}"'.format(args.install_dir), file=temp)
- print('export CIPD_INSTALL_DIR', file=temp)
- print('CIPD_CACHE_DIR={}'.format(args.cache_dir), file=temp)
- print('export CIPD_CACHE_DIR', file=temp)
+ for name, value in env.items():
+ print('{}={}'.format(name, value), file=temp)
+ print('export {}'.format(name), file=temp)
print('. {}'.format(temp.name))
diff --git a/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py b/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py
index 669e995..c526a53 100755
--- a/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py
+++ b/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py
@@ -16,6 +16,7 @@
"""Runs the local presubmit checks for the Pigweed repository."""
import argparse
+import itertools
import logging
import os
from pathlib import Path
@@ -108,10 +109,11 @@
**kwargs)
-def ninja(ctx: PresubmitContext, **kwargs) -> None:
+def ninja(*args, ctx: PresubmitContext, **kwargs):
call('ninja',
'-C',
ctx.output_directory,
+ *args,
cwd=ctx.repository_root,
**kwargs)
@@ -121,7 +123,7 @@
def gn_clang_build(ctx: PresubmitContext):
- gn_gen('--export-compile-commands', _CLANG_GEN_ARGS, ctx=ctx)
+ gn_gen(_CLANG_GEN_ARGS, ctx=ctx)
ninja(ctx=ctx)
@@ -149,24 +151,41 @@
gn_arm_build,
)
-
#
# C++ presubmit checks
#
+# TODO(pwbug/45) Probably want additional checks.
+CLANG_TIDY_CHECKS = ('modernize-use-override', )
+
+
@filter_paths(endswith=format_code.C_FORMAT.extensions)
def clang_tidy(ctx: PresubmitContext):
- # TODO(mohrr) should this check just do a new clang build?
- out = ctx.output_directory.joinpath('..', 'gn_clang_build')
- if not out.joinpath('compile_commands.json').exists():
- raise PresubmitFailure('clang_tidy MUST be run after generating '
- 'compile_commands.json in a clang build!')
+ gn_gen('--export-compile-commands', _CLANG_GEN_ARGS, ctx=ctx)
+ ninja(ctx=ctx)
+ ninja('-t', 'compdb', 'objcxx', 'cxx', ctx=ctx)
- call('clang-tidy', f'-p={out}', *ctx.paths)
+ run_clang_tidy = None
+ for var in ('PIGWEED_CIPD_INSTALL_DIR', 'CIPD_INSTALL_DIR'):
+ if var in os.environ:
+ possibility = os.path.join(os.environ[var],
+ 'share/clang/run-clang-tidy.py')
+ if os.path.isfile(possibility):
+ run_clang_tidy = possibility
+ break
+
+ checks = ','.join(CLANG_TIDY_CHECKS)
+ call(
+ run_clang_tidy,
+ f'-p={ctx.output_directory}',
+ f'-checks={checks}',
+ # TODO(pwbug/45) not sure if this is needed.
+ # f'-extra-arg-before=-warnings-as-errors={checks}',
+ *ctx.paths)
CC = (
pw_presubmit.pragma_once,
- # TODO(hepler): Enable clang-tidy when it passes.
+ # TODO(pwbug/45): Enable clang-tidy when it passes.
# clang_tidy,
)
@@ -392,6 +411,11 @@
GENERAL = (source_is_in_build_files, )
+BROKEN: Sequence = (
+ # TODO(pwbug/45): Remove clang-tidy from BROKEN when it passes.
+ clang_tidy,
+) # yapf: disable
+
#
# Presubmit check programs
#
@@ -405,10 +429,13 @@
)
PROGRAMS: Dict[str, Sequence] = {
+ 'broken': BROKEN,
'full': INIT + GN + CC + PYTHON + CMAKE + BAZEL + CODE_FORMAT + GENERAL,
'quick': QUICK_PRESUBMIT,
}
+ALL_STEPS = frozenset(itertools.chain(*PROGRAMS.values()))
+
def argument_parser(parser=None) -> argparse.ArgumentParser:
"""Create argument parser."""
@@ -443,13 +470,13 @@
exclusive.add_argument('-p',
'--program',
dest='program_name',
- choices=PROGRAMS,
+ choices=[x for x in PROGRAMS if x != 'broken'],
default='full',
help='Which presubmit program to run')
exclusive.add_argument(
'--step',
- choices=[x.__name__ for x in PROGRAMS['full']],
+ choices=sorted(x.__name__ for x in itertools.chain(ALL_STEPS)),
action='append',
help='Provide explicit steps instead of running a predefined program.',
)
@@ -489,7 +516,7 @@
program = PROGRAMS[program_name]
if step:
- program = [x for x in PROGRAMS['full'] if x.__name__ in step]
+ program = [x for x in ALL_STEPS if x.__name__ in step]
if pw_presubmit.run_presubmit(program,
repository=repository,