diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-09-08 13:32:37 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-09-08 13:32:37 +0000 |
commit | 2211cb4baea65f192a9bb9b5306f80cbea00a305 (patch) | |
tree | 25c6d5e176c5cebf3bd70b77df70a86176ffbed7 | |
parent | 75f9de910b9617f77a0ee5cfd59d021592e55e80 (diff) | |
parent | 1b87bfa834509b3870c7c5f565680e4cc3e7e2ac (diff) | |
download | soong-android13-mainline-go-sdkext-release.tar.gz |
Snap for 8756029 from 1b87bfa834509b3870c7c5f565680e4cc3e7e2ac to mainline-go-sdkext-releaseaml_go_sdk_330810000android13-mainline-go-sdkext-release
Change-Id: I95d79823bc3b5e8d18cf87d5a33b455727914030
40 files changed, 2389 insertions, 1815 deletions
diff --git a/android/defaults.go b/android/defaults.go index 54f44bcec..8b121f6d9 100644 --- a/android/defaults.go +++ b/android/defaults.go @@ -15,8 +15,6 @@ package android import ( - "bytes" - "fmt" "reflect" "github.com/google/blueprint" @@ -69,11 +67,9 @@ type Defaultable interface { // Set the property structures into which defaults will be added. setProperties(props []interface{}, variableProperties interface{}) - // Apply defaults from the supplied DefaultsModule to the property structures supplied to + // Apply defaults from the supplied Defaults to the property structures supplied to // setProperties(...). - applyDefaults(TopDownMutatorContext, []DefaultsModule) - - applySingleDefaultsWithTracker(EarlyModuleContext, DefaultsModule, defaultsTrackerFunc) + applyDefaults(TopDownMutatorContext, []Defaults) // Set the hook to be called after any defaults have been applied. // @@ -119,23 +115,9 @@ type DefaultsVisibilityProperties struct { Defaults_visibility []string } -// AdditionalDefaultsProperties contains properties of defaults modules which -// can have other defaults applied. -type AdditionalDefaultsProperties struct { - - // The list of properties set by the default whose values must not be changed by any module that - // applies these defaults. It is an error if a property is not supported by the defaults module or - // has not been set to a non-zero value. If this contains "*" then that must be the only entry in - // which case all properties that are set on this defaults will be protected (except the - // protected_properties and visibility. - Protected_properties []string -} - type DefaultsModuleBase struct { DefaultableModuleBase - defaultsProperties AdditionalDefaultsProperties - // Included to support setting bazel_module.label for multiple Soong modules to the same Bazel // target. This is primarily useful for modules that were architecture specific and instead are // handled in Bazel as a select(). @@ -169,18 +151,6 @@ type Defaults interface { // DefaultsModuleBase will type-assert to the Defaults interface. isDefaults() bool - // additionalDefaultableProperties returns additional properties provided by the defaults which - // can themselves have defaults applied. - additionalDefaultableProperties() []interface{} - - // protectedProperties returns the names of the properties whose values cannot be changed by a - // module that applies these defaults. - protectedProperties() []string - - // setProtectedProperties sets the names of the properties whose values cannot be changed by a - // module that applies these defaults. - setProtectedProperties(protectedProperties []string) - // Get the structures containing the properties for which defaults can be provided. properties() []interface{} @@ -197,18 +167,6 @@ type DefaultsModule interface { Bazelable } -func (d *DefaultsModuleBase) additionalDefaultableProperties() []interface{} { - return []interface{}{&d.defaultsProperties} -} - -func (d *DefaultsModuleBase) protectedProperties() []string { - return d.defaultsProperties.Protected_properties -} - -func (d *DefaultsModuleBase) setProtectedProperties(protectedProperties []string) { - d.defaultsProperties.Protected_properties = protectedProperties -} - func (d *DefaultsModuleBase) properties() []interface{} { return d.defaultableProperties } @@ -232,10 +190,6 @@ func InitDefaultsModule(module DefaultsModule) { &ApexProperties{}, &distProperties{}) - // Additional properties of defaults modules that can themselves have - // defaults applied. - module.AddProperties(module.additionalDefaultableProperties()...) - // Bazel module must be initialized _before_ Defaults to be included in cc_defaults module. InitBazelModule(module) initAndroidModuleBase(module) @@ -264,57 +218,6 @@ func InitDefaultsModule(module DefaultsModule) { // The applicable licenses property for defaults is 'licenses'. setPrimaryLicensesProperty(module, "licenses", &commonProperties.Licenses) - AddLoadHook(module, func(ctx LoadHookContext) { - - protectedProperties := module.protectedProperties() - if len(protectedProperties) == 0 { - return - } - - propertiesAvailable := map[string]struct{}{} - propertiesSet := map[string]struct{}{} - - // A defaults tracker which will keep track of which properties have been set on this module. - collector := func(defaults DefaultsModule, property string, dstValue interface{}, srcValue interface{}) bool { - value := reflect.ValueOf(dstValue) - propertiesAvailable[property] = struct{}{} - if !value.IsZero() { - propertiesSet[property] = struct{}{} - } - // Skip all the properties so that there are no changes to the defaults. - return false - } - - // Try and apply this module's defaults to itself, so that the properties can be collected but - // skip all the properties so it doesn't actually do anything. - module.applySingleDefaultsWithTracker(ctx, module, collector) - - if InList("*", protectedProperties) { - if len(protectedProperties) != 1 { - ctx.PropertyErrorf("protected_properties", `if specified then "*" must be the only property listed`) - return - } - - // Do not automatically protect the protected_properties property. - delete(propertiesSet, "protected_properties") - - // Or the visibility property. - delete(propertiesSet, "visibility") - - // Replace the "*" with the names of all the properties that have been set. - protectedProperties = SortedStringKeys(propertiesSet) - module.setProtectedProperties(protectedProperties) - } else { - for _, property := range protectedProperties { - if _, ok := propertiesAvailable[property]; !ok { - ctx.PropertyErrorf(property, "property is not supported by this module type %q", - ctx.ModuleType()) - } else if _, ok := propertiesSet[property]; !ok { - ctx.PropertyErrorf(property, "is not set; protected properties must be explicitly set") - } - } - } - }) } var _ Defaults = (*DefaultsModuleBase)(nil) @@ -366,204 +269,35 @@ func applyNamespacedVariableDefaults(defaultDep Defaults, ctx TopDownMutatorCont b.setNamespacedVariableProps(dst) } -// defaultValueInfo contains information about each default value that applies to a protected -// property. -type defaultValueInfo struct { - // The DefaultsModule providing the value, which may be defined on that module or applied as a - // default from other modules. - module Module - - // The default value, as returned by getComparableValue - defaultValue reflect.Value -} - -// protectedPropertyInfo contains information about each property that has to be protected when -// applying defaults. -type protectedPropertyInfo struct { - // True if the property was set on the module to which defaults are applied, this is an error. - propertySet bool - - // The original value of the property on the module, as returned by getComparableValue. - originalValue reflect.Value - - // A list of defaults for the property that are being applied. - defaultValues []defaultValueInfo -} - -// getComparableValue takes a reflect.Value that may be a pointer to another value and returns a -// reflect.Value to the underlying data or the original if was not a pointer or was nil. The -// returned values can then be compared for equality. -func getComparableValue(value reflect.Value) reflect.Value { - if value.IsZero() { - return value - } - for value.Kind() == reflect.Ptr { - value = value.Elem() - } - return value -} - func (defaultable *DefaultableModuleBase) applyDefaults(ctx TopDownMutatorContext, - defaultsList []DefaultsModule) { - - // Collate information on all the properties protected by each of the default modules applied - // to this module. - allProtectedProperties := map[string]*protectedPropertyInfo{} - for _, defaults := range defaultsList { - for _, property := range defaults.protectedProperties() { - info := allProtectedProperties[property] - if info == nil { - info = &protectedPropertyInfo{} - allProtectedProperties[property] = info - } - } - } - - // If there are any protected properties then collate information about attempts to change them. - var protectedPropertyInfoCollector defaultsTrackerFunc - if len(allProtectedProperties) > 0 { - protectedPropertyInfoCollector = func(defaults DefaultsModule, property string, - dstValue interface{}, srcValue interface{}) bool { - - // If the property is not protected then return immediately. - info := allProtectedProperties[property] - if info == nil { - return true - } - - currentValue := reflect.ValueOf(dstValue) - if info.defaultValues == nil { - info.propertySet = !currentValue.IsZero() - info.originalValue = getComparableValue(currentValue) - } - - defaultValue := reflect.ValueOf(srcValue) - if !defaultValue.IsZero() { - info.defaultValues = append(info.defaultValues, - defaultValueInfo{defaults, getComparableValue(defaultValue)}) - } - - return true - } - } + defaultsList []Defaults) { for _, defaults := range defaultsList { if ctx.Config().runningAsBp2Build { applyNamespacedVariableDefaults(defaults, ctx) } - - defaultable.applySingleDefaultsWithTracker(ctx, defaults, protectedPropertyInfoCollector) - } - - // Check the status of any protected properties. - for property, info := range allProtectedProperties { - if len(info.defaultValues) == 0 { - // No defaults were applied to the protected properties. Possibly because this module type - // does not support any of them. - continue - } - - // Check to make sure that there are no conflicts between the defaults. - conflictingDefaults := false - previousDefaultValue := reflect.ValueOf(false) - for _, defaultInfo := range info.defaultValues { - defaultValue := defaultInfo.defaultValue - if previousDefaultValue.IsZero() { - previousDefaultValue = defaultValue - } else if !reflect.DeepEqual(previousDefaultValue.Interface(), defaultValue.Interface()) { - conflictingDefaults = true - break - } - } - - if conflictingDefaults { - var buf bytes.Buffer - for _, defaultInfo := range info.defaultValues { - buf.WriteString(fmt.Sprintf("\n defaults module %q provides value %#v", - ctx.OtherModuleName(defaultInfo.module), defaultInfo.defaultValue)) - } - result := buf.String() - ctx.ModuleErrorf("has conflicting default values for protected property %q:%s", property, result) - continue - } - - // Now check to see whether there the current module tried to override/append to the defaults. - if info.propertySet { - originalValue := info.originalValue - // Just compare against the first defaults. - defaultValue := info.defaultValues[0].defaultValue - defaults := info.defaultValues[0].module - - if originalValue.Kind() == reflect.Slice { - ctx.ModuleErrorf("attempts to append %q to protected property %q's value of %q defined in module %q", - originalValue, - property, - defaultValue, - ctx.OtherModuleName(defaults)) + for _, prop := range defaultable.defaultableProperties { + if prop == defaultable.defaultableVariableProperties { + defaultable.applyDefaultVariableProperties(ctx, defaults, prop) } else { - same := reflect.DeepEqual(originalValue.Interface(), defaultValue.Interface()) - message := "" - if same { - message = fmt.Sprintf(" with a matching value (%#v) so this property can simply be removed.", originalValue) - } else { - message = fmt.Sprintf(" with a different value (override %#v with %#v) so removing the property may necessitate other changes.", defaultValue, originalValue) - } - ctx.ModuleErrorf("attempts to override protected property %q defined in module %q%s", - property, - ctx.OtherModuleName(defaults), message) + defaultable.applyDefaultProperties(ctx, defaults, prop) } } } } -func (defaultable *DefaultableModuleBase) applySingleDefaultsWithTracker(ctx EarlyModuleContext, defaults DefaultsModule, tracker defaultsTrackerFunc) { - for _, prop := range defaultable.defaultableProperties { - var err error - if prop == defaultable.defaultableVariableProperties { - err = defaultable.applyDefaultVariableProperties(defaults, prop, tracker) - } else { - err = defaultable.applyDefaultProperties(defaults, prop, tracker) - } - if err != nil { - if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok { - ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error()) - } else { - panic(err) - } - } - } -} - -// defaultsTrackerFunc is the type of a function that can be used to track how defaults are applied. -type defaultsTrackerFunc func(defaults DefaultsModule, property string, - dstValue interface{}, srcValue interface{}) bool - -// filterForTracker wraps a defaultsTrackerFunc in a proptools.ExtendPropertyFilterFunc -func filterForTracker(defaults DefaultsModule, tracker defaultsTrackerFunc) proptools.ExtendPropertyFilterFunc { - if tracker == nil { - return nil - } - return func(property string, - dstField, srcField reflect.StructField, - dstValue, srcValue interface{}) (bool, error) { - - apply := tracker(defaults, property, dstValue, srcValue) - return apply, nil - } -} - // Product variable properties need special handling, the type of the filtered product variable // property struct may not be identical between the defaults module and the defaultable module. // Use PrependMatchingProperties to apply whichever properties match. -func (defaultable *DefaultableModuleBase) applyDefaultVariableProperties(defaults DefaultsModule, - defaultableProp interface{}, tracker defaultsTrackerFunc) error { +func (defaultable *DefaultableModuleBase) applyDefaultVariableProperties(ctx TopDownMutatorContext, + defaults Defaults, defaultableProp interface{}) { if defaultableProp == nil { - return nil + return } defaultsProp := defaults.productVariableProperties() if defaultsProp == nil { - return nil + return } dst := []interface{}{ @@ -573,26 +307,31 @@ func (defaultable *DefaultableModuleBase) applyDefaultVariableProperties(default proptools.CloneEmptyProperties(reflect.ValueOf(defaultsProp)).Interface(), } - filter := filterForTracker(defaults, tracker) - - return proptools.PrependMatchingProperties(dst, defaultsProp, filter) + err := proptools.PrependMatchingProperties(dst, defaultsProp, nil) + if err != nil { + if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok { + ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error()) + } else { + panic(err) + } + } } -func (defaultable *DefaultableModuleBase) applyDefaultProperties(defaults DefaultsModule, - defaultableProp interface{}, checker defaultsTrackerFunc) error { - - filter := filterForTracker(defaults, checker) +func (defaultable *DefaultableModuleBase) applyDefaultProperties(ctx TopDownMutatorContext, + defaults Defaults, defaultableProp interface{}) { for _, def := range defaults.properties() { if proptools.TypeEqual(defaultableProp, def) { - err := proptools.PrependProperties(defaultableProp, def, filter) + err := proptools.PrependProperties(defaultableProp, def, nil) if err != nil { - return err + if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok { + ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error()) + } else { + panic(err) + } } } } - - return nil } func RegisterDefaultsPreArchMutators(ctx RegisterMutatorsContext) { @@ -609,12 +348,12 @@ func defaultsDepsMutator(ctx BottomUpMutatorContext) { func defaultsMutator(ctx TopDownMutatorContext) { if defaultable, ok := ctx.Module().(Defaultable); ok { if len(defaultable.defaults().Defaults) > 0 { - var defaultsList []DefaultsModule + var defaultsList []Defaults seen := make(map[Defaults]bool) ctx.WalkDeps(func(module, parent Module) bool { if ctx.OtherModuleDependencyTag(module) == DefaultsDepTag { - if defaults, ok := module.(DefaultsModule); ok { + if defaults, ok := module.(Defaults); ok { if !seen[defaults] { seen[defaults] = true defaultsList = append(defaultsList, defaults) diff --git a/android/defaults_test.go b/android/defaults_test.go index d80f40cc6..a7542abb3 100644 --- a/android/defaults_test.go +++ b/android/defaults_test.go @@ -19,14 +19,7 @@ import ( ) type defaultsTestProperties struct { - Foo []string - Bar []string - Nested struct { - Fizz *bool - } - Other struct { - Buzz *string - } + Foo []string } type defaultsTestModule struct { @@ -137,167 +130,3 @@ func TestDefaultsAllowMissingDependencies(t *testing.T) { // TODO: missing transitive defaults is currently not handled _ = missingTransitiveDefaults } - -func TestProtectedProperties_ProtectedPropertyNotSet(t *testing.T) { - bp := ` - defaults { - name: "transitive", - protected_properties: ["foo"], - } - ` - - GroupFixturePreparers( - prepareForDefaultsTest, - FixtureWithRootAndroidBp(bp), - ).ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern( - "module \"transitive\": foo: is not set; protected properties must be explicitly set")). - RunTest(t) -} - -func TestProtectedProperties_ProtectedPropertyNotLeaf(t *testing.T) { - bp := ` - defaults { - name: "transitive", - protected_properties: ["nested"], - nested: { - fizz: true, - }, - } - ` - - GroupFixturePreparers( - prepareForDefaultsTest, - FixtureWithRootAndroidBp(bp), - ).ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern( - `\Qmodule "transitive": nested: property is not supported by this module type "defaults"\E`)). - RunTest(t) -} - -// TestProtectedProperties_ApplyDefaults makes sure that the protected_properties property has -// defaults applied. -func TestProtectedProperties_HasDefaultsApplied(t *testing.T) { - - bp := ` - defaults { - name: "transitive", - protected_properties: ["foo"], - foo: ["transitive"], - } - - defaults { - name: "defaults", - defaults: ["transitive"], - protected_properties: ["bar"], - bar: ["defaults"], - } - ` - - result := GroupFixturePreparers( - prepareForDefaultsTest, - FixtureWithRootAndroidBp(bp), - ).RunTest(t) - - defaults := result.Module("defaults", "").(DefaultsModule) - AssertDeepEquals(t, "defaults protected properties", []string{"foo", "bar"}, defaults.protectedProperties()) -} - -// TestProtectedProperties_ProtectAllProperties makes sure that protected_properties: ["*"] protects -// all properties. -func TestProtectedProperties_ProtectAllProperties(t *testing.T) { - - bp := ` - defaults { - name: "transitive", - protected_properties: ["other.buzz"], - other: { - buzz: "transitive", - }, - } - - defaults { - name: "defaults", - defaults: ["transitive"], - visibility: ["//visibility:private"], - protected_properties: ["*"], - foo: ["other"], - bar: ["defaults"], - nested: { - fizz: true, - } - } - ` - - result := GroupFixturePreparers( - prepareForDefaultsTest, - FixtureWithRootAndroidBp(bp), - ).RunTest(t) - - defaults := result.Module("defaults", "").(DefaultsModule) - AssertDeepEquals(t, "defaults protected properties", []string{"other.buzz", "bar", "foo", "nested.fizz"}, - defaults.protectedProperties()) -} - -func TestProtectedProperties_DetectedOverride(t *testing.T) { - bp := ` - defaults { - name: "defaults", - protected_properties: ["foo", "nested.fizz"], - foo: ["defaults"], - nested: { - fizz: true, - }, - } - - test { - name: "foo", - defaults: ["defaults"], - foo: ["module"], - nested: { - fizz: false, - }, - } - ` - - GroupFixturePreparers( - prepareForDefaultsTest, - FixtureWithRootAndroidBp(bp), - ).ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern( - []string{ - `\Qmodule "foo": attempts to append ["module"] to protected property "foo"'s value of ["defaults"] defined in module "defaults"\E`, - `\Qmodule "foo": attempts to override protected property "nested.fizz" defined in module "defaults" with a different value (override true with false) so removing the property may necessitate other changes.\E`, - })).RunTest(t) -} - -func TestProtectedProperties_DefaultsConflict(t *testing.T) { - bp := ` - defaults { - name: "defaults1", - protected_properties: ["other.buzz"], - other: { - buzz: "value", - }, - } - - defaults { - name: "defaults2", - protected_properties: ["other.buzz"], - other: { - buzz: "another", - }, - } - - test { - name: "foo", - defaults: ["defaults1", "defaults2"], - } - ` - - GroupFixturePreparers( - prepareForDefaultsTest, - FixtureWithRootAndroidBp(bp), - ).ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern( - `\Qmodule "foo": has conflicting default values for protected property "other.buzz": - defaults module "defaults1" provides value "value" - defaults module "defaults2" provides value "another"\E`, - )).RunTest(t) -} diff --git a/android/sdk.go b/android/sdk.go index a71f7f211..9317910ee 100644 --- a/android/sdk.go +++ b/android/sdk.go @@ -661,10 +661,6 @@ type SdkMemberType interface { // an Android.bp file. RequiresBpProperty() bool - // SupportedBuildReleases returns the string representation of a set of target build releases that - // support this member type. - SupportedBuildReleases() string - // UsableWithSdkAndSdkSnapshot returns true if the member type supports the sdk/sdk_snapshot, // false otherwise. UsableWithSdkAndSdkSnapshot() bool @@ -674,13 +670,6 @@ type SdkMemberType interface { // host OS variant explicitly and disable all other host OS'es. IsHostOsDependent() bool - // SupportedLinkages returns the names of the linkage variants supported by this module. - SupportedLinkages() []string - - // ArePrebuiltsRequired returns true if prebuilts are required in the sdk snapshot, false - // otherwise. - ArePrebuiltsRequired() bool - // AddDependencies adds 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 @@ -744,9 +733,6 @@ type SdkMemberType interface { // SupportedTraits returns the set of traits supported by this member type. SupportedTraits() SdkMemberTraitSet - - // Overrides returns whether type overrides other SdkMemberType - Overrides(SdkMemberType) bool } var _ sdkRegisterable = (SdkMemberType)(nil) @@ -770,28 +756,11 @@ type SdkDependencyContext interface { type SdkMemberTypeBase struct { PropertyName string - // Property names that this SdkMemberTypeBase can override, this is useful when a module type is a - // superset of another module type. - OverridesPropertyNames map[string]bool - - // The names of linkage variants supported by this module. - SupportedLinkageNames []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 - // The name of the first targeted build release. - // - // If not specified then it is assumed to be available on all targeted build releases. - SupportedBuildReleaseSpecification string - - // Set to true if this must be usable with the sdk/sdk_snapshot module types. Otherwise, it will - // only be usable with module_exports/module_exports_snapshots module types. - SupportsSdk bool - - // Set to true if prebuilt host artifacts of this member may be specific to the host OS. Only - // applicable to modules where HostSupported() is true. + SupportsSdk bool HostOsDependent bool // When set to true UseSourceModuleTypeInSnapshot indicates that the member type creates a source @@ -799,11 +768,6 @@ type SdkMemberTypeBase struct { // code from automatically adding a prefer: true flag. UseSourceModuleTypeInSnapshot bool - // Set to proptools.BoolPtr(false) if this member does not generate prebuilts but is only provided - // to allow the sdk to gather members from this member's dependencies. If not specified then - // defaults to true. - PrebuiltsRequired *bool - // The list of supported traits. Traits []SdkMemberTrait } @@ -816,10 +780,6 @@ func (b *SdkMemberTypeBase) RequiresBpProperty() bool { return !b.BpPropertyNotRequired } -func (b *SdkMemberTypeBase) SupportedBuildReleases() string { - return b.SupportedBuildReleaseSpecification -} - func (b *SdkMemberTypeBase) UsableWithSdkAndSdkSnapshot() bool { return b.SupportsSdk } @@ -828,10 +788,6 @@ func (b *SdkMemberTypeBase) IsHostOsDependent() bool { return b.HostOsDependent } -func (b *SdkMemberTypeBase) ArePrebuiltsRequired() bool { - return proptools.BoolDefault(b.PrebuiltsRequired, true) -} - func (b *SdkMemberTypeBase) UsesSourceModuleTypeInSnapshot() bool { return b.UseSourceModuleTypeInSnapshot } @@ -840,14 +796,6 @@ func (b *SdkMemberTypeBase) SupportedTraits() SdkMemberTraitSet { return NewSdkMemberTraitSet(b.Traits) } -func (b *SdkMemberTypeBase) Overrides(other SdkMemberType) bool { - return b.OverridesPropertyNames[other.SdkPropertyName()] -} - -func (b *SdkMemberTypeBase) SupportedLinkages() []string { - return b.SupportedLinkageNames -} - // registeredModuleExportsMemberTypes is the set of registered SdkMemberTypes for module_exports // modules. var registeredModuleExportsMemberTypes = &sdkRegistry{} @@ -985,10 +933,6 @@ type SdkMemberContext interface { // RequiresTrait returns true if this member is expected to provide the specified trait. RequiresTrait(trait SdkMemberTrait) bool - - // IsTargetBuildBeforeTiramisu return true if the target build release for which this snapshot is - // being generated is before Tiramisu, i.e. S. - IsTargetBuildBeforeTiramisu() bool } // ExportedComponentsInfo contains information about the components that this module exports to an diff --git a/apex/Android.bp b/apex/Android.bp index 312aadb2a..41224ecd5 100644 --- a/apex/Android.bp +++ b/apex/Android.bp @@ -22,10 +22,8 @@ bootstrap_go_package { srcs: [ "androidmk.go", "apex.go", - "apex_sdk_member.go", "apex_singleton.go", "builder.go", - "constants.go", "deapexer.go", "key.go", "prebuilt.go", diff --git a/apex/apex.go b/apex/apex.go index 744a9a602..951157f17 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -604,49 +604,32 @@ type dependencyTag struct { // replacement. This is needed because some prebuilt modules do not provide all the information // needed by the apex. sourceOnly bool - - // If not-nil and an APEX is a member of an SDK then dependencies of that APEX with this tag will - // also be added as exported members of that SDK. - memberType android.SdkMemberType -} - -func (d *dependencyTag) SdkMemberType(_ android.Module) android.SdkMemberType { - return d.memberType -} - -func (d *dependencyTag) ExportMember() bool { - return true -} - -func (d *dependencyTag) String() string { - return fmt.Sprintf("apex.dependencyTag{%q}", d.name) } -func (d *dependencyTag) ReplaceSourceWithPrebuilt() bool { +func (d dependencyTag) ReplaceSourceWithPrebuilt() bool { return !d.sourceOnly } var _ android.ReplaceSourceWithPrebuilt = &dependencyTag{} -var _ android.SdkMemberDependencyTag = &dependencyTag{} var ( - androidAppTag = &dependencyTag{name: "androidApp", payload: true} - bpfTag = &dependencyTag{name: "bpf", payload: true} - certificateTag = &dependencyTag{name: "certificate"} - executableTag = &dependencyTag{name: "executable", payload: true} - fsTag = &dependencyTag{name: "filesystem", payload: true} - bcpfTag = &dependencyTag{name: "bootclasspathFragment", payload: true, sourceOnly: true, memberType: java.BootclasspathFragmentSdkMemberType} - sscpfTag = &dependencyTag{name: "systemserverclasspathFragment", payload: true, sourceOnly: true, memberType: java.SystemServerClasspathFragmentSdkMemberType} - compatConfigTag = &dependencyTag{name: "compatConfig", payload: true, sourceOnly: true} - javaLibTag = &dependencyTag{name: "javaLib", payload: true} - jniLibTag = &dependencyTag{name: "jniLib", payload: true} - keyTag = &dependencyTag{name: "key"} - prebuiltTag = &dependencyTag{name: "prebuilt", payload: true} - rroTag = &dependencyTag{name: "rro", payload: true} - sharedLibTag = &dependencyTag{name: "sharedLib", payload: true} - testForTag = &dependencyTag{name: "test for"} - testTag = &dependencyTag{name: "test", payload: true} - shBinaryTag = &dependencyTag{name: "shBinary", payload: true} + androidAppTag = dependencyTag{name: "androidApp", payload: true} + bpfTag = dependencyTag{name: "bpf", payload: true} + certificateTag = dependencyTag{name: "certificate"} + executableTag = dependencyTag{name: "executable", payload: true} + fsTag = dependencyTag{name: "filesystem", payload: true} + bcpfTag = dependencyTag{name: "bootclasspathFragment", payload: true, sourceOnly: true} + sscpfTag = dependencyTag{name: "systemserverclasspathFragment", payload: true, sourceOnly: true} + compatConfigTag = dependencyTag{name: "compatConfig", payload: true, sourceOnly: true} + javaLibTag = dependencyTag{name: "javaLib", payload: true} + jniLibTag = dependencyTag{name: "jniLib", payload: true} + keyTag = dependencyTag{name: "key"} + prebuiltTag = dependencyTag{name: "prebuilt", payload: true} + rroTag = dependencyTag{name: "rro", payload: true} + sharedLibTag = dependencyTag{name: "sharedLib", payload: true} + testForTag = dependencyTag{name: "test for"} + testTag = dependencyTag{name: "test", payload: true} + shBinaryTag = dependencyTag{name: "shBinary", payload: true} ) // TODO(jiyong): shorten this function signature @@ -1752,7 +1735,7 @@ func (a *apexBundle) WalkPayloadDeps(ctx android.ModuleContext, do android.Paylo if _, ok := depTag.(android.ExcludeFromApexContentsTag); ok { return false } - if dt, ok := depTag.(*dependencyTag); ok && !dt.payload { + if dt, ok := depTag.(dependencyTag); ok && !dt.payload { return false } diff --git a/apex/apex_sdk_member.go b/apex/apex_sdk_member.go deleted file mode 100644 index 284158f07..000000000 --- a/apex/apex_sdk_member.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (C) 2022 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 apex - -import ( - "android/soong/android" - "github.com/google/blueprint" - "github.com/google/blueprint/proptools" -) - -// This file contains support for using apex modules within an sdk. - -func init() { - // Register sdk member types. - android.RegisterSdkMemberType(&apexSdkMemberType{ - SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "apexes", - SupportsSdk: true, - - // The apexes property does not need to be included in the snapshot as adding an apex to an - // sdk does not produce any prebuilts of the apex. - PrebuiltsRequired: proptools.BoolPtr(false), - }, - }) -} - -type apexSdkMemberType struct { - android.SdkMemberTypeBase -} - -func (mt *apexSdkMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) { - ctx.AddVariationDependencies(nil, dependencyTag, names...) -} - -func (mt *apexSdkMemberType) IsInstance(module android.Module) bool { - _, ok := module.(*apexBundle) - return ok -} - -func (mt *apexSdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule { - panic("Sdk does not create prebuilts of the apexes in its snapshot") -} - -func (mt *apexSdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties { - panic("Sdk does not create prebuilts of the apexes in its snapshot") -} diff --git a/apex/apex_test.go b/apex/apex_test.go index dbe918010..b3036b1fa 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -5931,7 +5931,7 @@ func TestApexAvailable_DirectDep(t *testing.T) { func TestApexAvailable_IndirectDep(t *testing.T) { // libbbaz is an indirect dep testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path: -.*via tag apex\.dependencyTag\{"sharedLib"\} +.*via tag apex\.dependencyTag.*name:sharedLib.* .*-> libfoo.*link:shared.* .*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.* .*-> libbar.*link:shared.* @@ -6227,9 +6227,6 @@ func TestOverrideApex(t *testing.T) { name: "mybootclasspath_fragment", contents: ["bcplib"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -6244,9 +6241,6 @@ func TestOverrideApex(t *testing.T) { name: "override_bootclasspath_fragment", contents: ["override_bcplib"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -7300,9 +7294,6 @@ func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer androi apex_available: [ "some-non-updatable-apex", ], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -7361,9 +7352,6 @@ func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer androi apex_available: [ "com.android.art.debug", ], - hidden_api: { - split_packages: ["*"], - }, } apex_key { @@ -8808,9 +8796,6 @@ func TestApexJavaCoverage(t *testing.T) { name: "mybootclasspathfragment", contents: ["mybootclasspathlib"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -9131,9 +9116,6 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { name: "mybootclasspathfragment", contents: ["mybootclasspathlib"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_sdk_library { @@ -9234,9 +9216,6 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { name: "mybootclasspathfragment", contents: ["mybootclasspathlib"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_sdk_library { @@ -9456,9 +9435,6 @@ func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) { name: "mybootclasspathfragment", contents: ["myjavalib"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_library { name: "myjavalib", diff --git a/apex/bootclasspath_fragment_test.go b/apex/bootclasspath_fragment_test.go index b298dac5d..ce6b7f730 100644 --- a/apex/bootclasspath_fragment_test.go +++ b/apex/bootclasspath_fragment_test.go @@ -110,9 +110,6 @@ func TestBootclasspathFragments(t *testing.T) { apex_available: [ "com.android.art", ], - hidden_api: { - split_packages: ["*"], - }, } `, ) @@ -212,9 +209,6 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { apex_available: [ "com.android.art", ], - hidden_api: { - split_packages: ["*"], - }, } bootclasspath_fragment { @@ -226,9 +220,6 @@ func TestBootclasspathFragments_FragmentDependency(t *testing.T) { module: "art-bootclasspath-fragment", }, ], - hidden_api: { - split_packages: ["*"], - }, } `, ) @@ -370,9 +361,6 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { apex_available: [ "com.android.art", ], - hidden_api: { - split_packages: ["*"], - }, } `, contentsInsert(contents)) @@ -865,9 +853,6 @@ func TestBootclasspathFragmentContentsNoName(t *testing.T) { apex_available: [ "myapex", ], - hidden_api: { - split_packages: ["*"], - }, } `) @@ -974,9 +959,6 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) { apex_available: [ "com.android.art", ], - hidden_api: { - split_packages: ["*"], - }, } apex { @@ -1028,9 +1010,6 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) { module: "art-bootclasspath-fragment", }, ], - hidden_api: { - split_packages: ["*"], - }, } `) @@ -1144,9 +1123,6 @@ func TestBootclasspathFragment_AndroidNonUpdatable(t *testing.T) { apex_available: [ "com.android.art", ], - hidden_api: { - split_packages: ["*"], - }, } apex { @@ -1199,9 +1175,6 @@ func TestBootclasspathFragment_AndroidNonUpdatable(t *testing.T) { module: "art-bootclasspath-fragment", }, ], - hidden_api: { - split_packages: ["*"], - }, } `) @@ -1309,9 +1282,6 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test apex_available: [ "com.android.art", ], - hidden_api: { - split_packages: ["*"], - }, } apex { @@ -1364,9 +1334,6 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test module: "art-bootclasspath-fragment", }, ], - hidden_api: { - split_packages: ["*"], - }, } `) diff --git a/apex/builder.go b/apex/builder.go index 1956b4447..a21fcb899 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -76,12 +76,11 @@ var ( Command: `rm -f $out && ${jsonmodify} $in ` + `-a provideNativeLibs ${provideNativeLibs} ` + `-a requireNativeLibs ${requireNativeLibs} ` + - `-se version 0 ${default_version} ` + `${opt} ` + `-o $out`, CommandDeps: []string{"${jsonmodify}"}, Description: "prepare ${out}", - }, "provideNativeLibs", "requireNativeLibs", "default_version", "opt") + }, "provideNativeLibs", "requireNativeLibs", "opt") stripApexManifestRule = pctx.StaticRule("stripApexManifestRule", blueprint.RuleParams{ Command: `rm -f $out && ${conv_apex_manifest} strip $in -o $out`, @@ -214,7 +213,6 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, Args: map[string]string{ "provideNativeLibs": strings.Join(provideNativeLibs, " "), "requireNativeLibs": strings.Join(requireNativeLibs, " "), - "default_version": defaultManifestVersion, "opt": strings.Join(optCommands, " "), }, }) diff --git a/apex/classpath_element_test.go b/apex/classpath_element_test.go index 9142eed99..60f18bd57 100644 --- a/apex/classpath_element_test.go +++ b/apex/classpath_element_test.go @@ -88,9 +88,6 @@ func TestCreateClasspathElements(t *testing.T) { "baz", "quuz", ], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -137,9 +134,6 @@ func TestCreateClasspathElements(t *testing.T) { contents: [ "bar", ], - hidden_api: { - split_packages: ["*"], - }, } java_library { diff --git a/apex/constants.go b/apex/constants.go deleted file mode 100644 index c68edb724..000000000 --- a/apex/constants.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2022 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 apex - -// This file contains branch specific constants. They are stored in a separate -// file to minimise the potential of merge conflicts between branches when -// the code from the package is changed. - -// The default manifest version for all the modules on this branch. -// This version code will be used only if there is no version field in the -// module's apex_manifest.json. Release branches have their version injected -// into apex_manifest.json by the tooling and will not use the version set -// here. Developers can also set the version field locally in the -// apex_manifest.json to build a module with a specific version. -// -// The value follows the schema from go/mainline-version-codes, and is chosen -// based on the branch such that the builds from testing and development -// branches will have a version higher than the prebuilts. -// Versions per branch: -// * x-dev - xx0090000 (where xx is the branch SDK level) -// * AOSP - xx9990000 -// * x-mainline-prod - xx9990000 -// * master - 990090000 -const defaultManifestVersion = "339990000" diff --git a/apex/platform_bootclasspath_test.go b/apex/platform_bootclasspath_test.go index 4b48da8e2..06c39ee4b 100644 --- a/apex/platform_bootclasspath_test.go +++ b/apex/platform_bootclasspath_test.go @@ -125,7 +125,6 @@ func TestPlatformBootclasspath_Fragments(t *testing.T) { unsupported_packages: [ "bar-unsupported-packages.txt", ], - split_packages: ["*"], }, } @@ -275,9 +274,6 @@ func TestPlatformBootclasspathDependencies(t *testing.T) { "baz", "quuz", ], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -321,9 +317,6 @@ func TestPlatformBootclasspathDependencies(t *testing.T) { name: "my-bootclasspath-fragment", contents: ["bar"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } apex_key { @@ -489,9 +482,6 @@ func TestPlatformBootclasspath_AlwaysUsePrebuiltSdks(t *testing.T) { contents: [ "foo", "bar", ], - hidden_api: { - split_packages: ["*"], - }, } prebuilt_bootclasspath_fragment { @@ -609,9 +599,6 @@ func TestPlatformBootclasspath_IncludesRemainingApexJars(t *testing.T) { generate_classpaths_proto: false, contents: ["foo"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -669,9 +656,6 @@ func TestBootJarNotInApex(t *testing.T) { contents: [ "foo", ], - hidden_api: { - split_packages: ["*"], - }, } platform_bootclasspath { @@ -712,9 +696,6 @@ func TestBootFragmentNotInApex(t *testing.T) { bootclasspath_fragment { name: "not-in-apex-fragment", contents: ["foo"], - hidden_api: { - split_packages: ["*"], - }, } platform_bootclasspath { @@ -765,9 +746,6 @@ func TestNonBootJarInFragment(t *testing.T) { name: "apex-fragment", contents: ["foo", "bar"], apex_available:[ "myapex" ], - hidden_api: { - split_packages: ["*"], - }, } platform_bootclasspath { diff --git a/cc/library_sdk_member.go b/cc/library_sdk_member.go index 1bcbdc55d..8988de2e5 100644 --- a/cc/library_sdk_member.go +++ b/cc/library_sdk_member.go @@ -27,33 +27,32 @@ import ( var sharedLibrarySdkMemberType = &librarySdkMemberType{ SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "native_shared_libs", - SupportsSdk: true, - HostOsDependent: true, - SupportedLinkageNames: []string{"shared"}, + PropertyName: "native_shared_libs", + SupportsSdk: true, + HostOsDependent: true, }, prebuiltModuleType: "cc_prebuilt_library_shared", + linkTypes: []string{"shared"}, } var staticLibrarySdkMemberType = &librarySdkMemberType{ SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "native_static_libs", - SupportsSdk: true, - HostOsDependent: true, - SupportedLinkageNames: []string{"static"}, + PropertyName: "native_static_libs", + SupportsSdk: true, + HostOsDependent: true, }, prebuiltModuleType: "cc_prebuilt_library_static", + linkTypes: []string{"static"}, } var staticAndSharedLibrarySdkMemberType = &librarySdkMemberType{ SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "native_libs", - OverridesPropertyNames: map[string]bool{"native_shared_libs": true, "native_static_libs": true}, - SupportsSdk: true, - HostOsDependent: true, - SupportedLinkageNames: []string{"static", "shared"}, + PropertyName: "native_libs", + SupportsSdk: true, + HostOsDependent: true, }, prebuiltModuleType: "cc_prebuilt_library", + linkTypes: []string{"static", "shared"}, } func init() { @@ -70,6 +69,9 @@ type librarySdkMemberType struct { noOutputFiles bool // True if there are no srcs files. + // The set of link types supported. A set of "static", "shared", or nil to + // skip link type variations. + linkTypes []string } func (mt *librarySdkMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) { @@ -163,12 +165,12 @@ func (mt *librarySdkMemberType) AddDependencies(ctx android.SdkDependencyContext // Add any additional dependencies needed. variations = append(variations, dependency.imageVariations...) - if mt.SupportedLinkageNames == nil { + if mt.linkTypes == nil { // No link types are supported so add a dependency directly. ctx.AddFarVariationDependencies(variations, dependencyTag, name) } else { // Otherwise, add a dependency on each supported link type in turn. - for _, linkType := range mt.SupportedLinkageNames { + for _, linkType := range mt.linkTypes { libVariations := append(variations, blueprint.Variation{Mutator: "link", Variation: linkType}) // If this is for the device and a shared link type then add a dependency onto the diff --git a/cc/object.go b/cc/object.go index 3558efba1..bd5bd4517 100644 --- a/cc/object.go +++ b/cc/object.go @@ -37,6 +37,7 @@ var ccObjectSdkMemberType = &librarySdkMemberType{ SupportsSdk: true, }, prebuiltModuleType: "cc_prebuilt_object", + linkTypes: nil, } type objectLinker struct { diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index 3f8105c88..4b3161b33 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -183,7 +183,8 @@ func runQueryView(queryviewDir, queryviewMarker string, configuration android.Co touch(shared.JoinPath(topDir, queryviewMarker)) } -func writeMetrics(configuration android.Config, eventHandler metrics.EventHandler, metricsDir string) { +func writeMetrics(configuration android.Config, eventHandler metrics.EventHandler) { + metricsDir := configuration.Getenv("LOG_DIR") if len(metricsDir) < 1 { fmt.Fprintf(os.Stderr, "\nMissing required env var for generating soong metrics: LOG_DIR\n") os.Exit(1) @@ -237,7 +238,7 @@ func writeDepFile(outputFile string, eventHandler metrics.EventHandler, ninjaDep // doChosenActivity runs Soong for a specific activity, like bp2build, queryview // or the actual Soong build for the build.ninja file. Returns the top level // output file of the specific activity. -func doChosenActivity(configuration android.Config, extraNinjaDeps []string, logDir string) string { +func doChosenActivity(configuration android.Config, extraNinjaDeps []string) string { mixedModeBuild := configuration.BazelContext.BazelEnabled() generateBazelWorkspace := bp2buildMarker != "" generateQueryView := bazelQueryViewDir != "" @@ -301,7 +302,7 @@ func doChosenActivity(configuration android.Config, extraNinjaDeps []string, log } } - writeMetrics(configuration, *ctx.EventHandler, logDir) + writeMetrics(configuration, *ctx.EventHandler) return cmdlineArgs.OutFile } @@ -357,11 +358,7 @@ func main() { extraNinjaDeps = append(extraNinjaDeps, filepath.Join(configuration.SoongOutDir(), "always_rerun_for_delve")) } - // Bypass configuration.Getenv, as LOG_DIR does not need to be dependency tracked. By definition, it will - // change between every CI build, so tracking it would require re-running Soong for every build. - logDir := availableEnv["LOG_DIR"] - - finalOutputFile := doChosenActivity(configuration, extraNinjaDeps, logDir) + finalOutputFile := doChosenActivity(configuration, extraNinjaDeps) writeUsedEnvironmentFile(configuration, finalOutputFile) } diff --git a/java/app.go b/java/app.go index 41419ba78..94e6fb950 100755 --- a/java/app.go +++ b/java/app.go @@ -589,16 +589,6 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx) - var noticeAssetPath android.WritablePath - if Bool(a.appProperties.Embed_notices) || ctx.Config().IsEnvTrue("ALWAYS_EMBED_NOTICES") { - // The rule to create the notice file can't be generated yet, as the final output path - // for the apk isn't known yet. Add the path where the notice file will be generated to the - // aapt rules now before calling aaptBuildActions, the rule to create the notice file will - // be generated later. - noticeAssetPath = android.PathForModuleOut(ctx, "NOTICE", "NOTICE.html.gz") - a.aapt.noticeFile = android.OptionalPathForPath(noticeAssetPath) - } - // Process all building blocks, from AAPT to certificates. a.aaptBuildActions(ctx) @@ -673,8 +663,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile) } - if a.aapt.noticeFile.Valid() { - // Generating the notice file rule has to be here after a.outputFile is known. + if Bool(a.appProperties.Embed_notices) || ctx.Config().IsEnvTrue("ALWAYS_EMBED_NOTICES") { noticeFile := android.PathForModuleOut(ctx, "NOTICE.html.gz") android.BuildNoticeHtmlOutputFromLicenseMetadata( ctx, noticeFile, "", "", @@ -683,11 +672,13 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { android.PathForModuleInstall(ctx).String() + "/", a.outputFile.String(), }) + noticeAssetPath := android.PathForModuleOut(ctx, "NOTICE", "NOTICE.html.gz") builder := android.NewRuleBuilder(pctx, ctx) builder.Command().Text("cp"). Input(noticeFile). Output(noticeAssetPath) builder.Build("notice_dir", "Building notice dir") + a.aapt.noticeFile = android.OptionalPathForPath(noticeAssetPath) } for _, split := range a.aapt.splits { diff --git a/java/base.go b/java/base.go index 717c7273f..7aa281495 100644 --- a/java/base.go +++ b/java/base.go @@ -1419,18 +1419,17 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) { j.implementationAndResourcesJar = implementationAndResourcesJar // Enable dex compilation for the APEX variants, unless it is disabled explicitly - compileDex := j.dexProperties.Compile_dex apexInfo := ctx.Provider(android.ApexInfoProvider).(android.ApexInfo) if j.DirectlyInAnyApex() && !apexInfo.IsForPlatform() { - if compileDex == nil { - compileDex = proptools.BoolPtr(true) + if j.dexProperties.Compile_dex == nil { + j.dexProperties.Compile_dex = proptools.BoolPtr(true) } if j.deviceProperties.Hostdex == nil { j.deviceProperties.Hostdex = proptools.BoolPtr(true) } } - if ctx.Device() && (Bool(j.properties.Installable) || Bool(compileDex)) { + if ctx.Device() && (Bool(j.properties.Installable) || Bool(j.dexProperties.Compile_dex)) { if j.hasCode(ctx) { if j.shouldInstrumentStatic(ctx) { j.dexer.extraProguardFlagFiles = append(j.dexer.extraProguardFlagFiles, diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index b6b179cdf..96009351f 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -32,24 +32,19 @@ import ( func init() { registerBootclasspathFragmentBuildComponents(android.InitRegistrationContext) - android.RegisterSdkMemberType(BootclasspathFragmentSdkMemberType) + android.RegisterSdkMemberType(&bootclasspathFragmentMemberType{ + SdkMemberTypeBase: android.SdkMemberTypeBase{ + PropertyName: "bootclasspath_fragments", + SupportsSdk: true, + }, + }) } func registerBootclasspathFragmentBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("bootclasspath_fragment", bootclasspathFragmentFactory) - ctx.RegisterModuleType("bootclasspath_fragment_test", testBootclasspathFragmentFactory) ctx.RegisterModuleType("prebuilt_bootclasspath_fragment", prebuiltBootclasspathFragmentFactory) } -// BootclasspathFragmentSdkMemberType is the member type used to add bootclasspath_fragments to -// the SDK snapshot. It is exported for use by apex. -var BootclasspathFragmentSdkMemberType = &bootclasspathFragmentMemberType{ - SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "bootclasspath_fragments", - SupportsSdk: true, - }, -} - type bootclasspathFragmentContentDependencyTag struct { blueprint.BaseDependencyTag } @@ -232,9 +227,6 @@ type BootclasspathFragmentModule struct { android.SdkBase ClasspathFragmentBase - // True if this fragment is for testing purposes. - testFragment bool - properties bootclasspathFragmentProperties sourceOnlyProperties SourceOnlyBootclasspathProperties @@ -306,12 +298,6 @@ func bootclasspathFragmentFactory() android.Module { return m } -func testBootclasspathFragmentFactory() android.Module { - m := bootclasspathFragmentFactory().(*BootclasspathFragmentModule) - m.testFragment = true - return m -} - // bootclasspathFragmentInitContentsFromImage will initialize the contents property from the image_name if // necessary. func bootclasspathFragmentInitContentsFromImage(ctx android.EarlyModuleContext, m *BootclasspathFragmentModule) { @@ -833,26 +819,6 @@ func (b *BootclasspathFragmentModule) createHiddenAPIFlagInput(ctx android.Modul return input } -// isTestFragment returns true if the current module is a test bootclasspath_fragment. -func (b *BootclasspathFragmentModule) isTestFragment() bool { - if b.testFragment { - return true - } - - // TODO(b/194063708): Once test fragments all use bootclasspath_fragment_test - // Some temporary exceptions until all test fragments use the - // bootclasspath_fragment_test module type. - name := b.BaseModuleName() - if strings.HasPrefix(name, "test_") { - return true - } - if name == "apex.apexd_test_bootclasspath-fragment" { - return true - } - - return false -} - // produceHiddenAPIOutput produces the hidden API all-flags.csv file (and supporting files) // for the fragment as well as encoding the flags in the boot dex jars. func (b *BootclasspathFragmentModule) produceHiddenAPIOutput(ctx android.ModuleContext, contents []android.Module, input HiddenAPIFlagInput) *HiddenAPIOutput { @@ -866,18 +832,11 @@ func (b *BootclasspathFragmentModule) produceHiddenAPIOutput(ctx android.ModuleC packagePrefixes := b.sourceOnlyProperties.Hidden_api.Package_prefixes singlePackages := b.sourceOnlyProperties.Hidden_api.Single_packages if splitPackages != nil || packagePrefixes != nil || singlePackages != nil { + if splitPackages == nil { + splitPackages = []string{"*"} + } output.SignaturePatternsPath = buildRuleSignaturePatternsFile( ctx, output.AllFlagsPath, splitPackages, packagePrefixes, singlePackages) - } else if !b.isTestFragment() { - ctx.ModuleErrorf(`Must specify at least one of the split_packages, package_prefixes and single_packages properties - If this is a new bootclasspath_fragment or you are unsure what to do add the - the following to the bootclasspath_fragment: - hidden_api: {split_packages: ["*"]}, - and then run the following: - m analyze_bcpf && analyze_bcpf --bcpf %q - it will analyze the bootclasspath_fragment and provide hints as to what you - should specify here. If you are happy with its suggestions then you can add - the --fix option and it will fix them for you.`, b.BaseModuleName()) } return output diff --git a/java/bootclasspath_fragment_test.go b/java/bootclasspath_fragment_test.go index 83beb6d23..d3de675d8 100644 --- a/java/bootclasspath_fragment_test.go +++ b/java/bootclasspath_fragment_test.go @@ -121,9 +121,6 @@ func TestBootclasspathFragment_Coverage(t *testing.T) { ], }, }, - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -204,9 +201,6 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { core_platform_api: { stub_libs: ["mycoreplatform.stubs"], }, - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -284,64 +278,3 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { android.AssertPathsRelativeToTopEquals(t, "widest dex stubs jar", expectedWidestPaths, info.TransitiveStubDexJarsByScope.StubDexJarsForWidestAPIScope()) } - -func TestBootclasspathFragment_Test(t *testing.T) { - result := android.GroupFixturePreparers( - prepareForTestWithBootclasspathFragment, - PrepareForTestWithJavaSdkLibraryFiles, - FixtureWithLastReleaseApis("mysdklibrary"), - ).RunTestWithBp(t, ` - bootclasspath_fragment { - name: "myfragment", - contents: ["mysdklibrary"], - hidden_api: { - split_packages: [], - }, - } - - bootclasspath_fragment { - name: "test_fragment", - contents: ["mysdklibrary"], - hidden_api: { - split_packages: [], - }, - } - - bootclasspath_fragment { - name: "apex.apexd_test_bootclasspath-fragment", - contents: ["mysdklibrary"], - hidden_api: { - split_packages: [], - }, - } - - bootclasspath_fragment_test { - name: "a_test_fragment", - contents: ["mysdklibrary"], - hidden_api: { - split_packages: [], - }, - } - - - java_sdk_library { - name: "mysdklibrary", - srcs: ["a.java"], - shared_library: false, - public: {enabled: true}, - system: {enabled: true}, - } - `) - - fragment := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule) - android.AssertBoolEquals(t, "not a test fragment", false, fragment.isTestFragment()) - - fragment = result.Module("test_fragment", "android_common").(*BootclasspathFragmentModule) - android.AssertBoolEquals(t, "is a test fragment by prefix", true, fragment.isTestFragment()) - - fragment = result.Module("a_test_fragment", "android_common").(*BootclasspathFragmentModule) - android.AssertBoolEquals(t, "is a test fragment by type", true, fragment.isTestFragment()) - - fragment = result.Module("apex.apexd_test_bootclasspath-fragment", "android_common").(*BootclasspathFragmentModule) - android.AssertBoolEquals(t, "is a test fragment by name", true, fragment.isTestFragment()) -} diff --git a/java/java.go b/java/java.go index 1e99aa32f..c8fb93cca 100644 --- a/java/java.go +++ b/java/java.go @@ -118,16 +118,6 @@ var ( copyEverythingToSnapshot, } - snapshotRequiresImplementationJar = func(ctx android.SdkMemberContext) bool { - // In the S build the build will break if updatable-media does not provide a full implementation - // jar. That issue was fixed in Tiramisu by b/229932396. - if ctx.IsTargetBuildBeforeTiramisu() && ctx.Name() == "updatable-media" { - return true - } - - return false - } - // Supports adding java boot libraries to module_exports and sdk. // // The build has some implicit dependencies (via the boot jars configuration) on a number of @@ -145,21 +135,13 @@ var ( SupportsSdk: true, }, func(ctx android.SdkMemberContext, j *Library) android.Path { - if snapshotRequiresImplementationJar(ctx) { - return exportImplementationClassesJar(ctx, j) - } - // Java boot libs are only provided in the SDK to provide access to their dex implementation // jar for use by dexpreopting and boot jars package check. They do not need to provide an // actual implementation jar but the java_import will need a file that exists so just copy an // empty file. Any attempt to use that file as a jar will cause a build error. return ctx.SnapshotBuilder().EmptyFile() }, - func(ctx android.SdkMemberContext, osPrefix, name string) string { - if snapshotRequiresImplementationJar(ctx) { - return sdkSnapshotFilePathForJar(ctx, osPrefix, name) - } - + func(osPrefix, name string) string { // Create a special name for the implementation jar to try and provide some useful information // to a developer that attempts to compile against this. // TODO(b/175714559): Provide a proper error message in Soong not ninja. @@ -182,9 +164,6 @@ var ( android.SdkMemberTypeBase{ PropertyName: "java_systemserver_libs", SupportsSdk: true, - - // This was only added in Tiramisu. - SupportedBuildReleaseSpecification: "Tiramisu+", }, func(ctx android.SdkMemberContext, j *Library) android.Path { // Java systemserver libs are only provided in the SDK to provide access to their dex @@ -193,7 +172,7 @@ var ( // file. Any attempt to use that file as a jar will cause a build error. return ctx.SnapshotBuilder().EmptyFile() }, - func(_ android.SdkMemberContext, osPrefix, name string) string { + func(osPrefix, name string) string { // Create a special name for the implementation jar to try and provide some useful information // to a developer that attempts to compile against this. // TODO(b/175714559): Provide a proper error message in Soong not ninja. @@ -667,7 +646,7 @@ const ( ) // path to the jar file of a java library. Relative to <sdk_root>/<api_dir> -func sdkSnapshotFilePathForJar(_ android.SdkMemberContext, osPrefix, name string) string { +func sdkSnapshotFilePathForJar(osPrefix, name string) string { return sdkSnapshotFilePathForMember(osPrefix, name, jarFileSuffix) } @@ -684,7 +663,7 @@ type librarySdkMemberType struct { // Function to compute the snapshot relative path to which the named library's // jar should be copied. - snapshotPathGetter func(ctx android.SdkMemberContext, osPrefix, name string) string + snapshotPathGetter func(osPrefix, name string) string // True if only the jar should be copied to the snapshot, false if the jar plus any additional // files like aidl files should also be copied. @@ -742,7 +721,7 @@ func (p *librarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberConte exportedJar := p.JarToExport if exportedJar != nil { // Delegate the creation of the snapshot relative path to the member type. - snapshotRelativeJavaLibPath := memberType.snapshotPathGetter(ctx, p.OsPrefix(), ctx.Name()) + snapshotRelativeJavaLibPath := memberType.snapshotPathGetter(p.OsPrefix(), ctx.Name()) // Copy the exported jar to the snapshot. builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) @@ -1208,7 +1187,7 @@ func (p *testSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, exportedJar := p.JarToExport if exportedJar != nil { - snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(ctx, p.OsPrefix(), ctx.Name()) + snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(p.OsPrefix(), ctx.Name()) builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) diff --git a/java/systemserver_classpath_fragment.go b/java/systemserver_classpath_fragment.go index a2cd2619a..fa61ea68c 100644 --- a/java/systemserver_classpath_fragment.go +++ b/java/systemserver_classpath_fragment.go @@ -24,7 +24,12 @@ import ( func init() { registerSystemserverClasspathBuildComponents(android.InitRegistrationContext) - android.RegisterSdkMemberType(SystemServerClasspathFragmentSdkMemberType) + android.RegisterSdkMemberType(&systemServerClasspathFragmentMemberType{ + SdkMemberTypeBase: android.SdkMemberTypeBase{ + PropertyName: "systemserverclasspath_fragments", + SupportsSdk: true, + }, + }) } func registerSystemserverClasspathBuildComponents(ctx android.RegistrationContext) { @@ -33,17 +38,6 @@ func registerSystemserverClasspathBuildComponents(ctx android.RegistrationContex ctx.RegisterModuleType("prebuilt_systemserverclasspath_fragment", prebuiltSystemServerClasspathModuleFactory) } -var SystemServerClasspathFragmentSdkMemberType = &systemServerClasspathFragmentMemberType{ - SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "systemserverclasspath_fragments", - SupportsSdk: true, - - // Support for adding systemserverclasspath_fragments to the sdk snapshot was only added in - // Tiramisu. - SupportedBuildReleaseSpecification: "Tiramisu+", - }, -} - type platformSystemServerClasspathModule struct { android.ModuleBase diff --git a/scripts/Android.bp b/scripts/Android.bp index a37d2597b..4773579e3 100644 --- a/scripts/Android.bp +++ b/scripts/Android.bp @@ -84,16 +84,6 @@ python_binary_host { ], } -python_test_host { - name: "jsonmodify_test", - main: "jsonmodify_test.py", - srcs: [ - "jsonmodify_test.py", - "jsonmodify.py", - ], - test_suites: ["general-tests"], -} - python_binary_host { name: "test_config_fixer", main: "test_config_fixer.py", diff --git a/scripts/jsonmodify.py b/scripts/jsonmodify.py index 8bd8d4556..ba1109e7a 100755 --- a/scripts/jsonmodify.py +++ b/scripts/jsonmodify.py @@ -59,13 +59,6 @@ class Replace(str): cur[key] = val -class ReplaceIfEqual(str): - def apply(self, obj, old_val, new_val): - cur, key = follow_path(obj, self) - if cur and cur[key] == int(old_val): - cur[key] = new_val - - class Remove(str): def apply(self, obj): cur, key = follow_path(obj, self) @@ -82,14 +75,6 @@ class AppendList(str): raise ValueError(self + " should be a array.") cur[key].extend(args) -# A JSONDecoder that supports line comments start with // -class JSONWithCommentsDecoder(json.JSONDecoder): - def __init__(self, **kw): - super().__init__(**kw) - - def decode(self, s: str): - s = '\n'.join(l for l in s.split('\n') if not l.lstrip(' ').startswith('//')) - return super().decode(s) def main(): parser = argparse.ArgumentParser() @@ -106,11 +91,6 @@ def main(): help='replace value of the key specified by path. If path doesn\'t exist, no op.', metavar=('path', 'value'), nargs=2, dest='patch', action='append') - parser.add_argument("-se", "--replace-if-equal", type=ReplaceIfEqual, - help='replace value of the key specified by path to new_value if it\'s equal to old_value.' + - 'If path doesn\'t exist or the value is not equal to old_value, no op.', - metavar=('path', 'old_value', 'new_value'), - nargs=3, dest='patch', action='append') parser.add_argument("-r", "--remove", type=Remove, help='remove the key specified by path. If path doesn\'t exist, no op.', metavar='path', @@ -123,9 +103,9 @@ def main(): if args.input: with open(args.input) as f: - obj = json.load(f, object_pairs_hook=collections.OrderedDict, cls=JSONWithCommentsDecoder) + obj = json.load(f, object_pairs_hook=collections.OrderedDict) else: - obj = json.load(sys.stdin, object_pairs_hook=collections.OrderedDict, cls=JSONWithCommentsDecoder) + obj = json.load(sys.stdin, object_pairs_hook=collections.OrderedDict) for p in args.patch: p[0].apply(obj, *p[1:]) diff --git a/scripts/jsonmodify_test.py b/scripts/jsonmodify_test.py deleted file mode 100644 index 6f0291dfb..000000000 --- a/scripts/jsonmodify_test.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2022 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. -# -"""Tests for jsonmodify.""" - -import json -import jsonmodify -import unittest - - -class JsonmodifyTest(unittest.TestCase): - - def test_set_value(self): - obj = json.loads('{"field1": 111}') - field1 = jsonmodify.SetValue("field1") - field1.apply(obj, 222) - field2 = jsonmodify.SetValue("field2") - field2.apply(obj, 333) - expected = json.loads('{"field1": 222, "field2": 333}') - self.assertEqual(obj, expected) - - def test_replace(self): - obj = json.loads('{"field1": 111}') - field1 = jsonmodify.Replace("field1") - field1.apply(obj, 222) - field2 = jsonmodify.Replace("field2") - field2.apply(obj, 333) - expected = json.loads('{"field1": 222}') - self.assertEqual(obj, expected) - - def test_replace_if_equal(self): - obj = json.loads('{"field1": 111, "field2": 222}') - field1 = jsonmodify.ReplaceIfEqual("field1") - field1.apply(obj, 111, 333) - field2 = jsonmodify.ReplaceIfEqual("field2") - field2.apply(obj, 444, 555) - field3 = jsonmodify.ReplaceIfEqual("field3") - field3.apply(obj, 666, 777) - expected = json.loads('{"field1": 333, "field2": 222}') - self.assertEqual(obj, expected) - - def test_remove(self): - obj = json.loads('{"field1": 111, "field2": 222}') - field2 = jsonmodify.Remove("field2") - field2.apply(obj) - field3 = jsonmodify.Remove("field3") - field3.apply(obj) - expected = json.loads('{"field1": 111}') - self.assertEqual(obj, expected) - - def test_append_list(self): - obj = json.loads('{"field1": [111]}') - field1 = jsonmodify.AppendList("field1") - field1.apply(obj, 222, 333) - field2 = jsonmodify.AppendList("field2") - field2.apply(obj, 444, 555, 666) - expected = json.loads('{"field1": [111, 222, 333], "field2": [444, 555, 666]}') - self.assertEqual(obj, expected) - - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/sdk/bootclasspath_fragment_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go index 13ddbe768..2dacdb55c 100644 --- a/sdk/bootclasspath_fragment_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -101,9 +101,6 @@ func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) { image_name: "art", contents: ["mybootlib"], apex_available: ["com.android.art"], - hidden_api: { - split_packages: ["*"], - }, } apex_key { @@ -127,7 +124,7 @@ func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) { preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("com.android.art", "mybootclasspathfragment") CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. prebuilt_bootclasspath_fragment { @@ -155,6 +152,41 @@ java_import { jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +prebuilt_bootclasspath_fragment { + name: "mysdk_mybootclasspathfragment@current", + sdk_member_name: "mybootclasspathfragment", + visibility: ["//visibility:public"], + apex_available: ["com.android.art"], + image_name: "art", + contents: ["mysdk_mybootlib@current"], + hidden_api: { + annotation_flags: "hiddenapi/annotation-flags.csv", + metadata: "hiddenapi/metadata.csv", + index: "hiddenapi/index.csv", + signature_patterns: "hiddenapi/signature-patterns.csv", + filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", + filtered_flags: "hiddenapi/filtered-flags.csv", + }, +} + +java_import { + name: "mysdk_mybootlib@current", + sdk_member_name: "mybootlib", + visibility: ["//visibility:public"], + apex_available: ["com.android.art"], + jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + bootclasspath_fragments: ["mysdk_mybootclasspathfragment@current"], + java_boot_libs: ["mysdk_mybootlib@current"], +} +`), checkAllCopyRules(` .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv .intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv @@ -190,7 +222,7 @@ func checkBootJarsPackageCheckRule(t *testing.T, result *android.TestResult, exp android.AssertStringDoesContain(t, "boot jars package check", command, expectedCommandArgs) } -func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, copyRules string) { +func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, @@ -202,7 +234,19 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co // Add a platform_bootclasspath that depends on the fragment. fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"), - android.FixtureWithRootAndroidBp(sdk+` + android.FixtureWithRootAndroidBp(` + sdk { + name: "mysdk", + bootclasspath_fragments: ["mybootclasspathfragment"], + java_sdk_libs: [ + // This is not strictly needed as it should be automatically added to the sdk_snapshot as + // a java_sdk_libs module because it is used in the mybootclasspathfragment's + // api.stub_libs property. However, it is specified here to ensure that duplicates are + // correctly deduped. + "mysdklibrary", + ], + } + apex { name: "myapex", key: "myapex.key", @@ -226,9 +270,6 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co // This should be automatically added to the sdk_snapshot as a java_sdk_libs module. stub_libs: ["mycoreplatform"], }, - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -276,7 +317,7 @@ func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, co preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment") CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. prebuilt_bootclasspath_fragment { @@ -361,7 +402,121 @@ java_sdk_library_import { }, } `), - checkAllCopyRules(copyRules), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +prebuilt_bootclasspath_fragment { + name: "mysdk_mybootclasspathfragment@current", + sdk_member_name: "mybootclasspathfragment", + visibility: ["//visibility:public"], + apex_available: ["myapex"], + contents: [ + "mysdk_mybootlib@current", + "mysdk_myothersdklibrary@current", + ], + api: { + stub_libs: ["mysdk_mysdklibrary@current"], + }, + core_platform_api: { + stub_libs: ["mysdk_mycoreplatform@current"], + }, + hidden_api: { + annotation_flags: "hiddenapi/annotation-flags.csv", + metadata: "hiddenapi/metadata.csv", + index: "hiddenapi/index.csv", + signature_patterns: "hiddenapi/signature-patterns.csv", + filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", + filtered_flags: "hiddenapi/filtered-flags.csv", + }, +} + +java_import { + name: "mysdk_mybootlib@current", + sdk_member_name: "mybootlib", + visibility: ["//visibility:public"], + apex_available: ["myapex"], + jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"], + permitted_packages: ["mybootlib"], +} + +java_sdk_library_import { + name: "mysdk_myothersdklibrary@current", + sdk_member_name: "myothersdklibrary", + visibility: ["//visibility:public"], + apex_available: ["myapex"], + shared_library: true, + compile_dex: true, + permitted_packages: ["myothersdklibrary"], + public: { + jars: ["sdk_library/public/myothersdklibrary-stubs.jar"], + stub_srcs: ["sdk_library/public/myothersdklibrary_stub_sources"], + current_api: "sdk_library/public/myothersdklibrary.txt", + removed_api: "sdk_library/public/myothersdklibrary-removed.txt", + sdk_version: "current", + }, +} + +java_sdk_library_import { + name: "mysdk_mysdklibrary@current", + sdk_member_name: "mysdklibrary", + visibility: ["//visibility:public"], + apex_available: ["myapex"], + shared_library: false, + public: { + jars: ["sdk_library/public/mysdklibrary-stubs.jar"], + stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], + current_api: "sdk_library/public/mysdklibrary.txt", + removed_api: "sdk_library/public/mysdklibrary-removed.txt", + sdk_version: "current", + }, +} + +java_sdk_library_import { + name: "mysdk_mycoreplatform@current", + sdk_member_name: "mycoreplatform", + visibility: ["//visibility:public"], + apex_available: ["myapex"], + shared_library: true, + compile_dex: true, + public: { + jars: ["sdk_library/public/mycoreplatform-stubs.jar"], + stub_srcs: ["sdk_library/public/mycoreplatform_stub_sources"], + current_api: "sdk_library/public/mycoreplatform.txt", + removed_api: "sdk_library/public/mycoreplatform-removed.txt", + sdk_version: "current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + bootclasspath_fragments: ["mysdk_mybootclasspathfragment@current"], + java_boot_libs: ["mysdk_mybootlib@current"], + java_sdk_libs: [ + "mysdk_myothersdklibrary@current", + "mysdk_mysdklibrary@current", + "mysdk_mycoreplatform@current", + ], +} + `), + checkAllCopyRules(` +.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv +.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv +.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv +.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv +.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv +.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv +.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar +.intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar +.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt +.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt +.intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar +.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt +.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt +.intermediates/mycoreplatform.stubs/android_common/javac/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar +.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt +.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt +`), snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot), snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) { module := result.ModuleForTests("platform-bootclasspath", "android_common") @@ -398,89 +553,6 @@ java_sdk_library_import { ) } -func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) { - t.Run("added-directly", func(t *testing.T) { - testSnapshotWithBootClasspathFragment_Contents(t, ` - sdk { - name: "mysdk", - bootclasspath_fragments: ["mybootclasspathfragment"], - java_sdk_libs: [ - // This is not strictly needed as it should be automatically added to the sdk_snapshot as - // a java_sdk_libs module because it is used in the mybootclasspathfragment's - // api.stub_libs property. However, it is specified here to ensure that duplicates are - // correctly deduped. - "mysdklibrary", - ], - } - `, ` -.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv -.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv -.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv -.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv -.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv -.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv -.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar -.intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar -.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt -.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt -.intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar -.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt -.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt -.intermediates/mycoreplatform.stubs/android_common/javac/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar -.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt -.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt -`) - }) - - copyBootclasspathFragmentFromApexVariantRules := ` -.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv -.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv -.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv -.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv -.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv -.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv -.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar -.intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar -.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt -.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt -.intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar -.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt -.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt -.intermediates/mycoreplatform.stubs/android_common/javac/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar -.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt -.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt -` - t.Run("added-via-apex", func(t *testing.T) { - testSnapshotWithBootClasspathFragment_Contents(t, ` - sdk { - name: "mysdk", - apexes: ["myapex"], - } - `, copyBootclasspathFragmentFromApexVariantRules) - }) - - t.Run("added-directly-and-indirectly", func(t *testing.T) { - testSnapshotWithBootClasspathFragment_Contents(t, ` - sdk { - name: "mysdk", - apexes: ["myapex"], - // This is not strictly needed as it should be automatically added to the sdk_snapshot as - // a bootclasspath_fragments module because it is used in the myapex's - // bootclasspath_fragments property. However, it is specified here to ensure that duplicates - // are correctly deduped. - bootclasspath_fragments: ["mybootclasspathfragment"], - java_sdk_libs: [ - // This is not strictly needed as it should be automatically added to the sdk_snapshot as - // a java_sdk_libs module because it is used in the mybootclasspathfragment's - // api.stub_libs property. However, it is specified here to ensure that duplicates are - // correctly deduped. - "mysdklibrary", - ], - } - `, copyBootclasspathFragmentFromApexVariantRules) - }) -} - // TestSnapshotWithBootClasspathFragment_Fragments makes sure that the fragments property of a // bootclasspath_fragment is correctly output to the sdk snapshot. func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { @@ -513,9 +585,6 @@ func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { contents: [ "myotherlib", ], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -545,9 +614,6 @@ func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { module: "myotherbootclasspathfragment" }, ], - hidden_api: { - split_packages: ["*"], - }, } java_sdk_library { @@ -564,7 +630,7 @@ func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment") CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. prebuilt_bootclasspath_fragment { @@ -627,9 +693,6 @@ func TestBasicSdkWithBootclasspathFragment(t *testing.T) { image_name: "art", contents: ["mybootlib"], apex_available: ["myapex"], - hidden_api: { - split_packages: ["*"], - }, } java_library { @@ -737,7 +800,6 @@ func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { unsupported_packages: [ "my-unsupported-packages.txt", ], - split_packages: ["*"], }, } @@ -766,7 +828,7 @@ func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment") CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. prebuilt_bootclasspath_fragment { @@ -298,15 +298,15 @@ func (t identityTransformation) transformModule(module *bpModule) *bpModule { return module } -func (t identityTransformation) transformPropertySetBeforeContents(_ string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { +func (t identityTransformation) transformPropertySetBeforeContents(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { return propertySet, tag } -func (t identityTransformation) transformPropertySetAfterContents(_ string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { +func (t identityTransformation) transformPropertySetAfterContents(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { return propertySet, tag } -func (t identityTransformation) transformProperty(_ string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { +func (t identityTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { return value, tag } @@ -332,7 +332,7 @@ func (t deepCopyTransformation) transformModule(module *bpModule) *bpModule { return &moduleCopy } -func (t deepCopyTransformation) transformPropertySetBeforeContents(_ string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { +func (t deepCopyTransformation) transformPropertySetBeforeContents(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { // Create a shallow copy of the properties map. Any mutable property values will be copied by the // transformer. propertiesCopy := make(map[string]interface{}) @@ -354,7 +354,7 @@ func (t deepCopyTransformation) transformPropertySetBeforeContents(_ string, pro }, tag } -func (t deepCopyTransformation) transformProperty(_ string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { +func (t deepCopyTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { // Copy string slice, otherwise return value. if values, ok := value.([]string); ok { valuesCopy := make([]string, len(values)) @@ -372,7 +372,7 @@ type bpFile struct { order []*bpModule } -// AddModule adds a module to this. +// Add a module. // // The module must have had its "name" property set to a string value that // is unique within this file. diff --git a/sdk/build_release.go b/sdk/build_release.go index 0494a28ee..4c2277e85 100644 --- a/sdk/build_release.go +++ b/sdk/build_release.go @@ -24,22 +24,18 @@ import ( // buildRelease represents the version of a build system used to create a specific release. // -// The name of the release, is the same as the code for the dessert release, e.g. S, Tiramisu, etc. +// The name of the release, is the same as the code for the dessert release, e.g. S, T, etc. type buildRelease struct { - // The name of the release, e.g. S, Tiramisu, etc. + // The name of the release, e.g. S, T, etc. name string // The index of this structure within the buildReleases list. ordinal int } -func (br *buildRelease) EarlierThan(other *buildRelease) bool { - return br.ordinal < other.ordinal -} - // String returns the name of the build release. -func (br *buildRelease) String() string { - return br.name +func (s *buildRelease) String() string { + return s.name } // buildReleaseSet represents a set of buildRelease objects. diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 265579aa1..571d21420 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -120,7 +120,7 @@ func TestSdkCompileMultilibOverride(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -145,6 +145,48 @@ cc_prebuilt_library_shared { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_shared { + name: "mysdk_sdkmember@current", + sdk_member_name: "sdkmember", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + host_supported: true, + installable: false, + stl: "none", + compile_multilib: "64", + target: { + host: { + enabled: false, + }, + android_arm64: { + srcs: ["android/arm64/lib/sdkmember.so"], + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["linux_glibc/x86_64/lib/sdkmember.so"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + host_supported: true, + compile_multilib: "64", + native_shared_libs: ["mysdk_sdkmember@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` .intermediates/sdkmember/android_arm64_armv8-a_shared/sdkmember.so -> android/arm64/lib/sdkmember.so .intermediates/sdkmember/linux_glibc_x86_64_shared/sdkmember.so -> linux_glibc/x86_64/lib/sdkmember.so @@ -223,7 +265,7 @@ func TestSnapshotWithObject(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_object { @@ -247,6 +289,37 @@ cc_prebuilt_object { }, } `), + // Make sure that the generated sdk_snapshot uses the native_objects property. + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_object { + name: "mysdk_crtobj@current", + sdk_member_name: "crtobj", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + stl: "none", + compile_multilib: "both", + system_shared_libs: [], + sanitize: { + never: true, + }, + arch: { + arm64: { + srcs: ["arm64/lib/crtobj.o"], + }, + arm: { + srcs: ["arm/lib/crtobj.o"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + native_objects: ["mysdk_crtobj@current"], +} +`), checkAllCopyRules(` .intermediates/crtobj/android_arm64_armv8-a/crtobj.o -> arm64/lib/crtobj.o .intermediates/crtobj/android_arm_armv7-a-neon/crtobj.o -> arm/lib/crtobj.o @@ -330,7 +403,7 @@ func TestSnapshotWithCcExportGeneratedHeaders(t *testing.T) { errorHandler := android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module source path "snapshot/include_gen/generated_foo/gen/protos" does not exist`) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -403,7 +476,7 @@ func TestSnapshotWithCcSharedLibraryCommonProperties(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -462,7 +535,7 @@ func TestSnapshotWithCcBinary(t *testing.T) { `) CheckSnapshot(t, result, "mymodule_exports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_binary { @@ -481,6 +554,33 @@ cc_prebuilt_binary { }, } `), + // Make sure that the generated sdk_snapshot uses the native_binaries property. + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_binary { + name: "mymodule_exports_mynativebinary@current", + sdk_member_name: "mynativebinary", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + installable: false, + compile_multilib: "both", + arch: { + arm64: { + srcs: ["arm64/bin/mynativebinary"], + }, + arm: { + srcs: ["arm/bin/mynativebinary"], + }, + }, +} + +module_exports_snapshot { + name: "mymodule_exports@current", + visibility: ["//visibility:public"], + native_binaries: ["mymodule_exports_mynativebinary@current"], +} +`), checkAllCopyRules(` .intermediates/mynativebinary/android_arm64_armv8-a/mynativebinary -> arm64/bin/mynativebinary .intermediates/mynativebinary/android_arm_armv7-a-neon/mynativebinary -> arm/bin/mynativebinary @@ -520,7 +620,7 @@ func TestMultipleHostOsTypesSnapshotWithCcBinary(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_binary { @@ -556,6 +656,68 @@ cc_prebuilt_binary { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_binary { + name: "myexports_mynativebinary@current", + sdk_member_name: "mynativebinary", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + stl: "none", + target: { + host: { + enabled: false, + }, + linux_glibc: { + compile_multilib: "both", + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["linux_glibc/x86_64/bin/mynativebinary"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["linux_glibc/x86/bin/mynativebinary"], + }, + windows: { + compile_multilib: "64", + }, + windows_x86_64: { + enabled: true, + srcs: ["windows/x86_64/bin/mynativebinary.exe"], + }, + }, +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + native_binaries: ["myexports_mynativebinary@current"], + target: { + windows: { + compile_multilib: "64", + }, + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + windows_x86_64: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` .intermediates/mynativebinary/linux_glibc_x86_64/mynativebinary -> linux_glibc/x86_64/bin/mynativebinary .intermediates/mynativebinary/linux_glibc_x86/mynativebinary -> linux_glibc/x86/bin/mynativebinary @@ -618,7 +780,7 @@ func TestSnapshotWithSingleHostOsType(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_binary { @@ -661,6 +823,69 @@ cc_prebuilt_library_shared { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_binary { + name: "myexports_mynativebinary@current", + sdk_member_name: "mynativebinary", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + stl: "none", + compile_multilib: "64", + target: { + host: { + enabled: false, + }, + linux_bionic_x86_64: { + enabled: true, + srcs: ["x86_64/bin/mynativebinary"], + }, + }, +} + +cc_prebuilt_library_shared { + name: "myexports_mynativelib@current", + sdk_member_name: "mynativelib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + stl: "none", + compile_multilib: "64", + target: { + host: { + enabled: false, + }, + linux_bionic_x86_64: { + enabled: true, + srcs: ["x86_64/lib/mynativelib.so"], + }, + }, +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + compile_multilib: "64", + native_binaries: ["myexports_mynativebinary@current"], + native_shared_libs: ["myexports_mynativelib@current"], + target: { + host: { + enabled: false, + }, + linux_bionic_x86_64: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` .intermediates/mynativebinary/linux_bionic_x86_64/mynativebinary -> x86_64/bin/mynativebinary .intermediates/mynativelib/linux_bionic_x86_64_shared/mynativelib.so -> x86_64/lib/mynativelib.so @@ -693,7 +918,7 @@ func TestSnapshotWithCcStaticNocrtBinary(t *testing.T) { `) CheckSnapshot(t, result, "mymodule_exports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_binary { @@ -722,6 +947,55 @@ cc_prebuilt_binary { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_binary { + name: "mymodule_exports_linker@current", + sdk_member_name: "linker", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + stl: "none", + compile_multilib: "both", + static_executable: true, + nocrt: true, + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["x86_64/bin/linker"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["x86/bin/linker"], + }, + }, +} + +module_exports_snapshot { + name: "mymodule_exports@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + native_binaries: ["mymodule_exports_linker@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` .intermediates/linker/linux_glibc_x86_64/linker -> x86_64/bin/linker .intermediates/linker/linux_glibc_x86/linker -> x86/bin/linker @@ -752,7 +1026,7 @@ func TestSnapshotWithCcSharedLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -853,7 +1127,7 @@ func TestSnapshotWithCcSharedLibrarySharedLibs(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -950,7 +1224,7 @@ func TestHostSnapshotWithCcSharedLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -981,6 +1255,57 @@ cc_prebuilt_library_shared { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_shared { + name: "mysdk_mynativelib@current", + sdk_member_name: "mynativelib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + sdk_version: "minimum", + stl: "none", + compile_multilib: "both", + export_include_dirs: ["include/myinclude"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["x86_64/lib/mynativelib.so"], + export_include_dirs: ["x86_64/include_gen/mynativelib/linux_glibc_x86_64_shared/gen/aidl"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["x86/lib/mynativelib.so"], + export_include_dirs: ["x86/include_gen/mynativelib/linux_glibc_x86_shared/gen/aidl"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + native_shared_libs: ["mysdk_mynativelib@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` myinclude/Test.h -> include/myinclude/Test.h .intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> x86_64/lib/mynativelib.so @@ -1026,7 +1351,7 @@ func TestMultipleHostOsTypesSnapshotWithCcSharedLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -1062,6 +1387,68 @@ cc_prebuilt_library_shared { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_shared { + name: "mysdk_mynativelib@current", + sdk_member_name: "mynativelib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + stl: "none", + target: { + host: { + enabled: false, + }, + linux_glibc: { + compile_multilib: "both", + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["linux_glibc/x86_64/lib/mynativelib.so"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["linux_glibc/x86/lib/mynativelib.so"], + }, + windows: { + compile_multilib: "64", + }, + windows_x86_64: { + enabled: true, + srcs: ["windows/x86_64/lib/mynativelib.dll"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + native_shared_libs: ["mysdk_mynativelib@current"], + target: { + windows: { + compile_multilib: "64", + }, + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + windows_x86_64: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` .intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> linux_glibc/x86_64/lib/mynativelib.so .intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> linux_glibc/x86/lib/mynativelib.so @@ -1092,7 +1479,7 @@ func TestSnapshotWithCcStaticLibrary(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_static { @@ -1155,7 +1542,7 @@ func TestHostSnapshotWithCcStaticLibrary(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_static { @@ -1185,6 +1572,56 @@ cc_prebuilt_library_static { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_static { + name: "myexports_mynativelib@current", + sdk_member_name: "mynativelib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + stl: "none", + compile_multilib: "both", + export_include_dirs: ["include/myinclude"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["x86_64/lib/mynativelib.a"], + export_include_dirs: ["x86_64/include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["x86/lib/mynativelib.a"], + export_include_dirs: ["x86/include_gen/mynativelib/linux_glibc_x86_static/gen/aidl"], + }, + }, +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + native_static_libs: ["myexports_mynativelib@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` myinclude/Test.h -> include/myinclude/Test.h .intermediates/mynativelib/linux_glibc_x86_64_static/mynativelib.a -> x86_64/lib/mynativelib.a @@ -1219,7 +1656,7 @@ func TestSnapshotWithCcLibrary(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library { @@ -1251,241 +1688,58 @@ cc_prebuilt_library { }, } `), - checkAllCopyRules(` -myinclude/Test.h -> include/myinclude/Test.h -.intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> arm64/lib/mynativelib.a -.intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so -.intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a -.intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so -`), - // TODO(b/183315522): Remove this and fix the issue. - snapshotTestErrorHandler(checkSnapshotPreferredWithSource, android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\Qunrecognized property "arch.arm.shared.export_include_dirs"\E`)), - ) -} - -func TestSnapshotSameLibraryWithNativeLibsAndNativeSharedLib(t *testing.T) { - result := testSdkWithCc(t, ` - module_exports { - host_supported: true, - name: "myexports", - target: { - android: { - native_shared_libs: [ - "mynativelib", - ], - }, - not_windows: { - native_libs: [ - "mynativelib", - ], - }, - }, - } - - cc_library { - name: "mynativelib", - host_supported: true, - srcs: [ - "Test.cpp", - ], - stl: "none", - recovery_available: true, - vendor_available: true, - } - `) - - CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + // Make sure that the generated sdk_snapshot uses the native_libs property. + checkVersionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library { - name: "mynativelib", - prefer: false, + name: "myexports_mynativelib@current", + sdk_member_name: "mynativelib", visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], - host_supported: true, + installable: false, vendor_available: true, stl: "none", compile_multilib: "both", - target: { - host: { - enabled: false, - }, - android_arm64: { - shared: { - srcs: ["android/arm64/lib/mynativelib.so"], - }, - static: { - enabled: false, - }, - }, - android_arm: { - shared: { - srcs: ["android/arm/lib/mynativelib.so"], - }, - static: { - enabled: false, - }, - }, - linux_glibc_x86_64: { - enabled: true, + export_include_dirs: ["include/myinclude"], + arch: { + arm64: { static: { - srcs: ["linux_glibc/x86_64/lib/mynativelib.a"], + srcs: ["arm64/lib/mynativelib.a"], }, shared: { - srcs: ["linux_glibc/x86_64/lib/mynativelib.so"], + srcs: ["arm64/lib/mynativelib.so"], }, }, - linux_glibc_x86: { - enabled: true, + arm: { static: { - srcs: ["linux_glibc/x86/lib/mynativelib.a"], + srcs: ["arm/lib/mynativelib.a"], }, shared: { - srcs: ["linux_glibc/x86/lib/mynativelib.so"], + srcs: ["arm/lib/mynativelib.so"], }, }, }, } -`), - checkAllCopyRules(` -.intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> android/arm64/lib/mynativelib.so -.intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> android/arm/lib/mynativelib.so -.intermediates/mynativelib/linux_glibc_x86_64_static/mynativelib.a -> linux_glibc/x86_64/lib/mynativelib.a -.intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> linux_glibc/x86_64/lib/mynativelib.so -.intermediates/mynativelib/linux_glibc_x86_static/mynativelib.a -> linux_glibc/x86/lib/mynativelib.a -.intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> linux_glibc/x86/lib/mynativelib.so -`), - ) -} -func TestSnapshotSameLibraryWithAndroidNativeLibsAndHostNativeSharedLib(t *testing.T) { - result := testSdkWithCc(t, ` - module_exports { - host_supported: true, - name: "myexports", - target: { - android: { - native_libs: [ - "mynativelib", - ], - }, - not_windows: { - native_shared_libs: [ - "mynativelib", - ], - }, - }, - } - - cc_library { - name: "mynativelib", - host_supported: true, - srcs: [ - "Test.cpp", - ], - stl: "none", - recovery_available: true, - vendor_available: true, - } - `) - - CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` -// This is auto-generated. DO NOT EDIT. - -cc_prebuilt_library { - name: "mynativelib", - prefer: false, +module_exports_snapshot { + name: "myexports@current", visibility: ["//visibility:public"], - apex_available: ["//apex_available:platform"], - host_supported: true, - vendor_available: true, - stl: "none", - compile_multilib: "both", - target: { - host: { - enabled: false, - }, - android_arm64: { - static: { - srcs: ["android/arm64/lib/mynativelib.a"], - }, - shared: { - srcs: ["android/arm64/lib/mynativelib.so"], - }, - }, - android_arm: { - static: { - srcs: ["android/arm/lib/mynativelib.a"], - }, - shared: { - srcs: ["android/arm/lib/mynativelib.so"], - }, - }, - linux_glibc_x86_64: { - enabled: true, - shared: { - srcs: ["linux_glibc/x86_64/lib/mynativelib.so"], - }, - static: { - enabled: false, - }, - }, - linux_glibc_x86: { - enabled: true, - shared: { - srcs: ["linux_glibc/x86/lib/mynativelib.so"], - }, - static: { - enabled: false, - }, - }, - }, + native_libs: ["myexports_mynativelib@current"], } `), checkAllCopyRules(` -.intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> android/arm64/lib/mynativelib.a -.intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> android/arm64/lib/mynativelib.so -.intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> android/arm/lib/mynativelib.a -.intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> android/arm/lib/mynativelib.so -.intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> linux_glibc/x86_64/lib/mynativelib.so -.intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> linux_glibc/x86/lib/mynativelib.so +myinclude/Test.h -> include/myinclude/Test.h +.intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> arm64/lib/mynativelib.a +.intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so +.intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a +.intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so `), + // TODO(b/183315522): Remove this and fix the issue. + snapshotTestErrorHandler(checkSnapshotPreferredWithSource, android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\Qunrecognized property "arch.arm.shared.export_include_dirs"\E`)), ) } -func TestSnapshotSameLibraryWithNativeStaticLibsAndNativeSharedLib(t *testing.T) { - testSdkError(t, "Incompatible member types", ` - module_exports { - host_supported: true, - name: "myexports", - target: { - android: { - native_shared_libs: [ - "mynativelib", - ], - }, - not_windows: { - native_static_libs: [ - "mynativelib", - ], - }, - }, - } - - cc_library { - name: "mynativelib", - host_supported: true, - srcs: [ - ], - stl: "none", - recovery_available: true, - vendor_available: true, - } - `) -} - func TestHostSnapshotWithMultiLib64(t *testing.T) { result := testSdkWithCc(t, ` module_exports { @@ -1517,7 +1771,7 @@ func TestHostSnapshotWithMultiLib64(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_static { @@ -1544,6 +1798,51 @@ cc_prebuilt_library_static { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_static { + name: "myexports_mynativelib@current", + sdk_member_name: "mynativelib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + installable: false, + stl: "none", + compile_multilib: "64", + export_include_dirs: [ + "include/myinclude", + "include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl", + ], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["x86_64/lib/mynativelib.a"], + }, + }, +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + compile_multilib: "64", + native_static_libs: ["myexports_mynativelib@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` myinclude/Test.h -> include/myinclude/Test.h .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/Test.h -> include_gen/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/Test.h @@ -1569,7 +1868,7 @@ func TestSnapshotWithCcHeadersLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_headers { @@ -1613,7 +1912,7 @@ func TestSnapshotWithCcHeadersLibraryAndNativeBridgeSupport(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_headers { @@ -1698,7 +1997,7 @@ func TestSnapshotWithCcHeadersLibraryAndImageVariants(t *testing.T) { `, trait, property)) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(fmt.Sprintf(` + checkUnversionedAndroidBpContents(fmt.Sprintf(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_headers { @@ -1747,7 +2046,7 @@ func TestHostSnapshotWithCcHeadersLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_headers { @@ -1773,6 +2072,51 @@ cc_prebuilt_library_headers { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_headers { + name: "mysdk_mynativeheaders@current", + sdk_member_name: "mynativeheaders", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + stl: "none", + compile_multilib: "both", + export_include_dirs: ["include/myinclude"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + native_header_libs: ["mysdk_mynativeheaders@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` myinclude/Test.h -> include/myinclude/Test.h `), @@ -1804,7 +2148,7 @@ func TestDeviceAndHostSnapshotWithCcHeadersLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_headers { @@ -1835,6 +2179,55 @@ cc_prebuilt_library_headers { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_headers { + name: "mysdk_mynativeheaders@current", + sdk_member_name: "mynativeheaders", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + host_supported: true, + stl: "none", + compile_multilib: "both", + export_system_include_dirs: ["common_os/include/myinclude"], + target: { + host: { + enabled: false, + }, + android: { + export_include_dirs: ["android/include/myinclude-android"], + }, + linux_glibc: { + export_include_dirs: ["linux_glibc/include/myinclude-host"], + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + host_supported: true, + native_header_libs: ["mysdk_mynativeheaders@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` myinclude/Test.h -> common_os/include/myinclude/Test.h myinclude-android/AndroidTest.h -> android/include/myinclude-android/AndroidTest.h @@ -1867,7 +2260,7 @@ func TestSystemSharedLibPropagation(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -1940,7 +2333,7 @@ cc_prebuilt_library_shared { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -1974,7 +2367,59 @@ cc_prebuilt_library_shared { }, } `), - ) + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_shared { + name: "mysdk_sslvariants@current", + sdk_member_name: "sslvariants", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + host_supported: true, + installable: false, + compile_multilib: "both", + target: { + host: { + enabled: false, + }, + android: { + system_shared_libs: [], + }, + android_arm64: { + srcs: ["android/arm64/lib/sslvariants.so"], + }, + android_arm: { + srcs: ["android/arm/lib/sslvariants.so"], + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["linux_glibc/x86_64/lib/sslvariants.so"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["linux_glibc/x86/lib/sslvariants.so"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + host_supported: true, + native_shared_libs: ["mysdk_sslvariants@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`)) } func TestStubsLibrary(t *testing.T) { @@ -1999,7 +2444,7 @@ func TestStubsLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -2053,7 +2498,7 @@ func TestDeviceAndHostSnapshotWithStubsLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -2092,7 +2537,64 @@ cc_prebuilt_library_shared { }, } `), - ) + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_shared { + name: "mysdk_stubslib@current", + sdk_member_name: "stubslib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + host_supported: true, + installable: false, + compile_multilib: "both", + stubs: { + versions: [ + "1", + "2", + "3", + "current", + ], + }, + target: { + host: { + enabled: false, + }, + android_arm64: { + srcs: ["android/arm64/lib/stubslib.so"], + }, + android_arm: { + srcs: ["android/arm/lib/stubslib.so"], + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["linux_glibc/x86_64/lib/stubslib.so"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["linux_glibc/x86/lib/stubslib.so"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + host_supported: true, + native_shared_libs: ["mysdk_stubslib@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`)) } func TestUniqueHostSoname(t *testing.T) { @@ -2111,7 +2613,7 @@ func TestUniqueHostSoname(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { @@ -2143,6 +2645,57 @@ cc_prebuilt_library_shared { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +cc_prebuilt_library_shared { + name: "mysdk_mylib@current", + sdk_member_name: "mylib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + host_supported: true, + installable: false, + unique_host_soname: true, + compile_multilib: "both", + target: { + host: { + enabled: false, + }, + android_arm64: { + srcs: ["android/arm64/lib/mylib.so"], + }, + android_arm: { + srcs: ["android/arm/lib/mylib.so"], + }, + linux_glibc_x86_64: { + enabled: true, + srcs: ["linux_glibc/x86_64/lib/mylib-host.so"], + }, + linux_glibc_x86: { + enabled: true, + srcs: ["linux_glibc/x86/lib/mylib-host.so"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + host_supported: true, + native_shared_libs: ["mysdk_mylib@current"], + target: { + host: { + enabled: false, + }, + linux_glibc_x86_64: { + enabled: true, + }, + linux_glibc_x86: { + enabled: true, + }, + }, +} +`), checkAllCopyRules(` .intermediates/mylib/android_arm64_armv8-a_shared/mylib.so -> android/arm64/lib/mylib.so .intermediates/mylib/android_arm_armv7-a-neon_shared/mylib.so -> android/arm/lib/mylib.so @@ -2175,7 +2728,7 @@ func TestNoSanitizerMembers(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library_shared { diff --git a/sdk/compat_config_sdk_test.go b/sdk/compat_config_sdk_test.go index d166add00..00073c29d 100644 --- a/sdk/compat_config_sdk_test.go +++ b/sdk/compat_config_sdk_test.go @@ -37,7 +37,23 @@ func TestSnapshotWithCompatConfig(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +prebuilt_platform_compat_config { + name: "mysdk_myconfig@current", + sdk_member_name: "myconfig", + visibility: ["//visibility:public"], + metadata: "compat_configs/myconfig/myconfig_meta.xml", +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + compat_configs: ["mysdk_myconfig@current"], +} +`), + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. prebuilt_platform_compat_config { diff --git a/sdk/exports.go b/sdk/exports.go index 7645d3fa1..9a0ba4e32 100644 --- a/sdk/exports.go +++ b/sdk/exports.go @@ -31,7 +31,7 @@ func ModuleExportsFactory() android.Module { return newSdkModule(true) } -// module_exports_snapshot is a snapshot of prebuilt versions of all the exports +// module_exports_snapshot is a versioned snapshot of prebuilt versions of all the exports // of a mainline module. func ModuleExportsSnapshotsFactory() android.Module { s := newSdkModule(true) diff --git a/sdk/exports_test.go b/sdk/exports_test.go index 2605fd141..17ddf1772 100644 --- a/sdk/exports_test.go +++ b/sdk/exports_test.go @@ -43,7 +43,7 @@ func TestModuleExportsSnapshot(t *testing.T) { }) CheckSnapshot(t, result, "myexports", "package", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -54,5 +54,22 @@ java_import { jars: ["java/myjavalib.jar"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "myexports_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + java_libs: ["myexports_myjavalib@current"], +} +`), ) } diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index 7ab5285c6..f33aa268e 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -15,7 +15,6 @@ package sdk import ( - "fmt" "testing" "android/soong/android" @@ -97,7 +96,7 @@ func TestSnapshotWithJavaHeaderLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -109,6 +108,24 @@ java_import { permitted_packages: ["pkg.myjavalib"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], + permitted_packages: ["pkg.myjavalib"], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib/android_common/turbine-combined/myjavalib.jar -> java/myjavalib.jar aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl @@ -143,7 +160,7 @@ func TestHostSnapshotWithJavaHeaderLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -156,6 +173,27 @@ java_import { jars: ["java/myjavalib.jar"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + jars: ["java/myjavalib.jar"], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + java_header_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib/linux_glibc_common/javac/myjavalib.jar -> java/myjavalib.jar aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl @@ -182,7 +220,7 @@ func TestDeviceAndHostSnapshotWithJavaHeaderLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -201,6 +239,32 @@ java_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + host_supported: true, + target: { + android: { + jars: ["java/android/myjavalib.jar"], + }, + linux_glibc: { + jars: ["java/linux_glibc/myjavalib.jar"], + }, + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + host_supported: true, + java_header_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib/android_common/turbine-combined/myjavalib.jar -> java/android/myjavalib.jar .intermediates/myjavalib/linux_glibc_common/javac/myjavalib.jar -> java/linux_glibc/myjavalib.jar @@ -234,7 +298,7 @@ func TestSnapshotWithJavaImplLibrary(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -245,6 +309,23 @@ java_import { jars: ["java/myjavalib.jar"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "myexports_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + java_libs: ["myexports_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib/android_common/withres/myjavalib.jar -> java/myjavalib.jar aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl @@ -258,8 +339,8 @@ func TestSnapshotWithJavaBootLibrary(t *testing.T) { android.FixtureAddFile("aidl", nil), android.FixtureAddFile("resource.txt", nil), ).RunTestWithBp(t, ` - sdk { - name: "mysdk", + module_exports { + name: "myexports", java_boot_libs: ["myjavalib"], } @@ -279,8 +360,8 @@ func TestSnapshotWithJavaBootLibrary(t *testing.T) { } `) - CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + CheckSnapshot(t, result, "myexports", "", + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -292,64 +373,29 @@ java_import { permitted_packages: ["pkg.myjavalib"], } `), - checkAllCopyRules(` -.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar -`), - ) -} - -func TestSnapshotWithJavaBootLibrary_UpdatableMedia(t *testing.T) { - runTest := func(t *testing.T, targetBuildRelease, expectedJarPath, expectedCopyRule string) { - result := android.GroupFixturePreparers( - prepareForSdkTestWithJava, - android.FixtureMergeEnv(map[string]string{ - "SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": targetBuildRelease, - }), - ).RunTestWithBp(t, ` - sdk { - name: "mysdk", - java_boot_libs: ["updatable-media"], - } - - java_library { - name: "updatable-media", - srcs: ["Test.java"], - system_modules: "none", - sdk_version: "none", - compile_dex: true, - permitted_packages: ["pkg.media"], - apex_available: ["com.android.media"], - } - `) - - CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(fmt.Sprintf(` + checkVersionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { - name: "updatable-media", - prefer: false, + name: "myexports_myjavalib@current", + sdk_member_name: "myjavalib", visibility: ["//visibility:public"], - apex_available: ["com.android.media"], - jars: ["%s"], - permitted_packages: ["pkg.media"], + apex_available: ["//apex_available:platform"], + jars: ["java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar"], + permitted_packages: ["pkg.myjavalib"], } -`, expectedJarPath)), - checkAllCopyRules(expectedCopyRule), - ) - } - t.Run("updatable-media in S", func(t *testing.T) { - runTest(t, "S", "java/updatable-media.jar", ` -.intermediates/updatable-media/android_common/package-check/updatable-media.jar -> java/updatable-media.jar -`) - }) +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + java_boot_libs: ["myexports_myjavalib@current"], +} - t.Run("updatable-media in T", func(t *testing.T) { - runTest(t, "Tiramisu", "java_boot_libs/snapshot/jars/are/invalid/updatable-media.jar", ` -.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/updatable-media.jar -`) - }) +`), + checkAllCopyRules(` +.intermediates/myexports/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/myjavalib.jar +`), + ) } func TestSnapshotWithJavaSystemserverLibrary(t *testing.T) { @@ -381,7 +427,7 @@ func TestSnapshotWithJavaSystemserverLibrary(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -393,6 +439,24 @@ java_import { permitted_packages: ["pkg.myjavalib"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "myexports_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java_systemserver_libs/snapshot/jars/are/invalid/myjavalib.jar"], + permitted_packages: ["pkg.myjavalib"], +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + java_systemserver_libs: ["myexports_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myexports/common_os/empty -> java_systemserver_libs/snapshot/jars/are/invalid/myjavalib.jar `), @@ -426,7 +490,7 @@ func TestHostSnapshotWithJavaImplLibrary(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -439,6 +503,27 @@ java_import { jars: ["java/myjavalib.jar"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "myexports_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + jars: ["java/myjavalib.jar"], +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + java_libs: ["myexports_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib/linux_glibc_common/javac/myjavalib.jar -> java/myjavalib.jar aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl @@ -464,7 +549,7 @@ func TestSnapshotWithJavaTest(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_test_import { @@ -476,6 +561,24 @@ java_test_import { test_config: "java/myjavatests-AndroidTest.xml", } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_test_import { + name: "myexports_myjavatests@current", + sdk_member_name: "myjavatests", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavatests.jar"], + test_config: "java/myjavatests-AndroidTest.xml", +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + java_tests: ["myexports_myjavatests@current"], +} +`), checkAllCopyRules(` .intermediates/myjavatests/android_common/javac/myjavatests.jar -> java/myjavatests.jar .intermediates/myjavatests/android_common/myjavatests.config -> java/myjavatests-AndroidTest.xml @@ -504,7 +607,7 @@ func TestHostSnapshotWithJavaTest(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_test_import { @@ -518,6 +621,28 @@ java_test_import { test_config: "java/myjavatests-AndroidTest.xml", } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_test_import { + name: "myexports_myjavatests@current", + sdk_member_name: "myjavatests", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + jars: ["java/myjavatests.jar"], + test_config: "java/myjavatests-AndroidTest.xml", +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + java_tests: ["myexports_myjavatests@current"], +} +`), checkAllCopyRules(` .intermediates/myjavatests/linux_glibc_common/javac/myjavatests.jar -> java/myjavatests.jar .intermediates/myjavatests/linux_glibc_common/myjavatests.config -> java/myjavatests-AndroidTest.xml @@ -578,7 +703,7 @@ func TestSnapshotWithJavaSystemModules(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -623,6 +748,59 @@ java_system_modules_import { ], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_exported-system-module@current", + sdk_member_name: "exported-system-module", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/exported-system-module.jar"], +} + +java_import { + name: "mysdk_system-module@current", + sdk_member_name: "system-module", + visibility: ["//visibility:private"], + apex_available: ["//apex_available:platform"], + jars: ["java/system-module.jar"], +} + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:anyapex"], + shared_library: false, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, +} + +java_system_modules_import { + name: "mysdk_my-system-modules@current", + sdk_member_name: "my-system-modules", + visibility: ["//visibility:public"], + libs: [ + "mysdk_system-module@current", + "mysdk_exported-system-module@current", + "mysdk_myjavalib.stubs@current", + ], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_exported-system-module@current"], + java_sdk_libs: ["mysdk_myjavalib@current"], + java_system_modules: ["mysdk_my-system-modules@current"], +} +`), checkAllCopyRules(` .intermediates/exported-system-module/android_common/turbine-combined/exported-system-module.jar -> java/exported-system-module.jar .intermediates/system-module/android_common/turbine-combined/system-module.jar -> java/system-module.jar @@ -707,7 +885,7 @@ func TestHostSnapshotWithJavaSystemModules(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -729,6 +907,36 @@ java_system_modules_import { libs: ["mysdk_system-module"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_system-module@current", + sdk_member_name: "system-module", + visibility: ["//visibility:private"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + jars: ["java/system-module.jar"], +} + +java_system_modules_import { + name: "mysdk_my-system-modules@current", + sdk_member_name: "my-system-modules", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + libs: ["mysdk_system-module@current"], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + device_supported: false, + host_supported: true, + java_system_modules: ["mysdk_my-system-modules@current"], +} +`), checkAllCopyRules(".intermediates/system-module/linux_glibc_common/javac/system-module.jar -> java/system-module.jar"), ) } @@ -771,7 +979,7 @@ func TestDeviceAndHostSnapshotWithOsSpecificMembers(t *testing.T) { `) CheckSnapshot(t, result, "myexports", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -808,6 +1016,58 @@ java_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "myexports_hostjavalib@current", + sdk_member_name: "hostjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + device_supported: false, + host_supported: true, + jars: ["java/hostjavalib.jar"], +} + +java_import { + name: "myexports_androidjavalib@current", + sdk_member_name: "androidjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/androidjavalib.jar"], +} + +java_import { + name: "myexports_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + host_supported: true, + target: { + android: { + jars: ["java/android/myjavalib.jar"], + }, + linux_glibc: { + jars: ["java/linux_glibc/myjavalib.jar"], + }, + }, +} + +module_exports_snapshot { + name: "myexports@current", + visibility: ["//visibility:public"], + host_supported: true, + java_libs: ["myexports_myjavalib@current"], + target: { + android: { + java_header_libs: ["myexports_androidjavalib@current"], + }, + linux_glibc: { + java_header_libs: ["myexports_hostjavalib@current"], + }, + }, +} +`), checkAllCopyRules(` .intermediates/hostjavalib/linux_glibc_common/javac/hostjavalib.jar -> java/hostjavalib.jar .intermediates/androidjavalib/android_common/turbine-combined/androidjavalib.jar -> java/androidjavalib.jar @@ -837,7 +1097,7 @@ func TestSnapshotWithJavaSdkLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -870,6 +1130,45 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:anyapex"], + shared_library: false, + permitted_packages: ["pkg.myjavalib"], + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, + system: { + jars: ["sdk_library/system/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/system/myjavalib_stub_sources"], + current_api: "sdk_library/system/myjavalib.txt", + removed_api: "sdk_library/system/myjavalib-removed.txt", + sdk_version: "system_current", + }, + test: { + jars: ["sdk_library/test/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/test/myjavalib_stub_sources"], + current_api: "sdk_library/test/myjavalib.txt", + removed_api: "sdk_library/test/myjavalib-removed.txt", + sdk_version: "test_current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt @@ -886,6 +1185,12 @@ java_sdk_library_import { ".intermediates/mysdk/common_os/tmp/sdk_library/system/myjavalib_stub_sources.zip", ".intermediates/mysdk/common_os/tmp/sdk_library/test/myjavalib_stub_sources.zip", ), + snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) { + // Make sure that the name of the child modules created by a versioned java_sdk_library_import + // module is correct, i.e. the suffix is added before the version and not after. + result.Module("mysdk_myjavalib.stubs@current", "android_common") + result.Module("mysdk_myjavalib.stubs.source@current", "android_common") + }), ) } @@ -913,7 +1218,7 @@ func TestSnapshotWithJavaSdkLibrary_UseSrcJar(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -960,7 +1265,7 @@ func TestSnapshotWithJavaSdkLibrary_AnnotationsZip(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1014,7 +1319,7 @@ func TestSnapshotWithJavaSdkLibrary_AnnotationsZip_PreT(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1064,7 +1369,7 @@ func TestSnapshotWithJavaSdkLibrary_CompileDex(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1131,7 +1436,7 @@ func TestSnapshotWithJavaSdkLibrary_SdkVersion_None(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1149,6 +1454,30 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + shared_library: true, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "none", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt @@ -1179,7 +1508,7 @@ func TestSnapshotWithJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1197,6 +1526,30 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + shared_library: true, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "module_current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt @@ -1230,7 +1583,7 @@ func TestSnapshotWithJavaSdkLibrary_ApiScopes(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1255,6 +1608,37 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:anyapex"], + shared_library: true, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, + system: { + jars: ["sdk_library/system/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/system/myjavalib_stub_sources"], + current_api: "sdk_library/system/myjavalib.txt", + removed_api: "sdk_library/system/myjavalib-removed.txt", + sdk_version: "system_current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt @@ -1295,7 +1679,7 @@ func TestSnapshotWithJavaSdkLibrary_ModuleLib(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1327,6 +1711,44 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:anyapex"], + shared_library: true, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, + system: { + jars: ["sdk_library/system/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/system/myjavalib_stub_sources"], + current_api: "sdk_library/system/myjavalib.txt", + removed_api: "sdk_library/system/myjavalib-removed.txt", + sdk_version: "system_current", + }, + module_lib: { + jars: ["sdk_library/module-lib/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/module-lib/myjavalib_stub_sources"], + current_api: "sdk_library/module-lib/myjavalib.txt", + removed_api: "sdk_library/module-lib/myjavalib-removed.txt", + sdk_version: "module_current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt @@ -1339,9 +1761,9 @@ java_sdk_library_import { .intermediates/myjavalib.stubs.source.module_lib/android_common/metalava/myjavalib.stubs.source.module_lib_removed.txt -> sdk_library/module-lib/myjavalib-removed.txt `), checkMergeZips( - ".intermediates/mysdk/common_os/tmp/sdk_library/module-lib/myjavalib_stub_sources.zip", ".intermediates/mysdk/common_os/tmp/sdk_library/public/myjavalib_stub_sources.zip", ".intermediates/mysdk/common_os/tmp/sdk_library/system/myjavalib_stub_sources.zip", + ".intermediates/mysdk/common_os/tmp/sdk_library/module-lib/myjavalib_stub_sources.zip", ), ) } @@ -1368,7 +1790,7 @@ func TestSnapshotWithJavaSdkLibrary_SystemServer(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1393,6 +1815,37 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:anyapex"], + shared_library: true, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, + system_server: { + jars: ["sdk_library/system-server/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/system-server/myjavalib_stub_sources"], + current_api: "sdk_library/system-server/myjavalib.txt", + removed_api: "sdk_library/system-server/myjavalib-removed.txt", + sdk_version: "system_server_current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt @@ -1428,7 +1881,7 @@ func TestSnapshotWithJavaSdkLibrary_NamingScheme(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1447,6 +1900,31 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:anyapex"], + naming_scheme: "default", + shared_library: true, + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt @@ -1485,7 +1963,7 @@ func TestSnapshotWithJavaSdkLibrary_DoctagFiles(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -1504,6 +1982,31 @@ java_sdk_library_import { }, } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_sdk_library_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + shared_library: true, + doctag_files: ["doctags/docs/known_doctags"], + public: { + jars: ["sdk_library/public/myjavalib-stubs.jar"], + stub_srcs: ["sdk_library/public/myjavalib_stub_sources"], + current_api: "sdk_library/public/myjavalib.txt", + removed_api: "sdk_library/public/myjavalib-removed.txt", + sdk_version: "current", + }, +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_myjavalib@current"], +} +`), checkAllCopyRules(` .intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar .intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt diff --git a/sdk/license_sdk_test.go b/sdk/license_sdk_test.go index 829edf117..1ef6fe684 100644 --- a/sdk/license_sdk_test.go +++ b/sdk/license_sdk_test.go @@ -60,7 +60,7 @@ func TestSnapshotWithPackageDefaultLicense(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. package { @@ -91,6 +91,44 @@ license { ], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +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"], +} + +java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + licenses: ["mysdk_mylicense@current"], + jars: ["java/myjavalib.jar"], +} + +license { + name: "mysdk_mylicense@current", + sdk_member_name: "mylicense", + visibility: ["//visibility:private"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "legacy_unencumbered", + ], + license_text: [ + "licenses/NOTICE1", + "licenses/NOTICE2", + ], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_myjavalib@current"], +} + `), checkAllCopyRules(` .intermediates/myjavalib/android_common/turbine-combined/myjavalib.jar -> java/myjavalib.jar NOTICE1 -> licenses/NOTICE1 diff --git a/sdk/member_trait_test.go b/sdk/member_trait_test.go index 99caf13e3..a3db189b2 100644 --- a/sdk/member_trait_test.go +++ b/sdk/member_trait_test.go @@ -134,7 +134,7 @@ func TestBasicTrait_WithoutTrait(t *testing.T) { ).RunTest(t) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { @@ -145,6 +145,23 @@ java_import { jars: ["javalibs/myjavalib.jar"], } `), + checkVersionedAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["javalibs/myjavalib.jar"], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + fake_members: ["mysdk_myjavalib@current"], +} +`), ) } @@ -199,7 +216,7 @@ func TestBasicTrait_MultipleTraits(t *testing.T) { ).RunTest(t) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_test_import { diff --git a/sdk/sdk.go b/sdk/sdk.go index aeeedb428..b37eaad69 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -146,7 +146,7 @@ func newSdkModule(moduleExports bool) *sdk { return s } -// sdk_snapshot is a snapshot of an SDK. This is an auto-generated module. +// sdk_snapshot is a versioned snapshot of an SDK. This is an auto-generated module. func SnapshotModuleFactory() android.Module { s := newSdkModule(false) s.properties.Snapshot = true @@ -281,6 +281,7 @@ var _ android.SdkDependencyContext = (*dependencyContext)(nil) func RegisterPreDepsMutators(ctx android.RegisterMutatorsContext) { ctx.BottomUp("SdkMember", memberMutator).Parallel() ctx.TopDown("SdkMember_deps", memberDepsMutator).Parallel() + ctx.BottomUp("SdkMemberInterVersion", memberInterVersionMutator).Parallel() } type dependencyTag struct { @@ -292,6 +293,38 @@ func (t dependencyTag) ExcludeFromApexContents() {} var _ android.ExcludeFromApexContentsTag = dependencyTag{} +// For dependencies from an in-development version of an SDK member to frozen versions of the same member +// e.g. libfoo -> libfoo.mysdk.11 and libfoo.mysdk.12 +// +// The dependency represented by this tag requires that for every APEX variant created for the +// `from` module that an equivalent APEX variant is created for the 'to' module. This is because an +// APEX that requires a specific version of an sdk (via the `uses_sdks` property will replace +// dependencies on the unversioned sdk member with a dependency on the appropriate versioned sdk +// member. In order for that to work the versioned sdk member needs to have a variant for that APEX. +// As it is not known at the time that the APEX variants are created which specific APEX variants of +// a versioned sdk members will be required it is necessary for the versioned sdk members to have +// variants for any APEX that it could be used within. +// +// If the APEX selects a versioned sdk member then it will not have a dependency on the `from` +// module at all so any dependencies of that module will not affect the APEX. However, if the APEX +// selects the unversioned sdk member then it must exclude all the versioned sdk members. In no +// situation would this dependency cause the `to` module to be added to the APEX hence why this tag +// also excludes the `to` module from being added to the APEX contents. +type sdkMemberVersionedDepTag struct { + dependencyTag + member string + version string +} + +func (t sdkMemberVersionedDepTag) AlwaysRequireApexVariant() bool { + return true +} + +// Mark this tag so dependencies that use it are excluded from visibility enforcement. +func (t sdkMemberVersionedDepTag) ExcludeFromVisibilityEnforcement() {} + +var _ android.AlwaysRequireApexVariantTag = sdkMemberVersionedDepTag{} + // Step 1: create dependencies from an SDK module to its members. func memberMutator(mctx android.BottomUpMutatorContext) { if s, ok := mctx.Module().(*sdk); ok { @@ -350,6 +383,22 @@ func memberDepsMutator(mctx android.TopDownMutatorContext) { } } +// Step 3: create dependencies from the unversioned SDK member to snapshot versions +// of the same member. By having these dependencies, they are mutated for multiple Mainline modules +// (apex and apk), each of which might want different sdks to be built with. For example, if both +// apex A and B are referencing libfoo which is a member of sdk 'mysdk', the two APEXes can be +// built with libfoo.mysdk.11 and libfoo.mysdk.12, respectively depending on which sdk they are +// using. +func memberInterVersionMutator(mctx android.BottomUpMutatorContext) { + if m, ok := mctx.Module().(android.SdkAware); ok && m.IsInAnySdk() && m.IsVersioned() { + if !m.ContainingSdk().Unversioned() { + memberName := m.MemberName() + tag := sdkMemberVersionedDepTag{member: memberName, version: m.ContainingSdk().Version} + mctx.AddReverseDependency(mctx.Module(), tag, memberName) + } + } +} + // An interface that encapsulates all the functionality needed to manage the sdk dependencies. // // It is a mixture of apex and sdk module functionality. diff --git a/sdk/sdk_test.go b/sdk/sdk_test.go index 1ec12c346..ccbeb8d9a 100644 --- a/sdk/sdk_test.go +++ b/sdk/sdk_test.go @@ -119,6 +119,18 @@ func TestSnapshotVisibility(t *testing.T) { // This is auto-generated. DO NOT EDIT. java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: [ + "//other/foo", + "//package", + "//prebuilts/mysdk", + ], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +java_import { name: "myjavalib", prefer: false, visibility: [ @@ -131,6 +143,14 @@ java_import { } java_import { + name: "mysdk_mypublicjavalib@current", + sdk_member_name: "mypublicjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/mypublicjavalib.jar"], +} + +java_import { name: "mypublicjavalib", prefer: false, visibility: ["//visibility:public"], @@ -139,6 +159,18 @@ java_import { } java_import { + name: "mysdk_mydefaultedjavalib@current", + sdk_member_name: "mydefaultedjavalib", + visibility: [ + "//other/bar", + "//package", + "//prebuilts/mysdk", + ], + apex_available: ["//apex_available:platform"], + jars: ["java/mydefaultedjavalib.jar"], +} + +java_import { name: "mydefaultedjavalib", prefer: false, visibility: [ @@ -151,6 +183,17 @@ java_import { } java_import { + name: "mysdk_myprivatejavalib@current", + sdk_member_name: "myprivatejavalib", + visibility: [ + "//package", + "//prebuilts/mysdk", + ], + apex_available: ["//apex_available:platform"], + jars: ["java/myprivatejavalib.jar"], +} + +java_import { name: "myprivatejavalib", prefer: false, visibility: [ @@ -160,6 +203,20 @@ java_import { apex_available: ["//apex_available:platform"], jars: ["java/myprivatejavalib.jar"], } + +sdk_snapshot { + name: "mysdk@current", + visibility: [ + "//other/foo", + "//package:__subpackages__", + ], + java_header_libs: [ + "mysdk_myjavalib@current", + "mysdk_mypublicjavalib@current", + "mysdk_mydefaultedjavalib@current", + "mysdk_myprivatejavalib@current", + ], +} `)) } @@ -393,12 +450,26 @@ func TestSnapshot_EnvConfiguration(t *testing.T) { // This is auto-generated. DO NOT EDIT. java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +java_import { name: "myjavalib", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["java/myjavalib.jar"], } + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_myjavalib@current"], +} `), ) }) @@ -418,12 +489,26 @@ java_import { // This is auto-generated. DO NOT EDIT. java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +java_import { name: "myjavalib", prefer: true, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["java/myjavalib.jar"], } + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_myjavalib@current"], +} `), ) }) @@ -443,6 +528,14 @@ java_import { // This is auto-generated. DO NOT EDIT. java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +java_import { name: "myjavalib", prefer: false, use_source_config_var: { @@ -453,10 +546,113 @@ java_import { apex_available: ["//apex_available:platform"], jars: ["java/myjavalib.jar"], } + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_myjavalib@current"], +} + `), + ) + }) + + t.Run("SOONG_SDK_SNAPSHOT_VERSION=unversioned", func(t *testing.T) { + result := android.GroupFixturePreparers( + preparer, + android.FixtureMergeEnv(map[string]string{ + "SOONG_SDK_SNAPSHOT_VERSION": "unversioned", + }), + ).RunTest(t) + + checkZipFile(t, result, "out/soong/.intermediates/mysdk/common_os/mysdk.zip") + + CheckSnapshot(t, result, "mysdk", "", + checkAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "myjavalib", + prefer: false, + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} `), ) }) + t.Run("SOONG_SDK_SNAPSHOT_VERSION=current", func(t *testing.T) { + result := android.GroupFixturePreparers( + preparer, + android.FixtureMergeEnv(map[string]string{ + "SOONG_SDK_SNAPSHOT_VERSION": "current", + }), + ).RunTest(t) + + checkZipFile(t, result, "out/soong/.intermediates/mysdk/common_os/mysdk-current.zip") + + CheckSnapshot(t, result, "mysdk", "", + checkAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_myjavalib@current", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +java_import { + name: "myjavalib", + prefer: false, + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_myjavalib@current"], +} + `), + ) + }) + + t.Run("SOONG_SDK_SNAPSHOT_VERSION=2", func(t *testing.T) { + result := android.GroupFixturePreparers( + preparer, + android.FixtureMergeEnv(map[string]string{ + "SOONG_SDK_SNAPSHOT_VERSION": "2", + }), + ).RunTest(t) + + checkZipFile(t, result, "out/soong/.intermediates/mysdk/common_os/mysdk-2.zip") + + CheckSnapshot(t, result, "mysdk", "", + checkAndroidBpContents(` +// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_myjavalib@2", + sdk_member_name: "myjavalib", + visibility: ["//visibility:public"], + apex_available: ["//apex_available:platform"], + jars: ["java/myjavalib.jar"], +} + +sdk_snapshot { + name: "mysdk@2", + visibility: ["//visibility:public"], + java_header_libs: ["mysdk_myjavalib@2"], +} + `), + // A versioned snapshot cannot be used on its own so add the source back in. + snapshotTestPreparer(checkSnapshotWithoutSource, android.FixtureWithRootAndroidBp(bp)), + ) + }) + t.Run("SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE=S", func(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, @@ -473,9 +669,6 @@ java_import { name: "mybootclasspathfragment", apex_available: ["myapex"], contents: ["mysdklibrary"], - hidden_api: { - split_packages: ["*"], - }, } java_sdk_library { @@ -492,7 +685,7 @@ java_import { ).RunTest(t) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. prebuilt_bootclasspath_fragment { diff --git a/sdk/systemserverclasspath_fragment_sdk_test.go b/sdk/systemserverclasspath_fragment_sdk_test.go index 1ac405d7d..16e3e7fa9 100644 --- a/sdk/systemserverclasspath_fragment_sdk_test.go +++ b/sdk/systemserverclasspath_fragment_sdk_test.go @@ -22,21 +22,28 @@ import ( "android/soong/java" ) -func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, targetBuildRelease string, expectedSdkSnapshot string) { +func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, java.PrepareForTestWithJavaSdkLibraryFiles, java.FixtureWithLastReleaseApis("mysdklibrary"), dexpreopt.FixtureSetApexSystemServerJars("myapex:mylib", "myapex:mysdklibrary"), - android.FixtureModifyEnv(func(env map[string]string) { - if targetBuildRelease != "latest" { - env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = targetBuildRelease - } - }), prepareForSdkTestWithApex, - android.FixtureWithRootAndroidBp(sdk+` + android.FixtureWithRootAndroidBp(` + sdk { + name: "mysdk", + systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], + java_sdk_libs: [ + // This is not strictly needed as it should be automatically added to the sdk_snapshot as + // a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's + // contents property. However, it is specified here to ensure that duplicates are + // correctly deduped. + "mysdklibrary", + ], + } + apex { name: "myapex", key: "myapex.key", @@ -76,27 +83,7 @@ func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, tar ).RunTest(t) CheckSnapshot(t, result, "mysdk", "", - checkAndroidBpContents(expectedSdkSnapshot), - ) -} - -func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) { - - commonSdk := ` -sdk { - name: "mysdk", - systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], - java_sdk_libs: [ - // This is not strictly needed as it should be automatically added to the sdk_snapshot as - // a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's - // contents property. However, it is specified here to ensure that duplicates are - // correctly deduped. - "mysdklibrary", - ], -} - ` - - expectedLatestSnapshot := ` + checkUnversionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { @@ -133,36 +120,13 @@ prebuilt_systemserverclasspath_fragment { "mysdklibrary", ], } -` - - t.Run("target-s", func(t *testing.T) { - testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", ` +`), + checkVersionedAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_sdk_library_import { - name: "mysdklibrary", - prefer: false, - visibility: ["//visibility:public"], - apex_available: ["myapex"], - shared_library: false, - public: { - jars: ["sdk_library/public/mysdklibrary-stubs.jar"], - stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], - current_api: "sdk_library/public/mysdklibrary.txt", - removed_api: "sdk_library/public/mysdklibrary-removed.txt", - sdk_version: "current", - }, -} -`) - }) - - t.Run("target-t", func(t *testing.T) { - testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", ` -// This is auto-generated. DO NOT EDIT. - -java_sdk_library_import { - name: "mysdklibrary", - prefer: false, + name: "mysdk_mysdklibrary@current", + sdk_member_name: "mysdklibrary", visibility: ["//visibility:public"], apex_available: ["myapex"], shared_library: false, @@ -176,8 +140,8 @@ java_sdk_library_import { } java_import { - name: "mylib", - prefer: false, + name: "mysdk_mylib@current", + sdk_member_name: "mylib", visibility: ["//visibility:public"], apex_available: ["myapex"], jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], @@ -185,28 +149,23 @@ java_import { } prebuilt_systemserverclasspath_fragment { - name: "mysystemserverclasspathfragment", - prefer: false, + name: "mysdk_mysystemserverclasspathfragment@current", + sdk_member_name: "mysystemserverclasspathfragment", visibility: ["//visibility:public"], apex_available: ["myapex"], contents: [ - "mylib", - "mysdklibrary", + "mysdk_mylib@current", + "mysdk_mysdklibrary@current", ], } -`) - }) - - t.Run("added-directly", func(t *testing.T) { - testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot) - }) - t.Run("added-via-apex", func(t *testing.T) { - testSnapshotWithSystemServerClasspathFragment(t, ` - sdk { - name: "mysdk", - apexes: ["myapex"], - } - `, `latest`, expectedLatestSnapshot) - }) +sdk_snapshot { + name: "mysdk@current", + visibility: ["//visibility:public"], + java_sdk_libs: ["mysdk_mysdklibrary@current"], + java_systemserver_libs: ["mysdk_mylib@current"], + systemserverclasspath_fragments: ["mysdk_mysystemserverclasspathfragment@current"], +} +`), + ) } diff --git a/sdk/testing.go b/sdk/testing.go index bed11b27d..72344de25 100644 --- a/sdk/testing.go +++ b/sdk/testing.go @@ -122,18 +122,29 @@ func ensureListContains(t *testing.T, result []string, expected string) { } } +func pathsToStrings(paths android.Paths) []string { + var ret []string + for _, p := range paths { + ret = append(ret, p.String()) + } + return ret +} + // Analyse the sdk build rules to extract information about what it is doing. // // e.g. find the src/dest pairs from each cp command, the various zip files // generated, etc. func getSdkSnapshotBuildInfo(t *testing.T, result *android.TestResult, sdk *sdk) *snapshotBuildInfo { info := &snapshotBuildInfo{ - t: t, - r: result, - androidBpContents: sdk.GetAndroidBpContentsForTests(), - infoContents: sdk.GetInfoContentsForTests(), - snapshotTestCustomizations: map[snapshotTest]*snapshotTestCustomization{}, - targetBuildRelease: sdk.builderForTests.targetBuildRelease, + t: t, + r: result, + version: sdk.builderForTests.version, + androidBpContents: sdk.GetAndroidBpContentsForTests(), + androidUnversionedBpContents: sdk.GetUnversionedAndroidBpContentsForTests(), + androidVersionedBpContents: sdk.GetVersionedAndroidBpContentsForTests(), + infoContents: sdk.GetInfoContentsForTests(), + snapshotTestCustomizations: map[snapshotTest]*snapshotTestCustomization{}, + targetBuildRelease: sdk.builderForTests.targetBuildRelease, } buildParams := sdk.BuildParamsForTests() @@ -247,7 +258,10 @@ func CheckSnapshot(t *testing.T, result *android.TestResult, name string, dir st if dir != "" { dir = filepath.Clean(dir) + "/" } - suffix := "-" + soongSdkSnapshotVersionCurrent + suffix := "" + if snapshotBuildInfo.version != soongSdkSnapshotVersionUnversioned { + suffix = "-" + snapshotBuildInfo.version + } expectedZipPath := fmt.Sprintf(".intermediates/%s%s/%s/%s%s.zip", dir, name, variant, name, suffix) android.AssertStringEquals(t, "Snapshot zip file in wrong place", expectedZipPath, actual) @@ -331,6 +345,33 @@ func checkAndroidBpContents(expected string) snapshotBuildInfoChecker { } } +// Check that the snapshot's unversioned generated Android.bp is correct. +// +// This func should be used to check the general snapshot generation code. +// +// Both the expected and actual string are both trimmed before comparing. +func checkUnversionedAndroidBpContents(expected string) snapshotBuildInfoChecker { + return func(info *snapshotBuildInfo) { + info.t.Helper() + android.AssertTrimmedStringEquals(info.t, "unversioned Android.bp contents do not match", expected, info.androidUnversionedBpContents) + } +} + +// Check that the snapshot's versioned generated Android.bp is correct. +// +// This func should only be used to check the version specific snapshot generation code, +// i.e. the encoding of version into module names and the generation of the _snapshot module. The +// general snapshot generation code should be checked using the checkUnversionedAndroidBpContents() +// func. +// +// Both the expected and actual string are both trimmed before comparing. +func checkVersionedAndroidBpContents(expected string) snapshotBuildInfoChecker { + return func(info *snapshotBuildInfo) { + info.t.Helper() + android.AssertTrimmedStringEquals(info.t, "versioned Android.bp contents do not match", expected, info.androidVersionedBpContents) + } +} + // Check that the snapshot's copy rules are correct. // // The copy rules are formatted as <src> -> <dest>, one per line and then compared @@ -436,9 +477,20 @@ type snapshotBuildInfo struct { // The result from RunTest() r *android.TestResult + // The version of the generated snapshot. + // + // See snapshotBuilder.version for more information about this field. + version string + // The contents of the generated Android.bp file androidBpContents string + // The contents of the unversioned Android.bp file + androidUnversionedBpContents string + + // The contents of the versioned Android.bp file + androidVersionedBpContents string + // The contents of the info file. infoContents string diff --git a/sdk/update.go b/sdk/update.go index c555ddc7a..e61ae0d0a 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -35,7 +35,7 @@ import ( // ======================================================== // // SOONG_SDK_SNAPSHOT_PREFER -// By default every module in the generated snapshot has prefer: false. Building it +// 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 @@ -69,6 +69,20 @@ import ( // 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. +// +// SOONG_SDK_SNAPSHOT_VERSION=current will generate unversioned and versioned prebuilts and a +// versioned snapshot module. This is the default behavior. The zip file containing the +// generated snapshot will be <sdk-name>-current.zip. +// +// SOONG_SDK_SNAPSHOT_VERSION=unversioned will generate unversioned prebuilts only and the zip +// file containing the generated snapshot will be <sdk-name>.zip. +// +// SOONG_SDK_SNAPSHOT_VERSION=<number> will generate versioned prebuilts and a versioned +// snapshot module only. The zip file containing the generated snapshot will be +// <sdk-name>-<number>.zip. +// // SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE // This allows the target build release (i.e. the release version of the build within which // the snapshot will be used) of the snapshot to be specified. If unspecified then it defaults @@ -108,7 +122,7 @@ var ( mergeZips = pctx.AndroidStaticRule("SnapshotMergeZips", blueprint.RuleParams{ - Command: `${config.MergeZipsCmd} -s $out $in`, + Command: `${config.MergeZipsCmd} $out $in`, CommandDeps: []string{ "${config.MergeZipsCmd}", }, @@ -116,7 +130,8 @@ var ( ) const ( - soongSdkSnapshotVersionCurrent = "current" + soongSdkSnapshotVersionUnversioned = "unversioned" + soongSdkSnapshotVersionCurrent = "current" ) type generatedContents struct { @@ -148,13 +163,13 @@ func (gc *generatedContents) Dedent() { // IndentedPrintf will add spaces to indent the line to the appropriate level before printing the // arguments. func (gc *generatedContents) IndentedPrintf(format string, args ...interface{}) { - _, _ = fmt.Fprintf(&(gc.content), strings.Repeat(" ", gc.indentLevel)+format, args...) + fmt.Fprintf(&(gc.content), strings.Repeat(" ", gc.indentLevel)+format, args...) } // UnindentedPrintf does not add spaces to indent the line to the appropriate level before printing // the arguments. func (gc *generatedContents) UnindentedPrintf(format string, args ...interface{}) { - _, _ = fmt.Fprintf(&(gc.content), format, args...) + fmt.Fprintf(&(gc.content), format, args...) } func (gf *generatedFile) build(pctx android.PackageContext, ctx android.BuilderContext, implicits android.Paths) { @@ -239,7 +254,7 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) { // Finally, the member type slices are concatenated together to form a single slice. The order in // which they are concatenated is the order in which the member types were registered in the // android.SdkMemberTypesRegistry. -func (s *sdk) groupMemberVariantsByMemberThenType(ctx android.ModuleContext, targetBuildRelease *buildRelease, memberVariantDeps []sdkMemberVariantDep) []*sdkMember { +func (s *sdk) groupMemberVariantsByMemberThenType(ctx android.ModuleContext, memberVariantDeps []sdkMemberVariantDep) []*sdkMember { byType := make(map[android.SdkMemberType][]*sdkMember) byName := make(map[string]*sdkMember) @@ -253,54 +268,22 @@ func (s *sdk) groupMemberVariantsByMemberThenType(ctx android.ModuleContext, tar member = &sdkMember{memberType: memberType, name: name} byName[name] = member byType[memberType] = append(byType[memberType], member) - } else if member.memberType != memberType { - // validate whether this is the same member type or and overriding member type - if memberType.Overrides(member.memberType) { - member.memberType = memberType - } else if !member.memberType.Overrides(memberType) { - ctx.ModuleErrorf("Incompatible member types %q %q", member.memberType, memberType) - } } // Only append new variants to the list. This is needed because a member can be both // exported by the sdk and also be a transitive sdk member. member.variants = appendUniqueVariants(member.variants, variant) } + var members []*sdkMember for _, memberListProperty := range s.memberTypeListProperties() { - memberType := memberListProperty.memberType - - if !isMemberTypeSupportedByTargetBuildRelease(memberType, targetBuildRelease) { - continue - } - - membersOfType := byType[memberType] + membersOfType := byType[memberListProperty.memberType] members = append(members, membersOfType...) } return members } -// isMemberTypeSupportedByTargetBuildRelease returns true if the member type is supported by the -// target build release. -func isMemberTypeSupportedByTargetBuildRelease(memberType android.SdkMemberType, targetBuildRelease *buildRelease) bool { - supportedByTargetBuildRelease := true - supportedBuildReleases := memberType.SupportedBuildReleases() - if supportedBuildReleases == "" { - supportedBuildReleases = "S+" - } - - set, err := parseBuildReleaseSet(supportedBuildReleases) - if err != nil { - panic(fmt.Errorf("member type %s has invalid supported build releases %q: %s", - memberType.SdkPropertyName(), supportedBuildReleases, err)) - } - if !set.contains(targetBuildRelease) { - supportedByTargetBuildRelease = false - } - return supportedByTargetBuildRelease -} - func appendUniqueVariants(variants []android.SdkAware, newVariant android.SdkAware) []android.SdkAware { for _, v := range variants { if v == newVariant { @@ -332,6 +315,12 @@ const BUILD_NUMBER_FILE = "snapshot-creation-build-number.txt" // <arch>/lib/ // libFoo.so : a stub library +// A name that uniquely identifies a prebuilt SDK member for a version of SDK snapshot +// This isn't visible to users, so could be changed in future. +func versionedSdkMemberName(ctx android.ModuleContext, memberName string, version string) string { + return ctx.ModuleName() + "_" + memberName + string(android.SdkVersionSeparator) + version +} + // buildSnapshot is the main function in this source file. It creates rules to copy // the contents (header files, stub libraries, etc) into the zip file. func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) { @@ -383,9 +372,20 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) { } config := ctx.Config() + version := config.GetenvWithDefault("SOONG_SDK_SNAPSHOT_VERSION", "current") + + // Generate versioned modules in the snapshot unless an unversioned snapshot has been requested. + generateVersioned := version != soongSdkSnapshotVersionUnversioned - // Always add -current to the end - snapshotFileSuffix := "-current" + // Generate unversioned modules in the snapshot unless a numbered snapshot has been requested. + // + // Unversioned modules are not required in that case because the numbered version will be a + // finalized version of the snapshot that is intended to be kept separate from the + generateUnversioned := version == soongSdkSnapshotVersionUnversioned || version == soongSdkSnapshotVersionCurrent + snapshotFileSuffix := "" + if generateVersioned { + snapshotFileSuffix = "-" + version + } currentBuildRelease := latestBuildRelease() targetBuildReleaseEnv := config.GetenvWithDefault("SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE", currentBuildRelease.name) @@ -398,6 +398,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) { builder := &snapshotBuilder{ ctx: ctx, sdk: s, + version: version, snapshotDir: snapshotDir.OutputPath, copies: make(map[string]string), filesToZip: []android.Path{bp.path}, @@ -427,15 +428,12 @@ be unnecessary as every module in the sdk already has its own licenses property. // Group the variants for each member module together and then group the members of each member // type together. - members := s.groupMemberVariantsByMemberThenType(ctx, targetBuildRelease, memberVariantDeps) + members := s.groupMemberVariantsByMemberThenType(ctx, memberVariantDeps) // Create the prebuilt modules for each of the member modules. traits := s.gatherTraits() for _, member := range members { memberType := member.memberType - if !memberType.ArePrebuiltsRequired() { - continue - } name := member.name requiredTraits := traits[name] @@ -450,19 +448,38 @@ be unnecessary as every module in the sdk already has its own licenses property. s.createMemberSnapshot(memberCtx, member, prebuiltModule.(*bpModule)) } - // Create a transformer that will transform a module by replacing any references + // Create a transformer that will transform an unversioned module into a versioned module. + unversionedToVersionedTransformer := unversionedToVersionedTransformation{builder: builder} + + // Create a transformer that will transform an unversioned module by replacing any references // to internal members with a unique module name and setting prefer: false. - snapshotTransformer := snapshotTransformation{ + unversionedTransformer := unversionedTransformation{ builder: builder, } - for _, module := range builder.prebuiltOrder { + for _, unversioned := range builder.prebuiltOrder { // Prune any empty property sets. - module = module.transform(pruneEmptySetTransformer{}) + unversioned = unversioned.transform(pruneEmptySetTransformer{}) + + if generateVersioned { + // Copy the unversioned module so it can be modified to make it versioned. + versioned := unversioned.deepCopy() + + // Transform the unversioned module into a versioned one. + versioned.transform(unversionedToVersionedTransformer) + bpFile.AddModule(versioned) + } - // Transform the module module to make it suitable for use in the snapshot. - module.transform(snapshotTransformer) - bpFile.AddModule(module) + if generateUnversioned { + // Transform the unversioned module to make it suitable for use in the snapshot. + unversioned.transform(unversionedTransformer) + bpFile.AddModule(unversioned) + } + } + + if generateVersioned { + // Add the sdk/module_exports_snapshot module to the bp file. + s.addSnapshotModule(ctx, builder, sdkVariants, memberVariantDeps) } // generate Android.bp @@ -481,7 +498,7 @@ be unnecessary as every module in the sdk already has its own licenses property. // Copy the build number file into the snapshot. builder.CopyToSnapshot(ctx.Config().BuildNumberFile(ctx), BUILD_NUMBER_FILE) - filesToZip := android.SortedUniquePaths(builder.filesToZip) + filesToZip := builder.filesToZip // zip them all zipPath := fmt.Sprintf("%s%s.zip", ctx.ModuleName(), snapshotFileSuffix) @@ -517,7 +534,7 @@ be unnecessary as every module in the sdk already has its own licenses property. Description: outputDesc, Rule: mergeZips, Input: zipFile, - Inputs: android.SortedUniquePaths(builder.zipsToMerge), + Inputs: builder.zipsToMerge, Output: outputZipFile, }) } @@ -649,7 +666,7 @@ func (s *sdk) generateInfoData(ctx android.ModuleContext, memberVariantDeps []sd func filterOutComponents(ctx android.ModuleContext, deps []sdkMemberVariantDep) []sdkMemberVariantDep { // Collate the set of components that all the modules added to the sdk provide. components := map[string]*sdkMemberVariantDep{} - for i := range deps { + for i, _ := range deps { dep := &deps[i] for _, c := range dep.exportedComponentsInfo.Components { components[c] = dep @@ -684,6 +701,81 @@ func filterOutComponents(ctx android.ModuleContext, deps []sdkMemberVariantDep) return filtered } +// addSnapshotModule adds the sdk_snapshot/module_exports_snapshot module to the builder. +func (s *sdk) addSnapshotModule(ctx android.ModuleContext, builder *snapshotBuilder, sdkVariants []*sdk, memberVariantDeps []sdkMemberVariantDep) { + bpFile := builder.bpFile + + snapshotName := ctx.ModuleName() + string(android.SdkVersionSeparator) + builder.version + var snapshotModuleType string + if s.properties.Module_exports { + snapshotModuleType = "module_exports_snapshot" + } else { + snapshotModuleType = "sdk_snapshot" + } + snapshotModule := bpFile.newModule(snapshotModuleType) + snapshotModule.AddProperty("name", snapshotName) + + // Make sure that the snapshot has the same visibility as the sdk. + visibility := android.EffectiveVisibilityRules(ctx, s).Strings() + if len(visibility) != 0 { + snapshotModule.AddProperty("visibility", visibility) + } + + addHostDeviceSupportedProperties(s.ModuleBase.DeviceSupported(), s.ModuleBase.HostSupported(), snapshotModule) + + combinedPropertiesList := s.collateSnapshotModuleInfo(ctx, sdkVariants, memberVariantDeps) + commonCombinedProperties := s.optimizeSnapshotModuleProperties(ctx, combinedPropertiesList) + + s.addSnapshotPropertiesToPropertySet(builder, snapshotModule, commonCombinedProperties) + + targetPropertySet := snapshotModule.AddPropertySet("target") + + // Create a mapping from osType to combined properties. + osTypeToCombinedProperties := map[android.OsType]*combinedSnapshotModuleProperties{} + for _, combined := range combinedPropertiesList { + osTypeToCombinedProperties[combined.sdkVariant.Os()] = combined + } + + // Iterate over the os types in a fixed order. + for _, osType := range s.getPossibleOsTypes() { + if combined, ok := osTypeToCombinedProperties[osType]; ok { + osPropertySet := targetPropertySet.AddPropertySet(osType.Name) + + s.addSnapshotPropertiesToPropertySet(builder, osPropertySet, combined) + } + } + + // If host is supported and any member is host OS dependent then disable host + // by default, so that we can enable each host OS variant explicitly. This + // avoids problems with implicitly enabled OS variants when the snapshot is + // used, which might be different from this run (e.g. different build OS). + if s.HostSupported() { + var supportedHostTargets []string + for _, memberVariantDep := range memberVariantDeps { + if memberVariantDep.memberType.IsHostOsDependent() && memberVariantDep.variant.Target().Os.Class == android.Host { + targetString := memberVariantDep.variant.Target().Os.String() + "_" + memberVariantDep.variant.Target().Arch.ArchType.String() + if !android.InList(targetString, supportedHostTargets) { + supportedHostTargets = append(supportedHostTargets, targetString) + } + } + } + if len(supportedHostTargets) > 0 { + hostPropertySet := targetPropertySet.AddPropertySet("host") + hostPropertySet.AddProperty("enabled", false) + } + // Enable the <os>_<arch> variant explicitly when we've disabled it by default on host. + for _, hostTarget := range supportedHostTargets { + propertySet := targetPropertySet.AddPropertySet(hostTarget) + propertySet.AddProperty("enabled", true) + } + } + + // Prune any empty property sets. + snapshotModule.transform(pruneEmptySetTransformer{}) + + bpFile.AddModule(snapshotModule) +} + // Check the syntax of the generated Android.bp file contents and if they are // invalid then log an error with the contents (tagged with line numbers) and the // errors that were found so that it is easy to see where the problem lies. @@ -820,34 +912,92 @@ func (s *sdk) optimizeSnapshotModuleProperties(ctx android.ModuleContext, list [ } } +func (s *sdk) addSnapshotPropertiesToPropertySet(builder *snapshotBuilder, propertySet android.BpPropertySet, combined *combinedSnapshotModuleProperties) { + staticProperties := combined.staticProperties + multilib := staticProperties.Compile_multilib + if multilib != "" && multilib != "both" { + // Compile_multilib defaults to both so only needs to be set when it's specified and not both. + propertySet.AddProperty("compile_multilib", multilib) + } + + dynamicMemberTypeListProperties := combined.dynamicProperties + for _, memberListProperty := range s.memberTypeListProperties() { + if memberListProperty.getter == nil { + continue + } + names := memberListProperty.getter(dynamicMemberTypeListProperties) + if len(names) > 0 { + propertySet.AddProperty(memberListProperty.propertyName(), builder.versionedSdkMemberNames(names, false)) + } + } +} + type propertyTag struct { name string } var _ android.BpPropertyTag = propertyTag{} -// BpPropertyTag instances to add to a property that contains references to other sdk members. +// A BpPropertyTag to add to a property that contains references to other sdk members. // -// These will ensure that the referenced modules are available, if required. +// This will cause the references to be rewritten to a versioned reference in the version +// specific instance of a snapshot module. var requiredSdkMemberReferencePropertyTag = propertyTag{"requiredSdkMemberReferencePropertyTag"} var optionalSdkMemberReferencePropertyTag = propertyTag{"optionalSdkMemberReferencePropertyTag"} -type snapshotTransformation struct { +// A BpPropertyTag that indicates the property should only be present in the versioned +// module. +// +// This will cause the property to be removed from the unversioned instance of a +// snapshot module. +var sdkVersionedOnlyPropertyTag = propertyTag{"sdkVersionedOnlyPropertyTag"} + +type unversionedToVersionedTransformation struct { identityTransformation builder *snapshotBuilder } -func (t snapshotTransformation) transformModule(module *bpModule) *bpModule { +func (t unversionedToVersionedTransformation) transformModule(module *bpModule) *bpModule { + // Use a versioned name for the module but remember the original name for the + // snapshot. + name := module.Name() + module.setProperty("name", t.builder.versionedSdkMemberName(name, true)) + 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 +} + +func (t unversionedToVersionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { + if tag == requiredSdkMemberReferencePropertyTag || tag == optionalSdkMemberReferencePropertyTag { + required := tag == requiredSdkMemberReferencePropertyTag + return t.builder.versionedSdkMemberNames(value.([]string), required), tag + } else { + return value, tag + } +} + +type unversionedTransformation struct { + identityTransformation + builder *snapshotBuilder +} + +func (t unversionedTransformation) transformModule(module *bpModule) *bpModule { // If the module is an internal member then use a unique name for it. name := module.Name() - module.setProperty("name", t.builder.snapshotSdkMemberName(name, true)) + module.setProperty("name", t.builder.unversionedSdkMemberName(name, true)) return module } -func (t snapshotTransformation) transformProperty(_ string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { +func (t unversionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { if tag == requiredSdkMemberReferencePropertyTag || tag == optionalSdkMemberReferencePropertyTag { required := tag == requiredSdkMemberReferencePropertyTag - return t.builder.snapshotSdkMemberNames(value.([]string), required), tag + return t.builder.unversionedSdkMemberNames(value.([]string), required), tag + } else if tag == sdkVersionedOnlyPropertyTag { + // The property is not allowed in the unversioned module so remove it. + return nil, nil } else { return value, tag } @@ -859,7 +1009,7 @@ type pruneEmptySetTransformer struct { var _ bpTransformer = (*pruneEmptySetTransformer)(nil) -func (t pruneEmptySetTransformer) transformPropertySetAfterContents(_ string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { +func (t pruneEmptySetTransformer) transformPropertySetAfterContents(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) { if len(propertySet.properties) == 0 { return nil, nil } else { @@ -868,12 +1018,20 @@ func (t pruneEmptySetTransformer) transformPropertySetAfterContents(_ string, pr } func generateBpContents(contents *generatedContents, bpFile *bpFile) { + generateFilteredBpContents(contents, bpFile, func(*bpModule) bool { + return true + }) +} + +func generateFilteredBpContents(contents *generatedContents, bpFile *bpFile, moduleFilter func(module *bpModule) bool) { contents.IndentedPrintf("// This is auto-generated. DO NOT EDIT.\n") for _, bpModule := range bpFile.order { - contents.IndentedPrintf("\n") - contents.IndentedPrintf("%s {\n", bpModule.moduleType) - outputPropertySet(contents, bpModule.bpPropertySet) - contents.IndentedPrintf("}\n") + if moduleFilter(bpModule) { + contents.IndentedPrintf("\n") + contents.IndentedPrintf("%s {\n", bpModule.moduleType) + outputPropertySet(contents, bpModule.bpPropertySet) + contents.IndentedPrintf("}\n") + } } } @@ -1009,10 +1167,36 @@ func (s *sdk) GetInfoContentsForTests() string { return s.builderForTests.infoContents } +func (s *sdk) GetUnversionedAndroidBpContentsForTests() string { + contents := &generatedContents{} + generateFilteredBpContents(contents, s.builderForTests.bpFile, func(module *bpModule) bool { + name := module.Name() + // Include modules that are either unversioned or have no name. + return !strings.Contains(name, "@") + }) + return contents.content.String() +} + +func (s *sdk) GetVersionedAndroidBpContentsForTests() string { + contents := &generatedContents{} + generateFilteredBpContents(contents, s.builderForTests.bpFile, func(module *bpModule) bool { + name := module.Name() + // Include modules that are either versioned or have no name. + return name == "" || strings.Contains(name, "@") + }) + return contents.content.String() +} + type snapshotBuilder struct { ctx android.ModuleContext sdk *sdk + // The version of the generated snapshot. + // + // See the documentation of SOONG_SDK_SNAPSHOT_VERSION above for details of the valid values of + // this field. + version string + snapshotDir android.OutputPath bpFile *bpFile @@ -1166,6 +1350,13 @@ func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType addHostDeviceSupportedProperties(deviceSupported, hostSupported, m) + // Disable installation in the versioned module of those modules that are ever installable. + if installable, ok := variant.(interface{ EverInstallable() bool }); ok { + if installable.EverInstallable() { + m.AddPropertyWithTag("installable", false, sdkVersionedOnlyPropertyTag) + } + } + s.prebuiltModules[name] = m s.prebuiltOrder = append(s.prebuiltOrder, m) return m @@ -1198,28 +1389,45 @@ func (s *snapshotBuilder) OptionalSdkMemberReferencePropertyTag() android.BpProp return optionalSdkMemberReferencePropertyTag } -// Get a name for sdk snapshot member. If the member is private then generate a snapshot specific -// name. As part of the processing this checks to make sure that any required members are part of -// the snapshot. -func (s *snapshotBuilder) snapshotSdkMemberName(name string, required bool) string { - if _, ok := s.allMembersByName[name]; !ok { +// Get a versioned name appropriate for the SDK snapshot version being taken. +func (s *snapshotBuilder) versionedSdkMemberName(unversionedName string, required bool) string { + if _, ok := s.allMembersByName[unversionedName]; !ok { if required { - s.ctx.ModuleErrorf("Required member reference %s is not a member of the sdk", name) + s.ctx.ModuleErrorf("Required member reference %s is not a member of the sdk", unversionedName) } - return name + return unversionedName } + return versionedSdkMemberName(s.ctx, unversionedName, s.version) +} - if s.isInternalMember(name) { - return s.ctx.ModuleName() + "_" + name +func (s *snapshotBuilder) versionedSdkMemberNames(members []string, required bool) []string { + var references []string = nil + for _, m := range members { + references = append(references, s.versionedSdkMemberName(m, required)) + } + return references +} + +// Get an internal name unique to the sdk. +func (s *snapshotBuilder) unversionedSdkMemberName(unversionedName string, required bool) string { + if _, ok := s.allMembersByName[unversionedName]; !ok { + if required { + s.ctx.ModuleErrorf("Required member reference %s is not a member of the sdk", unversionedName) + } + return unversionedName + } + + if s.isInternalMember(unversionedName) { + return s.ctx.ModuleName() + "_" + unversionedName } else { - return name + return unversionedName } } -func (s *snapshotBuilder) snapshotSdkMemberNames(members []string, required bool) []string { +func (s *snapshotBuilder) unversionedSdkMemberNames(members []string, required bool) []string { var references []string = nil for _, m := range members { - references = append(references, s.snapshotSdkMemberName(m, required)) + references = append(references, s.unversionedSdkMemberName(m, required)) } return references } @@ -1322,119 +1530,6 @@ func (m multilibUsage) String() string { } } -// TODO(187910671): BEGIN - Remove once modules do not have an APEX and default variant. -// variantCoordinate contains the coordinates used to identify a variant of an SDK member. -type variantCoordinate struct { - // osType identifies the OS target of a variant. - osType android.OsType - // archId identifies the architecture and whether it is for the native bridge. - archId archId - // image is the image variant name. - image string - // linkType is the link type name. - linkType string -} - -func getVariantCoordinate(ctx *memberContext, variant android.Module) variantCoordinate { - linkType := "" - if len(ctx.MemberType().SupportedLinkages()) > 0 { - linkType = getLinkType(variant) - } - return variantCoordinate{ - osType: variant.Target().Os, - archId: archIdFromTarget(variant.Target()), - image: variant.ImageVariation().Variation, - linkType: linkType, - } -} - -// selectApexVariantsWhereAvailable filters the input list of variants by selecting the APEX -// specific variant for a specific variantCoordinate when there is both an APEX and default variant. -// -// There is a long-standing issue where a module that is added to an APEX has both an APEX and -// default/platform variant created even when the module does not require a platform variant. As a -// result an indirect dependency onto a module via the APEX will use the APEX variant, whereas a -// direct dependency onto the module will use the default/platform variant. That would result in a -// failure while attempting to optimize the properties for a member as it would have two variants -// when only one was expected. -// -// This function mitigates that problem by detecting when there are two variants that differ only -// by apex variant, where one is the default/platform variant and one is the APEX variant. In that -// case it picks the APEX variant. It picks the APEX variant because that is the behavior that would -// be expected -func selectApexVariantsWhereAvailable(ctx *memberContext, variants []android.SdkAware) []android.SdkAware { - moduleCtx := ctx.sdkMemberContext - - // Group the variants by coordinates. - variantsByCoord := make(map[variantCoordinate][]android.SdkAware) - for _, variant := range variants { - coord := getVariantCoordinate(ctx, variant) - variantsByCoord[coord] = append(variantsByCoord[coord], variant) - } - - toDiscard := make(map[android.SdkAware]struct{}) - for coord, list := range variantsByCoord { - count := len(list) - if count == 1 { - continue - } - - variantsByApex := make(map[string]android.SdkAware) - conflictDetected := false - for _, variant := range list { - apexInfo := moduleCtx.OtherModuleProvider(variant, android.ApexInfoProvider).(android.ApexInfo) - apexVariationName := apexInfo.ApexVariationName - // If there are two variants for a specific APEX variation then there is conflict. - if _, ok := variantsByApex[apexVariationName]; ok { - conflictDetected = true - break - } - variantsByApex[apexVariationName] = variant - } - - // If there are more than 2 apex variations or one of the apex variations is not the - // default/platform variation then there is a conflict. - if len(variantsByApex) != 2 { - conflictDetected = true - } else if _, ok := variantsByApex[""]; !ok { - conflictDetected = true - } - - // If there are no conflicts then add the default/platform variation to the list to remove. - if !conflictDetected { - toDiscard[variantsByApex[""]] = struct{}{} - continue - } - - // There are duplicate variants at this coordinate and they are not the default and APEX variant - // so fail. - variantDescriptions := []string{} - for _, m := range list { - variantDescriptions = append(variantDescriptions, fmt.Sprintf(" %s", m.String())) - } - - moduleCtx.ModuleErrorf("multiple conflicting variants detected for OsType{%s}, %s, Image{%s}, Link{%s}\n%s", - coord.osType, coord.archId.String(), coord.image, coord.linkType, - strings.Join(variantDescriptions, "\n")) - } - - // If there are any variants to discard then remove them from the list of variants, while - // preserving the order. - if len(toDiscard) > 0 { - filtered := []android.SdkAware{} - for _, variant := range variants { - if _, ok := toDiscard[variant]; !ok { - filtered = append(filtered, variant) - } - } - variants = filtered - } - - return variants -} - -// TODO(187910671): END - Remove once modules do not have an APEX and default variant. - type baseInfo struct { Properties android.SdkMemberProperties } @@ -1490,14 +1585,7 @@ func newOsTypeSpecificInfo(ctx android.SdkMemberContext, osType android.OsType, if commonVariants, ok := variantsByArchId[commonArchId]; ok { if len(osTypeVariants) != 1 { - variants := []string{} - for _, m := range osTypeVariants { - variants = append(variants, fmt.Sprintf(" %s", m.String())) - } - panic(fmt.Errorf("expected to only have 1 variant of %q when arch type is common but found %d\n%s", - ctx.Name(), - len(osTypeVariants), - strings.Join(variants, "\n"))) + panic(fmt.Errorf("Expected to only have 1 variant when arch type is common but found %d", len(osTypeVariants))) } // A common arch type only has one variant and its properties should be treated @@ -1695,9 +1783,7 @@ func newArchSpecificInfo(ctx android.SdkMemberContext, archId archId, osType and // added. archInfo.Properties = variantPropertiesFactory() - // if there are multiple supported link variants, we want to nest based on linkage even if there - // is only one variant, otherwise, if there is only one variant we can populate based on the arch - if len(archVariants) == 1 && len(ctx.MemberType().SupportedLinkages()) <= 1 { + if len(archVariants) == 1 { archInfo.Properties.PopulateFromVariant(ctx, archVariants[0]) } else { // Group the variants by image type. @@ -1824,13 +1910,11 @@ func newImageVariantSpecificInfo(ctx android.SdkMemberContext, imageVariant stri // Create the properties into which the image variant specific properties will be added. imageInfo.Properties = variantPropertiesFactory() - // if there are multiple supported link variants, we want to nest even if there is only one - // variant, otherwise, if there is only one variant we can populate based on the image - if len(imageVariants) == 1 && len(ctx.MemberType().SupportedLinkages()) <= 1 { + if len(imageVariants) == 1 { imageInfo.Properties.PopulateFromVariant(ctx, imageVariants[0]) } else { // There is more than one variant for this image variant which must be differentiated by link - // type. Or there are multiple supported linkages and we need to nest based on link type. + // type. for _, linkVariant := range imageVariants { linkType := getLinkType(linkVariant) if linkType == "" { @@ -1874,22 +1958,10 @@ func (imageInfo *imageVariantSpecificInfo) addToPropertySet(ctx *memberContext, addSdkMemberPropertiesToSet(ctx, imageInfo.Properties, propertySet) - usedLinkages := make(map[string]bool, len(imageInfo.linkInfos)) for _, linkInfo := range imageInfo.linkInfos { - usedLinkages[linkInfo.linkType] = true linkInfo.addToPropertySet(ctx, propertySet) } - // If not all supported linkages had existing variants, we need to disable the unsupported variant - if len(imageInfo.linkInfos) < len(ctx.MemberType().SupportedLinkages()) { - for _, l := range ctx.MemberType().SupportedLinkages() { - if _, ok := usedLinkages[l]; !ok { - otherLinkagePropertySet := propertySet.AddPropertySet(l) - otherLinkagePropertySet.AddProperty("enabled", false) - } - } - } - // If this is for a non-core image variant then make sure that the property set does not contain // any properties as providing non-core image variant specific properties for prebuilts is not // currently supported. @@ -1972,19 +2044,12 @@ func (m *memberContext) RequiresTrait(trait android.SdkMemberTrait) bool { return m.requiredTraits.Contains(trait) } -func (m *memberContext) IsTargetBuildBeforeTiramisu() bool { - return m.builder.targetBuildRelease.EarlierThan(buildReleaseT) -} - -var _ android.SdkMemberContext = (*memberContext)(nil) - func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModule *bpModule) { memberType := member.memberType // Do not add the prefer property if the member snapshot module is a source module type. - moduleCtx := ctx.sdkMemberContext - config := moduleCtx.Config() + config := ctx.sdkMemberContext.Config() if !memberType.UsesSourceModuleTypeInSnapshot() { // Set the prefer based on the environment variable. This is a temporary work around to allow a // snapshot to be created that sets prefer: true. @@ -2009,10 +2074,9 @@ func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModu } } - variants := selectApexVariantsWhereAvailable(ctx, member.variants) - // Group the variants by os type. variantsByOsType := make(map[android.OsType][]android.Module) + variants := member.Variants() for _, variant := range variants { osType := variant.Target().Os variantsByOsType[osType] = append(variantsByOsType[osType], variant) @@ -2058,7 +2122,7 @@ func (s *sdk) createMemberSnapshot(ctx *memberContext, member *sdkMember, bpModu } // Extract properties which are common across all architectures and os types. - extractCommonProperties(moduleCtx, commonValueExtractor, commonProperties, osSpecificPropertiesContainers) + extractCommonProperties(ctx.sdkMemberContext, commonValueExtractor, commonProperties, osSpecificPropertiesContainers) // Add the common properties to the module. addSdkMemberPropertiesToSet(ctx, commonProperties, bpModule) diff --git a/ui/build/soong.go b/ui/build/soong.go index 8992b4f07..c7f22f946 100644 --- a/ui/build/soong.go +++ b/ui/build/soong.go @@ -15,9 +15,7 @@ package build import ( - "errors" "fmt" - "io/fs" "io/ioutil" "os" "path/filepath" @@ -493,14 +491,10 @@ func runSoong(ctx Context, config Config) { ninja("bootstrap", "bootstrap.ninja", targets...) + var soongBuildMetrics *soong_metrics_proto.SoongBuildMetrics if shouldCollectBuildSoongMetrics(config) { soongBuildMetrics := loadSoongBuildMetrics(ctx, config) - if soongBuildMetrics != nil { - logSoongBuildMetrics(ctx, soongBuildMetrics) - if ctx.Metrics != nil { - ctx.Metrics.SetSoongBuildMetrics(soongBuildMetrics) - } - } + logSoongBuildMetrics(ctx, soongBuildMetrics) } distGzipFile(ctx, config, config.SoongNinjaFile(), "soong") @@ -510,6 +504,9 @@ func runSoong(ctx Context, config Config) { distGzipFile(ctx, config, config.SoongMakeVarsMk(), "soong") } + if shouldCollectBuildSoongMetrics(config) && ctx.Metrics != nil { + ctx.Metrics.SetSoongBuildMetrics(soongBuildMetrics) + } if config.JsonModuleGraph() { distGzipFile(ctx, config, config.ModuleGraphFile(), "soong") } @@ -541,12 +538,8 @@ func shouldCollectBuildSoongMetrics(config Config) bool { func loadSoongBuildMetrics(ctx Context, config Config) *soong_metrics_proto.SoongBuildMetrics { soongBuildMetricsFile := filepath.Join(config.LogsDir(), "soong_build_metrics.pb") - buf, err := os.ReadFile(soongBuildMetricsFile) - if errors.Is(err, fs.ErrNotExist) { - // Soong may not have run during this invocation - ctx.Verbosef("Failed to read metrics file, %s: %s", soongBuildMetricsFile, err) - return nil - } else if err != nil { + buf, err := ioutil.ReadFile(soongBuildMetricsFile) + if err != nil { ctx.Fatalf("Failed to load %s: %s", soongBuildMetricsFile, err) } soongBuildMetrics := &soong_metrics_proto.SoongBuildMetrics{} |