java_sdk_library: Improve consistency with ..._import
The scopePaths struct is used by both java_sdk_library and its prebuilt but was not populated in the same way. This change addresses those discrepancies in preparation for a follow up change which will allow access to some of those fields through OutputFileProvider. Changes: * Document the scopePaths field and struct. * Switch those fields that may not be fully populated from Paths to OptionalPath to make that 100% clear and protect against unchecked use. * Switch java_sdk_library_import to use the dependency extraction mechanism driven by the dependency tag. This should actually have been part of the change that added that mechanism. * Only create prebuilt_stubs_sources if sources have been provided. * Add dependencies from java_sdk_library_import on its stubs source child modules if sources have been provided. That will ensure the stubsSrcJar field is updated. * Updates current/removedApiFilePath if provided for the scope in java_sdk_library_import. * Extracts ApiStubsSrcProvider from ApiStubsProvider to allow it to be implemented by PrebuiltStubsSources so that it can provide access to the stubs src jar that it creates. Test: m nothing Bug: 148080325 Bug: 155164730 Change-Id: Ic5bf884b2b1e79841843e7c3b4642796ecd49f5d
This commit is contained in:
parent
803a9565cd
commit
0f8faffdc0
|
@ -351,11 +351,16 @@ type ApiFilePath interface {
|
|||
ApiFilePath() android.Path
|
||||
}
|
||||
|
||||
type ApiStubsSrcProvider interface {
|
||||
StubsSrcJar() android.Path
|
||||
}
|
||||
|
||||
// Provider of information about API stubs, used by java_sdk_library.
|
||||
type ApiStubsProvider interface {
|
||||
ApiFilePath
|
||||
RemovedApiFilePath() android.Path
|
||||
StubsSrcJar() android.Path
|
||||
|
||||
ApiStubsSrcProvider
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -1932,6 +1937,10 @@ func (p *PrebuiltStubsSources) OutputFiles(tag string) (android.Paths, error) {
|
|||
}
|
||||
}
|
||||
|
||||
func (d *PrebuiltStubsSources) StubsSrcJar() android.Path {
|
||||
return d.stubsSrcJar
|
||||
}
|
||||
|
||||
func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
p.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
|
||||
|
||||
|
|
|
@ -575,6 +575,7 @@ func TestJavaSdkLibraryImport(t *testing.T) {
|
|||
},
|
||||
test: {
|
||||
jars: ["c.jar"],
|
||||
stub_srcs: ["c.java"],
|
||||
},
|
||||
}
|
||||
`)
|
||||
|
|
|
@ -433,12 +433,30 @@ type sdkLibraryProperties struct {
|
|||
//Html_doc *bool
|
||||
}
|
||||
|
||||
// Paths to outputs from java_sdk_library and java_sdk_library_import.
|
||||
//
|
||||
// Fields that are android.Paths are always set (during GenerateAndroidBuildActions).
|
||||
// OptionalPaths are always set by java_sdk_library but may not be set by
|
||||
// java_sdk_library_import as not all instances provide that information.
|
||||
type scopePaths struct {
|
||||
stubsHeaderPath android.Paths
|
||||
stubsImplPath android.Paths
|
||||
currentApiFilePath android.Path
|
||||
removedApiFilePath android.Path
|
||||
stubsSrcJar android.Path
|
||||
// The path (represented as Paths for convenience when returning) to the stubs header jar.
|
||||
//
|
||||
// That is the jar that is created by turbine.
|
||||
stubsHeaderPath android.Paths
|
||||
|
||||
// The path (represented as Paths for convenience when returning) to the stubs implementation jar.
|
||||
//
|
||||
// This is not the implementation jar, it still only contains stubs.
|
||||
stubsImplPath android.Paths
|
||||
|
||||
// The API specification file, e.g. system_current.txt.
|
||||
currentApiFilePath android.OptionalPath
|
||||
|
||||
// The specification of API elements removed since the last release.
|
||||
removedApiFilePath android.OptionalPath
|
||||
|
||||
// The stubs source jar.
|
||||
stubsSrcJar android.OptionalPath
|
||||
}
|
||||
|
||||
func (paths *scopePaths) extractStubsLibraryInfoFromDependency(dep android.Module) error {
|
||||
|
@ -460,9 +478,18 @@ func (paths *scopePaths) treatDepAsApiStubsProvider(dep android.Module, action f
|
|||
}
|
||||
}
|
||||
|
||||
func (paths *scopePaths) treatDepAsApiStubsSrcProvider(dep android.Module, action func(provider ApiStubsSrcProvider)) error {
|
||||
if apiStubsProvider, ok := dep.(ApiStubsSrcProvider); ok {
|
||||
action(apiStubsProvider)
|
||||
return nil
|
||||
} else {
|
||||
return fmt.Errorf("expected module that implements ApiStubsSrcProvider, e.g. droidstubs")
|
||||
}
|
||||
}
|
||||
|
||||
func (paths *scopePaths) extractApiInfoFromApiStubsProvider(provider ApiStubsProvider) {
|
||||
paths.currentApiFilePath = provider.ApiFilePath()
|
||||
paths.removedApiFilePath = provider.RemovedApiFilePath()
|
||||
paths.currentApiFilePath = android.OptionalPathForPath(provider.ApiFilePath())
|
||||
paths.removedApiFilePath = android.OptionalPathForPath(provider.RemovedApiFilePath())
|
||||
}
|
||||
|
||||
func (paths *scopePaths) extractApiInfoFromDep(dep android.Module) error {
|
||||
|
@ -471,12 +498,12 @@ func (paths *scopePaths) extractApiInfoFromDep(dep android.Module) error {
|
|||
})
|
||||
}
|
||||
|
||||
func (paths *scopePaths) extractStubsSourceInfoFromApiStubsProviders(provider ApiStubsProvider) {
|
||||
paths.stubsSrcJar = provider.StubsSrcJar()
|
||||
func (paths *scopePaths) extractStubsSourceInfoFromApiStubsProviders(provider ApiStubsSrcProvider) {
|
||||
paths.stubsSrcJar = android.OptionalPathForPath(provider.StubsSrcJar())
|
||||
}
|
||||
|
||||
func (paths *scopePaths) extractStubsSourceInfoFromDep(dep android.Module) error {
|
||||
return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) {
|
||||
return paths.treatDepAsApiStubsSrcProvider(dep, func(provider ApiStubsSrcProvider) {
|
||||
paths.extractStubsSourceInfoFromApiStubsProviders(provider)
|
||||
})
|
||||
}
|
||||
|
@ -1314,10 +1341,10 @@ type sdkLibraryScopeProperties struct {
|
|||
Stub_srcs []string `android:"path"`
|
||||
|
||||
// The current.txt
|
||||
Current_api string `android:"path"`
|
||||
Current_api *string `android:"path"`
|
||||
|
||||
// The removed.txt
|
||||
Removed_api string `android:"path"`
|
||||
Removed_api *string `android:"path"`
|
||||
}
|
||||
|
||||
type sdkLibraryImportProperties struct {
|
||||
|
@ -1427,7 +1454,9 @@ func (module *sdkLibraryImport) createInternalModules(mctx android.DefaultableHo
|
|||
|
||||
module.createJavaImportForStubs(mctx, apiScope, scopeProperties)
|
||||
|
||||
module.createPrebuiltStubsSources(mctx, apiScope, scopeProperties)
|
||||
if len(scopeProperties.Stub_srcs) > 0 {
|
||||
module.createPrebuiltStubsSources(mctx, apiScope, scopeProperties)
|
||||
}
|
||||
}
|
||||
|
||||
javaSdkLibraries := javaSdkLibraries(mctx.Config())
|
||||
|
@ -1479,22 +1508,40 @@ func (module *sdkLibraryImport) DepsMutator(ctx android.BottomUpMutatorContext)
|
|||
|
||||
// Add dependencies to the prebuilt stubs library
|
||||
ctx.AddVariationDependencies(nil, apiScope.stubsTag, module.stubsLibraryModuleName(apiScope))
|
||||
|
||||
if len(scopeProperties.Stub_srcs) > 0 {
|
||||
// Add dependencies to the prebuilt stubs source library
|
||||
ctx.AddVariationDependencies(nil, apiScope.stubsSourceTag, module.stubsSourceModuleName(apiScope))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (module *sdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
// Record the paths to the prebuilt stubs library.
|
||||
// Record the paths to the prebuilt stubs library and stubs source.
|
||||
ctx.VisitDirectDeps(func(to android.Module) {
|
||||
tag := ctx.OtherModuleDependencyTag(to)
|
||||
|
||||
if lib, ok := to.(Dependency); ok {
|
||||
if scopeTag, ok := tag.(scopeDependencyTag); ok {
|
||||
apiScope := scopeTag.apiScope
|
||||
scopePaths := module.getScopePathsCreateIfNeeded(apiScope)
|
||||
scopePaths.stubsHeaderPath = lib.HeaderJars()
|
||||
}
|
||||
// Extract information from any of the scope specific dependencies.
|
||||
if scopeTag, ok := tag.(scopeDependencyTag); ok {
|
||||
apiScope := scopeTag.apiScope
|
||||
scopePaths := module.getScopePathsCreateIfNeeded(apiScope)
|
||||
|
||||
// Extract information from the dependency. The exact information extracted
|
||||
// is determined by the nature of the dependency which is determined by the tag.
|
||||
scopeTag.extractDepInfo(ctx, to, scopePaths)
|
||||
}
|
||||
})
|
||||
|
||||
// Populate the scope paths with information from the properties.
|
||||
for apiScope, scopeProperties := range module.scopeProperties {
|
||||
if len(scopeProperties.Jars) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
paths := module.getScopePathsCreateIfNeeded(apiScope)
|
||||
paths.currentApiFilePath = android.OptionalPathForModuleSrc(ctx, scopeProperties.Current_api)
|
||||
paths.removedApiFilePath = android.OptionalPathForModuleSrc(ctx, scopeProperties.Removed_api)
|
||||
}
|
||||
}
|
||||
|
||||
func (module *sdkLibraryImport) sdkJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths {
|
||||
|
@ -1685,9 +1732,9 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe
|
|||
properties := scopeProperties{}
|
||||
properties.Jars = jars
|
||||
properties.SdkVersion = sdk.sdkVersionForStubsLibrary(ctx.SdkModuleContext(), apiScope)
|
||||
properties.StubsSrcJar = paths.stubsSrcJar
|
||||
properties.CurrentApiFile = paths.currentApiFilePath
|
||||
properties.RemovedApiFile = paths.removedApiFilePath
|
||||
properties.StubsSrcJar = paths.stubsSrcJar.Path()
|
||||
properties.CurrentApiFile = paths.currentApiFilePath.Path()
|
||||
properties.RemovedApiFile = paths.removedApiFilePath.Path()
|
||||
s.Scopes[apiScope] = properties
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue