Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
// Copyright (C) 2019 The Android Open Source Project
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package android
|
|
|
|
|
|
|
|
import (
|
2019-12-13 12:22:16 +01:00
|
|
|
"sort"
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
"strings"
|
|
|
|
|
2019-11-28 15:31:38 +01:00
|
|
|
"github.com/google/blueprint"
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
"github.com/google/blueprint/proptools"
|
|
|
|
)
|
|
|
|
|
2020-03-30 16:33:32 +02:00
|
|
|
// Extracted from SdkAware to make it easier to define custom subsets of the
|
|
|
|
// SdkAware interface and improve code navigation within the IDE.
|
|
|
|
//
|
|
|
|
// In addition to its use in SdkAware this interface must also be implemented by
|
|
|
|
// APEX to specify the SDKs required by that module and its contents. e.g. APEX
|
|
|
|
// is expected to implement RequiredSdks() by reading its own properties like
|
|
|
|
// `uses_sdks`.
|
|
|
|
type RequiredSdks interface {
|
|
|
|
// The set of SDKs required by an APEX and its contents.
|
|
|
|
RequiredSdks() SdkRefs
|
|
|
|
}
|
|
|
|
|
2020-07-22 14:52:01 +02:00
|
|
|
// Provided to improve code navigation with the IDE.
|
|
|
|
type sdkAwareWithoutModule interface {
|
2020-03-30 16:33:32 +02:00
|
|
|
RequiredSdks
|
|
|
|
|
Remove duplicate component from sdk snapshot
Previously, an sdk snapshot could contain the following:
* A java_sdk_library_import module, e.g. "foo" which creates component
modules "foo.stubs", etc.
* A corresponding versioned module, e.g. "sdk_foo@current" which
created component modules "sdk_foo@current.stubs", etc.
* An internal (to the sdk snapshot) java_import for one of "foo"'s
components, e.g. "sdk_foo.stubs"
* A corresponding versioned module, e.g. "sdk_foo.stubs@current".
That causes a few problems:
1. The "foo.stubs" is duplicated.
2. The names of the components created by the versioned
java_sdk_library_import are invalid, as they append the component's
suffix to the version and not the name before the version.
The latter causes problems when building against prebuilts and fixing
that causes the generated snapshot to be invalid because it contains
duplicate definitions of the "sdk_foo.stubs@current" module. One
explicitly in the Android.bp file and one created by the
"sdk_foo@current" module.
Removing the duplicates from the snapshot causes errors as the name
generated by the snapshot for the component module, i.e.
"sdk_foo.stubs@current" does not match the name generated by the
"sdk_foo@current", i.e. "sdk_foo@current.stubs".
This change fixes them together.
Bug: 179354495
Test: m nothing
Merged-In: I515f235fe21755b5275af12366e96c24c94c0273
Change-Id: I515f235fe21755b5275af12366e96c24c94c0273
(cherry picked from commit a1aa7387f74a49c8c974ba2198def0e081488624)
2021-04-29 22:50:40 +02:00
|
|
|
// SdkMemberComponentName will return the name to use for a component of this module based on the
|
|
|
|
// base name of this module.
|
|
|
|
//
|
|
|
|
// The baseName is the name returned by ModuleBase.BaseModuleName(), i.e. the name specified in
|
|
|
|
// the name property in the .bp file so will not include the prebuilt_ prefix.
|
|
|
|
//
|
|
|
|
// The componentNameCreator is a func for creating the name of a component from the base name of
|
|
|
|
// the module, e.g. it could just append ".component" to the name passed in.
|
|
|
|
//
|
|
|
|
// This is intended to be called by prebuilt modules that create component models. It is because
|
|
|
|
// prebuilt module base names come in a variety of different forms:
|
|
|
|
// * unversioned - this is the same as the source module.
|
|
|
|
// * internal to an sdk - this is the unversioned name prefixed by the base name of the sdk
|
|
|
|
// module.
|
|
|
|
// * versioned - this is the same as the internal with the addition of an "@<version>" suffix.
|
|
|
|
//
|
|
|
|
// While this can be called from a source module in that case it will behave the same way as the
|
|
|
|
// unversioned name and return the result of calling the componentNameCreator func on the supplied
|
|
|
|
// base name.
|
|
|
|
//
|
|
|
|
// e.g. Assuming the componentNameCreator func simply appends ".component" to the name passed in
|
|
|
|
// then this will work as follows:
|
|
|
|
// * An unversioned name of "foo" will return "foo.component".
|
|
|
|
// * An internal to the sdk name of "sdk_foo" will return "sdk_foo.component".
|
|
|
|
// * A versioned name of "sdk_foo@current" will return "sdk_foo.component@current".
|
|
|
|
//
|
|
|
|
// Note that in the latter case the ".component" suffix is added before the version. Adding it
|
|
|
|
// after would change the version.
|
|
|
|
SdkMemberComponentName(baseName string, componentNameCreator func(string) string) string
|
|
|
|
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
sdkBase() *SdkBase
|
|
|
|
MakeMemberOf(sdk SdkRef)
|
|
|
|
IsInAnySdk() bool
|
2021-05-06 16:53:19 +02:00
|
|
|
|
|
|
|
// IsVersioned determines whether the module is versioned, i.e. has a name of the form
|
|
|
|
// <name>@<version>
|
|
|
|
IsVersioned() bool
|
|
|
|
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
ContainingSdk() SdkRef
|
|
|
|
MemberName() string
|
|
|
|
BuildWithSdks(sdks SdkRefs)
|
|
|
|
}
|
|
|
|
|
2020-07-22 14:52:01 +02:00
|
|
|
// SdkAware is the interface that must be supported by any module to become a member of SDK or to be
|
|
|
|
// built with SDK
|
|
|
|
type SdkAware interface {
|
|
|
|
Module
|
|
|
|
sdkAwareWithoutModule
|
|
|
|
}
|
|
|
|
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
// SdkRef refers to a version of an SDK
|
|
|
|
type SdkRef struct {
|
|
|
|
Name string
|
|
|
|
Version string
|
|
|
|
}
|
|
|
|
|
2019-10-11 07:59:13 +02:00
|
|
|
// Unversioned determines if the SdkRef is referencing to the unversioned SDK module
|
|
|
|
func (s SdkRef) Unversioned() bool {
|
|
|
|
return s.Version == ""
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
}
|
|
|
|
|
2019-10-15 08:20:07 +02:00
|
|
|
// String returns string representation of this SdkRef for debugging purpose
|
|
|
|
func (s SdkRef) String() string {
|
|
|
|
if s.Name == "" {
|
|
|
|
return "(No Sdk)"
|
|
|
|
}
|
|
|
|
if s.Unversioned() {
|
|
|
|
return s.Name
|
|
|
|
}
|
|
|
|
return s.Name + string(SdkVersionSeparator) + s.Version
|
|
|
|
}
|
|
|
|
|
2019-10-11 07:59:13 +02:00
|
|
|
// SdkVersionSeparator is a character used to separate an sdk name and its version
|
|
|
|
const SdkVersionSeparator = '@'
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
|
2019-10-11 07:59:13 +02:00
|
|
|
// ParseSdkRef parses a `name@version` style string into a corresponding SdkRef struct
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
func ParseSdkRef(ctx BaseModuleContext, str string, property string) SdkRef {
|
2019-10-11 07:59:13 +02:00
|
|
|
tokens := strings.Split(str, string(SdkVersionSeparator))
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
if len(tokens) < 1 || len(tokens) > 2 {
|
2021-05-06 17:33:52 +02:00
|
|
|
ctx.PropertyErrorf(property, "%q does not follow name@version syntax", str)
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
return SdkRef{Name: "invalid sdk name", Version: "invalid sdk version"}
|
|
|
|
}
|
|
|
|
|
|
|
|
name := tokens[0]
|
|
|
|
|
2019-10-11 07:59:13 +02:00
|
|
|
var version string
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
if len(tokens) == 2 {
|
|
|
|
version = tokens[1]
|
|
|
|
}
|
|
|
|
|
|
|
|
return SdkRef{Name: name, Version: version}
|
|
|
|
}
|
|
|
|
|
|
|
|
type SdkRefs []SdkRef
|
|
|
|
|
2019-10-11 07:59:13 +02:00
|
|
|
// Contains tells if the given SdkRef is in this list of SdkRef's
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
func (refs SdkRefs) Contains(s SdkRef) bool {
|
|
|
|
for _, r := range refs {
|
|
|
|
if r == s {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
type sdkProperties struct {
|
|
|
|
// The SDK that this module is a member of. nil if it is not a member of any SDK
|
|
|
|
ContainingSdk *SdkRef `blueprint:"mutated"`
|
|
|
|
|
|
|
|
// The list of SDK names and versions that are used to build this module
|
|
|
|
RequiredSdks SdkRefs `blueprint:"mutated"`
|
|
|
|
|
|
|
|
// Name of the module that this sdk member is representing
|
|
|
|
Sdk_member_name *string
|
|
|
|
}
|
|
|
|
|
|
|
|
// SdkBase is a struct that is expected to be included in module types to implement the SdkAware
|
|
|
|
// interface. InitSdkAwareModule should be called to initialize this struct.
|
|
|
|
type SdkBase struct {
|
|
|
|
properties sdkProperties
|
2019-11-12 20:39:25 +01:00
|
|
|
module SdkAware
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *SdkBase) sdkBase() *SdkBase {
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
Remove duplicate component from sdk snapshot
Previously, an sdk snapshot could contain the following:
* A java_sdk_library_import module, e.g. "foo" which creates component
modules "foo.stubs", etc.
* A corresponding versioned module, e.g. "sdk_foo@current" which
created component modules "sdk_foo@current.stubs", etc.
* An internal (to the sdk snapshot) java_import for one of "foo"'s
components, e.g. "sdk_foo.stubs"
* A corresponding versioned module, e.g. "sdk_foo.stubs@current".
That causes a few problems:
1. The "foo.stubs" is duplicated.
2. The names of the components created by the versioned
java_sdk_library_import are invalid, as they append the component's
suffix to the version and not the name before the version.
The latter causes problems when building against prebuilts and fixing
that causes the generated snapshot to be invalid because it contains
duplicate definitions of the "sdk_foo.stubs@current" module. One
explicitly in the Android.bp file and one created by the
"sdk_foo@current" module.
Removing the duplicates from the snapshot causes errors as the name
generated by the snapshot for the component module, i.e.
"sdk_foo.stubs@current" does not match the name generated by the
"sdk_foo@current", i.e. "sdk_foo@current.stubs".
This change fixes them together.
Bug: 179354495
Test: m nothing
Merged-In: I515f235fe21755b5275af12366e96c24c94c0273
Change-Id: I515f235fe21755b5275af12366e96c24c94c0273
(cherry picked from commit a1aa7387f74a49c8c974ba2198def0e081488624)
2021-04-29 22:50:40 +02:00
|
|
|
func (s *SdkBase) SdkMemberComponentName(baseName string, componentNameCreator func(string) string) string {
|
|
|
|
if s.MemberName() == "" {
|
|
|
|
return componentNameCreator(baseName)
|
|
|
|
} else {
|
|
|
|
index := strings.LastIndex(baseName, "@")
|
|
|
|
unversionedName := baseName[:index]
|
|
|
|
unversionedComponentName := componentNameCreator(unversionedName)
|
|
|
|
versionSuffix := baseName[index:]
|
|
|
|
return unversionedComponentName + versionSuffix
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-11 07:59:13 +02:00
|
|
|
// MakeMemberOf sets this module to be a member of a specific SDK
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
func (s *SdkBase) MakeMemberOf(sdk SdkRef) {
|
|
|
|
s.properties.ContainingSdk = &sdk
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsInAnySdk returns true if this module is a member of any SDK
|
|
|
|
func (s *SdkBase) IsInAnySdk() bool {
|
|
|
|
return s.properties.ContainingSdk != nil
|
|
|
|
}
|
|
|
|
|
2021-05-06 16:53:19 +02:00
|
|
|
// IsVersioned returns true if this module is versioned.
|
|
|
|
func (s *SdkBase) IsVersioned() bool {
|
|
|
|
return strings.Contains(s.module.Name(), "@")
|
|
|
|
}
|
|
|
|
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
// ContainingSdk returns the SDK that this module is a member of
|
|
|
|
func (s *SdkBase) ContainingSdk() SdkRef {
|
|
|
|
if s.properties.ContainingSdk != nil {
|
|
|
|
return *s.properties.ContainingSdk
|
|
|
|
}
|
2019-10-11 07:59:13 +02:00
|
|
|
return SdkRef{Name: "", Version: ""}
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
}
|
|
|
|
|
2019-10-11 07:59:13 +02:00
|
|
|
// MemberName returns the name of the module that this SDK member is overriding
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
func (s *SdkBase) MemberName() string {
|
|
|
|
return proptools.String(s.properties.Sdk_member_name)
|
|
|
|
}
|
|
|
|
|
|
|
|
// BuildWithSdks is used to mark that this module has to be built with the given SDK(s).
|
|
|
|
func (s *SdkBase) BuildWithSdks(sdks SdkRefs) {
|
|
|
|
s.properties.RequiredSdks = sdks
|
|
|
|
}
|
|
|
|
|
|
|
|
// RequiredSdks returns the SDK(s) that this module has to be built with
|
|
|
|
func (s *SdkBase) RequiredSdks() SdkRefs {
|
|
|
|
return s.properties.RequiredSdks
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitSdkAwareModule initializes the SdkBase struct. This must be called by all modules including
|
|
|
|
// SdkBase.
|
|
|
|
func InitSdkAwareModule(m SdkAware) {
|
|
|
|
base := m.sdkBase()
|
2019-11-12 20:39:25 +01:00
|
|
|
base.module = m
|
Introduce module type 'sdk'
This change introduces a new module type named 'sdk'. It is a logical
group of prebuilt modules that together provide a context (e.g. APIs)
in which Mainline modules (such as APEXes) are built.
A prebuilt module (e.g. java_import) can join an sdk by adding it to the
sdk module as shown below:
sdk {
name: "mysdk#20",
java_libs: ["myjavalib_mysdk_20"],
}
java_import {
name: "myjavalib_mysdk_20",
srcs: ["myjavalib-v20.jar"],
sdk_member_name: "myjavalib",
}
sdk {
name: "mysdk#21",
java_libs: ["myjavalib_mysdk_21"],
}
java_import {
name: "myjavalib_mysdk_21",
srcs: ["myjavalib-v21.jar"],
sdk_member_name: "myjavalib",
}
java_library {
name: "myjavalib",
srcs: ["**/*/*.java"],
}
An APEX can specify the SDK(s) that it wants to build with via the new
'uses_sdks' property.
apex {
name: "myapex",
java_libs: ["libX", "libY"],
uses_sdks: ["mysdk#20"],
}
With this, libX, libY, and their transitive dependencies are all built
with the version 20 of myjavalib (the first java_import module) instead
of the other one (which is for version 21) and java_library having the
same name (which is for ToT).
Bug: 138182343
Test: m (sdk_test.go added)
Change-Id: I7e14c524a7d6a0d9f575fb20822080f39818c01e
2019-07-17 13:08:41 +02:00
|
|
|
m.AddProperties(&base.properties)
|
|
|
|
}
|
2019-11-12 20:39:25 +01:00
|
|
|
|
2021-04-28 01:39:52 +02:00
|
|
|
// IsModuleInVersionedSdk returns true if the module is an versioned sdk.
|
|
|
|
func IsModuleInVersionedSdk(module Module) bool {
|
|
|
|
if s, ok := module.(SdkAware); ok {
|
|
|
|
if !s.ContainingSdk().Unversioned() {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-11-12 20:39:25 +01:00
|
|
|
// Provide support for generating the build rules which will build the snapshot.
|
|
|
|
type SnapshotBuilder interface {
|
|
|
|
// Copy src to the dest (which is a snapshot relative path) and add the dest
|
|
|
|
// to the zip
|
|
|
|
CopyToSnapshot(src Path, dest string)
|
|
|
|
|
2021-07-15 13:42:44 +02:00
|
|
|
// Return the path to an empty file.
|
|
|
|
//
|
|
|
|
// This can be used by sdk member types that need to create an empty file in the snapshot, simply
|
|
|
|
// pass the value returned from this to the CopyToSnapshot() method.
|
|
|
|
EmptyFile() Path
|
|
|
|
|
2019-11-12 20:39:36 +01:00
|
|
|
// Unzip the supplied zip into the snapshot relative directory destDir.
|
|
|
|
UnzipToSnapshot(zipPath Path, destDir string)
|
|
|
|
|
2019-11-27 18:43:54 +01:00
|
|
|
// Add a new prebuilt module to the snapshot. The returned module
|
|
|
|
// must be populated with the module type specific properties. The following
|
|
|
|
// properties will be automatically populated.
|
|
|
|
//
|
|
|
|
// * name
|
|
|
|
// * sdk_member_name
|
|
|
|
// * prefer
|
|
|
|
//
|
|
|
|
// This will result in two Soong modules being generated in the Android. One
|
|
|
|
// that is versioned, coupled to the snapshot version and marked as
|
|
|
|
// prefer=true. And one that is not versioned, not marked as prefer=true and
|
|
|
|
// will only be used if the equivalently named non-prebuilt module is not
|
|
|
|
// present.
|
2019-12-05 19:19:29 +01:00
|
|
|
AddPrebuiltModule(member SdkMember, moduleType string) BpModule
|
2020-01-13 22:03:22 +01:00
|
|
|
|
|
|
|
// The property tag to use when adding a property to a BpModule that contains
|
|
|
|
// references to other sdk members. Using this will ensure that the reference
|
|
|
|
// is correctly output for both versioned and unversioned prebuilts in the
|
|
|
|
// snapshot.
|
|
|
|
//
|
2020-03-06 13:30:43 +01:00
|
|
|
// "required: true" means that the property must only contain references
|
|
|
|
// to other members of the sdk. Passing a reference to a module that is not a
|
|
|
|
// member of the sdk will result in a build error.
|
|
|
|
//
|
|
|
|
// "required: false" means that the property can contain references to modules
|
|
|
|
// that are either members or not members of the sdk. If a reference is to a
|
|
|
|
// module that is a non member then the reference is left unchanged, i.e. it
|
|
|
|
// is not transformed as references to members are.
|
|
|
|
//
|
|
|
|
// The handling of the member names is dependent on whether it is an internal or
|
|
|
|
// exported member. An exported member is one whose name is specified in one of
|
|
|
|
// the member type specific properties. An internal member is one that is added
|
|
|
|
// due to being a part of an exported (or other internal) member and is not itself
|
|
|
|
// an exported member.
|
|
|
|
//
|
|
|
|
// Member names are handled as follows:
|
|
|
|
// * When creating the unversioned form of the module the name is left unchecked
|
|
|
|
// unless the member is internal in which case it is transformed into an sdk
|
|
|
|
// specific name, i.e. by prefixing with the sdk name.
|
|
|
|
//
|
|
|
|
// * When creating the versioned form of the module the name is transformed into
|
|
|
|
// a versioned sdk specific name, i.e. by prefixing with the sdk name and
|
|
|
|
// suffixing with the version.
|
|
|
|
//
|
2020-01-13 22:03:22 +01:00
|
|
|
// e.g.
|
2020-03-06 13:30:43 +01:00
|
|
|
// bpPropertySet.AddPropertyWithTag("libs", []string{"member1", "member2"}, builder.SdkMemberReferencePropertyTag(true))
|
|
|
|
SdkMemberReferencePropertyTag(required bool) BpPropertyTag
|
2019-11-27 18:43:54 +01:00
|
|
|
}
|
|
|
|
|
2020-01-15 15:23:52 +01:00
|
|
|
type BpPropertyTag interface{}
|
|
|
|
|
2019-11-27 18:43:54 +01:00
|
|
|
// A set of properties for use in a .bp file.
|
|
|
|
type BpPropertySet interface {
|
|
|
|
// Add a property, the value can be one of the following types:
|
|
|
|
// * string
|
|
|
|
// * array of the above
|
|
|
|
// * bool
|
2020-09-10 01:40:37 +02:00
|
|
|
// For these types it is an error if multiple properties with the same name
|
|
|
|
// are added.
|
|
|
|
//
|
|
|
|
// * pointer to a struct
|
2019-11-27 18:43:54 +01:00
|
|
|
// * BpPropertySet
|
|
|
|
//
|
2020-09-10 01:40:37 +02:00
|
|
|
// A pointer to a Blueprint-style property struct is first converted into a
|
|
|
|
// BpPropertySet by traversing the fields and adding their values as
|
|
|
|
// properties in a BpPropertySet. A field with a struct value is itself
|
|
|
|
// converted into a BpPropertySet before adding.
|
|
|
|
//
|
|
|
|
// Adding a BpPropertySet is done as follows:
|
|
|
|
// * If no property with the name exists then the BpPropertySet is added
|
|
|
|
// directly to this property. Care must be taken to ensure that it does not
|
|
|
|
// introduce a cycle.
|
|
|
|
// * If a property exists with the name and the current value is a
|
|
|
|
// BpPropertySet then every property of the new BpPropertySet is added to
|
|
|
|
// the existing BpPropertySet.
|
|
|
|
// * Otherwise, if a property exists with the name then it is an error.
|
2019-11-27 18:43:54 +01:00
|
|
|
AddProperty(name string, value interface{})
|
|
|
|
|
2020-01-15 15:23:52 +01:00
|
|
|
// Add a property with an associated tag
|
|
|
|
AddPropertyWithTag(name string, value interface{}, tag BpPropertyTag)
|
|
|
|
|
2019-11-27 18:43:54 +01:00
|
|
|
// Add a property set with the specified name and return so that additional
|
|
|
|
// properties can be added.
|
|
|
|
AddPropertySet(name string) BpPropertySet
|
2021-05-07 02:10:01 +02:00
|
|
|
|
|
|
|
// Add comment for property (or property set).
|
|
|
|
AddCommentForProperty(name, text string)
|
2019-11-27 18:43:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// A .bp module definition.
|
|
|
|
type BpModule interface {
|
|
|
|
BpPropertySet
|
2021-05-07 02:10:01 +02:00
|
|
|
|
|
|
|
// ModuleType returns the module type of the module
|
|
|
|
ModuleType() string
|
|
|
|
|
|
|
|
// Name returns the name of the module or "" if no name has been specified.
|
|
|
|
Name() string
|
2019-11-12 20:39:25 +01:00
|
|
|
}
|
2019-11-28 15:31:38 +01:00
|
|
|
|
2021-05-18 13:54:27 +02:00
|
|
|
// BpPrintable is a marker interface that must be implemented by any struct that is added as a
|
|
|
|
// property value.
|
|
|
|
type BpPrintable interface {
|
|
|
|
bpPrintable()
|
|
|
|
}
|
|
|
|
|
|
|
|
// BpPrintableBase must be embedded within any struct that is added as a
|
|
|
|
// property value.
|
|
|
|
type BpPrintableBase struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b BpPrintableBase) bpPrintable() {
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ BpPrintable = BpPrintableBase{}
|
|
|
|
|
2019-11-28 15:31:38 +01:00
|
|
|
// An individual member of the SDK, includes all of the variants that the SDK
|
|
|
|
// requires.
|
|
|
|
type SdkMember interface {
|
|
|
|
// The name of the member.
|
|
|
|
Name() string
|
|
|
|
|
|
|
|
// All the variants required by the SDK.
|
|
|
|
Variants() []SdkAware
|
|
|
|
}
|
|
|
|
|
2021-04-23 22:20:20 +02:00
|
|
|
// SdkMemberTypeDependencyTag is the interface that a tag must implement in order to allow the
|
2021-05-06 13:02:27 +02:00
|
|
|
// dependent module to be automatically added to the sdk.
|
2019-11-19 20:44:10 +01:00
|
|
|
type SdkMemberTypeDependencyTag interface {
|
|
|
|
blueprint.DependencyTag
|
|
|
|
|
2021-04-23 22:20:20 +02:00
|
|
|
// SdkMemberType returns the SdkMemberType that will be used to automatically add the child module
|
|
|
|
// to the sdk.
|
2021-05-26 11:16:01 +02:00
|
|
|
//
|
|
|
|
// Returning nil will prevent the module being added to the sdk.
|
2021-04-28 00:17:56 +02:00
|
|
|
SdkMemberType(child Module) SdkMemberType
|
2021-04-23 22:20:20 +02:00
|
|
|
|
|
|
|
// ExportMember determines whether a module added to the sdk through this tag will be exported
|
|
|
|
// from the sdk or not.
|
|
|
|
//
|
|
|
|
// An exported member is added to the sdk using its own name, e.g. if "foo" was exported from sdk
|
|
|
|
// "bar" then its prebuilt would be simply called "foo". A member can be added to the sdk via
|
|
|
|
// multiple tags and if any of those tags returns true from this method then the membe will be
|
|
|
|
// exported. Every module added directly to the sdk via one of the member type specific
|
|
|
|
// properties, e.g. java_libs, will automatically be exported.
|
|
|
|
//
|
|
|
|
// If a member is not exported then it is treated as an internal implementation detail of the
|
|
|
|
// sdk and so will be added with an sdk specific name. e.g. if "foo" was an internal member of sdk
|
|
|
|
// "bar" then its prebuilt would be called "bar_foo". Additionally its visibility will be set to
|
|
|
|
// "//visibility:private" so it will not be accessible from outside its Android.bp file.
|
|
|
|
ExportMember() bool
|
2019-11-19 20:44:10 +01:00
|
|
|
}
|
|
|
|
|
2020-07-09 18:32:57 +02:00
|
|
|
var _ SdkMemberTypeDependencyTag = (*sdkMemberDependencyTag)(nil)
|
|
|
|
var _ ReplaceSourceWithPrebuilt = (*sdkMemberDependencyTag)(nil)
|
|
|
|
|
2019-11-19 20:44:10 +01:00
|
|
|
type sdkMemberDependencyTag struct {
|
|
|
|
blueprint.BaseDependencyTag
|
|
|
|
memberType SdkMemberType
|
2021-04-23 22:20:20 +02:00
|
|
|
export bool
|
2019-11-19 20:44:10 +01:00
|
|
|
}
|
|
|
|
|
2021-04-28 00:17:56 +02:00
|
|
|
func (t *sdkMemberDependencyTag) SdkMemberType(_ Module) SdkMemberType {
|
2019-11-19 20:44:10 +01:00
|
|
|
return t.memberType
|
|
|
|
}
|
|
|
|
|
2021-04-23 22:20:20 +02:00
|
|
|
func (t *sdkMemberDependencyTag) ExportMember() bool {
|
|
|
|
return t.export
|
|
|
|
}
|
|
|
|
|
2020-07-09 18:32:57 +02:00
|
|
|
// Prevent dependencies from the sdk/module_exports onto their members from being
|
|
|
|
// replaced with a preferred prebuilt.
|
|
|
|
func (t *sdkMemberDependencyTag) ReplaceSourceWithPrebuilt() bool {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-04-23 22:20:20 +02:00
|
|
|
// DependencyTagForSdkMemberType creates an SdkMemberTypeDependencyTag that will cause any
|
|
|
|
// dependencies added by the tag to be added to the sdk as the specified SdkMemberType and exported
|
|
|
|
// (or not) as specified by the export parameter.
|
|
|
|
func DependencyTagForSdkMemberType(memberType SdkMemberType, export bool) SdkMemberTypeDependencyTag {
|
|
|
|
return &sdkMemberDependencyTag{memberType: memberType, export: export}
|
2019-11-19 20:44:10 +01:00
|
|
|
}
|
|
|
|
|
2019-11-28 15:31:38 +01:00
|
|
|
// Interface that must be implemented for every type that can be a member of an
|
|
|
|
// sdk.
|
|
|
|
//
|
|
|
|
// The basic implementation should look something like this, where ModuleType is
|
|
|
|
// the name of the module type being supported.
|
|
|
|
//
|
2019-12-13 12:22:16 +01:00
|
|
|
// type moduleTypeSdkMemberType struct {
|
|
|
|
// android.SdkMemberTypeBase
|
2019-11-28 15:31:38 +01:00
|
|
|
// }
|
|
|
|
//
|
2019-12-13 12:22:16 +01:00
|
|
|
// func init() {
|
|
|
|
// android.RegisterSdkMemberType(&moduleTypeSdkMemberType{
|
|
|
|
// SdkMemberTypeBase: android.SdkMemberTypeBase{
|
|
|
|
// PropertyName: "module_types",
|
|
|
|
// },
|
|
|
|
// }
|
2019-11-28 15:31:38 +01:00
|
|
|
// }
|
|
|
|
//
|
|
|
|
// ...methods...
|
|
|
|
//
|
|
|
|
type SdkMemberType interface {
|
2019-12-13 12:22:16 +01:00
|
|
|
// The name of the member type property on an sdk module.
|
|
|
|
SdkPropertyName() string
|
|
|
|
|
2021-05-11 01:31:38 +02:00
|
|
|
// RequiresBpProperty returns true if this member type requires its property to be usable within
|
|
|
|
// an Android.bp file.
|
|
|
|
RequiresBpProperty() bool
|
|
|
|
|
2019-12-16 18:43:48 +01:00
|
|
|
// True if the member type supports the sdk/sdk_snapshot, false otherwise.
|
|
|
|
UsableWithSdkAndSdkSnapshot() bool
|
|
|
|
|
2020-07-11 05:52:24 +02:00
|
|
|
// Return true if prebuilt host artifacts may be specific to the host OS. Only
|
|
|
|
// applicable to modules where HostSupported() is true. If this is true,
|
|
|
|
// snapshots will list each host OS variant explicitly and disable all other
|
|
|
|
// host OS'es.
|
|
|
|
IsHostOsDependent() bool
|
|
|
|
|
Add SDK member support for cc_object.
Test: m nothing
Test: Add
sdk {
name: "runtime-module-sdk",
native_shared_libs: [
"libc",
"libdl",
"libm",
"ld-android",
],
native_objects: [
"crtbegin_dynamic",
"crtbegin_static",
"crtend_android",
],
}
to bionic/apex/Android.bp. Then:
build/soong/scripts/build-aml-prebuilts.sh runtime-module-sdk
Take the generated runtime-module-sdk-current.zip and unzip into a
master-art tree without bionic/, edit the generated Android.bp to
extend cc_prebuilt_* modules with:
nocrt: true,
stl: "none",
system_shared_libs: [],
apex_available: ["//apex_available:anyapex"],
recovery_available: true,
vendor_available: true,
ramdisk_available: true,
Then "m com.android.art.debug". This passes Soong but fails in the
build step because more members are required.
Bug: 148934017
Change-Id: I2ab8f6aadb1440b325697cae4a8ed761c62d15d2
2020-03-10 23:37:59 +01:00
|
|
|
// Add dependencies from the SDK module to all the module variants the member
|
|
|
|
// type contributes to the SDK. `names` is the list of module names given in
|
|
|
|
// the member type property (as returned by SdkPropertyName()) in the SDK
|
|
|
|
// module. The exact set of variants required is determined by the SDK and its
|
|
|
|
// properties. The dependencies must be added with the supplied tag.
|
2019-11-28 15:31:38 +01:00
|
|
|
//
|
|
|
|
// The BottomUpMutatorContext provided is for the SDK module.
|
2021-07-14 11:29:36 +02:00
|
|
|
AddDependencies(ctx SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string)
|
2019-11-28 15:31:38 +01:00
|
|
|
|
|
|
|
// Return true if the supplied module is an instance of this member type.
|
|
|
|
//
|
|
|
|
// This is used to check the type of each variant before added to the
|
|
|
|
// SdkMember. Returning false will cause an error to be logged expaining that
|
|
|
|
// the module is not allowed in whichever sdk property it was added.
|
|
|
|
IsInstance(module Module) bool
|
|
|
|
|
2021-05-11 00:58:40 +02:00
|
|
|
// UsesSourceModuleTypeInSnapshot returns true when the AddPrebuiltModule() method returns a
|
|
|
|
// source module type.
|
|
|
|
UsesSourceModuleTypeInSnapshot() bool
|
|
|
|
|
2020-02-27 17:00:53 +01:00
|
|
|
// Add a prebuilt module that the sdk will populate.
|
|
|
|
//
|
2020-05-06 13:41:39 +02:00
|
|
|
// The sdk module code generates the snapshot as follows:
|
2020-02-27 17:00:53 +01:00
|
|
|
//
|
|
|
|
// * A properties struct of type SdkMemberProperties is created for each variant and
|
|
|
|
// populated with information from the variant by calling PopulateFromVariant(SdkAware)
|
|
|
|
// on the struct.
|
|
|
|
//
|
|
|
|
// * An additional properties struct is created into which the common properties will be
|
|
|
|
// added.
|
|
|
|
//
|
|
|
|
// * The variant property structs are analysed to find exported (capitalized) fields which
|
|
|
|
// have common values. Those fields are cleared and the common value added to the common
|
2020-05-06 11:23:19 +02:00
|
|
|
// properties.
|
|
|
|
//
|
|
|
|
// A field annotated with a tag of `sdk:"keep"` will be treated as if it
|
2020-03-10 23:17:04 +01:00
|
|
|
// was not capitalized, i.e. not optimized for common values.
|
2020-02-27 17:00:53 +01:00
|
|
|
//
|
2020-05-06 11:23:19 +02:00
|
|
|
// A field annotated with a tag of `android:"arch_variant"` will be allowed to have
|
|
|
|
// values that differ by arch, fields not tagged as such must have common values across
|
|
|
|
// all variants.
|
|
|
|
//
|
2020-04-30 19:08:29 +02:00
|
|
|
// * Additional field tags can be specified on a field that will ignore certain values
|
|
|
|
// for the purpose of common value optimization. A value that is ignored must have the
|
|
|
|
// default value for the property type. This is to ensure that significant value are not
|
|
|
|
// ignored by accident. The purpose of this is to allow the snapshot generation to reflect
|
|
|
|
// the behavior of the runtime. e.g. if a property is ignored on the host then a property
|
|
|
|
// that is common for android can be treated as if it was common for android and host as
|
|
|
|
// the setting for host is ignored anyway.
|
|
|
|
// * `sdk:"ignored-on-host" - this indicates the property is ignored on the host variant.
|
|
|
|
//
|
2020-02-27 17:00:53 +01:00
|
|
|
// * The sdk module type populates the BpModule structure, creating the arch specific
|
|
|
|
// structure and calls AddToPropertySet(...) on the properties struct to add the member
|
|
|
|
// specific properties in the correct place in the structure.
|
|
|
|
//
|
2020-03-19 17:11:18 +01:00
|
|
|
AddPrebuiltModule(ctx SdkMemberContext, member SdkMember) BpModule
|
2020-02-27 17:00:53 +01:00
|
|
|
|
|
|
|
// Create a structure into which variant specific properties can be added.
|
|
|
|
CreateVariantPropertiesStruct() SdkMemberProperties
|
2019-11-28 15:31:38 +01:00
|
|
|
}
|
2019-12-13 12:22:16 +01:00
|
|
|
|
2021-07-14 11:29:36 +02:00
|
|
|
// SdkDependencyContext provides access to information needed by the SdkMemberType.AddDependencies()
|
|
|
|
// implementations.
|
|
|
|
type SdkDependencyContext interface {
|
|
|
|
BottomUpMutatorContext
|
|
|
|
}
|
|
|
|
|
2019-12-16 18:43:48 +01:00
|
|
|
// Base type for SdkMemberType implementations.
|
2019-12-13 12:22:16 +01:00
|
|
|
type SdkMemberTypeBase struct {
|
2021-05-11 01:31:38 +02:00
|
|
|
PropertyName string
|
|
|
|
|
|
|
|
// When set to true BpPropertyNotRequired indicates that the member type does not require the
|
|
|
|
// property to be specifiable in an Android.bp file.
|
|
|
|
BpPropertyNotRequired bool
|
|
|
|
|
2021-05-06 13:02:27 +02:00
|
|
|
SupportsSdk bool
|
|
|
|
HostOsDependent bool
|
2021-05-11 00:58:40 +02:00
|
|
|
|
|
|
|
// When set to true UseSourceModuleTypeInSnapshot indicates that the member type creates a source
|
|
|
|
// module type in its SdkMemberType.AddPrebuiltModule() method. That prevents the sdk snapshot
|
|
|
|
// code from automatically adding a prefer: true flag.
|
|
|
|
UseSourceModuleTypeInSnapshot bool
|
2019-12-13 12:22:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (b *SdkMemberTypeBase) SdkPropertyName() string {
|
|
|
|
return b.PropertyName
|
|
|
|
}
|
|
|
|
|
2021-05-11 01:31:38 +02:00
|
|
|
func (b *SdkMemberTypeBase) RequiresBpProperty() bool {
|
|
|
|
return !b.BpPropertyNotRequired
|
|
|
|
}
|
|
|
|
|
2019-12-16 18:43:48 +01:00
|
|
|
func (b *SdkMemberTypeBase) UsableWithSdkAndSdkSnapshot() bool {
|
|
|
|
return b.SupportsSdk
|
|
|
|
}
|
|
|
|
|
2020-07-11 05:52:24 +02:00
|
|
|
func (b *SdkMemberTypeBase) IsHostOsDependent() bool {
|
|
|
|
return b.HostOsDependent
|
|
|
|
}
|
|
|
|
|
2021-05-11 00:58:40 +02:00
|
|
|
func (b *SdkMemberTypeBase) UsesSourceModuleTypeInSnapshot() bool {
|
|
|
|
return b.UseSourceModuleTypeInSnapshot
|
|
|
|
}
|
|
|
|
|
2019-12-13 12:22:16 +01:00
|
|
|
// Encapsulates the information about registered SdkMemberTypes.
|
|
|
|
type SdkMemberTypesRegistry struct {
|
|
|
|
// The list of types sorted by property name.
|
|
|
|
list []SdkMemberType
|
|
|
|
}
|
|
|
|
|
2019-12-16 18:43:48 +01:00
|
|
|
func (r *SdkMemberTypesRegistry) copyAndAppend(memberType SdkMemberType) *SdkMemberTypesRegistry {
|
|
|
|
oldList := r.list
|
2019-12-13 12:22:16 +01:00
|
|
|
|
|
|
|
// Copy the slice just in case this is being read while being modified, e.g. when testing.
|
|
|
|
list := make([]SdkMemberType, 0, len(oldList)+1)
|
|
|
|
list = append(list, oldList...)
|
|
|
|
list = append(list, memberType)
|
|
|
|
|
|
|
|
// Sort the member types by their property name to ensure that registry order has no effect
|
|
|
|
// on behavior.
|
|
|
|
sort.Slice(list, func(i1, i2 int) bool {
|
|
|
|
t1 := list[i1]
|
|
|
|
t2 := list[i2]
|
|
|
|
|
|
|
|
return t1.SdkPropertyName() < t2.SdkPropertyName()
|
|
|
|
})
|
|
|
|
|
|
|
|
// Create a new registry so the pointer uniquely identifies the set of registered types.
|
2019-12-16 18:43:48 +01:00
|
|
|
return &SdkMemberTypesRegistry{
|
2019-12-13 12:22:16 +01:00
|
|
|
list: list,
|
|
|
|
}
|
|
|
|
}
|
2019-12-16 18:43:48 +01:00
|
|
|
|
|
|
|
func (r *SdkMemberTypesRegistry) RegisteredTypes() []SdkMemberType {
|
|
|
|
return r.list
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *SdkMemberTypesRegistry) UniqueOnceKey() OnceKey {
|
|
|
|
// Use the pointer to the registry as the unique key.
|
|
|
|
return NewCustomOnceKey(r)
|
|
|
|
}
|
|
|
|
|
|
|
|
// The set of registered SdkMemberTypes, one for sdk module and one for module_exports.
|
|
|
|
var ModuleExportsMemberTypes = &SdkMemberTypesRegistry{}
|
|
|
|
var SdkMemberTypes = &SdkMemberTypesRegistry{}
|
|
|
|
|
|
|
|
// Register an SdkMemberType object to allow them to be used in the sdk and sdk_snapshot module
|
|
|
|
// types.
|
|
|
|
func RegisterSdkMemberType(memberType SdkMemberType) {
|
|
|
|
// All member types are usable with module_exports.
|
|
|
|
ModuleExportsMemberTypes = ModuleExportsMemberTypes.copyAndAppend(memberType)
|
|
|
|
|
|
|
|
// Only those that explicitly indicate it are usable with sdk.
|
|
|
|
if memberType.UsableWithSdkAndSdkSnapshot() {
|
|
|
|
SdkMemberTypes = SdkMemberTypes.copyAndAppend(memberType)
|
|
|
|
}
|
|
|
|
}
|
2020-02-27 17:00:53 +01:00
|
|
|
|
|
|
|
// Base structure for all implementations of SdkMemberProperties.
|
|
|
|
//
|
2020-07-10 01:14:03 +02:00
|
|
|
// Contains common properties that apply across many different member types.
|
2020-02-27 17:00:53 +01:00
|
|
|
type SdkMemberPropertiesBase struct {
|
2020-03-02 11:16:35 +01:00
|
|
|
// The number of unique os types supported by the member variants.
|
2020-03-17 22:04:24 +01:00
|
|
|
//
|
|
|
|
// If a member has a variant with more than one os type then it will need to differentiate
|
|
|
|
// the locations of any of their prebuilt files in the snapshot by os type to prevent them
|
|
|
|
// from colliding. See OsPrefix().
|
|
|
|
//
|
|
|
|
// This property is the same for all variants of a member and so would be optimized away
|
|
|
|
// if it was not explicitly kept.
|
2020-03-10 23:17:04 +01:00
|
|
|
Os_count int `sdk:"keep"`
|
2020-03-02 11:16:35 +01:00
|
|
|
|
|
|
|
// The os type for which these properties refer.
|
2020-03-17 22:04:24 +01:00
|
|
|
//
|
|
|
|
// Provided to allow a member to differentiate between os types in the locations of their
|
|
|
|
// prebuilt files when it supports more than one os type.
|
|
|
|
//
|
|
|
|
// This property is the same for all os type specific variants of a member and so would be
|
|
|
|
// optimized away if it was not explicitly kept.
|
2020-03-10 23:17:04 +01:00
|
|
|
Os OsType `sdk:"keep"`
|
2020-03-17 22:04:24 +01:00
|
|
|
|
|
|
|
// The setting to use for the compile_multilib property.
|
2020-07-10 01:14:03 +02:00
|
|
|
Compile_multilib string `android:"arch_variant"`
|
2020-03-02 11:16:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// The os prefix to use for any file paths in the sdk.
|
|
|
|
//
|
|
|
|
// Is an empty string if the member only provides variants for a single os type, otherwise
|
|
|
|
// is the OsType.Name.
|
|
|
|
func (b *SdkMemberPropertiesBase) OsPrefix() string {
|
|
|
|
if b.Os_count == 1 {
|
|
|
|
return ""
|
|
|
|
} else {
|
|
|
|
return b.Os.Name
|
|
|
|
}
|
2020-02-27 17:00:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (b *SdkMemberPropertiesBase) Base() *SdkMemberPropertiesBase {
|
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
|
|
|
// Interface to be implemented on top of a structure that contains variant specific
|
|
|
|
// information.
|
|
|
|
//
|
|
|
|
// Struct fields that are capitalized are examined for common values to extract. Fields
|
|
|
|
// that are not capitalized are assumed to be arch specific.
|
|
|
|
type SdkMemberProperties interface {
|
|
|
|
// Access the base structure.
|
|
|
|
Base() *SdkMemberPropertiesBase
|
|
|
|
|
2020-03-19 17:11:18 +01:00
|
|
|
// Populate this structure with information from the variant.
|
|
|
|
PopulateFromVariant(ctx SdkMemberContext, variant Module)
|
2020-02-27 17:00:53 +01:00
|
|
|
|
2020-03-19 17:11:18 +01:00
|
|
|
// Add the information from this structure to the property set.
|
|
|
|
AddToPropertySet(ctx SdkMemberContext, propertySet BpPropertySet)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Provides access to information common to a specific member.
|
|
|
|
type SdkMemberContext interface {
|
|
|
|
|
|
|
|
// The module context of the sdk common os variant which is creating the snapshot.
|
|
|
|
SdkModuleContext() ModuleContext
|
|
|
|
|
|
|
|
// The builder of the snapshot.
|
|
|
|
SnapshotBuilder() SnapshotBuilder
|
2020-03-17 22:04:24 +01:00
|
|
|
|
|
|
|
// The type of the member.
|
|
|
|
MemberType() SdkMemberType
|
|
|
|
|
|
|
|
// The name of the member.
|
|
|
|
//
|
|
|
|
// Provided for use by sdk members to create a member specific location within the snapshot
|
|
|
|
// into which to copy the prebuilt files.
|
|
|
|
Name() string
|
2020-02-27 17:00:53 +01:00
|
|
|
}
|
Remove duplicate component from sdk snapshot
Previously, an sdk snapshot could contain the following:
* A java_sdk_library_import module, e.g. "foo" which creates component
modules "foo.stubs", etc.
* A corresponding versioned module, e.g. "sdk_foo@current" which
created component modules "sdk_foo@current.stubs", etc.
* An internal (to the sdk snapshot) java_import for one of "foo"'s
components, e.g. "sdk_foo.stubs"
* A corresponding versioned module, e.g. "sdk_foo.stubs@current".
That causes a few problems:
1. The "foo.stubs" is duplicated.
2. The names of the components created by the versioned
java_sdk_library_import are invalid, as they append the component's
suffix to the version and not the name before the version.
The latter causes problems when building against prebuilts and fixing
that causes the generated snapshot to be invalid because it contains
duplicate definitions of the "sdk_foo.stubs@current" module. One
explicitly in the Android.bp file and one created by the
"sdk_foo@current" module.
Removing the duplicates from the snapshot causes errors as the name
generated by the snapshot for the component module, i.e.
"sdk_foo.stubs@current" does not match the name generated by the
"sdk_foo@current", i.e. "sdk_foo@current.stubs".
This change fixes them together.
Bug: 179354495
Test: m nothing
Merged-In: I515f235fe21755b5275af12366e96c24c94c0273
Change-Id: I515f235fe21755b5275af12366e96c24c94c0273
(cherry picked from commit a1aa7387f74a49c8c974ba2198def0e081488624)
2021-04-29 22:50:40 +02:00
|
|
|
|
|
|
|
// ExportedComponentsInfo contains information about the components that this module exports to an
|
|
|
|
// sdk snapshot.
|
|
|
|
//
|
|
|
|
// A component of a module is a child module that the module creates and which forms an integral
|
|
|
|
// part of the functionality that the creating module provides. A component module is essentially
|
|
|
|
// owned by its creator and is tightly coupled to the creator and other components.
|
|
|
|
//
|
|
|
|
// e.g. the child modules created by prebuilt_apis are not components because they are not tightly
|
|
|
|
// coupled to the prebuilt_apis module. Once they are created the prebuilt_apis ignores them. The
|
|
|
|
// child impl and stub library created by java_sdk_library (and corresponding import) are components
|
|
|
|
// because the creating module depends upon them in order to provide some of its own functionality.
|
|
|
|
//
|
|
|
|
// A component is exported if it is part of an sdk snapshot. e.g. The xml and impl child modules are
|
|
|
|
// components but they are not exported as they are not part of an sdk snapshot.
|
|
|
|
//
|
|
|
|
// This information is used by the sdk snapshot generation code to ensure that it does not create
|
|
|
|
// an sdk snapshot that contains a declaration of the component module and the module that creates
|
|
|
|
// it as that would result in duplicate modules when attempting to use the snapshot. e.g. a snapshot
|
|
|
|
// that included the java_sdk_library_import "foo" and also a java_import "foo.stubs" would fail
|
|
|
|
// as there would be two modules called "foo.stubs".
|
|
|
|
type ExportedComponentsInfo struct {
|
|
|
|
// The names of the exported components.
|
|
|
|
Components []string
|
|
|
|
}
|
|
|
|
|
|
|
|
var ExportedComponentsInfoProvider = blueprint.NewProvider(ExportedComponentsInfo{})
|