Retry: Generate soong_config_module_type inline in the snapshot
Previously, this imported the soong_config_module_type definitions from
a manually curated file. That had a couple of problems:
1. It required that the file be manually updated everytime that a new
module_type was added to an sdk snapshot controlled by a specific
config variable.
2. Adding a new config variable required creating another file to be
manually curated.
3. It made a snapshot that was generated for an earlier release
dependent on an additional file from that release which was in a
separate repository and would require a lot of extra work to update
if necessary.
This change generates the soong_config_module_type inline in the
snapshot Android.bp file and while it makes it slightly bigger it makes
each snapshot much more self contained and makes it easier to add
module specific config variables.
The latter is the main driver for this change as follow up changes will
add module specific variables for the optional modules.
Due to bug 235475711 each soong_config_module_type has to be unique
across all mainline modules so this uses both the module short name
and a prefix associated with the SdkType to generate unique module
names. However, that only affects the S snapshots as from T onwards is
is not necessary to use soong_config_module_type modules at all.
Bug: 233965247
Test: atest --host mainline_modules_sdks_test
packages/modules/common/build/mainline_modules_sdks.sh
# Extract art sdk and module_exports snapshots into
# prebuilts/module_sdk/art and then run "m nothing"
Change-Id: Ib0e2ece1779451dffff6dfaca7ca39b264004b5b
This commit is contained in:
@@ -108,9 +108,8 @@ class SoongConfigBoilerplateInserter(SoongConfigVarTransformation):
|
||||
through a Soong configuration variable.
|
||||
"""
|
||||
|
||||
# The bp file containing the definitions of the configuration module types
|
||||
# to use in the sdk.
|
||||
configBpDefFile: str
|
||||
# The configuration variable that will control the prefer setting.
|
||||
configVar: ConfigVar
|
||||
|
||||
# The prefix to use for the soong config module types.
|
||||
configModuleTypePrefix: str
|
||||
@@ -202,32 +201,14 @@ class SoongConfigBoilerplateInserter(SoongConfigVarTransformation):
|
||||
content_lines.extend(module_content)
|
||||
content_lines.append("}")
|
||||
|
||||
if self.configBpDefFile:
|
||||
# Add the soong_config_module_type_import module definition that
|
||||
# imports the soong config module types into this bp file to the
|
||||
# header lines so that they appear before any uses.
|
||||
module_types = "\n".join([
|
||||
f' "{self.config_module_type(mt)}",'
|
||||
for mt in sorted(config_module_types)
|
||||
])
|
||||
# Add the soong_config_module_type module definitions to the header
|
||||
# lines so that they appear before any uses.
|
||||
header_lines.append("")
|
||||
for module_type in sorted(config_module_types):
|
||||
# Create the corresponding soong config module type name by adding
|
||||
# the prefix.
|
||||
config_module_type = self.configModuleTypePrefix + module_type
|
||||
header_lines.append(f"""
|
||||
// Soong config variable stanza added by {producer.script}.
|
||||
soong_config_module_type_import {{
|
||||
from: "{self.configBpDefFile}",
|
||||
module_types: [
|
||||
{module_types}
|
||||
],
|
||||
}}
|
||||
""")
|
||||
else:
|
||||
# Add the soong_config_module_type module definitions to the header
|
||||
# lines so that they appear before any uses.
|
||||
header_lines.append("")
|
||||
for module_type in sorted(config_module_types):
|
||||
# Create the corresponding soong config module type name by
|
||||
# adding the prefix.
|
||||
config_module_type = self.config_module_type(module_type)
|
||||
header_lines.append(f"""
|
||||
// Soong config variable module type added by {producer.script}.
|
||||
soong_config_module_type {{
|
||||
name: "{config_module_type}",
|
||||
@@ -823,13 +804,6 @@ class MainlineModule:
|
||||
name="module_build_from_source",
|
||||
)
|
||||
|
||||
# The bp file containing the definitions of the configuration module types
|
||||
# to use in the sdk.
|
||||
configBpDefFile: str = "packages/modules/common/Android.bp"
|
||||
|
||||
# The prefix to use for the soong config module types.
|
||||
configModuleTypePrefix: str = "module_"
|
||||
|
||||
for_r_build: typing.Optional[ForRBuild] = None
|
||||
|
||||
# The last release on which this module was optional.
|
||||
@@ -873,13 +847,11 @@ class MainlineModule:
|
||||
"""Returns true for bundled modules. See BundledMainlineModule."""
|
||||
return False
|
||||
|
||||
def transformations(self, build_release):
|
||||
def transformations(self, build_release, sdk_type):
|
||||
"""Returns the transformations to apply to this module's snapshot(s)."""
|
||||
transformations = []
|
||||
|
||||
config_var = self.configVar
|
||||
config_module_type_prefix = self.configModuleTypePrefix
|
||||
config_bp_def_file = self.configBpDefFile
|
||||
|
||||
# If the module is optional then it needs its own Soong config
|
||||
# variable to allow it to be managed separately from other modules.
|
||||
@@ -889,18 +861,16 @@ class MainlineModule:
|
||||
namespace=f"{self.short_name}_module",
|
||||
name="source_build",
|
||||
)
|
||||
config_module_type_prefix = f"{self.short_name}_prebuilt_"
|
||||
# Optional modules don't have their own config_bp_def_file so
|
||||
# they have to generate the soong_config_module_types inline.
|
||||
config_bp_def_file = ""
|
||||
|
||||
prefer_handling = build_release.preferHandling
|
||||
if prefer_handling == PreferHandling.SOONG_CONFIG:
|
||||
sdk_type_prefix = sdk_type.configModuleTypePrefix
|
||||
config_module_type_prefix = \
|
||||
f"{self.short_name}{sdk_type_prefix}_prebuilt_"
|
||||
inserter = SoongConfigBoilerplateInserter(
|
||||
"Android.bp",
|
||||
configVar=config_var,
|
||||
configModuleTypePrefix=config_module_type_prefix,
|
||||
configBpDefFile=config_bp_def_file)
|
||||
configModuleTypePrefix=config_module_type_prefix)
|
||||
transformations.append(inserter)
|
||||
elif prefer_handling == PreferHandling.USE_SOURCE_CONFIG_VAR_PROPERTY:
|
||||
transformation = UseSourceConfigVarTransformation(
|
||||
@@ -928,7 +898,7 @@ class BundledMainlineModule(MainlineModule):
|
||||
def is_bundled(self):
|
||||
return True
|
||||
|
||||
def transformations(self, build_release):
|
||||
def transformations(self, build_release, sdk_type):
|
||||
# Bundled modules are only used on thin branches where the corresponding
|
||||
# sources are absent, so skip transformations and keep the default
|
||||
# `prefer: false`.
|
||||
@@ -950,8 +920,6 @@ MAINLINE_MODULES = [
|
||||
namespace="art_module",
|
||||
name="source_build",
|
||||
),
|
||||
configBpDefFile="prebuilts/module_sdk/art/SoongConfig.bp",
|
||||
configModuleTypePrefix="art_prebuilt_",
|
||||
),
|
||||
MainlineModule(
|
||||
apex="com.android.conscrypt",
|
||||
@@ -1233,7 +1201,8 @@ class SdkDistProducer:
|
||||
|
||||
sdk_dist_subdir = os.path.join(sdk_dist_dir, module.apex, subdir)
|
||||
sdk_path = sdk_snapshot_zip_file(snapshots_dir, sdk, sdk_version)
|
||||
transformations = module.transformations(build_release)
|
||||
sdk_type = sdk_type_from_name(sdk)
|
||||
transformations = module.transformations(build_release, sdk_type)
|
||||
self.dist_sdk_snapshot_zip(sdk_path, sdk_dist_subdir, transformations)
|
||||
|
||||
def dist_sdk_snapshot_zip(self, src_sdk_zip, sdk_dist_dir, transformations):
|
||||
@@ -1380,15 +1349,24 @@ def google_to_aosp_name(name):
|
||||
class SdkType:
|
||||
name: str
|
||||
|
||||
configModuleTypePrefix: str
|
||||
|
||||
providesApis: bool = False
|
||||
|
||||
|
||||
Sdk = SdkType(
|
||||
name="sdk",
|
||||
configModuleTypePrefix="",
|
||||
providesApis=True,
|
||||
)
|
||||
HostExports = SdkType(name="host-exports")
|
||||
TestExports = SdkType(name="test-exports")
|
||||
HostExports = SdkType(
|
||||
name="host-exports",
|
||||
configModuleTypePrefix="_host_exports",
|
||||
)
|
||||
TestExports = SdkType(
|
||||
name="test-exports",
|
||||
configModuleTypePrefix="_test_exports",
|
||||
)
|
||||
|
||||
|
||||
def sdk_type_from_name(name):
|
||||
|
||||
@@ -417,15 +417,14 @@ class TestAndroidBpTransformations(unittest.TestCase):
|
||||
"""Tests the transformations applied to a common mainline sdk on S.
|
||||
|
||||
This uses ipsec as an example of a common mainline sdk. This checks
|
||||
that the correct Soong config module types and variables are used and
|
||||
that it imports the definitions from the correct location.
|
||||
that the general Soong config module types and variables are used.
|
||||
"""
|
||||
src = read_test_data("ipsec_Android.bp.input")
|
||||
|
||||
expected = read_test_data("ipsec_Android.bp.expected")
|
||||
|
||||
module = MAINLINE_MODULES_BY_APEX["com.android.ipsec"]
|
||||
transformations = module.transformations(mm.S)
|
||||
transformations = module.transformations(mm.S, mm.Sdk)
|
||||
|
||||
self.apply_transformations(src, transformations, expected)
|
||||
|
||||
@@ -440,7 +439,7 @@ class TestAndroidBpTransformations(unittest.TestCase):
|
||||
expected = read_test_data("ipsec_tiramisu_Android.bp.expected")
|
||||
|
||||
module = MAINLINE_MODULES_BY_APEX["com.android.ipsec"]
|
||||
transformations = module.transformations(mm.Tiramisu)
|
||||
transformations = module.transformations(mm.Tiramisu, mm.Sdk)
|
||||
|
||||
self.apply_transformations(src, transformations, expected)
|
||||
|
||||
@@ -456,7 +455,7 @@ class TestAndroidBpTransformations(unittest.TestCase):
|
||||
expected = read_test_data("wifi_Android.bp.expected")
|
||||
|
||||
module = MAINLINE_MODULES_BY_APEX["com.android.wifi"]
|
||||
transformations = module.transformations(mm.S)
|
||||
transformations = module.transformations(mm.S, mm.Sdk)
|
||||
|
||||
self.apply_transformations(src, transformations, expected)
|
||||
|
||||
@@ -471,7 +470,7 @@ class TestAndroidBpTransformations(unittest.TestCase):
|
||||
expected = read_test_data("wifi_tiramisu_Android.bp.expected")
|
||||
|
||||
module = MAINLINE_MODULES_BY_APEX["com.android.wifi"]
|
||||
transformations = module.transformations(mm.Tiramisu)
|
||||
transformations = module.transformations(mm.Tiramisu, mm.Sdk)
|
||||
|
||||
self.apply_transformations(src, transformations, expected)
|
||||
|
||||
@@ -480,14 +479,30 @@ class TestAndroidBpTransformations(unittest.TestCase):
|
||||
|
||||
The ART mainline module uses a different Soong config setup to the
|
||||
common mainline modules. This checks that the ART specific Soong config
|
||||
module types, variable and imports are used.
|
||||
module types, and variables are used.
|
||||
"""
|
||||
src = read_test_data("art_Android.bp.input")
|
||||
|
||||
expected = read_test_data("art_Android.bp.expected")
|
||||
|
||||
module = MAINLINE_MODULES_BY_APEX["com.android.art"]
|
||||
transformations = module.transformations(mm.S)
|
||||
transformations = module.transformations(mm.S, mm.Sdk)
|
||||
|
||||
self.apply_transformations(src, transformations, expected)
|
||||
|
||||
def test_art_module_exports(self):
|
||||
"""Tests the transformations applied to a the ART mainline module.
|
||||
|
||||
The ART mainline module uses a different Soong config setup to the
|
||||
common mainline modules. This checks that the ART specific Soong config
|
||||
module types, and variables are used.
|
||||
"""
|
||||
src = read_test_data("art_Android.bp.input")
|
||||
|
||||
expected = read_test_data("art_host_exports_Android.bp.expected")
|
||||
|
||||
module = MAINLINE_MODULES_BY_APEX["com.android.art"]
|
||||
transformations = module.transformations(mm.S, mm.HostExports)
|
||||
|
||||
self.apply_transformations(src, transformations, expected)
|
||||
|
||||
@@ -505,7 +520,7 @@ class TestAndroidBpTransformations(unittest.TestCase):
|
||||
expected = src
|
||||
|
||||
module = MAINLINE_MODULES_BY_APEX["com.android.ipsec"]
|
||||
transformations = module.transformations(mm.R)
|
||||
transformations = module.transformations(mm.R, mm.Sdk)
|
||||
|
||||
self.apply_transformations(src, transformations, expected)
|
||||
|
||||
|
||||
@@ -1,13 +1,30 @@
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
// Soong config variable stanza added by test_art.
|
||||
soong_config_module_type_import {
|
||||
from: "prebuilts/module_sdk/art/SoongConfig.bp",
|
||||
module_types: [
|
||||
"art_prebuilt_java_import",
|
||||
"art_prebuilt_prebuilt_bootclasspath_fragment",
|
||||
"art_prebuilt_prebuilt_platform_compat_config",
|
||||
],
|
||||
// Soong config variable module type added by test_art.
|
||||
soong_config_module_type {
|
||||
name: "art_prebuilt_java_import",
|
||||
module_type: "java_import",
|
||||
config_namespace: "art_module",
|
||||
bool_variables: ["source_build"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
// Soong config variable module type added by test_art.
|
||||
soong_config_module_type {
|
||||
name: "art_prebuilt_prebuilt_bootclasspath_fragment",
|
||||
module_type: "prebuilt_bootclasspath_fragment",
|
||||
config_namespace: "art_module",
|
||||
bool_variables: ["source_build"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
// Soong config variable module type added by test_art.
|
||||
soong_config_module_type {
|
||||
name: "art_prebuilt_prebuilt_platform_compat_config",
|
||||
module_type: "prebuilt_platform_compat_config",
|
||||
config_namespace: "art_module",
|
||||
bool_variables: ["source_build"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
package {
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
// Soong config variable module type added by test_art_module_exports.
|
||||
soong_config_module_type {
|
||||
name: "art_host_exports_prebuilt_java_import",
|
||||
module_type: "java_import",
|
||||
config_namespace: "art_module",
|
||||
bool_variables: ["source_build"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
// Soong config variable module type added by test_art_module_exports.
|
||||
soong_config_module_type {
|
||||
name: "art_host_exports_prebuilt_prebuilt_bootclasspath_fragment",
|
||||
module_type: "prebuilt_bootclasspath_fragment",
|
||||
config_namespace: "art_module",
|
||||
bool_variables: ["source_build"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
// Soong config variable module type added by test_art_module_exports.
|
||||
soong_config_module_type {
|
||||
name: "art_host_exports_prebuilt_prebuilt_platform_compat_config",
|
||||
module_type: "prebuilt_platform_compat_config",
|
||||
config_namespace: "art_module",
|
||||
bool_variables: ["source_build"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
package {
|
||||
// A default list here prevents the license LSC from adding its own list which would
|
||||
// be unnecessary as every module in the sdk already has its own licenses property.
|
||||
default_applicable_licenses: ["Android-Apache-2.0"],
|
||||
}
|
||||
|
||||
art_host_exports_prebuilt_prebuilt_bootclasspath_fragment {
|
||||
name: "art-bootclasspath-fragment",
|
||||
// Do not prefer prebuilt if the Soong config variable "source_build" in namespace "art_module" is true.
|
||||
prefer: true,
|
||||
soong_config_variables: {
|
||||
source_build: {
|
||||
prefer: false,
|
||||
},
|
||||
},
|
||||
visibility: [
|
||||
"//art/build/apex",
|
||||
"//art/build/boot",
|
||||
"//art/build/sdk",
|
||||
"//prebuilts:__subpackages__",
|
||||
],
|
||||
apex_available: [
|
||||
"com.android.art",
|
||||
],
|
||||
licenses: ["art-module-sdk_art_license"],
|
||||
image_name: "art",
|
||||
contents: [
|
||||
"core-oj",
|
||||
"core-libart",
|
||||
"okhttp",
|
||||
"bouncycastle",
|
||||
"apache-xml",
|
||||
],
|
||||
api: {
|
||||
stub_libs: ["art.module.public.api"],
|
||||
},
|
||||
core_platform_api: {
|
||||
stub_libs: ["art.module.public.api.stubs.module_lib"],
|
||||
},
|
||||
hidden_api: {
|
||||
max_target_o_low_priority: ["hiddenapi/hiddenapi-max-target-o-low-priority.txt"],
|
||||
blocked: ["hiddenapi/hiddenapi-blocked.txt"],
|
||||
unsupported_packages: ["hiddenapi/hiddenapi-unsupported-packages.txt"],
|
||||
stub_flags: "hiddenapi/stub-flags.csv",
|
||||
annotation_flags: "hiddenapi/annotation-flags.csv",
|
||||
metadata: "hiddenapi/metadata.csv",
|
||||
index: "hiddenapi/index.csv",
|
||||
all_flags: "hiddenapi/all-flags.csv",
|
||||
},
|
||||
}
|
||||
|
||||
art_host_exports_prebuilt_prebuilt_platform_compat_config {
|
||||
name: "libcore-platform-compat-config",
|
||||
// Do not prefer prebuilt if the Soong config variable "source_build" in namespace "art_module" is true.
|
||||
prefer: true,
|
||||
soong_config_variables: {
|
||||
source_build: {
|
||||
prefer: false,
|
||||
},
|
||||
},
|
||||
visibility: [
|
||||
"//art/build/apex",
|
||||
"//art/build/sdk",
|
||||
"//libcore",
|
||||
"//prebuilts:__subpackages__",
|
||||
],
|
||||
licenses: ["art-module-sdk_libcore_license"],
|
||||
metadata: "compat_configs/libcore-platform-compat-config/libcore-platform-compat-config_meta.xml",
|
||||
}
|
||||
|
||||
art_host_exports_prebuilt_java_import {
|
||||
name: "core-oj",
|
||||
// Do not prefer prebuilt if the Soong config variable "source_build" in namespace "art_module" is true.
|
||||
prefer: true,
|
||||
soong_config_variables: {
|
||||
source_build: {
|
||||
prefer: false,
|
||||
},
|
||||
},
|
||||
visibility: [
|
||||
"//art/build/apex",
|
||||
"//art/build/sdk",
|
||||
"//external/wycheproof",
|
||||
"//libcore",
|
||||
"//libcore/benchmarks",
|
||||
"//packages/modules/ArtPrebuilt",
|
||||
"//prebuilts:__subpackages__",
|
||||
],
|
||||
apex_available: [
|
||||
"com.android.art",
|
||||
"com.android.art.debug",
|
||||
],
|
||||
licenses: ["art-module-sdk_libcore_license"],
|
||||
jars: ["java/core-oj.jar"],
|
||||
}
|
||||
@@ -1,12 +1,21 @@
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
// Soong config variable stanza added by test_common_mainline_module.
|
||||
soong_config_module_type_import {
|
||||
from: "packages/modules/common/Android.bp",
|
||||
module_types: [
|
||||
"module_java_sdk_library_import",
|
||||
"module_prebuilt_bootclasspath_fragment",
|
||||
],
|
||||
// Soong config variable module type added by test_common_mainline_module.
|
||||
soong_config_module_type {
|
||||
name: "ipsec_prebuilt_java_sdk_library_import",
|
||||
module_type: "java_sdk_library_import",
|
||||
config_namespace: "ANDROID",
|
||||
bool_variables: ["module_build_from_source"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
// Soong config variable module type added by test_common_mainline_module.
|
||||
soong_config_module_type {
|
||||
name: "ipsec_prebuilt_prebuilt_bootclasspath_fragment",
|
||||
module_type: "prebuilt_bootclasspath_fragment",
|
||||
config_namespace: "ANDROID",
|
||||
bool_variables: ["module_build_from_source"],
|
||||
properties: ["prefer"],
|
||||
}
|
||||
|
||||
package {
|
||||
@@ -15,7 +24,7 @@ package {
|
||||
default_applicable_licenses: ["Android-Apache-2.0"],
|
||||
}
|
||||
|
||||
module_prebuilt_bootclasspath_fragment {
|
||||
ipsec_prebuilt_prebuilt_bootclasspath_fragment {
|
||||
name: "com.android.ipsec-bootclasspath-fragment",
|
||||
// Do not prefer prebuilt if the Soong config variable "module_build_from_source" in namespace "ANDROID" is true.
|
||||
prefer: true,
|
||||
@@ -37,7 +46,7 @@ module_prebuilt_bootclasspath_fragment {
|
||||
},
|
||||
}
|
||||
|
||||
module_java_sdk_library_import {
|
||||
ipsec_prebuilt_java_sdk_library_import {
|
||||
name: "android.net.ipsec.ike",
|
||||
// Do not prefer prebuilt if the Soong config variable "module_build_from_source" in namespace "ANDROID" is true.
|
||||
prefer: true,
|
||||
|
||||
Reference in New Issue
Block a user