aboutsummaryrefslogtreecommitdiffstats
path: root/genrule
diff options
context:
space:
mode:
authorDan Willemsen <dwillemsen@google.com>2017-09-13 15:46:47 -0700
committerDan Willemsen <dwillemsen@google.com>2017-09-14 22:59:33 +0000
commitd6ba0d592c137727d387905c3c16bfc0a705f8c3 (patch)
tree7874f4a1c326ce76a1afcc61ab7c3d50f4dfb8de /genrule
parentd5998cce7dee2c7e4200c3e8e7285095e5ba1a85 (diff)
downloadbuild_soong-d6ba0d592c137727d387905c3c16bfc0a705f8c3.tar.gz
build_soong-d6ba0d592c137727d387905c3c16bfc0a705f8c3.tar.bz2
build_soong-d6ba0d592c137727d387905c3c16bfc0a705f8c3.zip
Use dependency tags for genrules
So that we don't get confused when using :<module> in srcs to depend on a module that could also be a HostBinTool. Test: m -j Change-Id: Ia3b1c26826e70f84c6dc5ff78c95dd11d76901b6
Diffstat (limited to 'genrule')
-rw-r--r--genrule/genrule.go40
1 files changed, 30 insertions, 10 deletions
diff --git a/genrule/genrule.go b/genrule/genrule.go
index c5de1fdc..921a64e0 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -48,6 +48,12 @@ type HostToolProvider interface {
HostToolPath() android.OptionalPath
}
+type hostToolDependencyTag struct {
+ blueprint.BaseDependencyTag
+}
+
+var hostToolDepTag hostToolDependencyTag
+
type generatorProperties struct {
// The command to run on one or more input files. Cmd supports substitution of a few variables
// (the actual substitution is implemented in GenerateAndroidBuildActions below)
@@ -123,7 +129,7 @@ func (g *generator) DepsMutator(ctx android.BottomUpMutatorContext) {
if len(g.properties.Tools) > 0 {
ctx.AddFarVariationDependencies([]blueprint.Variation{
{"arch", ctx.AConfig().BuildOsVariant},
- }, nil, g.properties.Tools...)
+ }, hostToolDepTag, g.properties.Tools...)
}
}
}
@@ -147,23 +153,37 @@ func (g *generator) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if len(g.properties.Tools) > 0 {
ctx.VisitDirectDeps(func(module blueprint.Module) {
- if t, ok := module.(HostToolProvider); ok {
- p := t.HostToolPath()
- if p.Valid() {
- g.deps = append(g.deps, p.Path())
- tool := ctx.OtherModuleName(module)
- if _, exists := tools[tool]; !exists {
- tools[tool] = p.Path()
+ switch ctx.OtherModuleDependencyTag(module) {
+ case android.SourceDepTag:
+ // Nothing to do
+ case hostToolDepTag:
+ tool := ctx.OtherModuleName(module)
+
+ if t, ok := module.(HostToolProvider); ok {
+ p := t.HostToolPath()
+ if p.Valid() {
+ g.deps = append(g.deps, p.Path())
+ if _, exists := tools[tool]; !exists {
+ tools[tool] = p.Path()
+ } else {
+ ctx.ModuleErrorf("multiple tools for %q, %q and %q", tool, tools[tool], p.Path().String())
+ }
} else {
- ctx.ModuleErrorf("multiple tools for %q, %q and %q", tool, tools[tool], p.Path().String())
+ ctx.ModuleErrorf("host tool %q missing output file", tool)
}
} else {
- ctx.ModuleErrorf("host tool %q missing output file", ctx.OtherModuleName(module))
+ ctx.ModuleErrorf("%q is not a host tool provider", tool)
}
+ default:
+ ctx.ModuleErrorf("unknown dependency on %q", ctx.OtherModuleName(module))
}
})
}
+ if ctx.Failed() {
+ return
+ }
+
for _, tool := range g.properties.Tool_files {
toolPath := android.PathForModuleSrc(ctx, tool)
g.deps = append(g.deps, toolPath)