diff --git a/libcxx/utils/libcxx/test/dsl.py b/libcxx/utils/libcxx/test/dsl.py --- a/libcxx/utils/libcxx/test/dsl.py +++ b/libcxx/utils/libcxx/test/dsl.py @@ -217,6 +217,21 @@ _, _, exitCode, _ = _executeScriptInternal(test, script) return exitCode +@_memoizeExpensiveOperation(lambda c, s: (c.substitutions, c.environment, s)) +def commandOutput(config, command): + """ + Runs the given script as a Lit test, and returns the output. + If the exit code isn't 0 an exception is raised. + + The script must be a list of commands, each of which being something that + could appear on the right-hand-side of a `RUN:` keyword. + """ + with _makeConfigTest(config) as test: + out, _, exitCode, _ = _executeScriptInternal(test, command) + if exitCode != 0: + raise ConfigurationRuntimeError() + return out + @_memoizeExpensiveOperation(lambda c, l: (c.substitutions, c.environment, l)) def hasAnyLocale(config, locales): """ diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -18,6 +18,13 @@ _isMSVC = lambda cfg: '_MSC_VER' in compilerMacros(cfg) _msvcVersion = lambda cfg: (int(compilerMacros(cfg)['_MSC_VER']) // 100, int(compilerMacros(cfg)['_MSC_VER']) % 100) +def _hasSuitableClangTidy(cfg): + try: + return int(re.search('[0-9]+', commandOutput(cfg, ['clang-tidy --version'])).group()) >= 13 + except ConfigurationRuntimeError: + return False + + DEFAULT_FEATURES = [ Feature(name='fcoroutines-ts', when=lambda cfg: hasCompileFlag(cfg, '-fcoroutines-ts') and @@ -109,7 +116,7 @@ Feature(name='executor-has-no-bash', when=lambda cfg: runScriptExitCode(cfg, ['%{exec} bash -c \'bash --version\'']) != 0), Feature(name='has-clang-tidy', - when=lambda cfg: runScriptExitCode(cfg, ['clang-tidy --version']) == 0), + when=_hasSuitableClangTidy), Feature(name='apple-clang', when=_isAppleClang), Feature(name=lambda cfg: 'apple-clang-{__clang_major__}'.format(**compilerMacros(cfg)), when=_isAppleClang),