Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e09f262 authored by Chih-Hung Hsieh's avatar Chih-Hung Hsieh Committed by Chih-hung Hsieh
Browse files

Use ccCmd to generate clang-tidy dependent file

* After this change, make libtinyxml2-tidy should generate
  correct out/.../libtinyxml2.tidy.d file.
  Touching one of the dependent files, e.g., tinyxml2.h,
  should invoke clang-tidy but not to recompile tinyxml2.o.
* Note that linking libraries still depend on .tidy targets,
  so make libtinyxml2 will call clang-tidy, regnerate
  tinyxml2.tidy.d, tinyxml2.tidy, tinyxml2.o.d, tinyxml2.o.
* A clang-tidy rule uses the same $cFlags for both clang and clang-tidy.
  To share it and avoid over long command lines, we use modern shell
  array variables and cannot use old bourne shell.

Bug: 199169329
Test: WITH_TIDY=1 make
Test: WITH_TIDY=1 make libtinyxml2-tidy | grep tinyxml2
Test: touch external/tinyxml2/tinyxml2.h; make libtinyxml2-tidy | grep tinyxml2
Change-Id: I6175add58d7313ee50c9308b78c9290a60770052
parent b1a12462
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -199,8 +199,18 @@ var (
	// Rule for invoking clang-tidy (a clang-based linter).
	clangTidy, clangTidyRE = pctx.RemoteStaticRules("clangTidy",
		blueprint.RuleParams{
			Command:     "rm -f $out && $tidyVars $reTemplate${config.ClangBin}/clang-tidy $tidyFlags $in -- $cFlags && touch $out",
			CommandDeps: []string{"${config.ClangBin}/clang-tidy"},
			Depfile: "${out}.d",
			Deps:    blueprint.DepsGCC,
			// Pick bash because some machines with old /bin/sh cannot handle arrays.
			// All $cFlags and $tidyFlags should have single quotes escaped.
			// Assume no single quotes in other parameters like $in, $out, $ccCmd.
			Command: "/bin/bash -c 'SRCF=$in; TIDYF=$out; CLANGFLAGS=($cFlags); " +
				"rm -f $$TIDYF $${TIDYF}.d && " +
				"${config.CcWrapper}$ccCmd \"$${CLANGFLAGS[@]}\" -E -o /dev/null $$SRCF " +
				"-MQ $$TIDYF -MD -MF $${TIDYF}.d && " +
				"$tidyVars $reTemplate${config.ClangBin}/clang-tidy $tidyFlags $$SRCF " +
				"-- \"$${CLANGFLAGS[@]}\" && touch $$TIDYF'",
			CommandDeps: []string{"${config.ClangBin}/clang-tidy", "$ccCmd"},
		},
		&remoteexec.REParams{
			Labels:               map[string]string{"type": "lint", "tool": "clang-tidy", "lang": "cpp"},
@@ -214,7 +224,7 @@ var (
			// (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{})
		}, []string{"ccCmd", "cFlags", "tidyFlags", "tidyVars"}, []string{})

	_ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")

@@ -437,6 +447,12 @@ func (a Objects) Append(b Objects) Objects {
	}
}

func escapeSingleQuotes(s string) string {
	// Replace single quotes to work when embedded in a single quoted string for bash.
	// Relying on string concatenation of bash to get A'B from quoted 'A'\''B'.
	return strings.Replace(s, `'`, `'\''`, -1)
}

// Generate rules for compiling multiple .c, .cpp, or .S files to individual .o files
func transformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles android.Paths,
	flags builderFlags, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
@@ -672,14 +688,12 @@ func transformSourceToObj(ctx android.ModuleContext, subdir string, srcFiles and
				Description: "clang-tidy " + srcFile.Rel(),
				Output:      tidyFile,
				Input:       srcFile,
				// We must depend on objFile, since clang-tidy doesn't
				// support exporting dependencies.
				Implicit:  objFile,
				Implicits:   cFlagsDeps,
				OrderOnly:   pathDeps,
				Args: map[string]string{
					"cFlags":    shareFlags("cFlags", moduleToolingFlags),
					"tidyFlags": shareFlags("tidyFlags", config.TidyFlagsForSrcFile(srcFile, flags.tidyFlags)),
					"ccCmd":     ccCmd,
					"cFlags":    shareFlags("cFlags", escapeSingleQuotes(moduleToolingFlags)),
					"tidyFlags": shareFlags("tidyFlags", escapeSingleQuotes(config.TidyFlagsForSrcFile(srcFile, flags.tidyFlags))),
					"tidyVars":  tidyVars, // short and not shared
				},
			})