1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "strings" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workervar ( 24*333d2b36SAndroid Build Coastguard Worker vndkSuffix = ".vndk." 25*333d2b36SAndroid Build Coastguard Worker binder32Suffix = ".binder32" 26*333d2b36SAndroid Build Coastguard Worker) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker// Creates vndk prebuilts that include the VNDK version. 29*333d2b36SAndroid Build Coastguard Worker// 30*333d2b36SAndroid Build Coastguard Worker// Example: 31*333d2b36SAndroid Build Coastguard Worker// 32*333d2b36SAndroid Build Coastguard Worker// vndk_prebuilt_shared { 33*333d2b36SAndroid Build Coastguard Worker// name: "libfoo", 34*333d2b36SAndroid Build Coastguard Worker// version: "27", 35*333d2b36SAndroid Build Coastguard Worker// target_arch: "arm64", 36*333d2b36SAndroid Build Coastguard Worker// vendor_available: true, 37*333d2b36SAndroid Build Coastguard Worker// product_available: true, 38*333d2b36SAndroid Build Coastguard Worker// vndk: { 39*333d2b36SAndroid Build Coastguard Worker// enabled: true, 40*333d2b36SAndroid Build Coastguard Worker// }, 41*333d2b36SAndroid Build Coastguard Worker// export_include_dirs: ["include/external/libfoo/vndk_include"], 42*333d2b36SAndroid Build Coastguard Worker// arch: { 43*333d2b36SAndroid Build Coastguard Worker// arm64: { 44*333d2b36SAndroid Build Coastguard Worker// srcs: ["arm/lib64/libfoo.so"], 45*333d2b36SAndroid Build Coastguard Worker// }, 46*333d2b36SAndroid Build Coastguard Worker// arm: { 47*333d2b36SAndroid Build Coastguard Worker// srcs: ["arm/lib/libfoo.so"], 48*333d2b36SAndroid Build Coastguard Worker// }, 49*333d2b36SAndroid Build Coastguard Worker// }, 50*333d2b36SAndroid Build Coastguard Worker// } 51*333d2b36SAndroid Build Coastguard Workertype vndkPrebuiltProperties struct { 52*333d2b36SAndroid Build Coastguard Worker VndkProperties 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Worker // VNDK snapshot version. 55*333d2b36SAndroid Build Coastguard Worker Version *string 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker // Target arch name of the snapshot (e.g. 'arm64' for variant 'aosp_arm64') 58*333d2b36SAndroid Build Coastguard Worker Target_arch *string 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Worker // If the prebuilt snapshot lib is built with 32 bit binder, this must be set to true. 61*333d2b36SAndroid Build Coastguard Worker // The lib with 64 bit binder does not need to set this property. 62*333d2b36SAndroid Build Coastguard Worker Binder32bit *bool 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker // Prebuilt files for each arch. 65*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"arch_variant"` 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker // list of flags that will be used for any module that links against this module. 68*333d2b36SAndroid Build Coastguard Worker Export_flags []string `android:"arch_variant"` 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker // Check the prebuilt ELF files (e.g. DT_SONAME, DT_NEEDED, resolution of undefined symbols, 71*333d2b36SAndroid Build Coastguard Worker // etc). 72*333d2b36SAndroid Build Coastguard Worker Check_elf_files *bool 73*333d2b36SAndroid Build Coastguard Worker} 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Workertype vndkPrebuiltLibraryDecorator struct { 76*333d2b36SAndroid Build Coastguard Worker *libraryDecorator 77*333d2b36SAndroid Build Coastguard Worker properties vndkPrebuiltProperties 78*333d2b36SAndroid Build Coastguard Worker androidMkSuffix string 79*333d2b36SAndroid Build Coastguard Worker} 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) Name(name string) string { 82*333d2b36SAndroid Build Coastguard Worker return name + p.NameSuffix() 83*333d2b36SAndroid Build Coastguard Worker} 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) NameSuffix() string { 86*333d2b36SAndroid Build Coastguard Worker suffix := p.Version() 87*333d2b36SAndroid Build Coastguard Worker if p.arch() != "" { 88*333d2b36SAndroid Build Coastguard Worker suffix += "." + p.arch() 89*333d2b36SAndroid Build Coastguard Worker } 90*333d2b36SAndroid Build Coastguard Worker if Bool(p.properties.Binder32bit) { 91*333d2b36SAndroid Build Coastguard Worker suffix += binder32Suffix 92*333d2b36SAndroid Build Coastguard Worker } 93*333d2b36SAndroid Build Coastguard Worker return vndkSuffix + suffix 94*333d2b36SAndroid Build Coastguard Worker} 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) Version() string { 97*333d2b36SAndroid Build Coastguard Worker return String(p.properties.Version) 98*333d2b36SAndroid Build Coastguard Worker} 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) arch() string { 101*333d2b36SAndroid Build Coastguard Worker return String(p.properties.Target_arch) 102*333d2b36SAndroid Build Coastguard Worker} 103*333d2b36SAndroid Build Coastguard Worker 104*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) binderBit() string { 105*333d2b36SAndroid Build Coastguard Worker if Bool(p.properties.Binder32bit) { 106*333d2b36SAndroid Build Coastguard Worker return "32" 107*333d2b36SAndroid Build Coastguard Worker } 108*333d2b36SAndroid Build Coastguard Worker return "64" 109*333d2b36SAndroid Build Coastguard Worker} 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) SnapshotAndroidMkSuffix() string { 112*333d2b36SAndroid Build Coastguard Worker return ".vendor" 113*333d2b36SAndroid Build Coastguard Worker} 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags { 116*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(), p.NameSuffix()) 117*333d2b36SAndroid Build Coastguard Worker return p.libraryDecorator.linkerFlags(ctx, flags) 118*333d2b36SAndroid Build Coastguard Worker} 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) singleSourcePath(ctx ModuleContext) android.Path { 121*333d2b36SAndroid Build Coastguard Worker if len(p.properties.Srcs) == 0 { 122*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("srcs", "missing prebuilt source file") 123*333d2b36SAndroid Build Coastguard Worker return nil 124*333d2b36SAndroid Build Coastguard Worker } 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker if len(p.properties.Srcs) > 1 { 127*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("srcs", "multiple prebuilt source files") 128*333d2b36SAndroid Build Coastguard Worker return nil 129*333d2b36SAndroid Build Coastguard Worker } 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker return android.PathForModuleSrc(ctx, p.properties.Srcs[0]) 132*333d2b36SAndroid Build Coastguard Worker} 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) link(ctx ModuleContext, 135*333d2b36SAndroid Build Coastguard Worker flags Flags, deps PathDeps, objs Objects) android.Path { 136*333d2b36SAndroid Build Coastguard Worker if !p.MatchesWithDevice(ctx.DeviceConfig()) { 137*333d2b36SAndroid Build Coastguard Worker ctx.Module().HideFromMake() 138*333d2b36SAndroid Build Coastguard Worker return nil 139*333d2b36SAndroid Build Coastguard Worker } 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker if len(p.properties.Srcs) > 0 && p.shared() { 142*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.exportIncludes(ctx) 143*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.reexportFlags(p.properties.Export_flags...) 144*333d2b36SAndroid Build Coastguard Worker // current VNDK prebuilts are only shared libs. 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker in := p.singleSourcePath(ctx) 147*333d2b36SAndroid Build Coastguard Worker p.unstrippedOutputFile = in 148*333d2b36SAndroid Build Coastguard Worker libName := in.Base() 149*333d2b36SAndroid Build Coastguard Worker if p.stripper.NeedsStrip(ctx) { 150*333d2b36SAndroid Build Coastguard Worker stripFlags := flagsToStripFlags(flags) 151*333d2b36SAndroid Build Coastguard Worker stripped := android.PathForModuleOut(ctx, "stripped", libName) 152*333d2b36SAndroid Build Coastguard Worker p.stripper.StripExecutableOrSharedLib(ctx, in, stripped, stripFlags) 153*333d2b36SAndroid Build Coastguard Worker in = stripped 154*333d2b36SAndroid Build Coastguard Worker } 155*333d2b36SAndroid Build Coastguard Worker 156*333d2b36SAndroid Build Coastguard Worker // Optimize out relinking against shared libraries whose interface hasn't changed by 157*333d2b36SAndroid Build Coastguard Worker // depending on a table of contents file instead of the library itself. 158*333d2b36SAndroid Build Coastguard Worker tocFile := android.PathForModuleOut(ctx, libName+".toc") 159*333d2b36SAndroid Build Coastguard Worker p.tocFile = android.OptionalPathForPath(tocFile) 160*333d2b36SAndroid Build Coastguard Worker TransformSharedObjectToToc(ctx, in, tocFile) 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker p.androidMkSuffix = p.NameSuffix() 163*333d2b36SAndroid Build Coastguard Worker 164*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, SharedLibraryInfoProvider, SharedLibraryInfo{ 165*333d2b36SAndroid Build Coastguard Worker SharedLibrary: in, 166*333d2b36SAndroid Build Coastguard Worker Target: ctx.Target(), 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Worker TableOfContents: p.tocFile, 169*333d2b36SAndroid Build Coastguard Worker IsStubs: false, 170*333d2b36SAndroid Build Coastguard Worker }) 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.setProvider(ctx) 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker return in 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker ctx.Module().HideFromMake() 178*333d2b36SAndroid Build Coastguard Worker return nil 179*333d2b36SAndroid Build Coastguard Worker} 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) moduleInfoJSON(ctx ModuleContext, moduleInfoJSON *android.ModuleInfoJSON) { 182*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.moduleInfoJSON(ctx, moduleInfoJSON) 183*333d2b36SAndroid Build Coastguard Worker moduleInfoJSON.SubName += p.androidMkSuffix 184*333d2b36SAndroid Build Coastguard Worker} 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) MatchesWithDevice(config android.DeviceConfig) bool { 187*333d2b36SAndroid Build Coastguard Worker arches := config.Arches() 188*333d2b36SAndroid Build Coastguard Worker if len(arches) == 0 || arches[0].ArchType.String() != p.arch() { 189*333d2b36SAndroid Build Coastguard Worker return false 190*333d2b36SAndroid Build Coastguard Worker } 191*333d2b36SAndroid Build Coastguard Worker if config.BinderBitness() != p.binderBit() { 192*333d2b36SAndroid Build Coastguard Worker return false 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker if len(p.properties.Srcs) == 0 { 195*333d2b36SAndroid Build Coastguard Worker return false 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker return true 198*333d2b36SAndroid Build Coastguard Worker} 199*333d2b36SAndroid Build Coastguard Worker 200*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) nativeCoverage() bool { 201*333d2b36SAndroid Build Coastguard Worker return false 202*333d2b36SAndroid Build Coastguard Worker} 203*333d2b36SAndroid Build Coastguard Worker 204*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) IsSnapshotPrebuilt() bool { 205*333d2b36SAndroid Build Coastguard Worker return true 206*333d2b36SAndroid Build Coastguard Worker} 207*333d2b36SAndroid Build Coastguard Worker 208*333d2b36SAndroid Build Coastguard Workerfunc (p *vndkPrebuiltLibraryDecorator) install(ctx ModuleContext, file android.Path) { 209*333d2b36SAndroid Build Coastguard Worker // do not install vndk libs 210*333d2b36SAndroid Build Coastguard Worker} 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Workerfunc vndkPrebuiltSharedLibrary() *Module { 213*333d2b36SAndroid Build Coastguard Worker module, library := NewLibrary(android.DeviceSupported) 214*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyShared() 215*333d2b36SAndroid Build Coastguard Worker module.stl = nil 216*333d2b36SAndroid Build Coastguard Worker module.sanitize = nil 217*333d2b36SAndroid Build Coastguard Worker library.disableStripping() 218*333d2b36SAndroid Build Coastguard Worker 219*333d2b36SAndroid Build Coastguard Worker prebuilt := &vndkPrebuiltLibraryDecorator{ 220*333d2b36SAndroid Build Coastguard Worker libraryDecorator: library, 221*333d2b36SAndroid Build Coastguard Worker } 222*333d2b36SAndroid Build Coastguard Worker 223*333d2b36SAndroid Build Coastguard Worker prebuilt.properties.Check_elf_files = BoolPtr(false) 224*333d2b36SAndroid Build Coastguard Worker prebuilt.baseLinker.Properties.No_libcrt = BoolPtr(true) 225*333d2b36SAndroid Build Coastguard Worker prebuilt.baseLinker.Properties.Nocrt = BoolPtr(true) 226*333d2b36SAndroid Build Coastguard Worker prebuilt.baseLinker.Properties.No_crt_pad_segment = BoolPtr(true) 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Worker // Prevent default system libs (libc, libm, and libdl) from being linked 229*333d2b36SAndroid Build Coastguard Worker if prebuilt.baseLinker.Properties.System_shared_libs == nil { 230*333d2b36SAndroid Build Coastguard Worker prebuilt.baseLinker.Properties.System_shared_libs = []string{} 231*333d2b36SAndroid Build Coastguard Worker } 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Worker module.compiler = nil 234*333d2b36SAndroid Build Coastguard Worker module.linker = prebuilt 235*333d2b36SAndroid Build Coastguard Worker module.installer = prebuilt 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 238*333d2b36SAndroid Build Coastguard Worker &prebuilt.properties, 239*333d2b36SAndroid Build Coastguard Worker ) 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker return module 242*333d2b36SAndroid Build Coastguard Worker} 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Worker// vndk_prebuilt_shared installs Vendor Native Development kit (VNDK) snapshot 245*333d2b36SAndroid Build Coastguard Worker// shared libraries for system build. Example: 246*333d2b36SAndroid Build Coastguard Worker// 247*333d2b36SAndroid Build Coastguard Worker// vndk_prebuilt_shared { 248*333d2b36SAndroid Build Coastguard Worker// name: "libfoo", 249*333d2b36SAndroid Build Coastguard Worker// version: "27", 250*333d2b36SAndroid Build Coastguard Worker// target_arch: "arm64", 251*333d2b36SAndroid Build Coastguard Worker// vendor_available: true, 252*333d2b36SAndroid Build Coastguard Worker// product_available: true, 253*333d2b36SAndroid Build Coastguard Worker// vndk: { 254*333d2b36SAndroid Build Coastguard Worker// enabled: true, 255*333d2b36SAndroid Build Coastguard Worker// }, 256*333d2b36SAndroid Build Coastguard Worker// export_include_dirs: ["include/external/libfoo/vndk_include"], 257*333d2b36SAndroid Build Coastguard Worker// arch: { 258*333d2b36SAndroid Build Coastguard Worker// arm64: { 259*333d2b36SAndroid Build Coastguard Worker// srcs: ["arm/lib64/libfoo.so"], 260*333d2b36SAndroid Build Coastguard Worker// }, 261*333d2b36SAndroid Build Coastguard Worker// arm: { 262*333d2b36SAndroid Build Coastguard Worker// srcs: ["arm/lib/libfoo.so"], 263*333d2b36SAndroid Build Coastguard Worker// }, 264*333d2b36SAndroid Build Coastguard Worker// }, 265*333d2b36SAndroid Build Coastguard Worker// } 266*333d2b36SAndroid Build Coastguard Workerfunc VndkPrebuiltSharedFactory() android.Module { 267*333d2b36SAndroid Build Coastguard Worker module := vndkPrebuiltSharedLibrary() 268*333d2b36SAndroid Build Coastguard Worker return module.Init() 269*333d2b36SAndroid Build Coastguard Worker} 270*333d2b36SAndroid Build Coastguard Worker 271*333d2b36SAndroid Build Coastguard Workerfunc init() { 272*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("vndk_prebuilt_shared", VndkPrebuiltSharedFactory) 273*333d2b36SAndroid Build Coastguard Worker} 274*333d2b36SAndroid Build Coastguard Worker 275*333d2b36SAndroid Build Coastguard Workerfunc IsForVndkApex(mctx android.BottomUpMutatorContext, m *Module) bool { 276*333d2b36SAndroid Build Coastguard Worker if !m.Enabled(mctx) { 277*333d2b36SAndroid Build Coastguard Worker return true 278*333d2b36SAndroid Build Coastguard Worker } 279*333d2b36SAndroid Build Coastguard Worker 280*333d2b36SAndroid Build Coastguard Worker if p, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok { 281*333d2b36SAndroid Build Coastguard Worker return p.MatchesWithDevice(mctx.DeviceConfig()) && Bool(p.properties.Vndk.Enabled) 282*333d2b36SAndroid Build Coastguard Worker } 283*333d2b36SAndroid Build Coastguard Worker return false 284*333d2b36SAndroid Build Coastguard Worker} 285