// // Copyright (C) 2017 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 clangprebuilts import ( "path" "strings" "github.com/google/blueprint/proptools" "android/soong/android" "android/soong/cc" "android/soong/cc/config" ) // This module is used to generate libfuzzer, libomp static libraries and // libclang_rt.* shared libraries. When LLVM_PREBUILTS_VERSION and // LLVM_RELEASE_VERSION are set, the library will generated from the given // path. func init() { android.RegisterModuleType("llvm_prebuilt_library_static", llvmPrebuiltLibraryStaticFactory) android.RegisterModuleType("libclang_rt_prebuilt_library_shared", libClangRtPrebuiltLibrarySharedFactory) android.RegisterModuleType("libclang_rt_prebuilt_library_static", libClangRtPrebuiltLibraryStaticFactory) android.RegisterModuleType("libclang_rt_llndk_library", libClangRtLLndkLibraryFactory) } func getClangPrebuiltDir(ctx android.LoadHookContext) string { return path.Join( "./", ctx.AConfig().GetenvWithDefault("LLVM_PREBUILTS_VERSION", config.ClangDefaultVersion), ) } func getClangResourceDir(ctx android.LoadHookContext) string { clangDir := getClangPrebuiltDir(ctx) releaseVersion := ctx.AConfig().GetenvWithDefault("LLVM_RELEASE_VERSION", config.ClangDefaultShortVersion) return path.Join(clangDir, "lib64", "clang", releaseVersion, "lib", "linux") } type archProps struct { Android_arm struct { Srcs []string } Android_arm64 struct { Srcs []string } Android_mips struct { Srcs []string } Android_mips64 struct { Srcs []string } Android_x86 struct { Srcs []string } Android_x86_64 struct { Srcs []string } } func llvmPrebuiltLibraryStatic(ctx android.LoadHookContext) { libDir := getClangResourceDir(ctx) name := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_") + ".a" type props struct { Export_include_dirs []string Target archProps } p := &props{} if (name == "libFuzzer.a") { headerDir := path.Join(getClangPrebuiltDir(ctx), "prebuilt_include", "llvm", "lib", "Fuzzer") 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_mips.Srcs = []string{path.Join(libDir, "mipsel", name)} p.Target.Android_mips64.Srcs = []string{path.Join(libDir, "mips64el", 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)} ctx.AppendProperties(p) } func libClangRtPrebuiltLibraryShared(ctx android.LoadHookContext) { if ctx.AConfig().IsEnvTrue("FORCE_BUILD_SANITIZER_SHARED_OBJECTS") { return } libDir := getClangResourceDir(ctx) type props struct { Srcs []string System_shared_libs []string Sanitize struct { Never *bool } Strip struct { None *bool } Pack_relocations *bool Stl *string } p := &props{} name := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_") p.Srcs = []string{path.Join(libDir, name+".so")} p.System_shared_libs = []string{} p.Sanitize.Never = proptools.BoolPtr(true) p.Strip.None = proptools.BoolPtr(true) disable := false p.Pack_relocations = &disable none := "none" p.Stl = &none ctx.AppendProperties(p) } func libClangRtPrebuiltLibraryStatic(ctx android.LoadHookContext) { libDir := getClangResourceDir(ctx) type props struct { Srcs []string } name := strings.TrimPrefix(ctx.ModuleName(), "prebuilt_") p := &props{} p.Srcs = []string{path.Join(libDir, name+".a")} ctx.AppendProperties(p) } func libClangRtLLndkLibrary(ctx android.LoadHookContext) { libDir := getClangResourceDir(ctx) type props struct { Symbol_file *string } p := &props{} symbol_file := string(path.Join(libDir, strings.TrimSuffix(ctx.ModuleName(), ".llndk") + ".map.txt")) p.Symbol_file = proptools.StringPtr(symbol_file) ctx.AppendProperties(p) } func llvmPrebuiltLibraryStaticFactory() android.Module { module, _ := cc.NewPrebuiltStaticLibrary(android.DeviceSupported) android.AddLoadHook(module, llvmPrebuiltLibraryStatic) return module.Init() } func libClangRtPrebuiltLibrarySharedFactory() android.Module { module, _ := cc.NewPrebuiltSharedLibrary(android.DeviceSupported) android.AddLoadHook(module, libClangRtPrebuiltLibraryShared) return module.Init() } func libClangRtPrebuiltLibraryStaticFactory() android.Module { module, _ := cc.NewPrebuiltStaticLibrary(android.DeviceSupported) android.AddLoadHook(module, libClangRtPrebuiltLibraryStatic) return module.Init() } func libClangRtLLndkLibraryFactory() android.Module { module := cc.NewLLndkStubLibrary() android.AddLoadHook(module, libClangRtLLndkLibrary) return module.Init() }