diff --git a/cc/cc.go b/cc/cc.go index 14e71226e..470ea445b 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -417,6 +417,9 @@ type Module struct { hod android.HostOrDeviceSupported multilib android.Multilib + // Allowable SdkMemberTypes of this module type. + sdkMemberTypes []android.SdkMemberType + // delegates, initialize before calling Init features []feature compiler compiler diff --git a/cc/library.go b/cc/library.go index 84f1831a0..ae95bc5c6 100644 --- a/cc/library.go +++ b/cc/library.go @@ -192,6 +192,11 @@ func RegisterLibraryBuildComponents(ctx android.RegistrationContext) { // host. func LibraryFactory() android.Module { module, _ := NewLibrary(android.HostAndDeviceSupported) + // Can be used as both a static and a shared library. + module.sdkMemberTypes = []android.SdkMemberType{ + sharedLibrarySdkMemberType, + staticLibrarySdkMemberType, + } return module.Init() } @@ -199,6 +204,7 @@ func LibraryFactory() android.Module { func LibraryStaticFactory() android.Module { module, library := NewLibrary(android.HostAndDeviceSupported) library.BuildOnlyStatic() + module.sdkMemberTypes = []android.SdkMemberType{staticLibrarySdkMemberType} return module.Init() } @@ -206,6 +212,7 @@ func LibraryStaticFactory() android.Module { func LibrarySharedFactory() android.Module { module, library := NewLibrary(android.HostAndDeviceSupported) library.BuildOnlyShared() + module.sdkMemberTypes = []android.SdkMemberType{sharedLibrarySdkMemberType} return module.Init() } @@ -214,6 +221,7 @@ func LibrarySharedFactory() android.Module { func LibraryHostStaticFactory() android.Module { module, library := NewLibrary(android.HostSupported) library.BuildOnlyStatic() + module.sdkMemberTypes = []android.SdkMemberType{staticLibrarySdkMemberType} return module.Init() } @@ -221,6 +229,7 @@ func LibraryHostStaticFactory() android.Module { func LibraryHostSharedFactory() android.Module { module, library := NewLibrary(android.HostSupported) library.BuildOnlyShared() + module.sdkMemberTypes = []android.SdkMemberType{sharedLibrarySdkMemberType} return module.Init() } diff --git a/cc/library_sdk_member.go b/cc/library_sdk_member.go index 931907068..2c18e68ba 100644 --- a/cc/library_sdk_member.go +++ b/cc/library_sdk_member.go @@ -24,23 +24,26 @@ import ( // This file contains support for using cc library modules within an sdk. +var sharedLibrarySdkMemberType = &librarySdkMemberType{ + SdkMemberTypeBase: android.SdkMemberTypeBase{ + PropertyName: "native_shared_libs", + }, + prebuiltModuleType: "cc_prebuilt_library_shared", + linkTypes: []string{"shared"}, +} + +var staticLibrarySdkMemberType = &librarySdkMemberType{ + SdkMemberTypeBase: android.SdkMemberTypeBase{ + PropertyName: "native_static_libs", + }, + prebuiltModuleType: "cc_prebuilt_library_static", + linkTypes: []string{"static"}, +} + func init() { // Register sdk member types. - android.RegisterSdkMemberType(&librarySdkMemberType{ - SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "native_shared_libs", - }, - prebuiltModuleType: "cc_prebuilt_library_shared", - linkTypes: []string{"shared"}, - }) - - android.RegisterSdkMemberType(&librarySdkMemberType{ - SdkMemberTypeBase: android.SdkMemberTypeBase{ - PropertyName: "native_static_libs", - }, - prebuiltModuleType: "cc_prebuilt_library_static", - linkTypes: []string{"static"}, - }) + android.RegisterSdkMemberType(sharedLibrarySdkMemberType) + android.RegisterSdkMemberType(staticLibrarySdkMemberType) } type librarySdkMemberType struct { @@ -72,8 +75,16 @@ func (mt *librarySdkMemberType) AddDependencies(mctx android.BottomUpMutatorCont } func (mt *librarySdkMemberType) IsInstance(module android.Module) bool { - _, ok := module.(*Module) - return ok + // Check the module to see if it can be used with this module type. + if m, ok := module.(*Module); ok { + for _, allowableMemberType := range m.sdkMemberTypes { + if allowableMemberType == mt { + return true + } + } + } + + return false } // copy exported header files and stub *.so files diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 08751e444..f477445fd 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -73,6 +73,10 @@ func TestBasicSdkWithCc(t *testing.T) { native_shared_libs: ["sdkmember"], } + cc_library_shared { + name: "sdkmember", + } + sdk_snapshot { name: "mysdk@1", native_shared_libs: ["sdkmember_mysdk_1"], @@ -143,6 +147,66 @@ func TestBasicSdkWithCc(t *testing.T) { ensureListContains(t, pathsToStrings(cpplibForMyApex2.Rule("ld").Implicits), sdkMemberV2.String()) } +// Make sure the sdk can use host specific cc libraries static/shared and both. +func TestHostSdkWithCc(t *testing.T) { + testSdkWithCc(t, ` + sdk { + name: "mysdk", + device_supported: false, + host_supported: true, + native_shared_libs: ["sdkshared"], + native_static_libs: ["sdkstatic"], + } + + cc_library_host_shared { + name: "sdkshared", + system_shared_libs: [], + stl: "none", + } + + cc_library_host_static { + name: "sdkstatic", + system_shared_libs: [], + stl: "none", + } + `) +} + +// Make sure the sdk can use cc libraries static/shared and both. +func TestSdkWithCc(t *testing.T) { + testSdkWithCc(t, ` + sdk { + name: "mysdk", + native_shared_libs: ["sdkshared", "sdkboth1"], + native_static_libs: ["sdkstatic", "sdkboth2"], + } + + cc_library_shared { + name: "sdkshared", + system_shared_libs: [], + stl: "none", + } + + cc_library_static { + name: "sdkstatic", + system_shared_libs: [], + stl: "none", + } + + cc_library { + name: "sdkboth1", + system_shared_libs: [], + stl: "none", + } + + cc_library { + name: "sdkboth2", + system_shared_libs: [], + stl: "none", + } + `) +} + func TestSnapshotWithCcDuplicateHeaders(t *testing.T) { result := testSdkWithCc(t, ` sdk {