From 15e86d938bea0cf95f2694714fbc4dc35ee2a30e Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Fri, 20 Oct 2017 15:07:08 -0700 Subject: [PATCH] Support multiple outputs in genrules with depfile: true Ninja doesn't support depfiles on a rule with multiple outputs. Use a single output and put all the rest as implicit outputs. Bug: 68057449 Test: java_test.go Change-Id: Ia544493b1b3b51b185c865149d8f3e0eb3c57ee2 --- genrule/genrule.go | 22 +++++++++++++++------- java/java_test.go | 6 +++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/genrule/genrule.go b/genrule/genrule.go index 4a734dad2..e47035310 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -260,13 +260,13 @@ func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) { // recall that Sprintf replaces percent sign expressions, whereas dollar signs expressions remain as written, // to be replaced later by ninja_strings.go - sandboxCommand := fmt.Sprintf("$sboxCmd --sandbox-path %s --output-root %s -c %q $out", sandboxPath, buildDir, rawCommand) + sandboxCommand := fmt.Sprintf("$sboxCmd --sandbox-path %s --output-root %s -c %q $allouts", sandboxPath, buildDir, rawCommand) ruleParams := blueprint.RuleParams{ Command: sandboxCommand, CommandDeps: []string{"$sboxCmd"}, } - var args []string + args := []string{"allouts"} if g.properties.Depfile { ruleParams.Deps = blueprint.DepsGCC args = append(args, "depfile") @@ -281,16 +281,24 @@ func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) { func (g *Module) generateSourceFile(ctx android.ModuleContext, task generateTask) { desc := "generate" + if len(task.out) == 0 { + ctx.ModuleErrorf("must have at least one output file") + return + } if len(task.out) == 1 { desc += " " + task.out[0].Base() } params := android.ModuleBuildParams{ - Rule: g.rule, - Description: "generate", - Outputs: task.out, - Inputs: task.in, - Implicits: g.deps, + Rule: g.rule, + Description: "generate", + Output: task.out[0], + ImplicitOutputs: task.out[1:], + Inputs: task.in, + Implicits: g.deps, + Args: map[string]string{ + "allouts": strings.Join(task.out.Strings(), " "), + }, } if g.properties.Depfile { depfile := android.GenPathWithExt(ctx, "", task.out[0], task.out[0].Ext()+".d") diff --git a/java/java_test.go b/java/java_test.go index 451f58e9b..8ac4b3b2f 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -613,13 +613,13 @@ func TestGeneratedSources(t *testing.T) { javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") genrule := ctx.ModuleForTests("gen", "").Rule("generator") - if len(genrule.Outputs) != 1 || filepath.Base(genrule.Outputs[0].String()) != "gen.java" { - t.Fatalf(`gen output file %v is not [".../gen.java"]`, genrule.Outputs.Strings()) + if filepath.Base(genrule.Output.String()) != "gen.java" { + t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String()) } if len(javac.Inputs) != 3 || javac.Inputs[0].String() != "a.java" || - javac.Inputs[1].String() != genrule.Outputs[0].String() || + javac.Inputs[1].String() != genrule.Output.String() || javac.Inputs[2].String() != "b.java" { t.Errorf(`foo inputs %v != ["a.java", ".../gen.java", "b.java"]`, javac.Inputs) }