github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/cc/ndk_prebuilt.go (about) 1 // Copyright 2016 Google Inc. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package cc 16 17 import ( 18 "fmt" 19 "strings" 20 21 "android/soong/android" 22 "android/soong/cc/config" 23 ) 24 25 func init() { 26 android.RegisterModuleType("ndk_prebuilt_library", ndkPrebuiltLibraryFactory) 27 android.RegisterModuleType("ndk_prebuilt_object", ndkPrebuiltObjectFactory) 28 android.RegisterModuleType("ndk_prebuilt_static_stl", ndkPrebuiltStaticStlFactory) 29 android.RegisterModuleType("ndk_prebuilt_shared_stl", ndkPrebuiltSharedStlFactory) 30 } 31 32 // NDK prebuilt libraries. 33 // 34 // These differ from regular prebuilts in that they aren't stripped and usually aren't installed 35 // either (with the exception of the shared STLs, which are installed to the app's directory rather 36 // than to the system image). 37 38 func getNdkLibDir(ctx android.ModuleContext, toolchain config.Toolchain, version string) android.SourcePath { 39 suffix := "" 40 // Most 64-bit NDK prebuilts store libraries in "lib64", except for arm64 which is not a 41 // multilib toolchain and stores the libraries in "lib". 42 if toolchain.Is64Bit() && ctx.Arch().ArchType != android.Arm64 { 43 suffix = "64" 44 } 45 return android.PathForSource(ctx, fmt.Sprintf("prebuilts/ndk/current/platforms/android-%s/arch-%s/usr/lib%s", 46 version, toolchain.Name(), suffix)) 47 } 48 49 func ndkPrebuiltModuleToPath(ctx android.ModuleContext, toolchain config.Toolchain, 50 ext string, version string) android.Path { 51 52 // NDK prebuilts are named like: ndk_NAME.EXT.SDK_VERSION. 53 // We want to translate to just NAME.EXT 54 name := strings.Split(strings.TrimPrefix(ctx.ModuleName(), "ndk_"), ".")[0] 55 dir := getNdkLibDir(ctx, toolchain, version) 56 return dir.Join(ctx, name+ext) 57 } 58 59 type ndkPrebuiltObjectLinker struct { 60 objectLinker 61 } 62 63 func (*ndkPrebuiltObjectLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { 64 // NDK objects can't have any dependencies 65 return deps 66 } 67 68 func ndkPrebuiltObjectFactory() android.Module { 69 module := newBaseModule(android.DeviceSupported, android.MultilibBoth) 70 module.linker = &ndkPrebuiltObjectLinker{ 71 objectLinker: objectLinker{ 72 baseLinker: NewBaseLinker(), 73 }, 74 } 75 module.Properties.HideFromMake = true 76 return module.Init() 77 } 78 79 func (c *ndkPrebuiltObjectLinker) link(ctx ModuleContext, flags Flags, 80 deps PathDeps, objs Objects) android.Path { 81 // A null build step, but it sets up the output path. 82 if !strings.HasPrefix(ctx.ModuleName(), "ndk_crt") { 83 ctx.ModuleErrorf("NDK prebuilts must have an ndk_crt prefixed name") 84 } 85 86 return ndkPrebuiltModuleToPath(ctx, flags.Toolchain, objectExtension, ctx.sdkVersion()) 87 } 88 89 type ndkPrebuiltLibraryLinker struct { 90 *libraryDecorator 91 } 92 93 func (ndk *ndkPrebuiltLibraryLinker) linkerProps() []interface{} { 94 return append(ndk.libraryDecorator.linkerProps(), &ndk.Properties, &ndk.flagExporter.Properties) 95 } 96 97 func (*ndkPrebuiltLibraryLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { 98 // NDK libraries can't have any dependencies 99 return deps 100 } 101 102 func ndkPrebuiltLibraryFactory() android.Module { 103 module, library := NewLibrary(android.DeviceSupported) 104 library.BuildOnlyShared() 105 linker := &ndkPrebuiltLibraryLinker{ 106 libraryDecorator: library, 107 } 108 module.compiler = nil 109 module.linker = linker 110 module.installer = nil 111 module.stl = nil 112 module.Properties.HideFromMake = true 113 return module.Init() 114 } 115 116 func (ndk *ndkPrebuiltLibraryLinker) link(ctx ModuleContext, flags Flags, 117 deps PathDeps, objs Objects) android.Path { 118 // A null build step, but it sets up the output path. 119 ndk.exportIncludes(ctx, "-isystem") 120 121 return ndkPrebuiltModuleToPath(ctx, flags.Toolchain, flags.Toolchain.ShlibSuffix(), 122 ctx.sdkVersion()) 123 } 124 125 // The NDK STLs are slightly different from the prebuilt system libraries: 126 // * Are not specific to each platform version. 127 // * The libraries are not in a predictable location for each STL. 128 129 type ndkPrebuiltStlLinker struct { 130 ndkPrebuiltLibraryLinker 131 } 132 133 func ndkPrebuiltSharedStlFactory() android.Module { 134 module, library := NewLibrary(android.DeviceSupported) 135 library.BuildOnlyShared() 136 linker := &ndkPrebuiltStlLinker{ 137 ndkPrebuiltLibraryLinker: ndkPrebuiltLibraryLinker{ 138 libraryDecorator: library, 139 }, 140 } 141 module.compiler = nil 142 module.linker = linker 143 module.installer = nil 144 minVersionString := "minimum" 145 noStlString := "none" 146 module.Properties.Sdk_version = &minVersionString 147 module.stl.Properties.Stl = &noStlString 148 return module.Init() 149 } 150 151 func ndkPrebuiltStaticStlFactory() android.Module { 152 module, library := NewLibrary(android.DeviceSupported) 153 library.BuildOnlyStatic() 154 linker := &ndkPrebuiltStlLinker{ 155 ndkPrebuiltLibraryLinker: ndkPrebuiltLibraryLinker{ 156 libraryDecorator: library, 157 }, 158 } 159 module.compiler = nil 160 module.linker = linker 161 module.installer = nil 162 module.Properties.HideFromMake = true 163 return module.Init() 164 } 165 166 func getNdkStlLibDir(ctx android.ModuleContext, stl string) android.SourcePath { 167 libDir := "cxx-stl/llvm-libc++/libs" 168 ndkSrcRoot := "prebuilts/ndk/current/sources" 169 return android.PathForSource(ctx, ndkSrcRoot).Join(ctx, libDir, ctx.Arch().Abi[0]) 170 } 171 172 func (ndk *ndkPrebuiltStlLinker) link(ctx ModuleContext, flags Flags, 173 deps PathDeps, objs Objects) android.Path { 174 // A null build step, but it sets up the output path. 175 if !strings.HasPrefix(ctx.ModuleName(), "ndk_lib") { 176 ctx.ModuleErrorf("NDK prebuilts must have an ndk_lib prefixed name") 177 } 178 179 ndk.exportIncludes(ctx, "-isystem") 180 181 libName := strings.TrimPrefix(ctx.ModuleName(), "ndk_") 182 libExt := flags.Toolchain.ShlibSuffix() 183 if ndk.static() { 184 libExt = staticLibraryExtension 185 } 186 187 stlName := strings.TrimSuffix(libName, "_shared") 188 stlName = strings.TrimSuffix(stlName, "_static") 189 libDir := getNdkStlLibDir(ctx, stlName) 190 return libDir.Join(ctx, libName+libExt) 191 }