diff options
Diffstat (limited to 'java/java.go')
| -rw-r--r-- | java/java.go | 110 |
1 files changed, 72 insertions, 38 deletions
diff --git a/java/java.go b/java/java.go index 5cd074ab1..f58e5ba24 100644 --- a/java/java.go +++ b/java/java.go @@ -34,7 +34,7 @@ import ( ) func init() { - android.RegisterModuleType("java_defaults", defaultsFactory) + android.RegisterModuleType("java_defaults", DefaultsFactory) android.RegisterModuleType("java_library", LibraryFactory) android.RegisterModuleType("java_library_static", LibraryStaticFactory) @@ -792,8 +792,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { return } switch module.(type) { - case *Library: - case *AndroidLibrary: + case *Library, *AndroidLibrary: if to, ok := module.(linkTypeContext); ok { switch tag { case bootClasspathTag, libTag, staticLibTag: @@ -1711,23 +1710,47 @@ func (j *Library) DepsMutator(ctx android.BottomUpMutatorContext) { } const ( - aidlIncludeDir = "aidl" - javaStubDir = "java" - javaStubFileSuffix = ".jar" + aidlIncludeDir = "aidl" + javaDir = "java" + jarFileSuffix = ".jar" ) -// path to the stub file of a java library. Relative to <sdk_root>/<api_dir> -func (j *Library) javaStubFilePathFor() string { - return filepath.Join(javaStubDir, j.Name()+javaStubFileSuffix) +// path to the jar file of a java library. Relative to <sdk_root>/<api_dir> +func (j *Library) sdkSnapshotFilePathForJar() string { + return filepath.Join(javaDir, j.Name()+jarFileSuffix) } -func (j *Library) BuildSnapshot(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder) { - headerJars := j.HeaderJars() - if len(headerJars) != 1 { - panic(fmt.Errorf("there must be only one header jar from %q", j.Name())) +type librarySdkMemberType struct { +} + +func (mt *librarySdkMemberType) AddDependencies(mctx android.BottomUpMutatorContext, dependencyTag blueprint.DependencyTag, names []string) { + mctx.AddVariationDependencies(nil, dependencyTag, names...) +} + +func (mt *librarySdkMemberType) IsInstance(module android.Module) bool { + _, ok := module.(*Library) + return ok +} + +func (mt *librarySdkMemberType) buildSnapshot( + sdkModuleContext android.ModuleContext, + builder android.SnapshotBuilder, + member android.SdkMember, + jarToExportGetter func(j *Library) android.Path) { + + 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) + } } - snapshotRelativeJavaLibPath := j.javaStubFilePathFor() - builder.CopyToSnapshot(headerJars[0], snapshotRelativeJavaLibPath) + variant := variants[0] + j := variant.(*Library) + + exportedJar := jarToExportGetter(j) + snapshotRelativeJavaLibPath := j.sdkSnapshotFilePathForJar() + builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) for _, dir := range j.AidlIncludeDirs() { // TODO(jiyong): copy parcelable declarations only @@ -1737,30 +1760,42 @@ func (j *Library) BuildSnapshot(sdkModuleContext android.ModuleContext, builder } } - j.generateJavaImport(builder, snapshotRelativeJavaLibPath, true) + module := builder.AddPrebuiltModule(member, "java_import") + module.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) +} + +var HeaderLibrarySdkMemberType = &headerLibrarySdkMemberType{} - // This module is for the case when the source tree for the unversioned module - // doesn't exist (i.e. building in an unbundled tree). "prefer:" is set to false - // so that this module does not eclipse the unversioned module if it exists. - j.generateJavaImport(builder, snapshotRelativeJavaLibPath, false) +type headerLibrarySdkMemberType struct { + librarySdkMemberType } -func (j *Library) generateJavaImport(builder android.SnapshotBuilder, snapshotRelativeJavaLibPath string, versioned bool) { - bp := builder.AndroidBpFile() - name := j.Name() - bp.Printfln("java_import {") - bp.Indent() - if versioned { - bp.Printfln("name: %q,", builder.VersionedSdkMemberName(name)) - bp.Printfln("sdk_member_name: %q,", name) - } else { - bp.Printfln("name: %q,", name) - bp.Printfln("prefer: false,") - } - bp.Printfln("jars: [%q],", snapshotRelativeJavaLibPath) - bp.Dedent() - bp.Printfln("}") - bp.Printfln("") +func (mt *headerLibrarySdkMemberType) BuildSnapshot(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember) { + mt.librarySdkMemberType.buildSnapshot(sdkModuleContext, builder, member, func(j *Library) android.Path { + headerJars := j.HeaderJars() + if len(headerJars) != 1 { + panic(fmt.Errorf("there must be only one header jar from %q", j.Name())) + } + + return headerJars[0] + }) +} + +var ImplLibrarySdkMemberType = &implLibrarySdkMemberType{} + +type implLibrarySdkMemberType struct { + librarySdkMemberType +} + +func (mt *implLibrarySdkMemberType) BuildSnapshot(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember) { + mt.librarySdkMemberType.buildSnapshot(sdkModuleContext, builder, member, func(j *Library) android.Path { + implementationJars := j.ImplementationJars() + if len(implementationJars) != 1 { + panic(fmt.Errorf("there must be only one implementation jar from %q", j.Name())) + } + + return implementationJars[0] + }) } // java_library builds and links sources into a `.jar` file for the device, and possibly for the host as well. @@ -2416,10 +2451,9 @@ func defaultsFactory() android.Module { return DefaultsFactory() } -func DefaultsFactory(props ...interface{}) android.Module { +func DefaultsFactory() android.Module { module := &Defaults{} - module.AddProperties(props...) module.AddProperties( &CompilerProperties{}, &CompilerDeviceProperties{}, |