Support tagged module references

There are cases where a module needs to refer to an intermediate
output of another module instead of its final output.  For example,
a module may want to use the .jar containing .class files from
another module whose final output is a .jar containing classes.dex
files.  Support a new ":module{.tag}" format in any property that
is annotated with `android:"path"`, which will query the target
module for its ".tag" output(s).

Test: path_properties_test.go, paths_test.go
Test: no unexpected changes in build.ninja
Change-Id: Icd3c9b0d83ff125771767c04046fcffb9fc3f65a
This commit is contained in:
Colin Cross
2019-05-29 14:40:35 -07:00
parent 4c2c46f0a7
commit 41955e8895
14 changed files with 408 additions and 87 deletions

View File

@@ -351,15 +351,20 @@ type Module struct {
dexpreopter
}
func (j *Module) Srcs() android.Paths {
return append(android.Paths{j.outputFile}, j.extraOutputFiles...)
func (j *Module) OutputFiles(tag string) (android.Paths, error) {
switch tag {
case "":
return append(android.Paths{j.outputFile}, j.extraOutputFiles...), nil
default:
return nil, fmt.Errorf("unsupported module reference tag %q", tag)
}
}
func (j *Module) DexJarFile() android.Path {
return j.dexJarFile
}
var _ android.SourceFileProducer = (*Module)(nil)
var _ android.OutputFileProducer = (*Module)(nil)
type Dependency interface {
HeaderJars() android.Paths
@@ -813,8 +818,6 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
}
default:
switch tag {
case android.DefaultsDepTag, android.SourceDepTag:
// Nothing to do
case systemModulesTag:
if deps.systemModules != nil {
panic("Found two system module dependencies")
@@ -824,8 +827,6 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
panic("Missing directory for system module dependency")
}
deps.systemModules = sm.outputFile
default:
ctx.ModuleErrorf("depends on non-java module %q", otherName)
}
}
})