diff options
Diffstat (limited to 'java/java.go')
| -rw-r--r-- | java/java.go | 133 |
1 files changed, 85 insertions, 48 deletions
diff --git a/java/java.go b/java/java.go index 135ae514c..8c779f5c4 100644 --- a/java/java.go +++ b/java/java.go @@ -1796,11 +1796,16 @@ func (j *Module) hasCode(ctx android.ModuleContext) bool { } func (j *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { - depTag := ctx.OtherModuleDependencyTag(dep) // Dependencies other than the static linkage are all considered crossing APEX boundary + if staticLibTag == ctx.OtherModuleDependencyTag(dep) { + return true + } // Also, a dependency to an sdk member is also considered as such. This is required because // sdk members should be mutated into APEXes. Refer to sdk.sdkDepsReplaceMutator. - return depTag == staticLibTag || j.IsInAnySdk() + if sa, ok := dep.(android.SdkAware); ok && sa.IsInAnySdk() { + return true + } + return false } func (j *Module) Stem() string { @@ -1879,12 +1884,12 @@ const ( ) // path to the jar file of a java library. Relative to <sdk_root>/<api_dir> -func sdkSnapshotFilePathForJar(member android.SdkMember) string { - return sdkSnapshotFilePathForMember(member, jarFileSuffix) +func sdkSnapshotFilePathForJar(osPrefix, name string) string { + return sdkSnapshotFilePathForMember(osPrefix, name, jarFileSuffix) } -func sdkSnapshotFilePathForMember(member android.SdkMember, suffix string) string { - return filepath.Join(javaDir, member.Name()+suffix) +func sdkSnapshotFilePathForMember(osPrefix, name string, suffix string) string { + return filepath.Join(javaDir, osPrefix, name+suffix) } type librarySdkMemberType struct { @@ -1904,32 +1909,46 @@ func (mt *librarySdkMemberType) IsInstance(module android.Module) bool { return ok } -func (mt *librarySdkMemberType) BuildSnapshot(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember) { +func (mt *librarySdkMemberType) AddPrebuiltModule(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember) android.BpModule { + return builder.AddPrebuiltModule(member, "java_import") +} - variants := member.Variants() - if len(variants) != 1 { - sdkModuleContext.ModuleErrorf("sdk contains %d variants of member %q but only one is allowed", len(variants), member.Name()) - for _, variant := range variants { - sdkModuleContext.ModuleErrorf(" %q", variant) - } - } - variant := variants[0] +func (mt *librarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties { + return &librarySdkMemberProperties{memberType: mt} +} + +type librarySdkMemberProperties struct { + android.SdkMemberPropertiesBase + + memberType *librarySdkMemberType + + library *Library + jarToExport android.Path +} + +func (p *librarySdkMemberProperties) PopulateFromVariant(variant android.SdkAware) { j := variant.(*Library) - exportedJar := mt.jarToExportGetter(j) - snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(member) - builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) + p.library = j + p.jarToExport = p.memberType.jarToExportGetter(j) +} - for _, dir := range j.AidlIncludeDirs() { - // TODO(jiyong): copy parcelable declarations only - aidlFiles, _ := sdkModuleContext.GlobWithDeps(dir.String()+"/**/*.aidl", nil) - for _, file := range aidlFiles { - builder.CopyToSnapshot(android.PathForSource(sdkModuleContext, file), filepath.Join(aidlIncludeDir, file)) +func (p *librarySdkMemberProperties) AddToPropertySet(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, propertySet android.BpPropertySet) { + if p.jarToExport != nil { + exportedJar := p.jarToExport + snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(p.OsPrefix(), p.library.Name()) + builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) + + for _, dir := range p.library.AidlIncludeDirs() { + // TODO(jiyong): copy parcelable declarations only + aidlFiles, _ := sdkModuleContext.GlobWithDeps(dir.String()+"/**/*.aidl", nil) + for _, file := range aidlFiles { + builder.CopyToSnapshot(android.PathForSource(sdkModuleContext, file), filepath.Join(aidlIncludeDir, file)) + } } - } - module := builder.AddPrebuiltModule(member, "java_import") - module.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) + propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) + } } var javaHeaderLibsSdkMemberType android.SdkMemberType = &librarySdkMemberType{ @@ -2094,31 +2113,44 @@ func (mt *testSdkMemberType) IsInstance(module android.Module) bool { return ok } -func (mt *testSdkMemberType) BuildSnapshot(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember) { - variants := member.Variants() - if len(variants) != 1 { - sdkModuleContext.ModuleErrorf("sdk contains %d variants of member %q but only one is allowed", len(variants), member.Name()) - for _, variant := range variants { - sdkModuleContext.ModuleErrorf(" %q", variant) - } - } - variant := variants[0] - j := variant.(*Test) +func (mt *testSdkMemberType) AddPrebuiltModule(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember) android.BpModule { + return builder.AddPrebuiltModule(member, "java_test_import") +} + +func (mt *testSdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties { + return &testSdkMemberProperties{} +} + +type testSdkMemberProperties struct { + android.SdkMemberPropertiesBase + + test *Test + jarToExport android.Path +} + +func (p *testSdkMemberProperties) PopulateFromVariant(variant android.SdkAware) { + test := variant.(*Test) - implementationJars := j.ImplementationJars() + implementationJars := test.ImplementationJars() if len(implementationJars) != 1 { - panic(fmt.Errorf("there must be only one implementation jar from %q", j.Name())) + panic(fmt.Errorf("there must be only one implementation jar from %q", test.Name())) } - snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(member) - builder.CopyToSnapshot(implementationJars[0], snapshotRelativeJavaLibPath) + p.test = test + p.jarToExport = implementationJars[0] +} + +func (p *testSdkMemberProperties) AddToPropertySet(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, propertySet android.BpPropertySet) { + if p.jarToExport != nil { + snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(p.OsPrefix(), p.test.Name()) + builder.CopyToSnapshot(p.jarToExport, snapshotRelativeJavaLibPath) - snapshotRelativeTestConfigPath := sdkSnapshotFilePathForMember(member, testConfigSuffix) - builder.CopyToSnapshot(j.testConfig, snapshotRelativeTestConfigPath) + snapshotRelativeTestConfigPath := sdkSnapshotFilePathForMember(p.OsPrefix(), p.test.Name(), testConfigSuffix) + builder.CopyToSnapshot(p.test.testConfig, snapshotRelativeTestConfigPath) - module := builder.AddPrebuiltModule(member, "java_test_import") - module.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) - module.AddProperty("test_config", snapshotRelativeTestConfigPath) + propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) + propertySet.AddProperty("test_config", snapshotRelativeTestConfigPath) + } } // java_test builds a and links sources into a `.jar` file for the device, and possibly for the host as well, and @@ -2321,7 +2353,7 @@ func BinaryHostFactory() android.Module { // type ImportProperties struct { - Jars []string `android:"path"` + Jars []string `android:"path,arch_variant"` Sdk_version *string @@ -2477,11 +2509,16 @@ func (j *Import) SrcJarArgs() ([]string, android.Paths) { } func (j *Import) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { - depTag := ctx.OtherModuleDependencyTag(dep) // dependencies other than the static linkage are all considered crossing APEX boundary + if staticLibTag == ctx.OtherModuleDependencyTag(dep) { + return true + } // Also, a dependency to an sdk member is also considered as such. This is required because // sdk members should be mutated into APEXes. Refer to sdk.sdkDepsReplaceMutator. - return depTag == staticLibTag || j.IsInAnySdk() + if sa, ok := dep.(android.SdkAware); ok && sa.IsInAnySdk() { + return true + } + return false } // Add compile time check for interface implementation |