summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp22
-rw-r--r--android/config.go40
-rw-r--r--android/config_test.go32
-rw-r--r--android/module.go12
-rw-r--r--android/module_info_json.go10
-rw-r--r--android/rule_builder.go6
-rw-r--r--apex/apex_test.go2
-rw-r--r--cc/afdo.go5
-rw-r--r--dexpreopt/Android.bp1
-rw-r--r--dexpreopt/dexpreopt_tools_zip.go62
-rw-r--r--filesystem/android_device.go99
-rw-r--r--filesystem/filesystem.go3
-rw-r--r--fsgen/filesystem_creator.go15
-rw-r--r--java/builder.go8
-rw-r--r--java/droiddoc.go3
-rw-r--r--java/droidstubs.go24
-rw-r--r--java/droidstubs_test.go6
-rw-r--r--java/java.go1
-rw-r--r--java/java_test.go4
-rw-r--r--java/rro.go5
-rw-r--r--java/sdk.go2
-rw-r--r--scripts/Android.bp10
-rw-r--r--scripts/aconfig-to-metalava-flags.py103
-rwxr-xr-xscripts/keep-flagged-apis.sh37
-rw-r--r--tradefed_modules/test_module_config.go16
25 files changed, 429 insertions, 99 deletions
diff --git a/Android.bp b/Android.bp
index 337545bce..713459112 100644
--- a/Android.bp
+++ b/Android.bp
@@ -176,6 +176,12 @@ build_prop {
footer_files: [
":applied_backported_fixes",
],
+ dist: {
+ targets: [
+ "droidcore-unbundled",
+ "sdk",
+ ],
+ },
// Currently, only microdroid, Ravenwood, and cf system image can refer to system-build.prop
visibility: [
"//build/soong/fsgen",
@@ -191,6 +197,10 @@ build_prop {
system_ext_specific: true,
product_config: ":product_config",
relative_install_path: "etc", // system_ext/etc/build.prop
+ dist: {
+ targets: ["droidcore-unbundled"],
+ dest: "build.prop-system_ext",
+ },
visibility: [
"//build/make/target/product/gsi",
"//build/soong/fsgen",
@@ -203,6 +213,10 @@ build_prop {
product_specific: true,
product_config: ":product_config",
relative_install_path: "etc", // product/etc/build.prop
+ dist: {
+ targets: ["droidcore-unbundled"],
+ dest: "build.prop-product",
+ },
visibility: [
"//build/make/target/product/gsi",
"//build/soong/fsgen",
@@ -215,6 +229,10 @@ build_prop {
device_specific: true,
product_config: ":product_config",
relative_install_path: "etc", // odm/etc/build.prop
+ dist: {
+ targets: ["droidcore-unbundled"],
+ dest: "build.prop-odm",
+ },
visibility: ["//build/soong/fsgen"],
}
@@ -251,6 +269,10 @@ build_prop {
ramdisk: true,
product_config: ":product_config",
relative_install_path: "etc/ramdisk", // ramdisk/system/etc/ramdisk/build.prop
+ dist: {
+ targets: ["droidcore-unbundled"],
+ dest: "build.prop-ramdisk",
+ },
visibility: ["//visibility:private"],
}
diff --git a/android/config.go b/android/config.go
index 696e7727f..9ccd09990 100644
--- a/android/config.go
+++ b/android/config.go
@@ -385,24 +385,28 @@ type config struct {
}
type partialCompileFlags struct {
- // Is partial compilation enabled at all?
- Enabled bool
-
// Whether to use d8 instead of r8
Use_d8 bool
+ // Whether to disable stub validation. This is slightly more surgical
+ // than DISABLE_STUB_VALIDATION, in that it only applies to partial
+ // compile builds.
+ Disable_stub_validation bool
+
+ // Whether to disable api lint.
+ Disable_api_lint bool
+
// Add others as needed.
}
// These are the flags when `SOONG_PARTIAL_COMPILE` is empty or not set.
-var defaultPartialCompileFlags = partialCompileFlags{
- Enabled: false,
-}
+var defaultPartialCompileFlags = partialCompileFlags{}
// These are the flags when `SOONG_PARTIAL_COMPILE=true`.
var enabledPartialCompileFlags = partialCompileFlags{
- Enabled: true,
- Use_d8: true,
+ Use_d8: true,
+ Disable_stub_validation: false,
+ Disable_api_lint: false,
}
type deviceConfig struct {
@@ -477,13 +481,29 @@ func (c *config) parsePartialCompileFlags(isEngBuild bool) (partialCompileFlags,
state = "+"
}
switch tok {
+ case "all":
+ // Turn on **all** of the flags.
+ ret = partialCompileFlags{
+ Use_d8: true,
+ Disable_stub_validation: true,
+ Disable_api_lint: true,
+ }
case "true":
ret = enabledPartialCompileFlags
case "false":
// Set everything to false.
ret = partialCompileFlags{}
- case "enabled":
- ret.Enabled = makeVal(state, defaultPartialCompileFlags.Enabled)
+
+ case "api_lint", "enable_api_lint":
+ ret.Disable_api_lint = !makeVal(state, !defaultPartialCompileFlags.Disable_api_lint)
+ case "disable_api_lint":
+ ret.Disable_api_lint = makeVal(state, defaultPartialCompileFlags.Disable_api_lint)
+
+ case "stub_validation", "enable_stub_validation":
+ ret.Disable_stub_validation = !makeVal(state, !defaultPartialCompileFlags.Disable_stub_validation)
+ case "disable_stub_validation":
+ ret.Disable_stub_validation = makeVal(state, defaultPartialCompileFlags.Disable_stub_validation)
+
case "use_d8":
ret.Use_d8 = makeVal(state, defaultPartialCompileFlags.Use_d8)
default:
diff --git a/android/config_test.go b/android/config_test.go
index 3d8686041..d1b26c12a 100644
--- a/android/config_test.go
+++ b/android/config_test.go
@@ -213,13 +213,18 @@ func TestConfiguredJarList(t *testing.T) {
})
}
-func (p partialCompileFlags) updateEnabled(value bool) partialCompileFlags {
- p.Enabled = value
+func (p partialCompileFlags) updateUseD8(value bool) partialCompileFlags {
+ p.Use_d8 = value
return p
}
-func (p partialCompileFlags) updateUseD8(value bool) partialCompileFlags {
- p.Use_d8 = value
+func (p partialCompileFlags) updateDisableApiLint(value bool) partialCompileFlags {
+ p.Disable_api_lint = value
+ return p
+}
+
+func (p partialCompileFlags) updateDisableStubValidation(value bool) partialCompileFlags {
+ p.Disable_stub_validation = value
return p
}
@@ -241,10 +246,29 @@ func TestPartialCompile(t *testing.T) {
{"false", true, partialCompileFlags{}},
{"true", true, enabledPartialCompileFlags},
{"true", false, partialCompileFlags{}},
+ {"all", true, partialCompileFlags{}.updateUseD8(true).updateDisableApiLint(true).updateDisableStubValidation(true)},
+
+ // This verifies both use_d8 and the processing order.
{"true,use_d8", true, enabledPartialCompileFlags.updateUseD8(true)},
{"true,-use_d8", true, enabledPartialCompileFlags.updateUseD8(false)},
{"use_d8,false", true, partialCompileFlags{}},
{"false,+use_d8", true, partialCompileFlags{}.updateUseD8(true)},
+
+ // disable_api_lint can be specified with any of 3 options.
+ {"false,-api_lint", true, partialCompileFlags{}.updateDisableApiLint(true)},
+ {"false,-enable_api_lint", true, partialCompileFlags{}.updateDisableApiLint(true)},
+ {"false,+disable_api_lint", true, partialCompileFlags{}.updateDisableApiLint(true)},
+ {"false,+api_lint", true, partialCompileFlags{}.updateDisableApiLint(false)},
+ {"false,+enable_api_lint", true, partialCompileFlags{}.updateDisableApiLint(false)},
+ {"false,-disable_api_lint", true, partialCompileFlags{}.updateDisableApiLint(false)},
+
+ // disable_stub_validation can be specified with any of 3 options.
+ {"false,-stub_validation", true, partialCompileFlags{}.updateDisableStubValidation(true)},
+ {"false,-enable_stub_validation", true, partialCompileFlags{}.updateDisableStubValidation(true)},
+ {"false,+disable_stub_validation", true, partialCompileFlags{}.updateDisableStubValidation(true)},
+ {"false,+stub_validation", true, partialCompileFlags{}.updateDisableStubValidation(false)},
+ {"false,+enable_stub_validation", true, partialCompileFlags{}.updateDisableStubValidation(false)},
+ {"false,-disable_stub_validation", true, partialCompileFlags{}.updateDisableStubValidation(false)},
}
for _, test := range tests {
diff --git a/android/module.go b/android/module.go
index 7786f13ee..a56fea322 100644
--- a/android/module.go
+++ b/android/module.go
@@ -1669,9 +1669,10 @@ func (m *ModuleBase) generateModuleTarget(ctx *moduleContext) {
if len(ctx.installFiles) > 0 {
name := namespacePrefix + ctx.ModuleName() + "-install"
- ctx.Phony(name, ctx.installFiles.Paths()...)
+ installFiles := ctx.installFiles.Paths()
+ ctx.Phony(name, installFiles...)
info.InstallTarget = PathForPhony(ctx, name)
- deps = append(deps, info.InstallTarget)
+ deps = append(deps, installFiles...)
}
// A module's -checkbuild phony targets should
@@ -1681,13 +1682,13 @@ func (m *ModuleBase) generateModuleTarget(ctx *moduleContext) {
if (!ctx.Config().KatiEnabled() || !shouldSkipAndroidMkProcessing(ctx, m)) && !ctx.uncheckedModule && ctx.checkbuildTarget != nil {
name := namespacePrefix + ctx.ModuleName() + "-checkbuild"
ctx.Phony(name, ctx.checkbuildTarget)
- deps = append(deps, PathForPhony(ctx, name))
+ deps = append(deps, ctx.checkbuildTarget)
}
if outputFiles, err := outputFilesForModule(ctx, ctx.Module(), ""); err == nil && len(outputFiles) > 0 {
name := namespacePrefix + ctx.ModuleName() + "-outputs"
ctx.Phony(name, outputFiles...)
- deps = append(deps, PathForPhony(ctx, name))
+ deps = append(deps, outputFiles...)
}
if len(deps) > 0 {
@@ -1914,6 +1915,7 @@ type CommonModuleInfo struct {
Dists []Dist
ExportedToMake bool
Team string
+ PartitionTag string
}
type ApiLevelOrPlatform struct {
@@ -2167,6 +2169,7 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext)
} else {
hostRequired = m.baseProperties.Host_required
}
+ hostRequired = append(hostRequired, moduleInfoJSON.ExtraHostRequired...)
var data []string
for _, d := range ctx.testData {
@@ -2280,6 +2283,7 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext)
Dists: m.Dists(),
ExportedToMake: m.ExportedToMake(),
Team: m.Team(),
+ PartitionTag: m.PartitionTag(ctx.DeviceConfig()),
}
if mm, ok := m.module.(interface {
MinSdkVersion(ctx EarlyModuleContext) ApiLevel
diff --git a/android/module_info_json.go b/android/module_info_json.go
index bb309ffee..50c961abe 100644
--- a/android/module_info_json.go
+++ b/android/module_info_json.go
@@ -40,10 +40,12 @@ type ExtraModuleInfoJSON struct {
StaticDependencies []string `json:"static_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).LOCAL_STATIC_LIBRARIES))
DataDependencies []string `json:"data_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_DATA_BINS))
- CompatibilitySuites []string `json:"compatibility_suites,omitempty"` // $(sort $(ALL_MODULES.$(m).COMPATIBILITY_SUITES))
- AutoTestConfig []string `json:"auto_test_config,omitempty"` // $(ALL_MODULES.$(m).auto_test_config)
- TestConfig []string `json:"test_config,omitempty"` // $(strip $(ALL_MODULES.$(m).TEST_CONFIG) $(ALL_MODULES.$(m).EXTRA_TEST_CONFIGS)
- ExtraRequired []string `json:"-"`
+ CompatibilitySuites []string `json:"compatibility_suites,omitempty"` // $(sort $(ALL_MODULES.$(m).COMPATIBILITY_SUITES))
+ AutoTestConfig []string `json:"auto_test_config,omitempty"` // $(ALL_MODULES.$(m).auto_test_config)
+ TestConfig []string `json:"test_config,omitempty"` // $(strip $(ALL_MODULES.$(m).TEST_CONFIG) $(ALL_MODULES.$(m).EXTRA_TEST_CONFIGS)
+ TestModuleConfigBase string `json:"test_module_config_base,omitempty"`
+ ExtraRequired []string `json:"-"`
+ ExtraHostRequired []string `json:"-"`
SupportedVariantsOverride []string `json:"-"`
Disabled bool `json:"-"`
diff --git a/android/rule_builder.go b/android/rule_builder.go
index db56c3f29..ea6aaa4c4 100644
--- a/android/rule_builder.go
+++ b/android/rule_builder.go
@@ -1187,7 +1187,11 @@ func (c *RuleBuilderCommand) Text(text string) *RuleBuilderCommand {
// Textf adds the specified formatted text to the command line. The text should not contain input or output paths or
// the rule will not have them listed in its dependencies or outputs.
func (c *RuleBuilderCommand) Textf(format string, a ...interface{}) *RuleBuilderCommand {
- return c.Text(fmt.Sprintf(format, a...))
+ if c.buf.Len() > 0 {
+ c.buf.WriteByte(' ')
+ }
+ fmt.Fprintf(&c.buf, format, a...)
+ return c
}
// Flag adds the specified raw text to the command line. The text should not contain input or output paths or the
diff --git a/apex/apex_test.go b/apex/apex_test.go
index a0a42a149..36a697487 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -11667,7 +11667,7 @@ func TestAconfifDeclarationsValidation(t *testing.T) {
// Arguments passed to aconfig to retrieve the state of the flags defined in the
// textproto files
- aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
+ aconfigFlagArgs := m.Output("released-flags-exportable.pb").Args["flags_path"]
// "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
// cache file provided by the associated aconfig_declarations module "bar" should be passed
diff --git a/cc/afdo.go b/cc/afdo.go
index 8d8341eb4..9be39185c 100644
--- a/cc/afdo.go
+++ b/cc/afdo.go
@@ -105,6 +105,11 @@ func (afdo *afdo) flags(ctx ModuleContext, flags Flags) Flags {
// The flags are prepended to allow overriding.
profileUseFlag := fmt.Sprintf(afdoFlagsFormat, fdoProfilePath)
flags.Local.CFlags = append([]string{profileUseFlag}, flags.Local.CFlags...)
+ // Salvage stale profile by fuzzy matching and use the remapped location for sample profile query.
+ flags.Local.CFlags = append([]string{"-mllvm", "--salvage-stale-profile=true"}, flags.Local.CFlags...)
+ flags.Local.CFlags = append([]string{"-mllvm", "--salvage-stale-profile-max-callsites=2000"}, flags.Local.CFlags...)
+ // Salvage stale profile by fuzzy matching renamed functions.
+ flags.Local.CFlags = append([]string{"-mllvm", "--salvage-unused-profile=true"}, flags.Local.CFlags...)
flags.Local.LdFlags = append([]string{profileUseFlag, "-Wl,-mllvm,-no-warn-sample-unused=true"}, flags.Local.LdFlags...)
// Update CFlagsDeps and LdFlagsDeps so the module is rebuilt
diff --git a/dexpreopt/Android.bp b/dexpreopt/Android.bp
index ea3f52bd2..dbc192238 100644
--- a/dexpreopt/Android.bp
+++ b/dexpreopt/Android.bp
@@ -9,6 +9,7 @@ bootstrap_go_package {
"class_loader_context.go",
"config.go",
"dexpreopt.go",
+ "dexpreopt_tools_zip.go",
"system_server_zip.go",
"testing.go",
],
diff --git a/dexpreopt/dexpreopt_tools_zip.go b/dexpreopt/dexpreopt_tools_zip.go
new file mode 100644
index 000000000..c7cf12830
--- /dev/null
+++ b/dexpreopt/dexpreopt_tools_zip.go
@@ -0,0 +1,62 @@
+package dexpreopt
+
+import "android/soong/android"
+
+func init() {
+ android.InitRegistrationContext.RegisterSingletonType("dexpreopt_tools_zip_singleton", dexpreoptToolsZipSingletonFactory)
+}
+
+func dexpreoptToolsZipSingletonFactory() android.Singleton {
+ return &dexpreoptToolsZipSingleton{}
+}
+
+type dexpreoptToolsZipSingleton struct{}
+
+func (s *dexpreoptToolsZipSingleton) GenerateBuildActions(ctx android.SingletonContext) {
+ // The mac build doesn't build dex2oat, so create the zip file only if the build OS is linux.
+ if !ctx.Config().BuildOS.Linux() {
+ return
+ }
+ global := GetGlobalConfig(ctx)
+ if global.DisablePreopt {
+ return
+ }
+ config := GetCachedGlobalSoongConfig(ctx)
+ if config == nil {
+ return
+ }
+
+ deps := android.Paths{
+ ctx.Config().HostToolPath(ctx, "dexpreopt_gen"),
+ ctx.Config().HostToolPath(ctx, "dexdump"),
+ ctx.Config().HostToolPath(ctx, "oatdump"),
+ config.Profman,
+ config.Dex2oat,
+ config.Aapt,
+ config.SoongZip,
+ config.Zip2zip,
+ config.ManifestCheck,
+ config.ConstructContext,
+ config.UffdGcFlag,
+ }
+
+ out := android.PathForOutput(ctx, "dexpreopt_tools.zip")
+ builder := android.NewRuleBuilder(pctx, ctx)
+
+ cmd := builder.Command().BuiltTool("soong_zip").
+ Flag("-d").
+ FlagWithOutput("-o ", out).
+ Flag("-j")
+
+ for _, dep := range deps {
+ cmd.FlagWithInput("-f ", dep)
+ }
+
+ // This reads through a symlink to include the file it points to. This isn't great for
+ // build reproducibility, will need to be revisited later.
+ cmd.Textf("-f $(realpath %s)", config.Dex2oat)
+
+ builder.Build("dexpreopt_tools_zip", "building dexpreopt_tools.zip")
+
+ ctx.DistForGoal("droidcore", out)
+}
diff --git a/filesystem/android_device.go b/filesystem/android_device.go
index 005dc3439..3d306e365 100644
--- a/filesystem/android_device.go
+++ b/filesystem/android_device.go
@@ -106,11 +106,14 @@ type androidDevice struct {
allImagesZip android.Path
- proguardDictZip android.Path
- proguardDictMapping android.Path
- proguardUsageZip android.Path
- kernelConfig android.Path
- kernelVersion android.Path
+ proguardDictZip android.Path
+ proguardDictMapping android.Path
+ proguardUsageZip android.Path
+ kernelConfig android.Path
+ kernelVersion android.Path
+ miscInfo android.Path
+ rootDirForFsConfig string
+ rootDirForFsConfigTimestamp android.Path
}
func AndroidDeviceFactory() android.Module {
@@ -186,6 +189,7 @@ func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) {
allInstalledModules := a.allInstalledModules(ctx)
a.kernelConfig, a.kernelVersion = a.extractKernelVersionAndConfigs(ctx)
+ a.miscInfo = a.addMiscInfo(ctx)
a.buildTargetFilesZip(ctx, allInstalledModules)
a.buildProguardZips(ctx, allInstalledModules)
@@ -333,6 +337,10 @@ func (a *androidDevice) distFiles(ctx android.ModuleContext) {
ctx.DistForGoalWithFilename("droidcore-unbundled", a.proguardDictZip, namePrefix+insertBeforeExtension(a.proguardDictZip.Base(), "-FILE_NAME_TAG_PLACEHOLDER"))
ctx.DistForGoalWithFilename("droidcore-unbundled", a.proguardDictMapping, namePrefix+insertBeforeExtension(a.proguardDictMapping.Base(), "-FILE_NAME_TAG_PLACEHOLDER"))
ctx.DistForGoalWithFilename("droidcore-unbundled", a.proguardUsageZip, namePrefix+insertBeforeExtension(a.proguardUsageZip.Base(), "-FILE_NAME_TAG_PLACEHOLDER"))
+
+ if a.deviceProps.Android_info != nil {
+ ctx.DistForGoal("droidcore-unbundled", android.PathForModuleSrc(ctx, *a.deviceProps.Android_info))
+ }
}
}
@@ -470,6 +478,17 @@ func (a *androidDevice) buildTargetFilesZip(ctx android.ModuleContext, allInstal
if toCopy.destSubdir == "SYSTEM" {
// Create the ROOT partition in target_files.zip
builder.Command().Textf("rsync --links --exclude=system/* %s/ -r %s/ROOT", toCopy.fsInfo.RootDir, targetFilesDir.String())
+ // Add a duplicate rule to assemble the ROOT/ directory in separate intermediates.
+ // The output timestamp will be an input to a separate fs_config call.
+ a.rootDirForFsConfig = android.PathForModuleOut(ctx, "root_dir_for_fs_config").String()
+ rootDirBuilder := android.NewRuleBuilder(pctx, ctx)
+ rootDirForFsConfigTimestamp := android.PathForModuleOut(ctx, "root_dir_for_fs_config.timestamp")
+ rootDirBuilder.Command().Textf("rsync --links --exclude=system/* %s/ -r %s", toCopy.fsInfo.RootDir, a.rootDirForFsConfig).
+ Implicit(toCopy.fsInfo.Output).
+ Text("&& touch").
+ Output(rootDirForFsConfigTimestamp)
+ rootDirBuilder.Build("assemble_root_dir_for_fs_config", "Assemble ROOT/ for fs_config")
+ a.rootDirForFsConfigTimestamp = rootDirForFsConfigTimestamp
}
}
// Copy cmdline, kernel etc. files of boot images
@@ -608,11 +627,11 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build
}
if partition == "system" {
// Create root_filesystem_config from the assembled ROOT/ intermediates directory
- a.generateFilesystemConfigForTargetFiles(ctx, builder, targetFilesDir.String(), targetFilesDir.String()+"/ROOT", "root_filesystem_config.txt")
+ a.generateFilesystemConfigForTargetFiles(ctx, builder, a.rootDirForFsConfigTimestamp, targetFilesDir.String(), a.rootDirForFsConfig, "root_filesystem_config.txt")
}
if partition == "vendor_ramdisk" {
// Create vendor_boot_filesystem_config from the assembled VENDOR_BOOT/RAMDISK intermediates directory
- a.generateFilesystemConfigForTargetFiles(ctx, builder, targetFilesDir.String(), targetFilesDir.String()+"/VENDOR_BOOT/RAMDISK", "vendor_boot_filesystem_config.txt")
+ a.generateFilesystemConfigForTargetFiles(ctx, builder, nil, targetFilesDir.String(), targetFilesDir.String()+"/VENDOR_BOOT/RAMDISK", "vendor_boot_filesystem_config.txt")
}
}
// Copy ramdisk_node_list
@@ -646,6 +665,12 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build
if a.kernelVersion != nil {
builder.Command().Textf("cp").Input(a.kernelVersion).Textf(" %s/META/", targetFilesDir.String())
}
+ // misc_info.txt
+ if a.miscInfo != nil {
+ builder.Command().Textf("cp").Input(a.miscInfo).Textf(" %s/META/", targetFilesDir.String())
+ }
+ // apex_info.pb, care_map.pb, vbmeta_digest.txt
+ a.addImgToTargetFiles(ctx, builder, targetFilesDir.String())
if a.partitionProps.Super_partition_name != nil {
superPartition := ctx.GetDirectDepProxyWithTag(*a.partitionProps.Super_partition_name, superPartitionDepTag)
@@ -660,17 +685,71 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build
}
+// A partial implementation of make's $PRODUCT_OUT/misc_info.txt
+// https://cs.android.com/android/platform/superproject/main/+/main:build/make/core/Makefile;l=5894?q=misc_info.txt%20f:build%2Fmake%2Fcore%2FMakefile&ss=android%2Fplatform%2Fsuperproject%2Fmain
+// This file is subsequently used by add_img_to_target_files to create additioanl metadata files like apex_info.pb
+// TODO (b/399788119): Complete the migration of misc_info.txt
+func (a *androidDevice) addMiscInfo(ctx android.ModuleContext) android.Path {
+ builder := android.NewRuleBuilder(pctx, ctx)
+ miscInfo := android.PathForModuleOut(ctx, "misc_info.txt")
+ builder.Command().
+ Textf("rm -f %s", miscInfo).
+ Textf("&& echo recovery_api_version=%s >> %s", ctx.Config().VendorConfig("recovery").String("recovery_api_version"), miscInfo).
+ Textf("&& echo fstab_version=%s >> %s", ctx.Config().VendorConfig("recovery").String("recovery_fstab_version"), miscInfo).
+ ImplicitOutput(miscInfo)
+
+ if a.partitionProps.Recovery_partition_name == nil {
+ builder.Command().Textf("echo no_recovery=true >> %s", miscInfo)
+ }
+ fsInfos := a.getFsInfos(ctx)
+ for _, partition := range android.SortedKeys(fsInfos) {
+ if fsInfos[partition].UseAvb {
+ builder.Command().Textf("echo 'avb_%s_hashtree_enable=true' >> %s", partition, miscInfo)
+ }
+ }
+ if len(a.partitionProps.Vbmeta_partitions) > 0 {
+ builder.Command().
+ Textf("echo avb_enable=true >> %s", miscInfo).
+ Textf("&& echo avb_building_vbmeta_image=true >> %s", miscInfo).
+ Textf("&& echo avb_avbtool=avbtool >> %s", miscInfo)
+ }
+ if a.partitionProps.Boot_partition_name != nil {
+ builder.Command().Textf("echo boot_images=boot.img >> %s", miscInfo)
+ }
+
+ builder.Build("misc_info", "Building misc_info")
+
+ return miscInfo
+}
+
+// addImgToTargetFiles invokes `add_img_to_target_files` and creates the following files in META/
+// - apex_info.pb
+// - care_map.pb
+// - vbmeta_digest.txt
+func (a *androidDevice) addImgToTargetFiles(ctx android.ModuleContext, builder *android.RuleBuilder, targetFilesDir string) {
+ mkbootimg := ctx.Config().HostToolPath(ctx, "mkbootimg")
+ builder.Command().
+ Textf("PATH=%s:$PATH", ctx.Config().HostToolDir()).
+ Textf("MKBOOTIMG=%s", mkbootimg).
+ Implicit(mkbootimg).
+ BuiltTool("add_img_to_target_files").
+ Flag("-a -v -p").
+ Flag(ctx.Config().HostToolDir()).
+ Text(targetFilesDir)
+}
+
type ApexKeyPathInfo struct {
ApexKeyPath android.Path
}
var ApexKeyPathInfoProvider = blueprint.NewProvider[ApexKeyPathInfo]()
-func (a *androidDevice) generateFilesystemConfigForTargetFiles(ctx android.ModuleContext, builder *android.RuleBuilder, targetFilesDir, stagingDir, filename string) {
+func (a *androidDevice) generateFilesystemConfigForTargetFiles(ctx android.ModuleContext, builder *android.RuleBuilder, stagingDirTimestamp android.Path, targetFilesDir, stagingDir, filename string) {
fsConfigOut := android.PathForModuleOut(ctx, filename)
ctx.Build(pctx, android.BuildParams{
- Rule: fsConfigRule,
- Output: fsConfigOut,
+ Rule: fsConfigRule,
+ Implicit: stagingDirTimestamp,
+ Output: fsConfigOut,
Args: map[string]string{
"rootDir": stagingDir,
"prefix": "",
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go
index fc480e6f0..35fdd00a3 100644
--- a/filesystem/filesystem.go
+++ b/filesystem/filesystem.go
@@ -436,6 +436,8 @@ type FilesystemInfo struct {
FilesystemConfig android.Path
Owners []InstalledModuleInfo
+
+ UseAvb bool
}
// FullInstallPathInfo contains information about the "full install" paths of all the files
@@ -680,6 +682,7 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) {
SelinuxFc: f.selinuxFc,
FilesystemConfig: f.generateFilesystemConfig(ctx, rootDir, rebasedDir),
Owners: f.gatherOwners(specs),
+ UseAvb: proptools.Bool(f.properties.Use_avb),
}
android.SetProvider(ctx, FilesystemProvider, fsInfo)
diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go
index f00e491cc..b73fb219f 100644
--- a/fsgen/filesystem_creator.go
+++ b/fsgen/filesystem_creator.go
@@ -505,6 +505,7 @@ func partitionSpecificFsProps(ctx android.EarlyModuleContext, partitions allGene
}
fsProps.Security_patch = proptools.StringPtr(ctx.Config().PlatformSecurityPatch())
fsProps.Stem = proptools.StringPtr("system_ext.img")
+ fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true)
case "product":
fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true)
fsProps.Android_filesystem_deps.System = proptools.StringPtr(partitions.nameForType("system"))
@@ -853,19 +854,29 @@ func (f *filesystemCreator) createVendorBuildProp(ctx android.LoadHookContext) {
Product_config *string
Android_info *string
Licenses []string
+ Dist android.Dist
}{
Name: proptools.StringPtr(generatedModuleName(ctx.Config(), "vendor-build.prop")),
Vendor: proptools.BoolPtr(true),
Stem: proptools.StringPtr("build.prop"),
Product_config: proptools.StringPtr(":product_config"),
Android_info: proptools.StringPtr(":" + generatedModuleName(ctx.Config(), "android_info.prop")),
- Licenses: []string{"Android-Apache-2.0"},
+ Dist: android.Dist{
+ Targets: []string{"droidcore-unbundled"},
+ Dest: proptools.StringPtr("build.prop-vendor"),
+ },
+ Licenses: []string{"Android-Apache-2.0"},
}
vendorBuildProp := ctx.CreateModule(
android.BuildPropFactory,
vendorBuildProps,
)
- vendorBuildProp.HideFromMake()
+ // We don't want this to conflict with the make-built vendor build.prop, but unfortunately
+ // calling HideFromMake() prevents disting files, even in soong-only mode. So only call
+ // HideFromMake() on soong+make builds.
+ if ctx.Config().KatiEnabled() {
+ vendorBuildProp.HideFromMake()
+ }
}
func createRecoveryBuildProp(ctx android.LoadHookContext) string {
diff --git a/java/builder.go b/java/builder.go
index ade978450..dff0032d8 100644
--- a/java/builder.go
+++ b/java/builder.go
@@ -310,7 +310,7 @@ var (
gatherReleasedFlaggedApisRule = pctx.AndroidStaticRule("gatherReleasedFlaggedApisRule",
blueprint.RuleParams{
- Command: `${aconfig} dump-cache --dedup --format='{fully_qualified_name}' ` +
+ Command: `${aconfig} dump-cache --dedup --format=protobuf ` +
`--out ${out} ` +
`${flags_path} ` +
`${filter_args} `,
@@ -320,8 +320,8 @@ var (
generateMetalavaRevertAnnotationsRule = pctx.AndroidStaticRule("generateMetalavaRevertAnnotationsRule",
blueprint.RuleParams{
- Command: `${keep-flagged-apis} ${in} > ${out}`,
- CommandDeps: []string{"${keep-flagged-apis}"},
+ Command: `${aconfig-to-metalava-flags} ${in} > ${out}`,
+ CommandDeps: []string{"${aconfig-to-metalava-flags}"},
})
generateApiXMLRule = pctx.AndroidStaticRule("generateApiXMLRule",
@@ -339,7 +339,7 @@ func init() {
pctx.HostBinToolVariable("aconfig", "aconfig")
pctx.HostBinToolVariable("ravenizer", "ravenizer")
pctx.HostBinToolVariable("apimapper", "apimapper")
- pctx.HostBinToolVariable("keep-flagged-apis", "keep-flagged-apis")
+ pctx.HostBinToolVariable("aconfig-to-metalava-flags", "aconfig-to-metalava-flags")
}
type javaBuilderFlags struct {
diff --git a/java/droiddoc.go b/java/droiddoc.go
index 225f201a9..3faf294de 100644
--- a/java/droiddoc.go
+++ b/java/droiddoc.go
@@ -195,6 +195,9 @@ func apiCheckEnabled(ctx android.ModuleContext, apiToCheck ApiToCheck, apiVersio
"them instead.")
}
return false
+ } else if ctx.Config().PartialCompileFlags().Disable_stub_validation &&
+ !ctx.Config().BuildFromTextStub() {
+ return false
} else if String(apiToCheck.Api_file) != "" && String(apiToCheck.Removed_api_file) != "" {
return true
} else if String(apiToCheck.Api_file) != "" {
diff --git a/java/droidstubs.go b/java/droidstubs.go
index caad6883e..c21592518 100644
--- a/java/droidstubs.go
+++ b/java/droidstubs.go
@@ -821,19 +821,17 @@ func generateRevertAnnotationArgs(ctx android.ModuleContext, cmd *android.RuleBu
}
}
- if len(aconfigFlagsPaths) == 0 {
- // This argument should not be added for "everything" stubs
- cmd.Flag("--revert-annotation android.annotation.FlaggedApi")
- return
- }
+ // If aconfigFlagsPaths is empty then it is still important to generate the
+ // Metalava flags config file, albeit with an empty set of flags, so that all
+ // flagged APIs will be reverted.
- releasedFlaggedApisFile := android.PathForModuleOut(ctx, fmt.Sprintf("released-flagged-apis-%s.txt", stubsType.String()))
- revertAnnotationsFile := android.PathForModuleOut(ctx, fmt.Sprintf("revert-annotations-%s.txt", stubsType.String()))
+ releasedFlagsFile := android.PathForModuleOut(ctx, fmt.Sprintf("released-flags-%s.pb", stubsType.String()))
+ metalavaFlagsConfigFile := android.PathForModuleOut(ctx, fmt.Sprintf("flags-config-%s.xml", stubsType.String()))
ctx.Build(pctx, android.BuildParams{
Rule: gatherReleasedFlaggedApisRule,
Inputs: aconfigFlagsPaths,
- Output: releasedFlaggedApisFile,
+ Output: releasedFlagsFile,
Description: fmt.Sprintf("%s gather aconfig flags", stubsType),
Args: map[string]string{
"flags_path": android.JoinPathsWithPrefix(aconfigFlagsPaths, "--cache "),
@@ -843,12 +841,12 @@ func generateRevertAnnotationArgs(ctx android.ModuleContext, cmd *android.RuleBu
ctx.Build(pctx, android.BuildParams{
Rule: generateMetalavaRevertAnnotationsRule,
- Input: releasedFlaggedApisFile,
- Output: revertAnnotationsFile,
- Description: fmt.Sprintf("%s revert annotations", stubsType),
+ Input: releasedFlagsFile,
+ Output: metalavaFlagsConfigFile,
+ Description: fmt.Sprintf("%s metalava flags config", stubsType),
})
- cmd.FlagWithInput("@", revertAnnotationsFile)
+ cmd.FlagWithInput("--config-file ", metalavaFlagsConfigFile)
}
func (d *Droidstubs) commonMetalavaStubCmd(ctx android.ModuleContext, rule *android.RuleBuilder,
@@ -1245,7 +1243,7 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// Add options for the other optional tasks: API-lint and check-released.
// We generate separate timestamp files for them.
- doApiLint := BoolDefault(d.properties.Check_api.Api_lint.Enabled, false)
+ doApiLint := BoolDefault(d.properties.Check_api.Api_lint.Enabled, false) && !ctx.Config().PartialCompileFlags().Disable_api_lint
doCheckReleased := apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released")
writeSdkValues := Bool(d.properties.Write_sdk_values)
diff --git a/java/droidstubs_test.go b/java/droidstubs_test.go
index dfdf87703..1f9d223b5 100644
--- a/java/droidstubs_test.go
+++ b/java/droidstubs_test.go
@@ -410,12 +410,12 @@ func TestAconfigDeclarations(t *testing.T) {
m := result.ModuleForTests(t, "foo", "android_common")
android.AssertStringDoesContain(t, "foo generates revert annotations file",
- strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt")
+ strings.Join(m.AllOutputs(), ""), "flags-config-exportable.xml")
// revert-annotations.txt passed to exportable stubs generation metalava command
manifest := m.Output("metalava_exportable.sbox.textproto")
cmdline := String(android.RuleBuilderSboxProtoForTests(t, result.TestContext, manifest).Commands[0].Command)
- android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "revert-annotations-exportable.txt")
+ android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "flags-config-exportable.xml")
android.AssertStringDoesContain(t, "foo generates exportable stubs jar",
strings.Join(m.AllOutputs(), ""), "exportable/foo-stubs.srcjar")
@@ -460,7 +460,7 @@ func TestReleaseExportRuntimeApis(t *testing.T) {
m := result.ModuleForTests(t, "foo", "android_common")
- rule := m.Output("released-flagged-apis-exportable.txt")
+ rule := m.Output("released-flags-exportable.pb")
exposeWritableApisFilter := "--filter='state:ENABLED+permission:READ_ONLY' --filter='permission:READ_WRITE'"
android.AssertStringEquals(t, "Filter argument expected to contain READ_WRITE permissions", exposeWritableApisFilter, rule.Args["filter_args"])
}
diff --git a/java/java.go b/java/java.go
index c1e4f8ca0..215fbbda8 100644
--- a/java/java.go
+++ b/java/java.go
@@ -2530,6 +2530,7 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
apiContributions := al.properties.Api_contributions
addValidations := !ctx.Config().IsEnvTrue("DISABLE_STUB_VALIDATION") &&
!ctx.Config().IsEnvTrue("WITHOUT_CHECK_API") &&
+ !ctx.Config().PartialCompileFlags().Disable_stub_validation &&
proptools.BoolDefault(al.properties.Enable_validation, true)
for _, apiContributionName := range apiContributions {
ctx.AddDependency(ctx.Module(), javaApiContributionTag, apiContributionName)
diff --git a/java/java_test.go b/java/java_test.go
index a6290a628..6df81e595 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -2912,12 +2912,12 @@ func TestApiLibraryAconfigDeclarations(t *testing.T) {
m := result.ModuleForTests(t, "foo", "android_common")
android.AssertStringDoesContain(t, "foo generates revert annotations file",
- strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt")
+ strings.Join(m.AllOutputs(), ""), "flags-config-exportable.xml")
// revert-annotations.txt passed to exportable stubs generation metalava command
manifest := m.Output("metalava.sbox.textproto")
cmdline := String(android.RuleBuilderSboxProtoForTests(t, result.TestContext, manifest).Commands[0].Command)
- android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "revert-annotations-exportable.txt")
+ android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "flags-config-exportable.xml")
}
func TestTestOnly(t *testing.T) {
diff --git a/java/rro.go b/java/rro.go
index b3d934867..42d42b86a 100644
--- a/java/rro.go
+++ b/java/rro.go
@@ -427,6 +427,11 @@ func (a *AutogenRuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.
// Install the signed apk
installDir := android.PathForModuleInstall(ctx, "overlay")
ctx.InstallFile(installDir, signed.Base(), signed)
+
+ android.SetProvider(ctx, RuntimeResourceOverlayInfoProvider, RuntimeResourceOverlayInfo{
+ OutputFile: signed,
+ Certificate: a.certificate,
+ })
}
func (a *AutogenRuntimeResourceOverlay) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
diff --git a/java/sdk.go b/java/sdk.go
index ab1c653d1..73262dab3 100644
--- a/java/sdk.go
+++ b/java/sdk.go
@@ -382,7 +382,7 @@ func createAPIFingerprint(ctx android.SingletonContext) {
rule.Build("api_fingerprint", "generate api_fingerprint.txt")
- if ctx.Config().BuildOS == android.Linux {
+ if ctx.Config().BuildOS.Linux() {
ctx.DistForGoals([]string{"sdk", "droidcore"}, out)
}
}
diff --git a/scripts/Android.bp b/scripts/Android.bp
index 94163a5c2..c0e13d52f 100644
--- a/scripts/Android.bp
+++ b/scripts/Android.bp
@@ -287,9 +287,13 @@ python_test_host {
],
}
-sh_binary_host {
- name: "keep-flagged-apis",
- src: "keep-flagged-apis.sh",
+python_binary_host {
+ name: "aconfig-to-metalava-flags",
+ main: "aconfig-to-metalava-flags.py",
+ srcs: ["aconfig-to-metalava-flags.py"],
+ libs: [
+ "libaconfig_python_proto",
+ ],
}
python_binary_host {
diff --git a/scripts/aconfig-to-metalava-flags.py b/scripts/aconfig-to-metalava-flags.py
new file mode 100644
index 000000000..efa85ecb3
--- /dev/null
+++ b/scripts/aconfig-to-metalava-flags.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2025 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.
+
+"""Converts a set of aconfig protobuf flags to a Metalava config file."""
+
+# Formatted using `pyformat -i scripts/aconfig-to-metalava-flags.py`
+
+import argparse
+import sys
+import xml.etree.ElementTree as ET
+
+from protos import aconfig_pb2
+
+_READ_ONLY = aconfig_pb2.flag_permission.READ_ONLY
+_ENABLED = aconfig_pb2.flag_state.ENABLED
+_DISABLED = aconfig_pb2.flag_state.DISABLED
+
+# The namespace of the Metalava config file.
+CONFIG_NS = 'http://www.google.com/tools/metalava/config'
+
+
+def config_name(tag: str):
+ """Create a QName in the config namespace.
+
+ :param:tag the name of the entity in the config namespace.
+ """
+ return f'{{{CONFIG_NS}}}{tag}'
+
+
+def main():
+ """Program entry point."""
+ args_parser = argparse.ArgumentParser(
+ description='Generate Metalava flags config from aconfig protobuf',
+ )
+ args_parser.add_argument(
+ 'input',
+ help='The path to the aconfig protobuf file',
+ )
+ args = args_parser.parse_args(sys.argv[1:])
+
+ # Read the parsed_flags from the protobuf file.
+ with open(args.input, 'rb') as f:
+ parsed_flags = aconfig_pb2.parsed_flags.FromString(f.read())
+
+ # Create the structure of the XML config file.
+ config = ET.Element(config_name('config'))
+ api_flags = ET.SubElement(config, config_name('api-flags'))
+ # Create an <api-flag> element for each parsed_flag.
+ for flag in parsed_flags.parsed_flag:
+ if flag.permission == _READ_ONLY:
+ # Ignore any read only disabled flags as Metalava assumes that as the
+ # default when an <api-flags/> element is provided so this reduces the
+ # size of the file.
+ if flag.state == _DISABLED:
+ continue
+ mutability = 'immutable'
+ else:
+ mutability = 'mutable'
+ if flag.state == _ENABLED:
+ status = 'enabled'
+ else:
+ status = 'disabled'
+ attributes = {
+ 'package': flag.package,
+ 'name': flag.name,
+ 'mutability': mutability,
+ 'status': status,
+ }
+ # Convert the attribute names into qualified names in, what will become, the
+ # default namespace for the XML file. This is needed to ensure that the
+ # attribute will be written in the XML file without a prefix, e.g.
+ # `name="flag_name"`. Without it, a namespace prefix, e.g. `ns1`, will be
+ # synthesized for the attribute when writing the XML file, i.e. it
+ # will be written as `ns1:name="flag_name"`. Strictly speaking, that is
+ # unnecessary as the "Namespaces in XML 1.0 (Third Edition)" specification
+ # says that unprefixed attribute names have no namespace.
+ qualified_attributes = {config_name(k): v for (k, v) in attributes.items()}
+ ET.SubElement(api_flags, config_name('api-flag'), qualified_attributes)
+
+ # Create a tree and add white space so it will pretty print when written out.
+ tree = ET.ElementTree(config)
+ ET.indent(tree)
+
+ # Write the tree using the config namespace as the default.
+ tree.write(sys.stdout, encoding='unicode', default_namespace=CONFIG_NS)
+ sys.stdout.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/keep-flagged-apis.sh b/scripts/keep-flagged-apis.sh
deleted file mode 100755
index 48efb7a29..000000000
--- a/scripts/keep-flagged-apis.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash -e
-#
-# Copyright 2023 Google Inc. All rights reserved.
-#
-# 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.
-
-# Convert a list of flags in the input file to a list of metalava options
-# that will keep the APIs for those flags will hiding all other flagged
-# APIs.
-
-FLAGS="$1"
-
-FLAGGED="android.annotation.FlaggedApi"
-
-# Convert the list of feature flags in the input file to Metalava options
-# of the form `--revert-annotation !android.annotation.FlaggedApi("<flag>")`
-# to prevent the annotated APIs from being hidden, i.e. include the annotated
-# APIs in the SDK snapshots.
-while read -r line; do
- # Escape and quote the key for sed
- escaped_line=$(echo "$line" | sed "s/'/\\\'/g; s/ /\\ /g")
-
- echo "--revert-annotation '!$FLAGGED(\"$escaped_line\")'"
-done < "$FLAGS"
-
-# Revert all flagged APIs, unless listed above.
-echo "--revert-annotation $FLAGGED"
diff --git a/tradefed_modules/test_module_config.go b/tradefed_modules/test_module_config.go
index 988352cd2..6dd48eb5a 100644
--- a/tradefed_modules/test_module_config.go
+++ b/tradefed_modules/test_module_config.go
@@ -162,6 +162,22 @@ func (m *testModuleConfigModule) GenerateAndroidBuildActions(ctx android.ModuleC
m.validateBase(ctx, &testModuleConfigTag, "android_test", false)
m.generateManifestAndConfig(ctx)
+ moduleInfoJSON := ctx.ModuleInfoJSON()
+ moduleInfoJSON.Class = []string{m.provider.MkAppClass}
+ if m.provider.MkAppClass != "NATIVE_TESTS" {
+ moduleInfoJSON.Tags = append(moduleInfoJSON.Tags, "tests")
+ }
+ if m.provider.IsUnitTest {
+ moduleInfoJSON.IsUnitTest = "true"
+ }
+ moduleInfoJSON.CompatibilitySuites = append(moduleInfoJSON.CompatibilitySuites, m.tradefedProperties.Test_suites...)
+ moduleInfoJSON.SystemSharedLibs = []string{"none"}
+ moduleInfoJSON.ExtraRequired = append(moduleInfoJSON.ExtraRequired, m.provider.RequiredModuleNames...)
+ moduleInfoJSON.ExtraRequired = append(moduleInfoJSON.ExtraRequired, *m.Base)
+ moduleInfoJSON.ExtraHostRequired = append(moduleInfoJSON.ExtraRequired, m.provider.HostRequiredModuleNames...)
+ moduleInfoJSON.TestConfig = []string{m.testConfig.String()}
+ moduleInfoJSON.AutoTestConfig = []string{"true"}
+ moduleInfoJSON.TestModuleConfigBase = proptools.String(m.Base)
}
// Ensure at least one test_suite is listed. Ideally it should be general-tests