diff --git a/cc/cc_test.go b/cc/cc_test.go index d82619a04..5acafbe2a 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -554,6 +554,13 @@ func TestVndk(t *testing.T) { } } + cc_library { + name: "libclang_rt.hwasan-llndk", + llndk: { + symbol_file: "libclang_rt.hwasan.map.txt", + } + } + cc_library_headers { name: "libllndk_headers", llndk: { @@ -661,7 +668,7 @@ func TestVndk(t *testing.T) { "VNDK-product: libvndk_product.so", "VNDK-product: libvndk_sp_product_private-x.so", }) - checkVndkLibrariesOutput(t, ctx, "llndk.libraries.txt", []string{"libc.so", "libdl.so", "libft2.so", "libllndk.so", "libm.so"}) + checkVndkLibrariesOutput(t, ctx, "llndk.libraries.txt", []string{"libc.so", "libclang_rt.hwasan-llndk.so", "libdl.so", "libft2.so", "libllndk.so", "libm.so"}) checkVndkLibrariesOutput(t, ctx, "vndkcore.libraries.txt", []string{"libvndk-private.so", "libvndk.so", "libvndk_product.so"}) checkVndkLibrariesOutput(t, ctx, "vndksp.libraries.txt", []string{"libc++.so", "libvndk_sp-x.so", "libvndk_sp_private-x.so", "libvndk_sp_product_private-x.so"}) checkVndkLibrariesOutput(t, ctx, "vndkprivate.libraries.txt", []string{"libft2.so", "libvndk-private.so", "libvndk_sp_private-x.so", "libvndk_sp_product_private-x.so"}) diff --git a/cc/vndk.go b/cc/vndk.go index 0254edc66..6a56c34db 100644 --- a/cc/vndk.go +++ b/cc/vndk.go @@ -234,7 +234,6 @@ type moduleListerFunc func(ctx android.SingletonContext) (moduleNames, fileNames var ( llndkLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsLLNDK && !m.Header() }) - llndkLibrariesWithoutHWASAN = vndkModuleListRemover(llndkLibraries, "libclang_rt.hwasan-") vndkSPLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKSP }) vndkCoreLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKCore }) vndkPrivateLibraries = vndkModuleLister(func(m *Module) bool { return m.VendorProperties.IsVNDKPrivate }) @@ -419,10 +418,6 @@ func init() { } func RegisterVndkLibraryTxtTypes(ctx android.RegistrationContext) { - // Make uses LLNDK_LIBRARIES to determine which libraries to install. - // HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN. - // Therefore, by removing the library here, we cause it to only be installed if libc - // depends on it. ctx.RegisterSingletonModuleType("llndk_libraries_txt", llndkLibrariesTxtFactory) ctx.RegisterSingletonModuleType("vndksp_libraries_txt", vndkSPLibrariesTxtFactory) ctx.RegisterSingletonModuleType("vndkcore_libraries_txt", vndkCoreLibrariesTxtFactory) @@ -434,8 +429,9 @@ func RegisterVndkLibraryTxtTypes(ctx android.RegistrationContext) { type vndkLibrariesTxt struct { android.SingletonModuleBase - lister moduleListerFunc - makeVarName string + lister moduleListerFunc + makeVarName string + filterOutFromMakeVar string properties VndkLibrariesTxtProperties @@ -454,8 +450,12 @@ var _ android.OutputFileProducer = &vndkLibrariesTxt{} // llndk_libraries_txt is a singleton module whose content is a list of LLNDK libraries // generated by Soong but can be referenced by other modules. // For example, apex_vndk can depend on these files as prebuilt. +// Make uses LLNDK_LIBRARIES to determine which libraries to install. +// HWASAN is only part of the LL-NDK in builds in which libc depends on HWASAN. +// Therefore, by removing the library here, we cause it to only be installed if libc +// depends on it. func llndkLibrariesTxtFactory() android.SingletonModule { - return newVndkLibrariesTxt(llndkLibrariesWithoutHWASAN, "LLNDK_LIBRARIES") + return newVndkLibrariesWithMakeVarFilter(llndkLibraries, "LLNDK_LIBRARIES", "libclang_rt.hwasan-") } // vndksp_libraries_txt is a singleton module whose content is a list of VNDKSP libraries @@ -493,16 +493,21 @@ func vndkUsingCoreVariantLibrariesTxtFactory() android.SingletonModule { return newVndkLibrariesTxt(vndkUsingCoreVariantLibraries, "VNDK_USING_CORE_VARIANT_LIBRARIES") } -func newVndkLibrariesTxt(lister moduleListerFunc, makeVarName string) android.SingletonModule { +func newVndkLibrariesWithMakeVarFilter(lister moduleListerFunc, makeVarName string, filter string) android.SingletonModule { m := &vndkLibrariesTxt{ - lister: lister, - makeVarName: makeVarName, + lister: lister, + makeVarName: makeVarName, + filterOutFromMakeVar: filter, } m.AddProperties(&m.properties) android.InitAndroidModule(m) return m } +func newVndkLibrariesTxt(lister moduleListerFunc, makeVarName string) android.SingletonModule { + return newVndkLibrariesWithMakeVarFilter(lister, makeVarName, "") +} + func insertVndkVersion(filename string, vndkVersion string) string { if index := strings.LastIndex(filename, "."); index != -1 { return filename[:index] + "." + vndkVersion + filename[index:] @@ -542,8 +547,21 @@ func (txt *vndkLibrariesTxt) AndroidMkEntries() []android.AndroidMkEntries { } func (txt *vndkLibrariesTxt) MakeVars(ctx android.MakeVarsContext) { - ctx.Strict(txt.makeVarName, strings.Join(txt.moduleNames, " ")) - + filter := func(modules []string, prefix string) []string { + if prefix == "" { + return modules + } + var result []string + for _, module := range modules { + if strings.HasPrefix(module, prefix) { + continue + } else { + result = append(result, module) + } + } + return result + } + ctx.Strict(txt.makeVarName, strings.Join(filter(txt.moduleNames, txt.filterOutFromMakeVar), " ")) } // PrebuiltEtcModule interface