--- a/python/mozbuild/mozbuild/mach_commands.py
+++ b/python/mozbuild/mozbuild/mach_commands.py
@@ -2191,42 +2191,45 @@ class StaticAnalysis(MachCommandBase):
@CommandArgument('source', nargs='*', default=['.*'],
help='Source files to be analyzed (regex on path). '
'Can be omitted, in which case the entire code base '
'is analyzed. The source argument is ignored if '
'there is anything fed through stdin, in which case '
'the analysis is only performed on the files changed '
'in the patch streamed through stdin. This is called '
'the diff mode.')
- @CommandArgument('--checks', '-c', default='-*,mozilla-*', metavar='checks',
+ @CommandArgument('--checks', '-c', default='-*', metavar='checks',
help='Static analysis checks to enable. By default, this enables only '
'custom Mozilla checks, but can be any clang-tidy checks syntax.')
@CommandArgument('--jobs', '-j', default='0', metavar='jobs', type=int,
help='Number of concurrent jobs to run. Default is the number of CPUs.')
@CommandArgument('--strip', '-p', default='1', metavar='NUM',
help='Strip NUM leading components from file names in diff mode.')
@CommandArgument('--fix', '-f', default=False, action='store_true',
help='Try to autofix errors detected by clang-tidy checkers.')
def check(self, source=None, jobs=2, strip=1, verbose=False,
- checks='-*,mozilla-*', fix=False):
+ checks='-*', fix=False):
self._set_log_level(verbose)
rc = self._build_compile_db(verbose=verbose)
if rc != 0:
return rc
rc = self._build_export(jobs=jobs, verbose=verbose)
if rc != 0:
return rc
rc = self._get_clang_tidy(verbose=verbose)
if rc != 0:
return rc
python = self.virtualenv_manager.python_path
+ if checks == '-*':
+ checks = self._get_checks()
+
common_args = ['-clang-tidy-binary', self._clang_tidy_path,
'-checks=%s' % checks,
'-extra-arg=-DMOZ_CLANG_PLUGIN']
if fix:
common_args.append('-fix')
self.log_manager.register_structured_logger(logging.getLogger('mozbuild'))
@@ -2291,16 +2294,31 @@ class StaticAnalysis(MachCommandBase):
def print_checks(self, verbose=False):
self._set_log_level(verbose)
rc = self._get_clang_tidy(verbose=verbose)
if rc != 0:
return rc
args = [self._clang_tidy_path, '-list-checks', '-checks=-*,mozilla-*']
return self._run_command_in_objdir(args=args, pass_thru=True)
+ def _get_checks(self):
+ checks = '-*'
+ import yaml
+ with open(mozpath.join(self.topsrcdir, "tools", "clang-tidy", "config.yaml")) as f:
+ try:
+ config = yaml.load(f)
+ for item in config['clang_checkers']:
+ if item['publish']:
+ checks += ',' + item['name']
+ except Exception:
+ print('Looks like config.yaml is not valid, so we are unable to '
+ 'determine default checkers, using \'-checks=-*,mozilla-*\'')
+ checks += ',mozilla-*'
+ return checks
+
def _get_config_environment(self):
ran_configure = False
config = None
builder = Build(self._mach_context)
try:
config = self.config_environment
except Exception: