Parse genrule's cmd property

Instead of just passing this to ninja, use os.Expand to parse the
variable substitutions. While we're here, define a new "genDir" variable
that is the root of this module's generated directory.

Bug: 31742855
Test: Ensure invalid variables cause error
Test: Inspect commands in build.ninja
Change-Id: Iff6d0499ab57367669e73df52ab7c647358da13b
This commit is contained in:
Dan Willemsen
2016-09-28 16:19:10 -07:00
parent 4aa75ca244
commit 3f4539b035

View File

@@ -15,6 +15,8 @@
package genrule package genrule
import ( import (
"os"
"github.com/google/blueprint" "github.com/google/blueprint"
"android/soong" "android/soong"
@@ -52,6 +54,7 @@ type generatorProperties struct {
// $in: one or more input files // $in: one or more input files
// $out: a single output file // $out: a single output file
// $srcDir: the root directory of the source tree // $srcDir: the root directory of the source tree
// $genDir: the sandbox directory for this tool; contains $out
// The host bin directory will be in the path // The host bin directory will be in the path
Cmd string Cmd string
@@ -109,8 +112,30 @@ func (g *generator) GenerateAndroidBuildActions(ctx android.ModuleContext) {
return return
} }
g.genPath = android.PathForModuleGen(ctx, "")
cmd := os.Expand(g.properties.Cmd, func(name string) string {
switch name {
case "$":
return "$$"
case "tool":
return "${tool}"
case "in":
return "${in}"
case "out":
return "${out}"
case "srcDir":
return "${srcDir}"
case "genDir":
return g.genPath.String()
default:
ctx.PropertyErrorf("cmd", "unknown variable '%s'", name)
}
return ""
})
g.rule = ctx.Rule(pctx, "generator", blueprint.RuleParams{ g.rule = ctx.Rule(pctx, "generator", blueprint.RuleParams{
Command: "PATH=$$PATH:$hostBin " + g.properties.Cmd, Command: "PATH=$$PATH:$hostBin " + cmd,
}, "tool") }, "tool")
var tool string var tool string
@@ -134,8 +159,6 @@ func (g *generator) GenerateAndroidBuildActions(ctx android.ModuleContext) {
}) })
} }
g.genPath = android.PathForModuleGen(ctx, "")
for _, task := range g.tasks(ctx) { for _, task := range g.tasks(ctx) {
g.generateSourceFile(ctx, task, tool) g.generateSourceFile(ctx, task, tool)
} }