From 1945a4b47d2e446133b6eecfa464637d9bc4ddcd Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Tue, 4 Jun 2019 17:10:41 -0700 Subject: [PATCH] Convert cc aidl to rule builder This fixes an incremental build issue where we didn't clean up old aidl header files (or necessarily notice that they were updated). We do this by declaring the header files as outputs in the build graph, but this means that the src file name needs to be convertible to the aidl package name, as that's how the header file paths are created. In many cases, filegroups can be used to strip path prefixes from the aidl files. Bug: 112114177 Test: treehugger Change-Id: If534ff3dbfac329dea9a7402e30be74495754160 --- android/rule_builder.go | 9 ++++++ cc/gen.go | 65 ++++++++++++++++++++++++++--------------- cc/gen_test.go | 5 ++-- 3 files changed, 54 insertions(+), 25 deletions(-) diff --git a/android/rule_builder.go b/android/rule_builder.go index 4a3b02233..8d7e74b7a 100644 --- a/android/rule_builder.go +++ b/android/rule_builder.go @@ -525,6 +525,15 @@ func (c *RuleBuilderCommand) Outputs(paths WritablePaths) *RuleBuilderCommand { return c } +// OutputDir adds the output directory to the command line. This is only available when used with RuleBuilder.Sbox, +// and will be the temporary output directory managed by sbox, not the final one. +func (c *RuleBuilderCommand) OutputDir() *RuleBuilderCommand { + if !c.sbox { + panic("OutputDir only valid with Sbox") + } + return c.Text("__SBOX_OUT_DIR__") +} + // DepFile adds the specified depfile path to the paths returned by RuleBuilder.DepFiles and adds it to the command // line, and causes RuleBuilder.Build file to set the depfile flag for ninja. If multiple depfiles are added to // commands in a single RuleBuilder then RuleBuilder.Build will add an extra command to merge the depfiles together. diff --git a/cc/gen.go b/cc/gen.go index ae761d036..82669acc7 100644 --- a/cc/gen.go +++ b/cc/gen.go @@ -16,6 +16,7 @@ package cc import ( "path/filepath" + "strings" "github.com/google/blueprint" @@ -36,15 +37,6 @@ var ( CommandDeps: []string{"$lexCmd"}, }) - aidl = pctx.AndroidStaticRule("aidl", - blueprint.RuleParams{ - Command: "$aidlCmd -d${out}.d --ninja $aidlFlags $in $outDir $out", - CommandDeps: []string{"$aidlCmd"}, - Depfile: "${out}.d", - Deps: blueprint.DepsGCC, - }, - "aidlFlags", "outDir") - sysprop = pctx.AndroidStaticRule("sysprop", blueprint.RuleParams{ Command: "$syspropCmd --header-dir=$headerOutDir --system-header-dir=$systemOutDir " + @@ -114,20 +106,37 @@ func genYacc(ctx android.ModuleContext, rule *android.RuleBuilder, yaccFile andr return ret } -func genAidl(ctx android.ModuleContext, aidlFile android.Path, outFile android.ModuleGenPath, aidlFlags string) android.Paths { - ctx.Build(pctx, android.BuildParams{ - Rule: aidl, - Description: "aidl " + aidlFile.Rel(), - Output: outFile, - Input: aidlFile, - Args: map[string]string{ - "aidlFlags": aidlFlags, - "outDir": android.PathForModuleGen(ctx, "aidl").String(), - }, - }) +func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile android.Path, + outFile, depFile android.ModuleGenPath, aidlFlags string) android.Paths { - // TODO: This should return the generated headers, not the source file. - return android.Paths{outFile} + aidlPackage := strings.TrimSuffix(aidlFile.Rel(), aidlFile.Base()) + baseName := strings.TrimSuffix(aidlFile.Base(), aidlFile.Ext()) + shortName := strings.TrimPrefix(baseName, "I") + + outDir := android.PathForModuleGen(ctx, "aidl") + headerI := outDir.Join(ctx, aidlPackage, baseName+".h") + headerBn := outDir.Join(ctx, aidlPackage, "Bn"+shortName+".h") + headerBp := outDir.Join(ctx, aidlPackage, "Bp"+shortName+".h") + + cmd := rule.Command() + cmd.Tool(ctx.Config().HostToolPath(ctx, "aidl-cpp")). + FlagWithDepFile("-d", depFile). + Flag("--ninja"). + Flag(aidlFlags). + Input(aidlFile). + OutputDir(). + Output(outFile). + ImplicitOutputs(android.WritablePaths{ + headerI, + headerBn, + headerBp, + }) + + return android.Paths{ + headerI, + headerBn, + headerBp, + } } func genLex(ctx android.ModuleContext, lexFile android.Path, outFile android.ModuleGenPath) { @@ -187,6 +196,8 @@ func genSources(ctx android.ModuleContext, srcFiles android.Paths, var deps android.Paths var rsFiles android.Paths + var aidlRule *android.RuleBuilder + var yaccRule_ *android.RuleBuilder yaccRule := func() *android.RuleBuilder { if yaccRule_ == nil { @@ -218,9 +229,13 @@ func genSources(ctx android.ModuleContext, srcFiles android.Paths, srcFiles[i] = ccFile deps = append(deps, headerFile) case ".aidl": + if aidlRule == nil { + aidlRule = android.NewRuleBuilder().Sbox(android.PathForModuleGen(ctx, "aidl")) + } cppFile := android.GenPathWithExt(ctx, "aidl", srcFile, "cpp") + depFile := android.GenPathWithExt(ctx, "aidl", srcFile, "cpp.d") srcFiles[i] = cppFile - deps = append(deps, genAidl(ctx, srcFile, cppFile, buildFlags.aidlFlags)...) + deps = append(deps, genAidl(ctx, aidlRule, srcFile, cppFile, depFile, buildFlags.aidlFlags)...) case ".rs", ".fs": cppFile := rsGeneratedCppFile(ctx, srcFile) rsFiles = append(rsFiles, srcFiles[i]) @@ -236,6 +251,10 @@ func genSources(ctx android.ModuleContext, srcFiles android.Paths, } } + if aidlRule != nil { + aidlRule.Build(pctx, ctx, "aidl", "gen aidl") + } + if yaccRule_ != nil { yaccRule_.Build(pctx, ctx, "yacc", "gen yacc") } diff --git a/cc/gen_test.go b/cc/gen_test.go index a0f7308c2..e4219d999 100644 --- a/cc/gen_test.go +++ b/cc/gen_test.go @@ -15,6 +15,7 @@ package cc import ( + "path/filepath" "testing" ) @@ -32,7 +33,7 @@ func TestGen(t *testing.T) { aidl := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("aidl") libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Module().(*Module) - if !inList("-I"+aidl.Args["outDir"], libfoo.flags.GlobalFlags) { + if !inList("-I"+filepath.Dir(aidl.Output.String()), libfoo.flags.GlobalFlags) { t.Errorf("missing aidl includes in global flags") } }) @@ -55,7 +56,7 @@ func TestGen(t *testing.T) { aidl := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Rule("aidl") libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_core_shared").Module().(*Module) - if !inList("-I"+aidl.Args["outDir"], libfoo.flags.GlobalFlags) { + if !inList("-I"+filepath.Dir(aidl.Output.String()), libfoo.flags.GlobalFlags) { t.Errorf("missing aidl includes in global flags") } })