Allow java manifest property to reference filegroups
Also factor out ExtractSourceDep and ExpandSource.
Test: m checkbuild
Change-Id: Ibc253514bc3109d84ec388a05c66b8108af5d6ab
diff --git a/android/module.go b/android/module.go
index 6d7bb43..3d8f683 100644
--- a/android/module.go
+++ b/android/module.go
@@ -106,6 +106,7 @@
ModuleBuild(pctx PackageContext, params ModuleBuildParams)
ExpandSources(srcFiles, excludes []string) Paths
+ ExpandSource(srcFile, prop string) Path
ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths
Glob(globPattern string, excludes []string) Paths
@@ -1005,8 +1006,8 @@
var SourceDepTag sourceDependencyTag
-// Returns a list of modules that must be depended on to satisfy filegroup or generated sources
-// modules listed in srcFiles using ":module" syntax
+// Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles
+// using ":module" syntax, if any.
func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
var deps []string
set := make(map[string]bool)
@@ -1025,6 +1026,16 @@
ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
}
+// Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s
+// using ":module" syntax, if any.
+func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) {
+ if s != nil {
+ if m := SrcIsModule(*s); m != "" {
+ ctx.AddDependency(ctx.Module(), SourceDepTag, m)
+ }
+ }
+}
+
type SourceFileProducer interface {
Srcs() Paths
}
@@ -1035,6 +1046,18 @@
return ctx.ExpandSourcesSubDir(srcFiles, excludes, "")
}
+// Returns a single path expanded from globs and modules referenced using ":module" syntax.
+// ExtractSourceDeps must have already been called during the dependency resolution phase.
+func (ctx *androidModuleContext) ExpandSource(srcFile, prop string) Path {
+ srcFiles := ctx.ExpandSourcesSubDir([]string{srcFile}, nil, "")
+ if len(srcFiles) == 1 {
+ return srcFiles[0]
+ } else {
+ ctx.PropertyErrorf(prop, "module providing %s must produce exactly one file", prop)
+ return nil
+ }
+}
+
func (ctx *androidModuleContext) ExpandSourcesSubDir(srcFiles, excludes []string, subDir string) Paths {
prefix := PathForModuleSrc(ctx).String()
diff --git a/java/java.go b/java/java.go
index e9f8331..d9075b1 100644
--- a/java/java.go
+++ b/java/java.go
@@ -390,6 +390,7 @@
android.ExtractSourcesDeps(ctx, j.properties.Srcs)
android.ExtractSourcesDeps(ctx, j.properties.Java_resources)
+ android.ExtractSourceDeps(ctx, j.properties.Manifest)
if j.hasSrcExt(".proto") {
protoDeps(ctx, &j.protoProperties)
@@ -764,7 +765,10 @@
// static classpath jars have the resources in them, so the resource jars aren't necessary here
jars = append(jars, deps.staticJars...)
- manifest := android.OptionalPathForModuleSrc(ctx, j.properties.Manifest)
+ var manifest android.OptionalPath
+ if j.properties.Manifest != nil {
+ manifest = android.OptionalPathForPath(ctx.ExpandSource(*j.properties.Manifest, "manifest"))
+ }
// Combine the classes built from sources, any manifests, and any static libraries into
// classes.jar. If there is only one input jar this step will be skipped.
@@ -1088,14 +1092,8 @@
// Handle the binary wrapper
j.isWrapperVariant = true
- if String(j.binaryProperties.Wrapper) != "" {
- wrapperSrcs := ctx.ExpandSources([]string{String(j.binaryProperties.Wrapper)}, nil)
- if len(wrapperSrcs) == 1 {
- j.wrapperFile = wrapperSrcs[0]
- } else {
- ctx.PropertyErrorf("wrapper", "module providing wrapper must produce exactly one file")
- return
- }
+ if j.binaryProperties.Wrapper != nil {
+ j.wrapperFile = ctx.ExpandSource(*j.binaryProperties.Wrapper, "wrapper")
} else {
j.wrapperFile = android.PathForSource(ctx, "build/soong/scripts/jar-wrapper.sh")
}
@@ -1113,7 +1111,7 @@
if ctx.Arch().ArchType == android.Common {
j.deps(ctx)
} else {
- android.ExtractSourcesDeps(ctx, []string{String(j.binaryProperties.Wrapper)})
+ android.ExtractSourceDeps(ctx, j.binaryProperties.Wrapper)
}
}