1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 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 "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/depset" 21*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc init() { 27*333d2b36SAndroid Build Coastguard Worker RegisterPrebuiltBuildComponents(android.InitRegistrationContext) 28*333d2b36SAndroid Build Coastguard Worker} 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workerfunc RegisterPrebuiltBuildComponents(ctx android.RegistrationContext) { 31*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_prebuilt_library", PrebuiltLibraryFactory) 32*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_prebuilt_library_shared", PrebuiltSharedLibraryFactory) 33*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory) 34*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_prebuilt_test_library_shared", PrebuiltSharedTestLibraryFactory) 35*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_prebuilt_object", PrebuiltObjectFactory) 36*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("cc_prebuilt_binary", PrebuiltBinaryFactory) 37*333d2b36SAndroid Build Coastguard Worker} 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Workertype prebuiltLinkerInterface interface { 40*333d2b36SAndroid Build Coastguard Worker Name(string) string 41*333d2b36SAndroid Build Coastguard Worker prebuilt() *android.Prebuilt 42*333d2b36SAndroid Build Coastguard Worker sourceModuleName() string 43*333d2b36SAndroid Build Coastguard Worker} 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Workertype prebuiltLinkerProperties struct { 46*333d2b36SAndroid Build Coastguard Worker // Name of the source soong module that gets shadowed by this prebuilt 47*333d2b36SAndroid Build Coastguard Worker // If unspecified, follows the naming convention that the source module of 48*333d2b36SAndroid Build Coastguard Worker // the prebuilt is Name() without "prebuilt_" prefix 49*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Worker // a prebuilt library or binary. Can reference a genrule module that generates an executable file. 52*333d2b36SAndroid Build Coastguard Worker Srcs proptools.Configurable[[]string] `android:"path,arch_variant"` 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Worker Sanitized Sanitized `android:"arch_variant"` 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker // Check the prebuilt ELF files (e.g. DT_SONAME, DT_NEEDED, resolution of undefined 57*333d2b36SAndroid Build Coastguard Worker // symbols, etc), default true. 58*333d2b36SAndroid Build Coastguard Worker Check_elf_files *bool 59*333d2b36SAndroid Build Coastguard Worker 60*333d2b36SAndroid Build Coastguard Worker // if set, add an extra objcopy --prefix-symbols= step 61*333d2b36SAndroid Build Coastguard Worker Prefix_symbols *string 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker // Optionally provide an import library if this is a Windows PE DLL prebuilt. 64*333d2b36SAndroid Build Coastguard Worker // This is needed only if this library is linked by other modules in build time. 65*333d2b36SAndroid Build Coastguard Worker // Only makes sense for the Windows target. 66*333d2b36SAndroid Build Coastguard Worker Windows_import_lib *string `android:"path,arch_variant"` 67*333d2b36SAndroid Build Coastguard Worker} 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Workertype prebuiltLinker struct { 70*333d2b36SAndroid Build Coastguard Worker android.Prebuilt 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker properties prebuiltLinkerProperties 73*333d2b36SAndroid Build Coastguard Worker} 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLinker) prebuilt() *android.Prebuilt { 76*333d2b36SAndroid Build Coastguard Worker return &p.Prebuilt 77*333d2b36SAndroid Build Coastguard Worker} 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Workertype prebuiltLibraryInterface interface { 80*333d2b36SAndroid Build Coastguard Worker libraryInterface 81*333d2b36SAndroid Build Coastguard Worker prebuiltLinkerInterface 82*333d2b36SAndroid Build Coastguard Worker disablePrebuilt() 83*333d2b36SAndroid Build Coastguard Worker} 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Workertype prebuiltLibraryLinker struct { 86*333d2b36SAndroid Build Coastguard Worker *libraryDecorator 87*333d2b36SAndroid Build Coastguard Worker prebuiltLinker 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Workervar _ prebuiltLinkerInterface = (*prebuiltLibraryLinker)(nil) 91*333d2b36SAndroid Build Coastguard Workervar _ prebuiltLibraryInterface = (*prebuiltLibraryLinker)(nil) 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) linkerInit(ctx BaseModuleContext) {} 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { 96*333d2b36SAndroid Build Coastguard Worker return p.libraryDecorator.linkerDeps(ctx, deps) 97*333d2b36SAndroid Build Coastguard Worker} 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) linkerProps() []interface{} { 100*333d2b36SAndroid Build Coastguard Worker return p.libraryDecorator.linkerProps() 101*333d2b36SAndroid Build Coastguard Worker} 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) link(ctx ModuleContext, 104*333d2b36SAndroid Build Coastguard Worker flags Flags, deps PathDeps, objs Objects) android.Path { 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.exportIncludes(ctx) 107*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.reexportDirs(deps.ReexportedDirs...) 108*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.reexportSystemDirs(deps.ReexportedSystemDirs...) 109*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.reexportFlags(deps.ReexportedFlags...) 110*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.reexportDeps(deps.ReexportedDeps...) 111*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...) 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Worker p.libraryDecorator.flagExporter.setProvider(ctx) 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker // TODO(ccross): verify shared library dependencies 116*333d2b36SAndroid Build Coastguard Worker srcs := p.prebuiltSrcs(ctx) 117*333d2b36SAndroid Build Coastguard Worker stubInfo := addStubDependencyProviders(ctx) 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker // Stub variants will create a stub .so file from stub .c files 120*333d2b36SAndroid Build Coastguard Worker if p.buildStubs() && objs.objFiles != nil { 121*333d2b36SAndroid Build Coastguard Worker // TODO (b/275273834): Make objs.objFiles == nil a hard error when the symbol files have been added to module sdk. 122*333d2b36SAndroid Build Coastguard Worker return p.linkShared(ctx, flags, deps, objs) 123*333d2b36SAndroid Build Coastguard Worker } 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker if len(srcs) > 0 { 126*333d2b36SAndroid Build Coastguard Worker if len(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 p.libraryDecorator.exportVersioningMacroIfNeeded(ctx) 132*333d2b36SAndroid Build Coastguard Worker 133*333d2b36SAndroid Build Coastguard Worker in := android.PathForModuleSrc(ctx, srcs[0]) 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker if String(p.prebuiltLinker.properties.Prefix_symbols) != "" { 136*333d2b36SAndroid Build Coastguard Worker prefixed := android.PathForModuleOut(ctx, "prefixed", srcs[0]) 137*333d2b36SAndroid Build Coastguard Worker transformBinaryPrefixSymbols(ctx, String(p.prebuiltLinker.properties.Prefix_symbols), 138*333d2b36SAndroid Build Coastguard Worker in, flagsToBuilderFlags(flags), prefixed) 139*333d2b36SAndroid Build Coastguard Worker in = prefixed 140*333d2b36SAndroid Build Coastguard Worker } 141*333d2b36SAndroid Build Coastguard Worker 142*333d2b36SAndroid Build Coastguard Worker if p.static() { 143*333d2b36SAndroid Build Coastguard Worker depSet := depset.NewBuilder[android.Path](depset.TOPOLOGICAL).Direct(in).Build() 144*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, StaticLibraryInfoProvider, StaticLibraryInfo{ 145*333d2b36SAndroid Build Coastguard Worker StaticLibrary: in, 146*333d2b36SAndroid Build Coastguard Worker 147*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibrariesForOrdering: depSet, 148*333d2b36SAndroid Build Coastguard Worker }) 149*333d2b36SAndroid Build Coastguard Worker return in 150*333d2b36SAndroid Build Coastguard Worker } 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Worker if p.shared() { 153*333d2b36SAndroid Build Coastguard Worker p.unstrippedOutputFile = in 154*333d2b36SAndroid Build Coastguard Worker libName := p.libraryDecorator.getLibName(ctx) + flags.Toolchain.ShlibSuffix() 155*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, libName) 156*333d2b36SAndroid Build Coastguard Worker var implicits android.Paths 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker if p.stripper.NeedsStrip(ctx) { 159*333d2b36SAndroid Build Coastguard Worker stripFlags := flagsToStripFlags(flags) 160*333d2b36SAndroid Build Coastguard Worker stripped := android.PathForModuleOut(ctx, "stripped", libName) 161*333d2b36SAndroid Build Coastguard Worker p.stripper.StripExecutableOrSharedLib(ctx, in, stripped, stripFlags) 162*333d2b36SAndroid Build Coastguard Worker in = stripped 163*333d2b36SAndroid Build Coastguard Worker } 164*333d2b36SAndroid Build Coastguard Worker 165*333d2b36SAndroid Build Coastguard Worker // Optimize out relinking against shared libraries whose interface hasn't changed by 166*333d2b36SAndroid Build Coastguard Worker // depending on a table of contents file instead of the library itself. 167*333d2b36SAndroid Build Coastguard Worker tocFile := android.PathForModuleOut(ctx, libName+".toc") 168*333d2b36SAndroid Build Coastguard Worker p.tocFile = android.OptionalPathForPath(tocFile) 169*333d2b36SAndroid Build Coastguard Worker TransformSharedObjectToToc(ctx, outputFile, tocFile) 170*333d2b36SAndroid Build Coastguard Worker 171*333d2b36SAndroid Build Coastguard Worker if ctx.Windows() && p.properties.Windows_import_lib != nil { 172*333d2b36SAndroid Build Coastguard Worker // Consumers of this library actually links to the import library in build 173*333d2b36SAndroid Build Coastguard Worker // time and dynamically links to the DLL in run time. i.e. 174*333d2b36SAndroid Build Coastguard Worker // a.exe <-- static link --> foo.lib <-- dynamic link --> foo.dll 175*333d2b36SAndroid Build Coastguard Worker importLibSrc := android.PathForModuleSrc(ctx, String(p.properties.Windows_import_lib)) 176*333d2b36SAndroid Build Coastguard Worker importLibName := p.libraryDecorator.getLibName(ctx) + ".lib" 177*333d2b36SAndroid Build Coastguard Worker importLibOutputFile := android.PathForModuleOut(ctx, importLibName) 178*333d2b36SAndroid Build Coastguard Worker implicits = append(implicits, importLibOutputFile) 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 181*333d2b36SAndroid Build Coastguard Worker Rule: android.CpExecutable, 182*333d2b36SAndroid Build Coastguard Worker Description: "prebuilt import library", 183*333d2b36SAndroid Build Coastguard Worker Input: importLibSrc, 184*333d2b36SAndroid Build Coastguard Worker Output: importLibOutputFile, 185*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 186*333d2b36SAndroid Build Coastguard Worker "cpFlags": "-L", 187*333d2b36SAndroid Build Coastguard Worker }, 188*333d2b36SAndroid Build Coastguard Worker }) 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 192*333d2b36SAndroid Build Coastguard Worker Rule: android.CpExecutable, 193*333d2b36SAndroid Build Coastguard Worker Description: "prebuilt shared library", 194*333d2b36SAndroid Build Coastguard Worker Implicits: implicits, 195*333d2b36SAndroid Build Coastguard Worker Input: in, 196*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 197*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 198*333d2b36SAndroid Build Coastguard Worker "cpFlags": "-L", 199*333d2b36SAndroid Build Coastguard Worker }, 200*333d2b36SAndroid Build Coastguard Worker }) 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, SharedLibraryInfoProvider, SharedLibraryInfo{ 203*333d2b36SAndroid Build Coastguard Worker SharedLibrary: outputFile, 204*333d2b36SAndroid Build Coastguard Worker Target: ctx.Target(), 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker TableOfContents: p.tocFile, 207*333d2b36SAndroid Build Coastguard Worker IsStubs: p.buildStubs(), 208*333d2b36SAndroid Build Coastguard Worker }) 209*333d2b36SAndroid Build Coastguard Worker 210*333d2b36SAndroid Build Coastguard Worker return outputFile 211*333d2b36SAndroid Build Coastguard Worker } 212*333d2b36SAndroid Build Coastguard Worker } else if p.shared() && len(stubInfo) > 0 { 213*333d2b36SAndroid Build Coastguard Worker // This is a prebuilt which does not have any implementation (nil `srcs`), but provides APIs. 214*333d2b36SAndroid Build Coastguard Worker // Provide the latest (i.e. `current`) stubs to reverse dependencies. 215*333d2b36SAndroid Build Coastguard Worker latestStub := stubInfo[len(stubInfo)-1].SharedLibraryInfo.SharedLibrary 216*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, SharedLibraryInfoProvider, SharedLibraryInfo{ 217*333d2b36SAndroid Build Coastguard Worker SharedLibrary: latestStub, 218*333d2b36SAndroid Build Coastguard Worker Target: ctx.Target(), 219*333d2b36SAndroid Build Coastguard Worker IsStubs: true, 220*333d2b36SAndroid Build Coastguard Worker }) 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker return latestStub 223*333d2b36SAndroid Build Coastguard Worker } 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Worker if p.header() { 226*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, HeaderLibraryInfoProvider, HeaderLibraryInfo{}) 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Worker // Need to return an output path so that the AndroidMk logic doesn't skip 229*333d2b36SAndroid Build Coastguard Worker // the prebuilt header. For compatibility, in case Android.mk files use a 230*333d2b36SAndroid Build Coastguard Worker // header lib in LOCAL_STATIC_LIBRARIES, create an empty ar file as 231*333d2b36SAndroid Build Coastguard Worker // placeholder, just like non-prebuilt header modules do in linkStatic(). 232*333d2b36SAndroid Build Coastguard Worker ph := android.PathForModuleOut(ctx, ctx.ModuleName()+staticLibraryExtension) 233*333d2b36SAndroid Build Coastguard Worker transformObjToStaticLib(ctx, nil, nil, builderFlags{}, ph, nil, nil) 234*333d2b36SAndroid Build Coastguard Worker return ph 235*333d2b36SAndroid Build Coastguard Worker } 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Worker return nil 238*333d2b36SAndroid Build Coastguard Worker} 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) prebuiltSrcs(ctx android.BaseModuleContext) []string { 241*333d2b36SAndroid Build Coastguard Worker sanitize := ctx.Module().(*Module).sanitize 242*333d2b36SAndroid Build Coastguard Worker srcs := p.properties.Srcs.GetOrDefault(ctx, nil) 243*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, srcsForSanitizer(sanitize, p.properties.Sanitized)...) 244*333d2b36SAndroid Build Coastguard Worker if p.static() { 245*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, p.libraryDecorator.StaticProperties.Static.Srcs.GetOrDefault(ctx, nil)...) 246*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, srcsForSanitizer(sanitize, p.libraryDecorator.StaticProperties.Static.Sanitized)...) 247*333d2b36SAndroid Build Coastguard Worker } 248*333d2b36SAndroid Build Coastguard Worker if p.shared() { 249*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, p.libraryDecorator.SharedProperties.Shared.Srcs.GetOrDefault(ctx, nil)...) 250*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, srcsForSanitizer(sanitize, p.libraryDecorator.SharedProperties.Shared.Sanitized)...) 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker return srcs 253*333d2b36SAndroid Build Coastguard Worker} 254*333d2b36SAndroid Build Coastguard Worker 255*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) shared() bool { 256*333d2b36SAndroid Build Coastguard Worker return p.libraryDecorator.shared() 257*333d2b36SAndroid Build Coastguard Worker} 258*333d2b36SAndroid Build Coastguard Worker 259*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) nativeCoverage() bool { 260*333d2b36SAndroid Build Coastguard Worker return false 261*333d2b36SAndroid Build Coastguard Worker} 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) disablePrebuilt() { 264*333d2b36SAndroid Build Coastguard Worker p.properties.Srcs = proptools.NewConfigurable[[]string](nil, nil) 265*333d2b36SAndroid Build Coastguard Worker p.properties.Sanitized.None.Srcs = nil 266*333d2b36SAndroid Build Coastguard Worker p.properties.Sanitized.Address.Srcs = nil 267*333d2b36SAndroid Build Coastguard Worker p.properties.Sanitized.Hwaddress.Srcs = nil 268*333d2b36SAndroid Build Coastguard Worker} 269*333d2b36SAndroid Build Coastguard Worker 270*333d2b36SAndroid Build Coastguard Worker// Implements versionedInterface 271*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) implementationModuleName(name string) string { 272*333d2b36SAndroid Build Coastguard Worker return android.RemoveOptionalPrebuiltPrefix(name) 273*333d2b36SAndroid Build Coastguard Worker} 274*333d2b36SAndroid Build Coastguard Worker 275*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltLibrary(hod android.HostOrDeviceSupported, srcsProperty string) (*Module, *libraryDecorator) { 276*333d2b36SAndroid Build Coastguard Worker module, library := NewLibrary(hod) 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Worker prebuilt := &prebuiltLibraryLinker{ 279*333d2b36SAndroid Build Coastguard Worker libraryDecorator: library, 280*333d2b36SAndroid Build Coastguard Worker } 281*333d2b36SAndroid Build Coastguard Worker module.compiler = prebuilt 282*333d2b36SAndroid Build Coastguard Worker module.linker = prebuilt 283*333d2b36SAndroid Build Coastguard Worker module.library = prebuilt 284*333d2b36SAndroid Build Coastguard Worker 285*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&prebuilt.properties) 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker if srcsProperty == "" { 288*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModuleWithoutSrcs(module) 289*333d2b36SAndroid Build Coastguard Worker } else { 290*333d2b36SAndroid Build Coastguard Worker srcsSupplier := func(ctx android.BaseModuleContext, _ android.Module) []string { 291*333d2b36SAndroid Build Coastguard Worker return prebuilt.prebuiltSrcs(ctx) 292*333d2b36SAndroid Build Coastguard Worker } 293*333d2b36SAndroid Build Coastguard Worker 294*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, srcsProperty) 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker return module, library 298*333d2b36SAndroid Build Coastguard Worker} 299*333d2b36SAndroid Build Coastguard Worker 300*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLibraryLinker) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects { 301*333d2b36SAndroid Build Coastguard Worker if p.buildStubs() && p.stubsVersion() != "" { 302*333d2b36SAndroid Build Coastguard Worker return p.compileModuleLibApiStubs(ctx, flags, deps) 303*333d2b36SAndroid Build Coastguard Worker } 304*333d2b36SAndroid Build Coastguard Worker return Objects{} 305*333d2b36SAndroid Build Coastguard Worker} 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Worker// cc_prebuilt_library installs a precompiled shared library that are 308*333d2b36SAndroid Build Coastguard Worker// listed in the srcs property in the device's directory. 309*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltLibraryFactory() android.Module { 310*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported, "srcs") 311*333d2b36SAndroid Build Coastguard Worker 312*333d2b36SAndroid Build Coastguard Worker // Prebuilt shared libraries can be included in APEXes 313*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 314*333d2b36SAndroid Build Coastguard Worker 315*333d2b36SAndroid Build Coastguard Worker return module.Init() 316*333d2b36SAndroid Build Coastguard Worker} 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker// cc_prebuilt_library_shared installs a precompiled shared library that are 319*333d2b36SAndroid Build Coastguard Worker// listed in the srcs property in the device's directory. 320*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltSharedLibraryFactory() android.Module { 321*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltSharedLibrary(android.HostAndDeviceSupported) 322*333d2b36SAndroid Build Coastguard Worker return module.Init() 323*333d2b36SAndroid Build Coastguard Worker} 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker// cc_prebuilt_test_library_shared installs a precompiled shared library 326*333d2b36SAndroid Build Coastguard Worker// to be used as a data dependency of a test-related module (such as cc_test, or 327*333d2b36SAndroid Build Coastguard Worker// cc_test_library). 328*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltSharedTestLibraryFactory() android.Module { 329*333d2b36SAndroid Build Coastguard Worker module, library := NewPrebuiltLibrary(android.HostAndDeviceSupported, "srcs") 330*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyShared() 331*333d2b36SAndroid Build Coastguard Worker library.baseInstaller = NewTestInstaller() 332*333d2b36SAndroid Build Coastguard Worker return module.Init() 333*333d2b36SAndroid Build Coastguard Worker} 334*333d2b36SAndroid Build Coastguard Worker 335*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltSharedLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { 336*333d2b36SAndroid Build Coastguard Worker module, library := NewPrebuiltLibrary(hod, "srcs") 337*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyShared() 338*333d2b36SAndroid Build Coastguard Worker 339*333d2b36SAndroid Build Coastguard Worker // Prebuilt shared libraries can be included in APEXes 340*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 341*333d2b36SAndroid Build Coastguard Worker 342*333d2b36SAndroid Build Coastguard Worker return module, library 343*333d2b36SAndroid Build Coastguard Worker} 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker// cc_prebuilt_library_static installs a precompiled static library that are 346*333d2b36SAndroid Build Coastguard Worker// listed in the srcs property in the device's directory. 347*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltStaticLibraryFactory() android.Module { 348*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltStaticLibrary(android.HostAndDeviceSupported) 349*333d2b36SAndroid Build Coastguard Worker return module.Init() 350*333d2b36SAndroid Build Coastguard Worker} 351*333d2b36SAndroid Build Coastguard Worker 352*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltStaticLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { 353*333d2b36SAndroid Build Coastguard Worker module, library := NewPrebuiltLibrary(hod, "srcs") 354*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyStatic() 355*333d2b36SAndroid Build Coastguard Worker 356*333d2b36SAndroid Build Coastguard Worker return module, library 357*333d2b36SAndroid Build Coastguard Worker} 358*333d2b36SAndroid Build Coastguard Worker 359*333d2b36SAndroid Build Coastguard Workertype prebuiltObjectProperties struct { 360*333d2b36SAndroid Build Coastguard Worker // Name of the source soong module that gets shadowed by this prebuilt 361*333d2b36SAndroid Build Coastguard Worker // If unspecified, follows the naming convention that the source module of 362*333d2b36SAndroid Build Coastguard Worker // the prebuilt is Name() without "prebuilt_" prefix 363*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 364*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 365*333d2b36SAndroid Build Coastguard Worker} 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Workertype prebuiltObjectLinker struct { 368*333d2b36SAndroid Build Coastguard Worker android.Prebuilt 369*333d2b36SAndroid Build Coastguard Worker objectLinker 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker properties prebuiltObjectProperties 372*333d2b36SAndroid Build Coastguard Worker} 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltObjectLinker) prebuilt() *android.Prebuilt { 375*333d2b36SAndroid Build Coastguard Worker return &p.Prebuilt 376*333d2b36SAndroid Build Coastguard Worker} 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltObjectLinker) sourceModuleName() string { 379*333d2b36SAndroid Build Coastguard Worker return proptools.String(p.properties.Source_module_name) 380*333d2b36SAndroid Build Coastguard Worker} 381*333d2b36SAndroid Build Coastguard Worker 382*333d2b36SAndroid Build Coastguard Workervar _ prebuiltLinkerInterface = (*prebuiltObjectLinker)(nil) 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltObjectLinker) link(ctx ModuleContext, 385*333d2b36SAndroid Build Coastguard Worker flags Flags, deps PathDeps, objs Objects) android.Path { 386*333d2b36SAndroid Build Coastguard Worker if len(p.properties.Srcs) > 0 { 387*333d2b36SAndroid Build Coastguard Worker // Copy objects to a name matching the final installed name 388*333d2b36SAndroid Build Coastguard Worker in := p.Prebuilt.SingleSourcePath(ctx) 389*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, ctx.ModuleName()+".o") 390*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 391*333d2b36SAndroid Build Coastguard Worker Rule: android.CpExecutable, 392*333d2b36SAndroid Build Coastguard Worker Description: "prebuilt", 393*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 394*333d2b36SAndroid Build Coastguard Worker Input: in, 395*333d2b36SAndroid Build Coastguard Worker }) 396*333d2b36SAndroid Build Coastguard Worker return outputFile 397*333d2b36SAndroid Build Coastguard Worker } 398*333d2b36SAndroid Build Coastguard Worker return nil 399*333d2b36SAndroid Build Coastguard Worker} 400*333d2b36SAndroid Build Coastguard Worker 401*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltObjectLinker) object() bool { 402*333d2b36SAndroid Build Coastguard Worker return true 403*333d2b36SAndroid Build Coastguard Worker} 404*333d2b36SAndroid Build Coastguard Worker 405*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltObject(hod android.HostOrDeviceSupported) *Module { 406*333d2b36SAndroid Build Coastguard Worker module := newObject(hod) 407*333d2b36SAndroid Build Coastguard Worker prebuilt := &prebuiltObjectLinker{ 408*333d2b36SAndroid Build Coastguard Worker objectLinker: objectLinker{ 409*333d2b36SAndroid Build Coastguard Worker baseLinker: NewBaseLinker(nil), 410*333d2b36SAndroid Build Coastguard Worker }, 411*333d2b36SAndroid Build Coastguard Worker } 412*333d2b36SAndroid Build Coastguard Worker module.linker = prebuilt 413*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&prebuilt.properties) 414*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModule(module, &prebuilt.properties.Srcs) 415*333d2b36SAndroid Build Coastguard Worker return module 416*333d2b36SAndroid Build Coastguard Worker} 417*333d2b36SAndroid Build Coastguard Worker 418*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltObjectFactory() android.Module { 419*333d2b36SAndroid Build Coastguard Worker module := NewPrebuiltObject(android.HostAndDeviceSupported) 420*333d2b36SAndroid Build Coastguard Worker return module.Init() 421*333d2b36SAndroid Build Coastguard Worker} 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Workertype prebuiltBinaryLinker struct { 424*333d2b36SAndroid Build Coastguard Worker *binaryDecorator 425*333d2b36SAndroid Build Coastguard Worker prebuiltLinker 426*333d2b36SAndroid Build Coastguard Worker 427*333d2b36SAndroid Build Coastguard Worker toolPath android.OptionalPath 428*333d2b36SAndroid Build Coastguard Worker} 429*333d2b36SAndroid Build Coastguard Worker 430*333d2b36SAndroid Build Coastguard Workervar _ prebuiltLinkerInterface = (*prebuiltBinaryLinker)(nil) 431*333d2b36SAndroid Build Coastguard Worker 432*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltBinaryLinker) hostToolPath() android.OptionalPath { 433*333d2b36SAndroid Build Coastguard Worker return p.toolPath 434*333d2b36SAndroid Build Coastguard Worker} 435*333d2b36SAndroid Build Coastguard Worker 436*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltBinaryLinker) link(ctx ModuleContext, 437*333d2b36SAndroid Build Coastguard Worker flags Flags, deps PathDeps, objs Objects) android.Path { 438*333d2b36SAndroid Build Coastguard Worker // TODO(ccross): verify shared library dependencies 439*333d2b36SAndroid Build Coastguard Worker if len(p.properties.Srcs.GetOrDefault(ctx, nil)) > 0 { 440*333d2b36SAndroid Build Coastguard Worker fileName := p.getStem(ctx) + flags.Toolchain.ExecutableSuffix() 441*333d2b36SAndroid Build Coastguard Worker in := p.Prebuilt.SingleSourcePath(ctx) 442*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, fileName) 443*333d2b36SAndroid Build Coastguard Worker p.unstrippedOutputFile = in 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Worker if ctx.Host() { 446*333d2b36SAndroid Build Coastguard Worker // Host binaries are symlinked to their prebuilt source locations. That 447*333d2b36SAndroid Build Coastguard Worker // way they are executed directly from there so the linker resolves their 448*333d2b36SAndroid Build Coastguard Worker // shared library dependencies relative to that location (using 449*333d2b36SAndroid Build Coastguard Worker // $ORIGIN/../lib(64):$ORIGIN/lib(64) as RUNPATH). This way the prebuilt 450*333d2b36SAndroid Build Coastguard Worker // repository can supply the expected versions of the shared libraries 451*333d2b36SAndroid Build Coastguard Worker // without interference from what is in the out tree. 452*333d2b36SAndroid Build Coastguard Worker 453*333d2b36SAndroid Build Coastguard Worker // These shared lib paths may point to copies of the libs in 454*333d2b36SAndroid Build Coastguard Worker // .intermediates, which isn't where the binary will load them from, but 455*333d2b36SAndroid Build Coastguard Worker // it's fine for dependency tracking. If a library dependency is updated, 456*333d2b36SAndroid Build Coastguard Worker // the symlink will get a new timestamp, along with any installed symlinks 457*333d2b36SAndroid Build Coastguard Worker // handled in make. 458*333d2b36SAndroid Build Coastguard Worker sharedLibPaths := deps.EarlySharedLibs 459*333d2b36SAndroid Build Coastguard Worker sharedLibPaths = append(sharedLibPaths, deps.SharedLibs...) 460*333d2b36SAndroid Build Coastguard Worker sharedLibPaths = append(sharedLibPaths, deps.LateSharedLibs...) 461*333d2b36SAndroid Build Coastguard Worker 462*333d2b36SAndroid Build Coastguard Worker var fromPath = in.String() 463*333d2b36SAndroid Build Coastguard Worker if !filepath.IsAbs(fromPath) { 464*333d2b36SAndroid Build Coastguard Worker fromPath = "$$PWD/" + fromPath 465*333d2b36SAndroid Build Coastguard Worker } 466*333d2b36SAndroid Build Coastguard Worker 467*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 468*333d2b36SAndroid Build Coastguard Worker Rule: android.Symlink, 469*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 470*333d2b36SAndroid Build Coastguard Worker Input: in, 471*333d2b36SAndroid Build Coastguard Worker Implicits: sharedLibPaths, 472*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 473*333d2b36SAndroid Build Coastguard Worker "fromPath": fromPath, 474*333d2b36SAndroid Build Coastguard Worker }, 475*333d2b36SAndroid Build Coastguard Worker }) 476*333d2b36SAndroid Build Coastguard Worker 477*333d2b36SAndroid Build Coastguard Worker p.toolPath = android.OptionalPathForPath(outputFile) 478*333d2b36SAndroid Build Coastguard Worker } else { 479*333d2b36SAndroid Build Coastguard Worker if p.stripper.NeedsStrip(ctx) { 480*333d2b36SAndroid Build Coastguard Worker stripped := android.PathForModuleOut(ctx, "stripped", fileName) 481*333d2b36SAndroid Build Coastguard Worker p.stripper.StripExecutableOrSharedLib(ctx, in, stripped, flagsToStripFlags(flags)) 482*333d2b36SAndroid Build Coastguard Worker in = stripped 483*333d2b36SAndroid Build Coastguard Worker } 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker // Copy binaries to a name matching the final installed name 486*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 487*333d2b36SAndroid Build Coastguard Worker Rule: android.CpExecutable, 488*333d2b36SAndroid Build Coastguard Worker Description: "prebuilt", 489*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 490*333d2b36SAndroid Build Coastguard Worker Input: in, 491*333d2b36SAndroid Build Coastguard Worker }) 492*333d2b36SAndroid Build Coastguard Worker } 493*333d2b36SAndroid Build Coastguard Worker 494*333d2b36SAndroid Build Coastguard Worker return outputFile 495*333d2b36SAndroid Build Coastguard Worker } 496*333d2b36SAndroid Build Coastguard Worker 497*333d2b36SAndroid Build Coastguard Worker return nil 498*333d2b36SAndroid Build Coastguard Worker} 499*333d2b36SAndroid Build Coastguard Worker 500*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltBinaryLinker) binary() bool { 501*333d2b36SAndroid Build Coastguard Worker return true 502*333d2b36SAndroid Build Coastguard Worker} 503*333d2b36SAndroid Build Coastguard Worker 504*333d2b36SAndroid Build Coastguard Worker// cc_prebuilt_binary installs a precompiled executable in srcs property in the 505*333d2b36SAndroid Build Coastguard Worker// device's directory, for both the host and device 506*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltBinaryFactory() android.Module { 507*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltBinary(android.HostAndDeviceSupported) 508*333d2b36SAndroid Build Coastguard Worker return module.Init() 509*333d2b36SAndroid Build Coastguard Worker} 510*333d2b36SAndroid Build Coastguard Worker 511*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltBinary(hod android.HostOrDeviceSupported) (*Module, *binaryDecorator) { 512*333d2b36SAndroid Build Coastguard Worker module, binary := newBinary(hod) 513*333d2b36SAndroid Build Coastguard Worker module.compiler = nil 514*333d2b36SAndroid Build Coastguard Worker 515*333d2b36SAndroid Build Coastguard Worker prebuilt := &prebuiltBinaryLinker{ 516*333d2b36SAndroid Build Coastguard Worker binaryDecorator: binary, 517*333d2b36SAndroid Build Coastguard Worker } 518*333d2b36SAndroid Build Coastguard Worker module.linker = prebuilt 519*333d2b36SAndroid Build Coastguard Worker module.installer = prebuilt 520*333d2b36SAndroid Build Coastguard Worker 521*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&prebuilt.properties) 522*333d2b36SAndroid Build Coastguard Worker 523*333d2b36SAndroid Build Coastguard Worker android.InitConfigurablePrebuiltModule(module, &prebuilt.properties.Srcs) 524*333d2b36SAndroid Build Coastguard Worker return module, binary 525*333d2b36SAndroid Build Coastguard Worker} 526*333d2b36SAndroid Build Coastguard Worker 527*333d2b36SAndroid Build Coastguard Workertype Sanitized struct { 528*333d2b36SAndroid Build Coastguard Worker None struct { 529*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 530*333d2b36SAndroid Build Coastguard Worker } `android:"arch_variant"` 531*333d2b36SAndroid Build Coastguard Worker Address struct { 532*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 533*333d2b36SAndroid Build Coastguard Worker } `android:"arch_variant"` 534*333d2b36SAndroid Build Coastguard Worker Hwaddress struct { 535*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 536*333d2b36SAndroid Build Coastguard Worker } `android:"arch_variant"` 537*333d2b36SAndroid Build Coastguard Worker} 538*333d2b36SAndroid Build Coastguard Worker 539*333d2b36SAndroid Build Coastguard Workerfunc srcsForSanitizer(sanitize *sanitize, sanitized Sanitized) []string { 540*333d2b36SAndroid Build Coastguard Worker if sanitize == nil { 541*333d2b36SAndroid Build Coastguard Worker return nil 542*333d2b36SAndroid Build Coastguard Worker } 543*333d2b36SAndroid Build Coastguard Worker if sanitize.isSanitizerEnabled(Asan) && sanitized.Address.Srcs != nil { 544*333d2b36SAndroid Build Coastguard Worker return sanitized.Address.Srcs 545*333d2b36SAndroid Build Coastguard Worker } 546*333d2b36SAndroid Build Coastguard Worker if sanitize.isSanitizerEnabled(Hwasan) && sanitized.Hwaddress.Srcs != nil { 547*333d2b36SAndroid Build Coastguard Worker return sanitized.Hwaddress.Srcs 548*333d2b36SAndroid Build Coastguard Worker } 549*333d2b36SAndroid Build Coastguard Worker return sanitized.None.Srcs 550*333d2b36SAndroid Build Coastguard Worker} 551*333d2b36SAndroid Build Coastguard Worker 552*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltLinker) sourceModuleName() string { 553*333d2b36SAndroid Build Coastguard Worker return proptools.String(p.properties.Source_module_name) 554*333d2b36SAndroid Build Coastguard Worker} 555