Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6029182 authored by Paul Duffin's avatar Paul Duffin
Browse files

Restrict SdkMemberTypes that can be used with sdk/sdk_snapshot

By default SdkMemberTypes are only supported on module_exports module
type. Support for sdk module type has to be explicitly specified.

The java_header_libs, native_shared_libs and stubs_sources are
supported on sdk. The latter is required to provide the stubs source
for an API specified in java_header_libs as they should be kept in
sync.

Bug: 146341462
Test: m nothing
Change-Id: I19b9e60792780a797458d4a9e489506602b13144
parent 28aa5448
Loading
Loading
Loading
Loading
+37 −17
Original line number Diff line number Diff line
@@ -237,6 +237,9 @@ type SdkMemberType interface {
	// The name of the member type property on an sdk module.
	SdkPropertyName() string

	// True if the member type supports the sdk/sdk_snapshot, false otherwise.
	UsableWithSdkAndSdkSnapshot() bool

	// Add dependencies from the SDK module to all the variants the member
	// contributes to the SDK. The exact set of variants required is determined
	// by the SDK and its properties. The dependencies must be added with the
@@ -262,14 +265,20 @@ type SdkMemberType interface {
	BuildSnapshot(sdkModuleContext ModuleContext, builder SnapshotBuilder, member SdkMember)
}

// Base type for SdkMemberType implementations.
type SdkMemberTypeBase struct {
	PropertyName string
	SupportsSdk  bool
}

func (b *SdkMemberTypeBase) SdkPropertyName() string {
	return b.PropertyName
}

func (b *SdkMemberTypeBase) UsableWithSdkAndSdkSnapshot() bool {
	return b.SupportsSdk
}

// Encapsulates the information about registered SdkMemberTypes.
type SdkMemberTypesRegistry struct {
	// The list of types sorted by property name.
@@ -279,22 +288,8 @@ type SdkMemberTypesRegistry struct {
	key OnceKey
}

func (r *SdkMemberTypesRegistry) RegisteredTypes() []SdkMemberType {
	return r.list
}

func (r *SdkMemberTypesRegistry) UniqueOnceKey() OnceKey {
	// Use the pointer to the registry as the unique key.
	return NewCustomOnceKey(r)
}

// The set of registered SdkMemberTypes.
var SdkMemberTypes = &SdkMemberTypesRegistry{}

// Register an SdkMemberType object to allow them to be used in the sdk and sdk_snapshot module
// types.
func RegisterSdkMemberType(memberType SdkMemberType) {
	oldList := SdkMemberTypes.list
func (r *SdkMemberTypesRegistry) copyAndAppend(memberType SdkMemberType) *SdkMemberTypesRegistry {
	oldList := r.list

	// Copy the slice just in case this is being read while being modified, e.g. when testing.
	list := make([]SdkMemberType, 0, len(oldList)+1)
@@ -319,8 +314,33 @@ func RegisterSdkMemberType(memberType SdkMemberType) {
	key := NewOnceKey(strings.Join(properties, "|"))

	// Create a new registry so the pointer uniquely identifies the set of registered types.
	SdkMemberTypes = &SdkMemberTypesRegistry{
	return &SdkMemberTypesRegistry{
		list: list,
		key:  key,
	}
}

func (r *SdkMemberTypesRegistry) RegisteredTypes() []SdkMemberType {
	return r.list
}

func (r *SdkMemberTypesRegistry) UniqueOnceKey() OnceKey {
	// Use the pointer to the registry as the unique key.
	return NewCustomOnceKey(r)
}

// The set of registered SdkMemberTypes, one for sdk module and one for module_exports.
var ModuleExportsMemberTypes = &SdkMemberTypesRegistry{}
var SdkMemberTypes = &SdkMemberTypesRegistry{}

// Register an SdkMemberType object to allow them to be used in the sdk and sdk_snapshot module
// types.
func RegisterSdkMemberType(memberType SdkMemberType) {
	// All member types are usable with module_exports.
	ModuleExportsMemberTypes = ModuleExportsMemberTypes.copyAndAppend(memberType)

	// Only those that explicitly indicate it are usable with sdk.
	if memberType.UsableWithSdkAndSdkSnapshot() {
		SdkMemberTypes = SdkMemberTypes.copyAndAppend(memberType)
	}
}
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import (
var sharedLibrarySdkMemberType = &librarySdkMemberType{
	SdkMemberTypeBase: android.SdkMemberTypeBase{
		PropertyName: "native_shared_libs",
		SupportsSdk:  true,
	},
	prebuiltModuleType: "cc_prebuilt_library_shared",
	linkTypes:          []string{"shared"},
@@ -35,6 +36,7 @@ var sharedLibrarySdkMemberType = &librarySdkMemberType{
var staticLibrarySdkMemberType = &librarySdkMemberType{
	SdkMemberTypeBase: android.SdkMemberTypeBase{
		PropertyName: "native_static_libs",
		SupportsSdk:  true,
	},
	prebuiltModuleType: "cc_prebuilt_library_static",
	linkTypes:          []string{"static"},
+3 −0
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ func init() {
	android.RegisterSdkMemberType(&droidStubsSdkMemberType{
		SdkMemberTypeBase: android.SdkMemberTypeBase{
			PropertyName: "stubs_sources",
			// stubs_sources can be used with sdk to provide the source stubs for APIs provided by
			// the APEX.
			SupportsSdk: true,
		},
	})
}
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ func init() {
		librarySdkMemberType{
			android.SdkMemberTypeBase{
				PropertyName: "java_header_libs",
				SupportsSdk:  true,
			},
		},
	})
+14 −14
Original line number Diff line number Diff line
@@ -500,8 +500,8 @@ include/Test.h -> include/include/Test.h

func TestSnapshotWithCcStaticLibrary(t *testing.T) {
	result := testSdkWithCc(t, `
		sdk {
			name: "mysdk",
		module_exports {
			name: "myexports",
			native_static_libs: ["mynativelib"],
		}

@@ -520,12 +520,12 @@ func TestSnapshotWithCcStaticLibrary(t *testing.T) {
		}
	`)

	result.CheckSnapshot("mysdk", "android_common", "",
	result.CheckSnapshot("myexports", "android_common", "",
		checkAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.

cc_prebuilt_library_static {
    name: "mysdk_mynativelib@current",
    name: "myexports_mynativelib@current",
    sdk_member_name: "mynativelib",
    export_include_dirs: ["include/include"],
    arch: {
@@ -560,9 +560,9 @@ cc_prebuilt_library_static {
    system_shared_libs: [],
}

sdk_snapshot {
    name: "mysdk@current",
    native_static_libs: ["mysdk_mynativelib@current"],
module_exports_snapshot {
    name: "myexports@current",
    native_static_libs: ["myexports_mynativelib@current"],
}
`),
		checkAllCopyRules(`
@@ -584,8 +584,8 @@ func TestHostSnapshotWithCcStaticLibrary(t *testing.T) {
	SkipIfNotLinux(t)

	result := testSdkWithCc(t, `
		sdk {
			name: "mysdk",
		module_exports {
			name: "myexports",
			device_supported: false,
			host_supported: true,
			native_static_libs: ["mynativelib"],
@@ -608,12 +608,12 @@ func TestHostSnapshotWithCcStaticLibrary(t *testing.T) {
		}
	`)

	result.CheckSnapshot("mysdk", "linux_glibc_common", "",
	result.CheckSnapshot("myexports", "linux_glibc_common", "",
		checkAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.

cc_prebuilt_library_static {
    name: "mysdk_mynativelib@current",
    name: "myexports_mynativelib@current",
    sdk_member_name: "mynativelib",
    device_supported: false,
    host_supported: true,
@@ -652,11 +652,11 @@ cc_prebuilt_library_static {
    system_shared_libs: [],
}

sdk_snapshot {
    name: "mysdk@current",
module_exports_snapshot {
    name: "myexports@current",
    device_supported: false,
    host_supported: true,
    native_static_libs: ["mysdk_mynativelib@current"],
    native_static_libs: ["myexports_mynativelib@current"],
}
`),
		checkAllCopyRules(`
Loading