diff options
Diffstat (limited to 'cc/builder.go')
| -rw-r--r-- | cc/builder.go | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/cc/builder.go b/cc/builder.go index d0527cb44..6a4d94040 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -198,19 +198,22 @@ var ( // Rule for invoking clang-tidy (a clang-based linter). clangTidy, clangTidyRE = pctx.RemoteStaticRules("clangTidy", blueprint.RuleParams{ - Command: "rm -f $out && $reTemplate${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out", + Command: "rm -f $out && $tidyVars $reTemplate${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out", CommandDeps: []string{"${config.ClangBin}/clang-tidy"}, }, &remoteexec.REParams{ - Labels: map[string]string{"type": "lint", "tool": "clang-tidy", "lang": "cpp"}, - ExecStrategy: "${config.REClangTidyExecStrategy}", - Inputs: []string{"$in"}, - // OutputFile here is $in for remote-execution since its possible that - // clang-tidy modifies the given input file itself and $out refers to the - // ".tidy" file generated for ninja-dependency reasons. - OutputFiles: []string{"$in"}, - Platform: map[string]string{remoteexec.PoolKey: "${config.REClangTidyPool}"}, - }, []string{"cFlags", "tidyFlags"}, []string{}) + Labels: map[string]string{"type": "lint", "tool": "clang-tidy", "lang": "cpp"}, + ExecStrategy: "${config.REClangTidyExecStrategy}", + Inputs: []string{"$in"}, + EnvironmentVariables: []string{"TIDY_TIMEOUT"}, + // Although clang-tidy has an option to "fix" source files, that feature is hardly useable + // under parallel compilation and RBE. So we assume no OutputFiles here. + // The clang-tidy fix option is best run locally in single thread. + // Copying source file back to local caused two problems: + // (1) New timestamps trigger clang and clang-tidy compilations again. + // (2) Changing source files caused concurrent clang or clang-tidy jobs to crash. + Platform: map[string]string{remoteexec.PoolKey: "${config.REClangTidyPool}"}, + }, []string{"cFlags", "tidyFlags", "tidyVars"}, []string{}) _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm") @@ -440,8 +443,13 @@ func transformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and // Source files are one-to-one with tidy, coverage, or kythe files, if enabled. objFiles := make(android.Paths, len(srcFiles)) var tidyFiles android.Paths + var tidyVars string if flags.tidy { tidyFiles = make(android.Paths, 0, len(srcFiles)) + tidyTimeout := ctx.Config().Getenv("TIDY_TIMEOUT") + if len(tidyTimeout) > 0 { + tidyVars += "TIDY_TIMEOUT=" + tidyTimeout + } } var coverageFiles android.Paths if flags.gcovCoverage { @@ -631,6 +639,7 @@ func transformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and rule = clangTidyRE } + ctx.TidyFile(tidyFile) ctx.Build(pctx, android.BuildParams{ Rule: rule, Description: "clang-tidy " + srcFile.Rel(), @@ -644,6 +653,7 @@ func transformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and Args: map[string]string{ "cFlags": moduleToolingFlags, "tidyFlags": config.TidyFlagsForSrcFile(srcFile, flags.tidyFlags), + "tidyVars": tidyVars, }, }) } |