summaryrefslogtreecommitdiff
path: root/sdk/update.go
diff options
context:
space:
mode:
Diffstat (limited to 'sdk/update.go')
-rw-r--r--sdk/update.go65
1 files changed, 63 insertions, 2 deletions
diff --git a/sdk/update.go b/sdk/update.go
index b146b62c8..1cd8f135a 100644
--- a/sdk/update.go
+++ b/sdk/update.go
@@ -22,6 +22,7 @@ import (
"android/soong/apex"
"android/soong/cc"
+
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -35,6 +36,37 @@ import (
// By default every unversioned module in the generated snapshot has prefer: false. Building it
// with SOONG_SDK_SNAPSHOT_PREFER=true will force them to use prefer: true.
//
+// SOONG_SDK_SNAPSHOT_USE_SOURCE_CONFIG_VAR
+// If set this specifies the Soong config var that can be used to control whether the prebuilt
+// modules from the generated snapshot or the original source modules. Values must be a colon
+// separated pair of strings, the first of which is the Soong config namespace, and the second
+// is the name of the variable within that namespace.
+//
+// The config namespace and var name are used to set the `use_source_config_var` property. That
+// in turn will cause the generated prebuilts to use the soong config variable to select whether
+// source or the prebuilt is used.
+// e.g. If an sdk snapshot is built using:
+// m SOONG_SDK_SNAPSHOT_USE_SOURCE_CONFIG_VAR=acme:build_from_source sdkextensions-sdk
+// Then the resulting snapshot will include:
+// use_source_config_var: {
+// config_namespace: "acme",
+// var_name: "build_from_source",
+// }
+//
+// Assuming that the config variable is defined in .mk using something like:
+// $(call add_soong_config_namespace,acme)
+// $(call add_soong_config_var_value,acme,build_from_source,true)
+//
+// Then when the snapshot is unpacked in the repository it will have the following behavior:
+// m droid - will use the sdkextensions-sdk prebuilts if present. Otherwise, it will use the
+// sources.
+// m SOONG_CONFIG_acme_build_from_source=true droid - will use the sdkextensions-sdk
+// sources, if present. Otherwise, it will use the prebuilts.
+//
+// This is a temporary mechanism to control the prefer flags and will be removed once a more
+// maintainable solution has been implemented.
+// TODO(b/174997203): Remove when no longer necessary.
+//
// SOONG_SDK_SNAPSHOT_VERSION
// This provides control over the version of the generated snapshot.
//
@@ -760,6 +792,8 @@ func (t unversionedToVersionedTransformation) transformModule(module *bpModule)
module.insertAfter("name", "sdk_member_name", name)
// Remove the prefer property if present as versioned modules never need marking with prefer.
module.removeProperty("prefer")
+ // Ditto for use_source_config_var
+ module.removeProperty("use_source_config_var")
return module
}
@@ -996,6 +1030,9 @@ type snapshotBuilder struct {
filesToZip android.Paths
zipsToMerge android.Paths
+ // The path to an empty file.
+ emptyFile android.WritablePath
+
prebuiltModules map[string]*bpModule
prebuiltOrder []*bpModule
@@ -1046,6 +1083,19 @@ func (s *snapshotBuilder) UnzipToSnapshot(zipPath android.Path, destDir string)
s.zipsToMerge = append(s.zipsToMerge, tmpZipPath)
}
+func (s *snapshotBuilder) EmptyFile() android.Path {
+ if s.emptyFile == nil {
+ ctx := s.ctx
+ s.emptyFile = android.PathForModuleOut(ctx, "empty")
+ s.ctx.Build(pctx, android.BuildParams{
+ Rule: android.Touch,
+ Output: s.emptyFile,
+ })
+ }
+
+ return s.emptyFile
+}
+
func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType string) android.BpModule {
name := member.Name()
if s.prebuiltModules[name] != nil {
@@ -1627,13 +1677,24 @@ func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModu
// snapshot to be created that sets prefer: true.
// TODO(b/174997203): Remove once the ability to select the modules to prefer can be done
// dynamically at build time not at snapshot generation time.
- prefer := ctx.sdkMemberContext.Config().IsEnvTrue("SOONG_SDK_SNAPSHOT_PREFER")
+ config := ctx.sdkMemberContext.Config()
+ prefer := config.IsEnvTrue("SOONG_SDK_SNAPSHOT_PREFER")
// Set prefer. Setting this to false is not strictly required as that is the default but it does
// provide a convenient hook to post-process the generated Android.bp file, e.g. in tests to
// check the behavior when a prebuilt is preferred. It also makes it explicit what the default
// behavior is for the module.
bpModule.insertAfter("name", "prefer", prefer)
+
+ configVar := config.Getenv("SOONG_SDK_SNAPSHOT_USE_SOURCE_CONFIG_VAR")
+ if configVar != "" {
+ parts := strings.Split(configVar, ":")
+ cfp := android.ConfigVarProperties{
+ Config_namespace: proptools.StringPtr(parts[0]),
+ Var_name: proptools.StringPtr(parts[1]),
+ }
+ bpModule.insertAfter("prefer", "use_source_config_var", cfp)
+ }
}
// Group the variants by os type.
@@ -1714,7 +1775,7 @@ func (s *sdk) getPossibleOsTypes() []android.OsType {
var osTypes []android.OsType
for _, osType := range android.OsTypeList() {
if s.DeviceSupported() {
- if osType.Class == android.Device && osType != android.Fuchsia {
+ if osType.Class == android.Device {
osTypes = append(osTypes, osType)
}
}