diff options
author | Ryan Prichard <rprichard@google.com> | 2024-04-26 01:52:16 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-26 01:52:16 +0000 |
commit | 3bd47139ac0e3593d4707ac0eeb2d45aa7411b67 (patch) | |
tree | 7d5a0856ab30d32b60fa9283934d4aa4c320bbc4 | |
parent | c87235c5e62d3b6372a4a4925f9d42b4d680c78d (diff) | |
parent | a88a49e4f9d0ad9562e3dd75a3c197689d1a63f3 (diff) | |
download | linux-x86-master.tar.gz |
-rw-r--r-- | Android.bp | 134 | ||||
-rw-r--r-- | soong/clangprebuilts.go | 319 |
2 files changed, 116 insertions, 337 deletions
diff --git a/Android.bp b/Android.bp index e621a29aa..914bdef8c 100644 --- a/Android.bp +++ b/Android.bp @@ -343,29 +343,23 @@ llvm_prebuilt_library_static { } // ----------------------------------------------------------------------------- -// Export libc++ and libclang-cpp.so. +// Export shared libraries for host tools (libLLVM, libclang, libc++). These +// are exported only when the LLVM_BUILD_HOST_TOOLS environment variable is set. // ----------------------------------------------------------------------------- +// Export LLVM_BUILD_HOST_TOOLS llvm_host_defaults { name: "llvm-build-host-tools-defaults", - target: { - // We don't have a musl build of libclang-cpp.so, so disable the host - // tools for musl. - musl: { - enabled: false, - }, - }, } // Export libclang-cpp shared library -llvm_prebuilt_library_shared { +llvm_host_prebuilt_library_shared { name: "libclang-cpp_host", - host_supported: true, - device_supported: false, sanitize: { never: true, }, - shared_libs: ["libc++"], + compile_multilib: "64", + shared_libs: ["libc++_host"], target: { darwin: { strip: { @@ -375,113 +369,27 @@ llvm_prebuilt_library_shared { }, } -cc_defaults { - name: "libc++-device-base-default", - device_supported: true, - ramdisk_available: true, - vendor_ramdisk_available: true, - recovery_available: true, - native_bridge_supported: true, - sdk_version: "minimum", -} - -cc_defaults { - name: "libc++-device-default", - defaults: ["libc++-device-base-default"], - vendor_available: true, - product_available: true, - apex_available: [ - "//apex_available:platform", - "//apex_available:anyapex", - ], -} - -// The "noexcept" variants of libc++_static and libc++demangle are intended for -// use in the dynamic linker. The linker doesn't implement ELF TLS for itself, -// so it needs to avoid using the per-thread EH globals pointer. -cc_defaults { - name: "libc++-noexcept-default", - defaults: ["libc++-device-base-default"], - host_supported: false, - apex_available: [ - "com.android.runtime", - ], - visibility: [ - "//bionic:__subpackages__", - "//frameworks/libs/native_bridge_support:__subpackages__", - ], -} - -llvm_prebuilt_library_shared { - name: "libc++", - host_supported: true, - defaults: ["libc++-device-default"], - double_loadable: true, - // TODO(b/298326651): Soong doesn't output a shared library module for - // libc.native_bridge, so when check_elf_file.py checks - // libc++.native_bridge, it's missing a --shared-lib argument for libc.so. - check_elf_files: false, -} - -llvm_prebuilt_library_shared { - name: "libc++abi_shared", - host_supported: true, - device_supported: false, -} - -llvm_prebuilt_library_static { - name: "libc++_static", - host_supported: true, - defaults: ["libc++-device-default"], - target: { - windows: { - enabled: true, - }, +// Export libc++.so for the host LLVM tools +llvm_host_prebuilt_library_shared { + name: "libc++_host", + sanitize: { + never: true, }, - stl: "none", -} - -llvm_prebuilt_library_static { - name: "libc++abi_static", - host_supported: true, - device_supported: false, + compile_multilib: "64", target: { - windows: { - enabled: true, + darwin: { + shared_libs: ["libc++abi_host"], }, }, - stl: "none", } -llvm_prebuilt_library_static { - name: "libc++demangle", - host_supported: false, - defaults: ["libc++-device-default"], - stl: "none", -} - -llvm_prebuilt_library_static { - name: "libc++_static_noexcept", - defaults: ["libc++-noexcept-default"], - stl: "none", -} - -llvm_prebuilt_library_static { - name: "libc++demangle_noexcept", - defaults: ["libc++-noexcept-default"], - stl: "none", -} - -// Stub out this library. It's not needed anymore because libc++.so and -// libc++_static.a now contain the stable std::filesystem APIs. -// TODO: Remove dependencies on this library, then remove this library. -cc_library_static { - name: "libc++fs", - srcs: [], - host_supported: true, - defaults: ["libc++-device-default"], - min_sdk_version: "apex_inherit", - stl: "none", +// Export libc++abi.so for the host LLVM tools +llvm_host_prebuilt_library_shared { + name: "libc++abi_host", + sanitize: { + never: true, + }, + compile_multilib: "64", } clang_builtin_headers { diff --git a/soong/clangprebuilts.go b/soong/clangprebuilts.go index 609c3cce3..ce95b7ea4 100644 --- a/soong/clangprebuilts.go +++ b/soong/clangprebuilts.go @@ -28,6 +28,10 @@ import ( "android/soong/genrule" ) +const libclangCppSoName = "libclang-cpp.so" +const libcxxSoName = "libc++.so" +const libcxxabiSoName = "libc++abi.so" + var ( // Files included in the llvm-tools filegroup in ../Android.bp llvmToolsFiles = []string{ @@ -44,8 +48,8 @@ var ( func init() { android.RegisterModuleType("llvm_host_defaults", llvmHostDefaultsFactory) - android.RegisterModuleType("llvm_prebuilt_library_shared", - llvmPrebuiltLibrarySharedFactory) + android.RegisterModuleType("llvm_host_prebuilt_library_shared", + llvmHostPrebuiltLibrarySharedFactory) android.RegisterModuleType("llvm_prebuilt_library_static", llvmPrebuiltLibraryStaticFactory) android.RegisterModuleType("llvm_prebuilt_build_tool", @@ -89,49 +93,66 @@ func trimVersionNumbers(ver string, retain int) string { return strings.Join(versions[0:retain], sep) } -func androidLibcxxHeaderDirs(ctx android.LoadHookContext, arch string) []string { - clangDir := getClangPrebuiltDir(ctx) - // Ensure that the target-specific __config_site header comes first so it - // overrides the default __config_site header. - return []string{ - path.Join(clangDir, "android_libc++", "platform", arch, "include", "c++", "v1"), - path.Join(clangDir, "include", "c++", "v1"), +func getHostLibrary(ctx android.LoadHookContext) string { + switch ctx.ModuleName() { + case "prebuilt_libclang-cpp_host": + return libclangCppSoName + case "prebuilt_libc++_host": + return libcxxSoName + case "prebuilt_libc++abi_host": + return libcxxabiSoName + default: + ctx.ModuleErrorf("unsupported host LLVM module: " + ctx.ModuleName()) + return "" } } -func hostLibcxxHeaderDirs(ctx android.LoadHookContext, triple string) []string { +func llvmHostPrebuiltLibraryShared(ctx android.LoadHookContext) { + moduleName := ctx.ModuleName() + enabled := ctx.Config().IsEnvTrue("LLVM_BUILD_HOST_TOOLS") + clangDir := getClangPrebuiltDir(ctx) - // Ensure that the target-specific __config_site header comes first so it - // overrides the default __config_site header. - return []string{ - path.Join(clangDir, "include", triple, "c++", "v1"), - path.Join(clangDir, "include", "c++", "v1"), + + headerDir := path.Join(clangDir, "include") + if moduleName == "prebuilt_libc++_host" { + headerDir = path.Join(headerDir, "c++", "v1") } -} -// The darwin-x86 directory typically isn't checked out on Linux machines, and -// if it's missing, then the Darwin filegroups won't be defined. -func hasDarwinClangPrebuilt(ctx android.LoadHookContext) bool { - return android.ExistentPathForSource( - ctx, "prebuilts/clang/host/darwin-x86", getClangPrebuiltDir(ctx), - "bin/clang").Valid() -} + linuxLibrary := path.Join(clangDir, "lib", getHostLibrary(ctx)) + darwinFileGroup := strings.TrimSuffix(strings.TrimPrefix( + moduleName, "prebuilt_"), "_host") + "_darwin" -type archInnerProps struct { - Enabled *bool - Export_include_dirs []string - Srcs []string - Stem *string - Sanitized struct { - None struct { - Srcs []string - } - Hwaddress struct { - Srcs []string + type props struct { + Enabled *bool + Export_include_dirs []string + Target struct { + Linux_glibc_x86_64 struct { + Srcs []string + } + Darwin_x86_64 struct { + Srcs []string + } + Windows struct { + Enabled *bool + } } + Stl *string } + + p := &props{} + p.Enabled = proptools.BoolPtr(enabled) + p.Export_include_dirs = []string{headerDir} + p.Target.Linux_glibc_x86_64.Srcs = []string{linuxLibrary} + p.Target.Darwin_x86_64.Srcs = []string{":" + darwinFileGroup} + p.Target.Windows.Enabled = proptools.BoolPtr(false) + p.Stl = proptools.StringPtr("none") + ctx.AppendProperties(p) } +type archInnerProps struct { + Srcs []string + Stem *string +} type archProps struct { Android_arm archInnerProps Android_arm64 archInnerProps @@ -147,104 +168,12 @@ type archProps struct { Linux_musl_arm archInnerProps Linux_musl_arm64 archInnerProps Darwin archInnerProps - Windows_x86 archInnerProps Windows_x86_64 archInnerProps } -func invokeOnAndroidTargets(p *archProps, fn func(ap *archInnerProps, arch string)) { - fn(&p.Android_arm, "arm") - fn(&p.Android_arm64, "aarch64") - fn(&p.Android_riscv64, "riscv64") - fn(&p.Android_x86, "i386") - fn(&p.Android_x86_64, "x86_64") - fn(&p.Linux_bionic_arm64, "aarch64") - fn(&p.Linux_bionic_x86_64, "x86_64") -} - -func setAndroidLibcxxSrcProps(ctx android.LoadHookContext, ap *archInnerProps, kind string, - arch string, libName string) { - - clangDir := getClangPrebuiltDir(ctx) - setSrcsField := func(field *[]string, subdir string) { - *field = []string{path.Join(clangDir, "android_libc++", subdir, arch, "lib", libName)} - } - - if arch == "aarch64" { - setSrcsField(&ap.Sanitized.None.Srcs, kind) - setSrcsField(&ap.Sanitized.Hwaddress.Srcs, kind+"_hwasan") - } else { - setSrcsField(&ap.Srcs, kind) - } -} - -func llvmPrebuiltLibraryShared(ctx android.LoadHookContext) { - moduleName := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_") - - clangDir := getClangPrebuiltDir(ctx) - - type props struct { - Export_include_dirs []string - Target archProps - Stl *string - } - - p := &props{} - - if moduleName == "libc++" { - invokeOnAndroidTargets(&p.Target, func(ap *archInnerProps, arch string) { - setAndroidLibcxxSrcProps(ctx, ap, "platform", arch, "libc++.so") - ap.Export_include_dirs = androidLibcxxHeaderDirs(ctx, arch) - }) - setHostProps := func(ap *archInnerProps, triple string) { - ap.Srcs = []string{path.Join(clangDir, "lib", triple, "libc++.so")} - ap.Export_include_dirs = hostLibcxxHeaderDirs(ctx, triple) - } - setHostProps(&p.Target.Glibc_x86, "i386-unknown-linux-gnu") - setHostProps(&p.Target.Glibc_x86_64, "x86_64-unknown-linux-gnu") - setHostProps(&p.Target.Linux_musl_arm, "arm-unknown-linux-musleabihf") - setHostProps(&p.Target.Linux_musl_arm64, "aarch64-unknown-linux-musl") - setHostProps(&p.Target.Linux_musl_x86, "i686-unknown-linux-musl") - setHostProps(&p.Target.Linux_musl_x86_64, "x86_64-unknown-linux-musl") - if hasDarwinClangPrebuilt(ctx) { - p.Target.Darwin.Srcs = []string{":libc++_darwin"} - // TODO: At the moment, the Darwin __config_site header is the same as the - // Linux __config_site headers, but for correctness we ought to use the - // Darwin header somehow. - p.Target.Darwin.Export_include_dirs = []string{path.Join(clangDir, "include", "c++", "v1")} - } - } else if moduleName == "libc++abi_shared" { - // TODO: It's not clear that libc++abi_shared is needed, because the libc++ - // shared library has libc++abi linked into it. The Darwin libc++.1.dylib - // previously depended on libc++abi.1.dylib, but when it was renamed to - // libc++.dylib, it also lost its runtime dependency on the ABI dylib. - libcxxabiSoName := "libc++abi.so" - p.Target.Glibc_x86.Srcs = []string{path.Join(clangDir, "lib", "i386-unknown-linux-gnu", libcxxabiSoName)} - p.Target.Glibc_x86_64.Srcs = []string{path.Join(clangDir, "lib", "x86_64-unknown-linux-gnu", libcxxabiSoName)} - p.Target.Linux_musl_x86.Srcs = []string{path.Join(clangDir, "lib", "i686-unknown-linux-musl", libcxxabiSoName)} - p.Target.Linux_musl_x86_64.Srcs = []string{path.Join(clangDir, "lib", "x86_64-unknown-linux-musl", libcxxabiSoName)} - p.Target.Linux_musl_arm.Srcs = []string{path.Join(clangDir, "lib", "arm-unknown-linux-musleabihf", libcxxabiSoName)} - p.Target.Linux_musl_arm64.Srcs = []string{path.Join(clangDir, "lib", "aarch64-unknown-linux-musl", libcxxabiSoName)} - if hasDarwinClangPrebuilt(ctx) { - p.Target.Darwin.Srcs = []string{":libc++abi_shared_darwin"} - } - } else if moduleName == "libclang-cpp_host" { - p.Export_include_dirs = []string{path.Join(clangDir, "include")} - p.Target.Glibc_x86_64.Srcs = []string{path.Join(clangDir, "lib", "libclang-cpp.so")} - if hasDarwinClangPrebuilt(ctx) { - p.Target.Darwin.Srcs = []string{":libclang-cpp_host_darwin"} - } - } else { - ctx.ModuleErrorf("unsupported LLVM prebuilt shared library: " + moduleName) - } - - p.Stl = proptools.StringPtr("none") - ctx.AppendProperties(p) -} - func llvmPrebuiltLibraryStatic(ctx android.LoadHookContext) { - clangDir := getClangPrebuiltDir(ctx) libDir := getClangResourceDir(ctx) - moduleName := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_") + name := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_") + ".a" type props struct { Export_include_dirs []string @@ -253,82 +182,29 @@ func llvmPrebuiltLibraryStatic(ctx android.LoadHookContext) { p := &props{} - if moduleName == "libc++_static" { - invokeOnAndroidTargets(&p.Target, func(ap *archInnerProps, arch string) { - setAndroidLibcxxSrcProps(ctx, ap, "platform", arch, "libc++_static.a") - ap.Export_include_dirs = androidLibcxxHeaderDirs(ctx, arch) - }) - setHostProps := func(ap *archInnerProps, triple string) { - ap.Srcs = []string{path.Join(clangDir, "lib", triple, "libc++.a")} - ap.Export_include_dirs = hostLibcxxHeaderDirs(ctx, triple) - } - setHostProps(&p.Target.Glibc_x86, "i386-unknown-linux-gnu") - setHostProps(&p.Target.Glibc_x86_64, "x86_64-unknown-linux-gnu") - setHostProps(&p.Target.Linux_musl_arm, "arm-unknown-linux-musleabihf") - setHostProps(&p.Target.Linux_musl_arm64, "aarch64-unknown-linux-musl") - setHostProps(&p.Target.Linux_musl_x86, "i686-unknown-linux-musl") - setHostProps(&p.Target.Linux_musl_x86_64, "x86_64-unknown-linux-musl") - setHostProps(&p.Target.Windows_x86, "i686-w64-windows-gnu") - setHostProps(&p.Target.Windows_x86_64, "x86_64-w64-windows-gnu") - if hasDarwinClangPrebuilt(ctx) { - p.Target.Darwin.Srcs = []string{":libc++_static_darwin"} - // TODO: At the moment, the Darwin __config_site header is the same as the - // Linux __config_site headers, but for correctness we ought to use the - // Darwin header somehow. - p.Target.Darwin.Export_include_dirs = []string{path.Join(clangDir, "include", "c++", "v1")} - } - } else if moduleName == "libc++_static_noexcept" { - invokeOnAndroidTargets(&p.Target, func(ap *archInnerProps, arch string) { - setAndroidLibcxxSrcProps(ctx, ap, "platform_noexcept", arch, "libc++_static_noexcept.a") - ap.Export_include_dirs = androidLibcxxHeaderDirs(ctx, arch) - }) - } else if moduleName == "libc++demangle" { - invokeOnAndroidTargets(&p.Target, func(ap *archInnerProps, arch string) { - setAndroidLibcxxSrcProps(ctx, ap, "platform", arch, "libc++demangle.a") - }) - } else if moduleName == "libc++demangle_noexcept" { - invokeOnAndroidTargets(&p.Target, func(ap *archInnerProps, arch string) { - setAndroidLibcxxSrcProps(ctx, ap, "platform_noexcept", arch, "libc++demangle_noexcept.a") - }) - } else if moduleName == "libc++abi_static" { - // TODO: It's not clear that libc++abi_static is actually needed, because - // its object files are in libc++_static anyway. - name := "libc++abi.a" - p.Target.Glibc_x86.Srcs = []string{path.Join(clangDir, "lib", "i386-unknown-linux-gnu", name)} - p.Target.Glibc_x86_64.Srcs = []string{path.Join(clangDir, "lib", "x86_64-unknown-linux-gnu", name)} - p.Target.Windows_x86.Srcs = []string{path.Join(clangDir, "lib", "i686-w64-windows-gnu", name)} - p.Target.Windows_x86_64.Srcs = []string{path.Join(clangDir, "lib", "x86_64-w64-windows-gnu", name)} - if hasDarwinClangPrebuilt(ctx) { - p.Target.Darwin.Srcs = []string{":libc++abi_static_darwin"} - } - } else if moduleName == "libsimpleperf_readelf" { - name := "libsimpleperf_readelf.a" - headerDir := path.Join(clangDir, "include") + if name == "libFuzzer.a" { + headerDir := path.Join(getClangPrebuiltDir(ctx), "prebuilt_include", "llvm", "lib", "Fuzzer") p.Export_include_dirs = []string{headerDir} - invokeOnAndroidTargets(&p.Target, func(ap *archInnerProps, arch string) { - ap.Srcs = []string{path.Join(libDir, arch, name)} - }) - p.Target.Glibc_x86_64.Srcs = []string{path.Join(clangDir, "lib/x86_64-unknown-linux-gnu", name)} + } else if name == "libsimpleperf_readelf.a" { + headerDir := path.Join(getClangPrebuiltDir(ctx), "include") + p.Export_include_dirs = []string{headerDir} + } + + p.Target.Android_arm.Srcs = []string{path.Join(libDir, "arm", name)} + p.Target.Android_arm64.Srcs = []string{path.Join(libDir, "aarch64", name)} + p.Target.Android_riscv64.Srcs = []string{path.Join(libDir, "riscv64", name)} + p.Target.Android_x86.Srcs = []string{path.Join(libDir, "i386", name)} + p.Target.Android_x86_64.Srcs = []string{path.Join(libDir, "x86_64", name)} + p.Target.Linux_bionic_arm64.Srcs = []string{path.Join(libDir, "aarch64", name)} + p.Target.Linux_bionic_x86_64.Srcs = []string{path.Join(libDir, "x86_64", name)} + + if name == "libsimpleperf_readelf.a" { + p.Target.Glibc_x86_64.Srcs = []string{path.Join(getClangPrebuiltDir(ctx), "lib/x86_64-unknown-linux-gnu", name)} + p.Target.Windows_x86_64.Srcs = []string{path.Join(getClangPrebuiltDir(ctx), "lib/x86_64-w64-windows-gnu", name)} + p.Target.Darwin.Srcs = []string{":libsimpleperf_readelf_darwin"} p.Target.Linux_musl_x86_64.Srcs = []string{path.Join(libDir, "x86_64-unknown-linux-musl/lib", name)} p.Target.Linux_musl_arm64.Srcs = []string{path.Join(libDir, "aarch64-unknown-linux-musl/lib", name)} - p.Target.Windows_x86_64.Srcs = []string{path.Join(clangDir, "lib/x86_64-w64-windows-gnu", name)} - if hasDarwinClangPrebuilt(ctx) { - p.Target.Darwin.Srcs = []string{":libsimpleperf_readelf_darwin"} - } } else { - // Default behavior for a runtime library (like libunwind or libomp). Find - // the library from in the Clang resource directory. - name := moduleName + ".a" - if name == "libFuzzer.a" { - // TODO: Should these headers be removed? They declare internal symbols - // that aren't exported from libFuzzer.a(fuzzer.o). See b/303175229, - // aosp/2898988. Should libFuzzer be replaced by libclang_rt.fuzzer? - headerDir := path.Join(clangDir, "prebuilt_include", "llvm", "lib", "Fuzzer") - p.Export_include_dirs = []string{headerDir} - } - invokeOnAndroidTargets(&p.Target, func(ap *archInnerProps, arch string) { - ap.Srcs = []string{path.Join(libDir, arch, name)} - }) p.Target.Linux_musl_x86.Srcs = []string{path.Join(libDir, "i686-unknown-linux-musl/lib", name)} p.Target.Linux_musl_x86_64.Srcs = []string{path.Join(libDir, "x86_64-unknown-linux-musl/lib", name)} p.Target.Linux_musl_arm.Srcs = []string{path.Join(libDir, "arm-unknown-linux-musleabihf/lib", name)} @@ -529,33 +405,24 @@ func libClangRtPrebuiltObject(ctx android.LoadHookContext) { func llvmDarwinFileGroup(ctx android.LoadHookContext) { clangDir := getClangPrebuiltDir(ctx) - moduleName := ctx.ModuleName() - var libName string - - switch moduleName { - case "libclang-cpp_host_darwin": - libName = "libclang-cpp.dylib" - case "libc++_darwin": - libName = "libc++.dylib" - case "libc++abi_shared_darwin": - libName = "libc++abi.dylib" - case "libc++_static_darwin": - libName = "libc++.a" - case "libc++abi_static_darwin": - libName = "libc++abi.a" - case "libsimpleperf_readelf_darwin": - libName = "libsimpleperf_readelf.a" - default: - ctx.ModuleErrorf("unsupported host LLVM file group: " + moduleName) + libName := strings.TrimSuffix(ctx.ModuleName(), "_darwin") + if libName == "libsimpleperf_readelf" { + libName += ".a" + } else { + libName += ".dylib" } lib := path.Join(clangDir, "lib", libName) type props struct { Srcs []string } - p := &props{} - p.Srcs = []string{lib} - ctx.AppendProperties(p) + + libPath := android.ExistentPathForSource(ctx, ctx.ModuleDir(), lib) + if libPath.Valid() { + p := &props{} + p.Srcs = []string{lib} + ctx.AppendProperties(p) + } } func llvmPrebuiltLibraryStaticFactory() android.Module { @@ -570,9 +437,9 @@ func llvmPrebuiltBuildToolFactory() android.Module { return module } -func llvmPrebuiltLibrarySharedFactory() android.Module { - module, _ := cc.NewPrebuiltSharedLibrary(android.HostAndDeviceSupported) - android.AddLoadHook(module, llvmPrebuiltLibraryShared) +func llvmHostPrebuiltLibrarySharedFactory() android.Module { + module, _ := cc.NewPrebuiltSharedLibrary(android.HostSupported) + android.AddLoadHook(module, llvmHostPrebuiltLibraryShared) return module.Init() } @@ -611,13 +478,17 @@ func llvmDarwinFileGroupFactory() android.Module { func llvmHostDefaults(ctx android.LoadHookContext) { type props struct { - Enabled *bool + Enabled *bool + Shared_libs []string + Stl *string } p := &props{} if !ctx.Config().IsEnvTrue("LLVM_BUILD_HOST_TOOLS") { p.Enabled = proptools.BoolPtr(false) } + p.Shared_libs = []string{"libc++_host"} + p.Stl = proptools.StringPtr("none") ctx.AppendProperties(p) } |