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
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 4a734da..e470353 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -260,13 +260,13 @@
// 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) 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 451f58e..8ac4b3b 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -613,13 +613,13 @@
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)
}