Track sources for srcjars across modules
Robolectric coverage needs a srcjar that sometimes needs to include sources of dependencies. Track the arguments and dependencies necessary to jar the sources. Test: TestIncludeSrcs Change-Id: I9979d2b8350923a2237e743c232e6e548f54ba3b
This commit is contained in:
parent
988708ce75
commit
0c4ce21615
|
@ -647,6 +647,10 @@ func (a *AARImport) ExportedSdkLibs() []string {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AARImport) SrcJarArgs() ([]string, android.Paths) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
var _ android.PrebuiltInterface = (*Import)(nil)
|
var _ android.PrebuiltInterface = (*Import)(nil)
|
||||||
|
|
||||||
// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
|
// android_library_import imports an `.aar` file into the build graph as if it was built with android_library.
|
||||||
|
|
|
@ -34,6 +34,9 @@ type DeviceHostConverter struct {
|
||||||
implementationAndResourceJars android.Paths
|
implementationAndResourceJars android.Paths
|
||||||
resourceJars android.Paths
|
resourceJars android.Paths
|
||||||
|
|
||||||
|
srcJarArgs []string
|
||||||
|
srcJarDeps android.Paths
|
||||||
|
|
||||||
combinedHeaderJar android.Path
|
combinedHeaderJar android.Path
|
||||||
combinedImplementationJar android.Path
|
combinedImplementationJar android.Path
|
||||||
}
|
}
|
||||||
|
@ -100,6 +103,10 @@ func (d *DeviceHostConverter) GenerateAndroidBuildActions(ctx android.ModuleCont
|
||||||
d.implementationJars = append(d.implementationJars, dep.ImplementationJars()...)
|
d.implementationJars = append(d.implementationJars, dep.ImplementationJars()...)
|
||||||
d.implementationAndResourceJars = append(d.implementationAndResourceJars, dep.ImplementationAndResourcesJars()...)
|
d.implementationAndResourceJars = append(d.implementationAndResourceJars, dep.ImplementationAndResourcesJars()...)
|
||||||
d.resourceJars = append(d.resourceJars, dep.ResourceJars()...)
|
d.resourceJars = append(d.resourceJars, dep.ResourceJars()...)
|
||||||
|
|
||||||
|
srcJarArgs, srcJarDeps := dep.SrcJarArgs()
|
||||||
|
d.srcJarArgs = append(d.srcJarArgs, srcJarArgs...)
|
||||||
|
d.srcJarDeps = append(d.srcJarDeps, srcJarDeps...)
|
||||||
} else {
|
} else {
|
||||||
ctx.PropertyErrorf("libs", "module %q cannot be used as a dependency", ctx.OtherModuleName(m))
|
ctx.PropertyErrorf("libs", "module %q cannot be used as a dependency", ctx.OtherModuleName(m))
|
||||||
}
|
}
|
||||||
|
@ -157,6 +164,10 @@ func (d *DeviceHostConverter) ExportedSdkLibs() []string {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DeviceHostConverter) SrcJarArgs() ([]string, android.Paths) {
|
||||||
|
return d.srcJarArgs, d.srcJarDeps
|
||||||
|
}
|
||||||
|
|
||||||
func (d *DeviceHostConverter) AndroidMk() android.AndroidMkData {
|
func (d *DeviceHostConverter) AndroidMk() android.AndroidMkData {
|
||||||
return android.AndroidMkData{
|
return android.AndroidMkData{
|
||||||
Class: "JAVA_LIBRARIES",
|
Class: "JAVA_LIBRARIES",
|
||||||
|
|
46
java/java.go
46
java/java.go
|
@ -290,6 +290,10 @@ type Module struct {
|
||||||
// jar file containing only resources including from static library dependencies
|
// jar file containing only resources including from static library dependencies
|
||||||
resourceJar android.Path
|
resourceJar android.Path
|
||||||
|
|
||||||
|
// args and dependencies to package source files into a srcjar
|
||||||
|
srcJarArgs []string
|
||||||
|
srcJarDeps android.Paths
|
||||||
|
|
||||||
// jar file containing implementation classes and resources including static library
|
// jar file containing implementation classes and resources including static library
|
||||||
// dependencies
|
// dependencies
|
||||||
implementationAndResourcesJar android.Path
|
implementationAndResourcesJar android.Path
|
||||||
|
@ -365,6 +369,7 @@ type Dependency interface {
|
||||||
DexJar() android.Path
|
DexJar() android.Path
|
||||||
AidlIncludeDirs() android.Paths
|
AidlIncludeDirs() android.Paths
|
||||||
ExportedSdkLibs() []string
|
ExportedSdkLibs() []string
|
||||||
|
SrcJarArgs() ([]string, android.Paths)
|
||||||
}
|
}
|
||||||
|
|
||||||
type SdkLibraryDependency interface {
|
type SdkLibraryDependency interface {
|
||||||
|
@ -1113,6 +1118,14 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars ...android.Path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
j.srcJarArgs, j.srcJarDeps = resourcePathsToJarArgs(srcFiles), srcFiles
|
||||||
|
|
||||||
|
var includeSrcJar android.WritablePath
|
||||||
|
if Bool(j.properties.Include_srcs) {
|
||||||
|
includeSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+".srcjar")
|
||||||
|
TransformResourcesToJar(ctx, includeSrcJar, j.srcJarArgs, j.srcJarDeps)
|
||||||
|
}
|
||||||
|
|
||||||
dirArgs, dirDeps := ResourceDirsToJarArgs(ctx, j.properties.Java_resource_dirs,
|
dirArgs, dirDeps := ResourceDirsToJarArgs(ctx, j.properties.Java_resource_dirs,
|
||||||
j.properties.Exclude_java_resource_dirs, j.properties.Exclude_java_resources)
|
j.properties.Exclude_java_resource_dirs, j.properties.Exclude_java_resources)
|
||||||
fileArgs, fileDeps := ResourceFilesToJarArgs(ctx, j.properties.Java_resources, j.properties.Exclude_java_resources)
|
fileArgs, fileDeps := ResourceFilesToJarArgs(ctx, j.properties.Java_resources, j.properties.Exclude_java_resources)
|
||||||
|
@ -1130,12 +1143,6 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars ...android.Path
|
||||||
resArgs = append(resArgs, extraArgs...)
|
resArgs = append(resArgs, extraArgs...)
|
||||||
resDeps = append(resDeps, extraDeps...)
|
resDeps = append(resDeps, extraDeps...)
|
||||||
|
|
||||||
if Bool(j.properties.Include_srcs) {
|
|
||||||
srcArgs, srcDeps := SourceFilesToJarArgs(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
|
|
||||||
resArgs = append(resArgs, srcArgs...)
|
|
||||||
resDeps = append(resDeps, srcDeps...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(resArgs) > 0 {
|
if len(resArgs) > 0 {
|
||||||
resourceJar := android.PathForModuleOut(ctx, "res", jarName)
|
resourceJar := android.PathForModuleOut(ctx, "res", jarName)
|
||||||
TransformResourcesToJar(ctx, resourceJar, resArgs, resDeps)
|
TransformResourcesToJar(ctx, resourceJar, resArgs, resDeps)
|
||||||
|
@ -1145,17 +1152,22 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars ...android.Path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(deps.staticResourceJars) > 0 {
|
var resourceJars android.Paths
|
||||||
var jars android.Paths
|
if j.resourceJar != nil {
|
||||||
if j.resourceJar != nil {
|
resourceJars = append(resourceJars, j.resourceJar)
|
||||||
jars = append(jars, j.resourceJar)
|
}
|
||||||
}
|
if Bool(j.properties.Include_srcs) {
|
||||||
jars = append(jars, deps.staticResourceJars...)
|
resourceJars = append(resourceJars, includeSrcJar)
|
||||||
|
}
|
||||||
|
resourceJars = append(resourceJars, deps.staticResourceJars...)
|
||||||
|
|
||||||
|
if len(resourceJars) > 1 {
|
||||||
combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName)
|
combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName)
|
||||||
TransformJarsToJar(ctx, combinedJar, "for resources", jars, android.OptionalPath{},
|
TransformJarsToJar(ctx, combinedJar, "for resources", resourceJars, android.OptionalPath{},
|
||||||
false, nil, nil)
|
false, nil, nil)
|
||||||
j.resourceJar = combinedJar
|
j.resourceJar = combinedJar
|
||||||
|
} else if len(resourceJars) == 1 {
|
||||||
|
j.resourceJar = resourceJars[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
jars = append(jars, deps.staticJars...)
|
jars = append(jars, deps.staticJars...)
|
||||||
|
@ -1443,6 +1455,10 @@ func (j *Module) ExportedSdkLibs() []string {
|
||||||
return j.exportedSdkLibs
|
return j.exportedSdkLibs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (j *Module) SrcJarArgs() ([]string, android.Paths) {
|
||||||
|
return j.srcJarArgs, j.srcJarDeps
|
||||||
|
}
|
||||||
|
|
||||||
var _ logtagsProducer = (*Module)(nil)
|
var _ logtagsProducer = (*Module)(nil)
|
||||||
|
|
||||||
func (j *Module) logtags() android.Paths {
|
func (j *Module) logtags() android.Paths {
|
||||||
|
@ -1920,6 +1936,10 @@ func (j *Import) ExportedSdkLibs() []string {
|
||||||
return j.exportedSdkLibs
|
return j.exportedSdkLibs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (j *Import) SrcJarArgs() ([]string, android.Paths) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Add compile time check for interface implementation
|
// Add compile time check for interface implementation
|
||||||
var _ android.IDEInfo = (*Import)(nil)
|
var _ android.IDEInfo = (*Import)(nil)
|
||||||
var _ android.IDECustomizedModuleName = (*Import)(nil)
|
var _ android.IDECustomizedModuleName = (*Import)(nil)
|
||||||
|
|
|
@ -85,14 +85,6 @@ func ResourceFilesToJarArgs(ctx android.ModuleContext,
|
||||||
return resourceFilesToJarArgs(ctx, res, exclude)
|
return resourceFilesToJarArgs(ctx, res, exclude)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert java_resources properties to arguments to soong_zip -jar, keeping files that should
|
|
||||||
// normally not used as resources like *.java
|
|
||||||
func SourceFilesToJarArgs(ctx android.ModuleContext,
|
|
||||||
res, exclude []string) (args []string, deps android.Paths) {
|
|
||||||
|
|
||||||
return resourceFilesToJarArgs(ctx, res, exclude)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resourceFilesToJarArgs(ctx android.ModuleContext,
|
func resourceFilesToJarArgs(ctx android.ModuleContext,
|
||||||
res, exclude []string) (args []string, deps android.Paths) {
|
res, exclude []string) (args []string, deps android.Paths) {
|
||||||
|
|
||||||
|
|
|
@ -481,12 +481,6 @@ func TestResources(t *testing.T) {
|
||||||
}`,
|
}`,
|
||||||
args: "-C java-res -f java-res/a/a -f java-res/b/b",
|
args: "-C java-res -f java-res/a/a -f java-res/b/b",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
// Test that a module with "include_srcs: true" includes its source files in the resources jar
|
|
||||||
name: "include sources",
|
|
||||||
prop: `include_srcs: true`,
|
|
||||||
args: "-C . -f a.java -f b.java -f c.java",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
// Test that a module with wildcards in java_resource_dirs has the correct path prefixes
|
// Test that a module with wildcards in java_resource_dirs has the correct path prefixes
|
||||||
name: "wildcard dirs",
|
name: "wildcard dirs",
|
||||||
|
@ -555,6 +549,69 @@ func TestResources(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIncludeSrcs(t *testing.T) {
|
||||||
|
ctx := testJava(t, `
|
||||||
|
java_library {
|
||||||
|
name: "foo",
|
||||||
|
srcs: [
|
||||||
|
"a.java",
|
||||||
|
"b.java",
|
||||||
|
"c.java",
|
||||||
|
],
|
||||||
|
include_srcs: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
java_library {
|
||||||
|
name: "bar",
|
||||||
|
srcs: [
|
||||||
|
"a.java",
|
||||||
|
"b.java",
|
||||||
|
"c.java",
|
||||||
|
],
|
||||||
|
java_resource_dirs: ["java-res"],
|
||||||
|
include_srcs: true,
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
// Test a library with include_srcs: true
|
||||||
|
foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar")
|
||||||
|
fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar")
|
||||||
|
|
||||||
|
if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) {
|
||||||
|
t.Errorf("foo combined jars %v does not contain %q", w, g)
|
||||||
|
}
|
||||||
|
|
||||||
|
if g, w := fooSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
|
||||||
|
t.Errorf("foo source jar args %q is not %q", w, g)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test a library with include_srcs: true and resources
|
||||||
|
bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar")
|
||||||
|
barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar")
|
||||||
|
barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar")
|
||||||
|
barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar")
|
||||||
|
|
||||||
|
if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
|
||||||
|
t.Errorf("bar combined resource jars %v does not contain %q", w, g)
|
||||||
|
}
|
||||||
|
|
||||||
|
if g, w := barRes.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) {
|
||||||
|
t.Errorf("bar combined resource jars %v does not contain %q", w, g)
|
||||||
|
}
|
||||||
|
|
||||||
|
if g, w := barResCombined.Output.String(), bar.Inputs.Strings(); !inList(g, w) {
|
||||||
|
t.Errorf("bar combined jars %v does not contain %q", w, g)
|
||||||
|
}
|
||||||
|
|
||||||
|
if g, w := barSrcJar.Args["jarArgs"], "-C . -f a.java -f b.java -f c.java"; g != w {
|
||||||
|
t.Errorf("bar source jar args %q is not %q", w, g)
|
||||||
|
}
|
||||||
|
|
||||||
|
if g, w := barRes.Args["jarArgs"], "-C java-res -f java-res/a/a -f java-res/b/b"; g != w {
|
||||||
|
t.Errorf("bar resource jar args %q is not %q", w, g)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGeneratedSources(t *testing.T) {
|
func TestGeneratedSources(t *testing.T) {
|
||||||
ctx := testJava(t, `
|
ctx := testJava(t, `
|
||||||
java_library {
|
java_library {
|
||||||
|
|
Loading…
Reference in New Issue