diff --git a/cc/compiler.go b/cc/compiler.go index d7c4d4f4e..c57b72c1a 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -720,7 +720,7 @@ func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathD // Compile files listed in c.Properties.Srcs into objects objs := compileObjs(ctx, buildFlags, "", srcs, - android.PathsForModuleSrc(ctx, compiler.Properties.Tidy_disabled_srcs), + append(android.PathsForModuleSrc(ctx, compiler.Properties.Tidy_disabled_srcs), compiler.generatedSources...), android.PathsForModuleSrc(ctx, compiler.Properties.Tidy_timeout_srcs), pathDeps, compiler.cFlagsDeps) diff --git a/cc/gen.go b/cc/gen.go index 2e72e30ec..e351fddca 100644 --- a/cc/gen.go +++ b/cc/gen.go @@ -225,6 +225,10 @@ type generatedSourceInfo struct { // The files that can be used as order only dependencies in order to ensure that the sysprop // header files are up to date. syspropOrderOnlyDeps android.Paths + + // List of generated code path. + // ex) '*.cpp' files generated from '*.ll / *.yy'. + generatedSources android.Paths } func genSources( @@ -254,30 +258,37 @@ func genSources( return yaccRule_ } + var generatedSources android.Paths = nil + for i, srcFile := range srcFiles { switch srcFile.Ext() { case ".y": cFile := android.GenPathWithExt(ctx, "yacc", srcFile, "c") srcFiles[i] = cFile deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cFile, buildFlags.yacc)...) + generatedSources = append(generatedSources, cFile) case ".yy": cppFile := android.GenPathWithExt(ctx, "yacc", srcFile, "cpp") srcFiles[i] = cppFile deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cppFile, buildFlags.yacc)...) + generatedSources = append(generatedSources, cppFile) case ".l": cFile := android.GenPathWithExt(ctx, "lex", srcFile, "c") srcFiles[i] = cFile genLex(ctx, srcFile, cFile, buildFlags.lex) + generatedSources = append(generatedSources, cFile) case ".ll": cppFile := android.GenPathWithExt(ctx, "lex", srcFile, "cpp") srcFiles[i] = cppFile genLex(ctx, srcFile, cppFile, buildFlags.lex) + generatedSources = append(generatedSources, cppFile) case ".proto": ccFile, headerFile := genProto(ctx, srcFile, buildFlags) srcFiles[i] = ccFile info.protoHeaders = append(info.protoHeaders, headerFile) // Use the generated header as an order only dep to ensure that it is up to date when needed. info.protoOrderOnlyDeps = append(info.protoOrderOnlyDeps, headerFile) + generatedSources = append(generatedSources, ccFile) case ".aidl": if aidlRule == nil { aidlRule = android.NewRuleBuilder(pctx, ctx).Sbox(android.PathForModuleGen(ctx, "aidl"), @@ -299,10 +310,12 @@ func genSources( // needed. // TODO: Reduce the size of the ninja file by using one order only dep for the whole rule info.aidlOrderOnlyDeps = append(info.aidlOrderOnlyDeps, aidlHeaders...) + generatedSources = append(generatedSources, cppFile) case ".rscript", ".fs": cppFile := rsGeneratedCppFile(ctx, srcFile) rsFiles = append(rsFiles, srcFiles[i]) srcFiles[i] = cppFile + generatedSources = append(generatedSources, cppFile) case ".sysprop": cppFile, headerFiles := genSysprop(ctx, srcFile) srcFiles[i] = cppFile @@ -310,9 +323,12 @@ func genSources( // Use the generated headers as order only deps to ensure that they are up to date when // needed. info.syspropOrderOnlyDeps = append(info.syspropOrderOnlyDeps, headerFiles...) + generatedSources = append(generatedSources, cppFile) } } + info.generatedSources = generatedSources + for _, aidlLibraryInfo := range aidlLibraryInfos { if aidlLibraryRule == nil { aidlLibraryRule = android.NewRuleBuilder(pctx, ctx).Sbox( diff --git a/cc/tidy_test.go b/cc/tidy_test.go index 7036ecb1a..9481778a2 100644 --- a/cc/tidy_test.go +++ b/cc/tidy_test.go @@ -244,3 +244,30 @@ func TestWithTidy(t *testing.T) { }) } } + +func TestWithGeneratedCode(t *testing.T) { + bp := ` + cc_library_shared { + name: "libfoo", + srcs: ["foo_1.y", "foo_2.yy", "foo_3.l", "foo_4.ll", "foo_5.proto", + "foo_6.aidl", "foo_7.rscript", "foo_8.fs", "foo_9.sysprop", + "foo_src.cpp"], + tidy: true, + }` + variant := "android_arm64_armv8-a_shared" + + testEnv := map[string]string{} + testEnv["ALLOW_LOCAL_TIDY_TRUE"] = "1" + + ctx := android.GroupFixturePreparers(prepareForCcTest, android.FixtureMergeEnv(testEnv)).RunTestWithBp(t, bp) + + t.Run("tidy should be only run for source code, not for generated code", func(t *testing.T) { + depFiles := ctx.ModuleForTests("libfoo", variant).Rule("ld").Validations.Strings() + + tidyFileForCpp := "out/soong/.intermediates/libfoo/" + variant + "/obj/foo_src.tidy" + + android.AssertArrayString(t, + "only one .tidy file for source code should exist for libfoo", + []string{tidyFileForCpp}, depFiles) + }) +}