1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 The Android Open Source Project 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 rust 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "errors" 19*333d2b36SAndroid Build Coastguard Worker "fmt" 20*333d2b36SAndroid Build Coastguard Worker "regexp" 21*333d2b36SAndroid Build Coastguard Worker "strings" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/depset" 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 27*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 28*333d2b36SAndroid Build Coastguard Worker) 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workervar ( 31*333d2b36SAndroid Build Coastguard Worker RlibStdlibSuffix = ".rlib-std" 32*333d2b36SAndroid Build Coastguard Worker) 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workerfunc init() { 35*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_library", RustLibraryFactory) 36*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_library_dylib", RustLibraryDylibFactory) 37*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_library_rlib", RustLibraryRlibFactory) 38*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_library_host", RustLibraryHostFactory) 39*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_library_host_dylib", RustLibraryDylibHostFactory) 40*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_library_host_rlib", RustLibraryRlibHostFactory) 41*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi", RustFFIFactory) 42*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory) 43*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi_rlib", RustFFIRlibFactory) 44*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi_host", RustFFIHostFactory) 45*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory) 46*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory) 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker // TODO: Remove when all instances of rust_ffi_static have been switched to rust_ffi_rlib 49*333d2b36SAndroid Build Coastguard Worker // Alias rust_ffi_static to the rust_ffi_rlib factory 50*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory) 51*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory) 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workertype VariantLibraryProperties struct { 55*333d2b36SAndroid Build Coastguard Worker Enabled *bool `android:"arch_variant"` 56*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 57*333d2b36SAndroid Build Coastguard Worker} 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Workertype LibraryCompilerProperties struct { 60*333d2b36SAndroid Build Coastguard Worker Rlib VariantLibraryProperties `android:"arch_variant"` 61*333d2b36SAndroid Build Coastguard Worker Dylib VariantLibraryProperties `android:"arch_variant"` 62*333d2b36SAndroid Build Coastguard Worker Shared VariantLibraryProperties `android:"arch_variant"` 63*333d2b36SAndroid Build Coastguard Worker Static VariantLibraryProperties `android:"arch_variant"` 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker // TODO: Remove this when all instances of Include_dirs have been removed from rust_ffi modules. 66*333d2b36SAndroid Build Coastguard Worker // path to include directories to pass to cc_* modules, only relevant for static/shared variants (deprecated, use export_include_dirs instead). 67*333d2b36SAndroid Build Coastguard Worker Include_dirs []string `android:"path,arch_variant"` 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker // path to include directories to export to cc_* modules, only relevant for static/shared variants. 70*333d2b36SAndroid Build Coastguard Worker Export_include_dirs []string `android:"path,arch_variant"` 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker // Whether this library is part of the Rust toolchain sysroot. 73*333d2b36SAndroid Build Coastguard Worker Sysroot *bool 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker // Exclude this rust_ffi target from being included in APEXes. 76*333d2b36SAndroid Build Coastguard Worker // TODO(b/362509506): remove this once stubs are properly supported by rust_ffi targets. 77*333d2b36SAndroid Build Coastguard Worker Apex_exclude *bool 78*333d2b36SAndroid Build Coastguard Worker} 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Workertype LibraryMutatedProperties struct { 81*333d2b36SAndroid Build Coastguard Worker // Build a dylib variant 82*333d2b36SAndroid Build Coastguard Worker BuildDylib bool `blueprint:"mutated"` 83*333d2b36SAndroid Build Coastguard Worker // Build an rlib variant 84*333d2b36SAndroid Build Coastguard Worker BuildRlib bool `blueprint:"mutated"` 85*333d2b36SAndroid Build Coastguard Worker // Build a shared library variant 86*333d2b36SAndroid Build Coastguard Worker BuildShared bool `blueprint:"mutated"` 87*333d2b36SAndroid Build Coastguard Worker // Build a static library variant 88*333d2b36SAndroid Build Coastguard Worker BuildStatic bool `blueprint:"mutated"` 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker // This variant is a dylib 91*333d2b36SAndroid Build Coastguard Worker VariantIsDylib bool `blueprint:"mutated"` 92*333d2b36SAndroid Build Coastguard Worker // This variant is an rlib 93*333d2b36SAndroid Build Coastguard Worker VariantIsRlib bool `blueprint:"mutated"` 94*333d2b36SAndroid Build Coastguard Worker // This variant is a shared library 95*333d2b36SAndroid Build Coastguard Worker VariantIsShared bool `blueprint:"mutated"` 96*333d2b36SAndroid Build Coastguard Worker // This variant is a source provider 97*333d2b36SAndroid Build Coastguard Worker VariantIsSource bool `blueprint:"mutated"` 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker // This variant is disabled and should not be compiled 100*333d2b36SAndroid Build Coastguard Worker // (used for SourceProvider variants that produce only source) 101*333d2b36SAndroid Build Coastguard Worker VariantIsDisabled bool `blueprint:"mutated"` 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker // Whether this library variant should be link libstd via rlibs 104*333d2b36SAndroid Build Coastguard Worker VariantIsStaticStd bool `blueprint:"mutated"` 105*333d2b36SAndroid Build Coastguard Worker} 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Workertype libraryDecorator struct { 108*333d2b36SAndroid Build Coastguard Worker *baseCompiler 109*333d2b36SAndroid Build Coastguard Worker *flagExporter 110*333d2b36SAndroid Build Coastguard Worker stripper Stripper 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker Properties LibraryCompilerProperties 113*333d2b36SAndroid Build Coastguard Worker MutatedProperties LibraryMutatedProperties 114*333d2b36SAndroid Build Coastguard Worker includeDirs android.Paths 115*333d2b36SAndroid Build Coastguard Worker sourceProvider SourceProvider 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker isFFI bool 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker // table-of-contents file for cdylib crates to optimize out relinking when possible 120*333d2b36SAndroid Build Coastguard Worker tocFile android.OptionalPath 121*333d2b36SAndroid Build Coastguard Worker} 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Workertype libraryInterface interface { 124*333d2b36SAndroid Build Coastguard Worker rlib() bool 125*333d2b36SAndroid Build Coastguard Worker dylib() bool 126*333d2b36SAndroid Build Coastguard Worker static() bool 127*333d2b36SAndroid Build Coastguard Worker shared() bool 128*333d2b36SAndroid Build Coastguard Worker sysroot() bool 129*333d2b36SAndroid Build Coastguard Worker source() bool 130*333d2b36SAndroid Build Coastguard Worker apexExclude() bool 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker // Returns true if the build options for the module have selected a particular build type 133*333d2b36SAndroid Build Coastguard Worker buildRlib() bool 134*333d2b36SAndroid Build Coastguard Worker buildDylib() bool 135*333d2b36SAndroid Build Coastguard Worker buildShared() bool 136*333d2b36SAndroid Build Coastguard Worker buildStatic() bool 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker // Sets a particular variant type 139*333d2b36SAndroid Build Coastguard Worker setRlib() 140*333d2b36SAndroid Build Coastguard Worker setDylib() 141*333d2b36SAndroid Build Coastguard Worker setShared() 142*333d2b36SAndroid Build Coastguard Worker setStatic() 143*333d2b36SAndroid Build Coastguard Worker setSource() 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker // libstd linkage functions 146*333d2b36SAndroid Build Coastguard Worker rlibStd() bool 147*333d2b36SAndroid Build Coastguard Worker setRlibStd() 148*333d2b36SAndroid Build Coastguard Worker setDylibStd() 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker // Build a specific library variant 151*333d2b36SAndroid Build Coastguard Worker BuildOnlyFFI() 152*333d2b36SAndroid Build Coastguard Worker BuildOnlyRust() 153*333d2b36SAndroid Build Coastguard Worker BuildOnlyRlib() 154*333d2b36SAndroid Build Coastguard Worker BuildOnlyDylib() 155*333d2b36SAndroid Build Coastguard Worker BuildOnlyStatic() 156*333d2b36SAndroid Build Coastguard Worker BuildOnlyShared() 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker toc() android.OptionalPath 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Worker isFFILibrary() bool 161*333d2b36SAndroid Build Coastguard Worker} 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) nativeCoverage() bool { 164*333d2b36SAndroid Build Coastguard Worker return true 165*333d2b36SAndroid Build Coastguard Worker} 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) toc() android.OptionalPath { 168*333d2b36SAndroid Build Coastguard Worker return library.tocFile 169*333d2b36SAndroid Build Coastguard Worker} 170*333d2b36SAndroid Build Coastguard Worker 171*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) rlib() bool { 172*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.VariantIsRlib 173*333d2b36SAndroid Build Coastguard Worker} 174*333d2b36SAndroid Build Coastguard Worker 175*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) sysroot() bool { 176*333d2b36SAndroid Build Coastguard Worker return Bool(library.Properties.Sysroot) 177*333d2b36SAndroid Build Coastguard Worker} 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) dylib() bool { 180*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.VariantIsDylib 181*333d2b36SAndroid Build Coastguard Worker} 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) shared() bool { 184*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.VariantIsShared 185*333d2b36SAndroid Build Coastguard Worker} 186*333d2b36SAndroid Build Coastguard Worker 187*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) static() bool { 188*333d2b36SAndroid Build Coastguard Worker return false 189*333d2b36SAndroid Build Coastguard Worker} 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) source() bool { 192*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.VariantIsSource 193*333d2b36SAndroid Build Coastguard Worker} 194*333d2b36SAndroid Build Coastguard Worker 195*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) apexExclude() bool { 196*333d2b36SAndroid Build Coastguard Worker return Bool(library.Properties.Apex_exclude) 197*333d2b36SAndroid Build Coastguard Worker} 198*333d2b36SAndroid Build Coastguard Worker 199*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildRlib() bool { 200*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.BuildRlib && BoolDefault(library.Properties.Rlib.Enabled, true) 201*333d2b36SAndroid Build Coastguard Worker} 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildDylib() bool { 204*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.BuildDylib && BoolDefault(library.Properties.Dylib.Enabled, true) 205*333d2b36SAndroid Build Coastguard Worker} 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildShared() bool { 208*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.BuildShared && BoolDefault(library.Properties.Shared.Enabled, true) 209*333d2b36SAndroid Build Coastguard Worker} 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) buildStatic() bool { 212*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.BuildStatic && BoolDefault(library.Properties.Static.Enabled, true) 213*333d2b36SAndroid Build Coastguard Worker} 214*333d2b36SAndroid Build Coastguard Worker 215*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setRlib() { 216*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsRlib = true 217*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsDylib = false 218*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsShared = false 219*333d2b36SAndroid Build Coastguard Worker} 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setDylib() { 222*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsRlib = false 223*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsDylib = true 224*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsShared = false 225*333d2b36SAndroid Build Coastguard Worker} 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) rlibStd() bool { 228*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.VariantIsStaticStd 229*333d2b36SAndroid Build Coastguard Worker} 230*333d2b36SAndroid Build Coastguard Worker 231*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setRlibStd() { 232*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsStaticStd = true 233*333d2b36SAndroid Build Coastguard Worker} 234*333d2b36SAndroid Build Coastguard Worker 235*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setDylibStd() { 236*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsStaticStd = false 237*333d2b36SAndroid Build Coastguard Worker} 238*333d2b36SAndroid Build Coastguard Worker 239*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setShared() { 240*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsShared = true 241*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsRlib = false 242*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsDylib = false 243*333d2b36SAndroid Build Coastguard Worker} 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setStatic() { 246*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("static variant is not supported for rust modules, use the rlib variant instead")) 247*333d2b36SAndroid Build Coastguard Worker} 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) setSource() { 250*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsSource = true 251*333d2b36SAndroid Build Coastguard Worker} 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep { 254*333d2b36SAndroid Build Coastguard Worker if library.preferRlib() { 255*333d2b36SAndroid Build Coastguard Worker return rlibAutoDep 256*333d2b36SAndroid Build Coastguard Worker } else if library.rlib() || library.static() { 257*333d2b36SAndroid Build Coastguard Worker return rlibAutoDep 258*333d2b36SAndroid Build Coastguard Worker } else if library.dylib() || library.shared() { 259*333d2b36SAndroid Build Coastguard Worker return dylibAutoDep 260*333d2b36SAndroid Build Coastguard Worker } else { 261*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("autoDep called on library %q that has no enabled variants.", ctx.ModuleName())) 262*333d2b36SAndroid Build Coastguard Worker } 263*333d2b36SAndroid Build Coastguard Worker} 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) stdLinkage(ctx *depsContext) RustLinkage { 266*333d2b36SAndroid Build Coastguard Worker if library.static() || library.MutatedProperties.VariantIsStaticStd || (library.rlib() && library.isFFILibrary()) { 267*333d2b36SAndroid Build Coastguard Worker return RlibLinkage 268*333d2b36SAndroid Build Coastguard Worker } else if library.baseCompiler.preferRlib() { 269*333d2b36SAndroid Build Coastguard Worker return RlibLinkage 270*333d2b36SAndroid Build Coastguard Worker } 271*333d2b36SAndroid Build Coastguard Worker return DefaultLinkage 272*333d2b36SAndroid Build Coastguard Worker} 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*libraryDecorator)(nil) 275*333d2b36SAndroid Build Coastguard Workervar _ libraryInterface = (*libraryDecorator)(nil) 276*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*libraryDecorator)(nil) 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Worker// rust_library produces all Rust variants (rust_library_dylib and 279*333d2b36SAndroid Build Coastguard Worker// rust_library_rlib). 280*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryFactory() android.Module { 281*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostAndDeviceSupported) 282*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRust() 283*333d2b36SAndroid Build Coastguard Worker return module.Init() 284*333d2b36SAndroid Build Coastguard Worker} 285*333d2b36SAndroid Build Coastguard Worker 286*333d2b36SAndroid Build Coastguard Worker// rust_ffi produces all FFI variants (rust_ffi_shared, rust_ffi_static, and 287*333d2b36SAndroid Build Coastguard Worker// rust_ffi_rlib). 288*333d2b36SAndroid Build Coastguard Workerfunc RustFFIFactory() android.Module { 289*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostAndDeviceSupported) 290*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyFFI() 291*333d2b36SAndroid Build Coastguard Worker return module.Init() 292*333d2b36SAndroid Build Coastguard Worker} 293*333d2b36SAndroid Build Coastguard Worker 294*333d2b36SAndroid Build Coastguard Worker// rust_library_dylib produces a Rust dylib (Rust crate type "dylib"). 295*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryDylibFactory() android.Module { 296*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostAndDeviceSupported) 297*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyDylib() 298*333d2b36SAndroid Build Coastguard Worker return module.Init() 299*333d2b36SAndroid Build Coastguard Worker} 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker// rust_library_rlib produces an rlib (Rust crate type "rlib"). 302*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryRlibFactory() android.Module { 303*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostAndDeviceSupported) 304*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRlib() 305*333d2b36SAndroid Build Coastguard Worker return module.Init() 306*333d2b36SAndroid Build Coastguard Worker} 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Worker// rust_ffi_shared produces a shared library (Rust crate type 309*333d2b36SAndroid Build Coastguard Worker// "cdylib"). 310*333d2b36SAndroid Build Coastguard Workerfunc RustFFISharedFactory() android.Module { 311*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostAndDeviceSupported) 312*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyShared() 313*333d2b36SAndroid Build Coastguard Worker return module.Init() 314*333d2b36SAndroid Build Coastguard Worker} 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker// rust_library_host produces all Rust variants for the host 317*333d2b36SAndroid Build Coastguard Worker// (rust_library_dylib_host and rust_library_rlib_host). 318*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryHostFactory() android.Module { 319*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostSupported) 320*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRust() 321*333d2b36SAndroid Build Coastguard Worker return module.Init() 322*333d2b36SAndroid Build Coastguard Worker} 323*333d2b36SAndroid Build Coastguard Worker 324*333d2b36SAndroid Build Coastguard Worker// rust_ffi_host produces all FFI variants for the host 325*333d2b36SAndroid Build Coastguard Worker// (rust_ffi_rlib_host, rust_ffi_static_host, and rust_ffi_shared_host). 326*333d2b36SAndroid Build Coastguard Workerfunc RustFFIHostFactory() android.Module { 327*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostSupported) 328*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyFFI() 329*333d2b36SAndroid Build Coastguard Worker return module.Init() 330*333d2b36SAndroid Build Coastguard Worker} 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker// rust_library_dylib_host produces a dylib for the host (Rust crate 333*333d2b36SAndroid Build Coastguard Worker// type "dylib"). 334*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryDylibHostFactory() android.Module { 335*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostSupported) 336*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyDylib() 337*333d2b36SAndroid Build Coastguard Worker return module.Init() 338*333d2b36SAndroid Build Coastguard Worker} 339*333d2b36SAndroid Build Coastguard Worker 340*333d2b36SAndroid Build Coastguard Worker// rust_library_rlib_host produces an rlib for the host (Rust crate 341*333d2b36SAndroid Build Coastguard Worker// type "rlib"). 342*333d2b36SAndroid Build Coastguard Workerfunc RustLibraryRlibHostFactory() android.Module { 343*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostSupported) 344*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRlib() 345*333d2b36SAndroid Build Coastguard Worker return module.Init() 346*333d2b36SAndroid Build Coastguard Worker} 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker// rust_ffi_shared_host produces an shared library for the host (Rust 349*333d2b36SAndroid Build Coastguard Worker// crate type "cdylib"). 350*333d2b36SAndroid Build Coastguard Workerfunc RustFFISharedHostFactory() android.Module { 351*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostSupported) 352*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyShared() 353*333d2b36SAndroid Build Coastguard Worker return module.Init() 354*333d2b36SAndroid Build Coastguard Worker} 355*333d2b36SAndroid Build Coastguard Worker 356*333d2b36SAndroid Build Coastguard Worker// rust_ffi_rlib_host produces an rlib for the host (Rust crate 357*333d2b36SAndroid Build Coastguard Worker// type "rlib"). 358*333d2b36SAndroid Build Coastguard Workerfunc RustFFIRlibHostFactory() android.Module { 359*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostSupported) 360*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRlib() 361*333d2b36SAndroid Build Coastguard Worker 362*333d2b36SAndroid Build Coastguard Worker library.isFFI = true 363*333d2b36SAndroid Build Coastguard Worker return module.Init() 364*333d2b36SAndroid Build Coastguard Worker} 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Worker// rust_ffi_rlib produces an rlib (Rust crate type "rlib"). 367*333d2b36SAndroid Build Coastguard Workerfunc RustFFIRlibFactory() android.Module { 368*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(android.HostAndDeviceSupported) 369*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRlib() 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker library.isFFI = true 372*333d2b36SAndroid Build Coastguard Worker return module.Init() 373*333d2b36SAndroid Build Coastguard Worker} 374*333d2b36SAndroid Build Coastguard Worker 375*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyFFI() { 376*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildDylib = false 377*333d2b36SAndroid Build Coastguard Worker // we build rlibs for later static ffi linkage. 378*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildRlib = true 379*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildShared = true 380*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildStatic = false 381*333d2b36SAndroid Build Coastguard Worker 382*333d2b36SAndroid Build Coastguard Worker library.isFFI = true 383*333d2b36SAndroid Build Coastguard Worker} 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyRust() { 386*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildDylib = true 387*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildRlib = true 388*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildShared = false 389*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildStatic = false 390*333d2b36SAndroid Build Coastguard Worker} 391*333d2b36SAndroid Build Coastguard Worker 392*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyDylib() { 393*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildDylib = true 394*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildRlib = false 395*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildShared = false 396*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildStatic = false 397*333d2b36SAndroid Build Coastguard Worker} 398*333d2b36SAndroid Build Coastguard Worker 399*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyRlib() { 400*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildDylib = false 401*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildRlib = true 402*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildShared = false 403*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildStatic = false 404*333d2b36SAndroid Build Coastguard Worker} 405*333d2b36SAndroid Build Coastguard Worker 406*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyStatic() { 407*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildRlib = false 408*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildDylib = false 409*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildShared = false 410*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildStatic = true 411*333d2b36SAndroid Build Coastguard Worker 412*333d2b36SAndroid Build Coastguard Worker library.isFFI = true 413*333d2b36SAndroid Build Coastguard Worker} 414*333d2b36SAndroid Build Coastguard Worker 415*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) BuildOnlyShared() { 416*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildRlib = false 417*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildDylib = false 418*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildStatic = false 419*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.BuildShared = true 420*333d2b36SAndroid Build Coastguard Worker 421*333d2b36SAndroid Build Coastguard Worker library.isFFI = true 422*333d2b36SAndroid Build Coastguard Worker} 423*333d2b36SAndroid Build Coastguard Worker 424*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) isFFILibrary() bool { 425*333d2b36SAndroid Build Coastguard Worker return library.isFFI 426*333d2b36SAndroid Build Coastguard Worker} 427*333d2b36SAndroid Build Coastguard Worker 428*333d2b36SAndroid Build Coastguard Workerfunc NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { 429*333d2b36SAndroid Build Coastguard Worker module := newModule(hod, android.MultilibBoth) 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Worker library := &libraryDecorator{ 432*333d2b36SAndroid Build Coastguard Worker MutatedProperties: LibraryMutatedProperties{ 433*333d2b36SAndroid Build Coastguard Worker BuildDylib: false, 434*333d2b36SAndroid Build Coastguard Worker BuildRlib: false, 435*333d2b36SAndroid Build Coastguard Worker BuildShared: false, 436*333d2b36SAndroid Build Coastguard Worker BuildStatic: false, 437*333d2b36SAndroid Build Coastguard Worker }, 438*333d2b36SAndroid Build Coastguard Worker baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem), 439*333d2b36SAndroid Build Coastguard Worker flagExporter: NewFlagExporter(), 440*333d2b36SAndroid Build Coastguard Worker } 441*333d2b36SAndroid Build Coastguard Worker 442*333d2b36SAndroid Build Coastguard Worker module.compiler = library 443*333d2b36SAndroid Build Coastguard Worker 444*333d2b36SAndroid Build Coastguard Worker return module, library 445*333d2b36SAndroid Build Coastguard Worker} 446*333d2b36SAndroid Build Coastguard Worker 447*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compilerProps() []interface{} { 448*333d2b36SAndroid Build Coastguard Worker return append(library.baseCompiler.compilerProps(), 449*333d2b36SAndroid Build Coastguard Worker &library.Properties, 450*333d2b36SAndroid Build Coastguard Worker &library.MutatedProperties, 451*333d2b36SAndroid Build Coastguard Worker &library.stripper.StripProperties) 452*333d2b36SAndroid Build Coastguard Worker} 453*333d2b36SAndroid Build Coastguard Worker 454*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { 455*333d2b36SAndroid Build Coastguard Worker deps = library.baseCompiler.compilerDeps(ctx, deps) 456*333d2b36SAndroid Build Coastguard Worker 457*333d2b36SAndroid Build Coastguard Worker if library.dylib() || library.shared() { 458*333d2b36SAndroid Build Coastguard Worker if ctx.toolchain().Bionic() { 459*333d2b36SAndroid Build Coastguard Worker deps = bionicDeps(ctx, deps, false) 460*333d2b36SAndroid Build Coastguard Worker deps.CrtBegin = []string{"crtbegin_so"} 461*333d2b36SAndroid Build Coastguard Worker deps.CrtEnd = []string{"crtend_so"} 462*333d2b36SAndroid Build Coastguard Worker } else if ctx.Os() == android.LinuxMusl { 463*333d2b36SAndroid Build Coastguard Worker deps = muslDeps(ctx, deps, false) 464*333d2b36SAndroid Build Coastguard Worker deps.CrtBegin = []string{"libc_musl_crtbegin_so"} 465*333d2b36SAndroid Build Coastguard Worker deps.CrtEnd = []string{"libc_musl_crtend_so"} 466*333d2b36SAndroid Build Coastguard Worker } 467*333d2b36SAndroid Build Coastguard Worker } 468*333d2b36SAndroid Build Coastguard Worker 469*333d2b36SAndroid Build Coastguard Worker return deps 470*333d2b36SAndroid Build Coastguard Worker} 471*333d2b36SAndroid Build Coastguard Worker 472*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) sharedLibFilename(ctx ModuleContext) string { 473*333d2b36SAndroid Build Coastguard Worker return library.getStem(ctx) + ctx.toolchain().SharedLibSuffix() 474*333d2b36SAndroid Build Coastguard Worker} 475*333d2b36SAndroid Build Coastguard Worker 476*333d2b36SAndroid Build Coastguard Worker// Library cfg flags common to all variants 477*333d2b36SAndroid Build Coastguard Workerfunc CommonLibraryCfgFlags(ctx android.ModuleContext, flags Flags) Flags { 478*333d2b36SAndroid Build Coastguard Worker return flags 479*333d2b36SAndroid Build Coastguard Worker} 480*333d2b36SAndroid Build Coastguard Worker 481*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) cfgFlags(ctx ModuleContext, flags Flags) Flags { 482*333d2b36SAndroid Build Coastguard Worker flags = library.baseCompiler.cfgFlags(ctx, flags) 483*333d2b36SAndroid Build Coastguard Worker flags = CommonLibraryCfgFlags(ctx, flags) 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker cfgs := library.baseCompiler.Properties.Cfgs.GetOrDefault(ctx, nil) 486*333d2b36SAndroid Build Coastguard Worker 487*333d2b36SAndroid Build Coastguard Worker if library.dylib() { 488*333d2b36SAndroid Build Coastguard Worker // We need to add a dependency on std in order to link crates as dylibs. 489*333d2b36SAndroid Build Coastguard Worker // The hack to add this dependency is guarded by the following cfg so 490*333d2b36SAndroid Build Coastguard Worker // that we don't force a dependency when it isn't needed. 491*333d2b36SAndroid Build Coastguard Worker cfgs = append(cfgs, "android_dylib") 492*333d2b36SAndroid Build Coastguard Worker } 493*333d2b36SAndroid Build Coastguard Worker 494*333d2b36SAndroid Build Coastguard Worker cfgFlags := cfgsToFlags(cfgs) 495*333d2b36SAndroid Build Coastguard Worker 496*333d2b36SAndroid Build Coastguard Worker flags.RustFlags = append(flags.RustFlags, cfgFlags...) 497*333d2b36SAndroid Build Coastguard Worker flags.RustdocFlags = append(flags.RustdocFlags, cfgFlags...) 498*333d2b36SAndroid Build Coastguard Worker 499*333d2b36SAndroid Build Coastguard Worker return flags 500*333d2b36SAndroid Build Coastguard Worker} 501*333d2b36SAndroid Build Coastguard Worker 502*333d2b36SAndroid Build Coastguard Worker// Common flags applied to all libraries irrespective of properties or variant should be included here 503*333d2b36SAndroid Build Coastguard Workerfunc CommonLibraryCompilerFlags(ctx android.ModuleContext, flags Flags) Flags { 504*333d2b36SAndroid Build Coastguard Worker flags.RustFlags = append(flags.RustFlags, "-C metadata="+ctx.ModuleName()) 505*333d2b36SAndroid Build Coastguard Worker 506*333d2b36SAndroid Build Coastguard Worker return flags 507*333d2b36SAndroid Build Coastguard Worker} 508*333d2b36SAndroid Build Coastguard Worker 509*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { 510*333d2b36SAndroid Build Coastguard Worker flags = library.baseCompiler.compilerFlags(ctx, flags) 511*333d2b36SAndroid Build Coastguard Worker 512*333d2b36SAndroid Build Coastguard Worker flags = CommonLibraryCompilerFlags(ctx, flags) 513*333d2b36SAndroid Build Coastguard Worker 514*333d2b36SAndroid Build Coastguard Worker if library.isFFI { 515*333d2b36SAndroid Build Coastguard Worker library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...) 516*333d2b36SAndroid Build Coastguard Worker library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Export_include_dirs)...) 517*333d2b36SAndroid Build Coastguard Worker } 518*333d2b36SAndroid Build Coastguard Worker 519*333d2b36SAndroid Build Coastguard Worker if library.shared() { 520*333d2b36SAndroid Build Coastguard Worker if ctx.Darwin() { 521*333d2b36SAndroid Build Coastguard Worker flags.LinkFlags = append( 522*333d2b36SAndroid Build Coastguard Worker flags.LinkFlags, 523*333d2b36SAndroid Build Coastguard Worker "-dynamic_lib", 524*333d2b36SAndroid Build Coastguard Worker "-install_name @rpath/"+library.sharedLibFilename(ctx), 525*333d2b36SAndroid Build Coastguard Worker ) 526*333d2b36SAndroid Build Coastguard Worker } else { 527*333d2b36SAndroid Build Coastguard Worker flags.LinkFlags = append(flags.LinkFlags, "-Wl,-soname="+library.sharedLibFilename(ctx)) 528*333d2b36SAndroid Build Coastguard Worker } 529*333d2b36SAndroid Build Coastguard Worker } 530*333d2b36SAndroid Build Coastguard Worker 531*333d2b36SAndroid Build Coastguard Worker return flags 532*333d2b36SAndroid Build Coastguard Worker} 533*333d2b36SAndroid Build Coastguard Worker 534*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { 535*333d2b36SAndroid Build Coastguard Worker var outputFile android.ModuleOutPath 536*333d2b36SAndroid Build Coastguard Worker var ret buildOutput 537*333d2b36SAndroid Build Coastguard Worker var fileName string 538*333d2b36SAndroid Build Coastguard Worker crateRootPath := crateRootPath(ctx, library) 539*333d2b36SAndroid Build Coastguard Worker 540*333d2b36SAndroid Build Coastguard Worker if library.sourceProvider != nil { 541*333d2b36SAndroid Build Coastguard Worker deps.srcProviderFiles = append(deps.srcProviderFiles, library.sourceProvider.Srcs()...) 542*333d2b36SAndroid Build Coastguard Worker } 543*333d2b36SAndroid Build Coastguard Worker 544*333d2b36SAndroid Build Coastguard Worker // Ensure link dirs are not duplicated 545*333d2b36SAndroid Build Coastguard Worker deps.linkDirs = android.FirstUniqueStrings(deps.linkDirs) 546*333d2b36SAndroid Build Coastguard Worker 547*333d2b36SAndroid Build Coastguard Worker // Calculate output filename 548*333d2b36SAndroid Build Coastguard Worker if library.rlib() { 549*333d2b36SAndroid Build Coastguard Worker fileName = library.getStem(ctx) + ctx.toolchain().RlibSuffix() 550*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, fileName) 551*333d2b36SAndroid Build Coastguard Worker ret.outputFile = outputFile 552*333d2b36SAndroid Build Coastguard Worker } else if library.dylib() { 553*333d2b36SAndroid Build Coastguard Worker fileName = library.getStem(ctx) + ctx.toolchain().DylibSuffix() 554*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, fileName) 555*333d2b36SAndroid Build Coastguard Worker ret.outputFile = outputFile 556*333d2b36SAndroid Build Coastguard Worker } else if library.static() { 557*333d2b36SAndroid Build Coastguard Worker fileName = library.getStem(ctx) + ctx.toolchain().StaticLibSuffix() 558*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, fileName) 559*333d2b36SAndroid Build Coastguard Worker ret.outputFile = outputFile 560*333d2b36SAndroid Build Coastguard Worker } else if library.shared() { 561*333d2b36SAndroid Build Coastguard Worker fileName = library.sharedLibFilename(ctx) 562*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, fileName) 563*333d2b36SAndroid Build Coastguard Worker ret.outputFile = outputFile 564*333d2b36SAndroid Build Coastguard Worker } 565*333d2b36SAndroid Build Coastguard Worker 566*333d2b36SAndroid Build Coastguard Worker if !library.rlib() && !library.static() && library.stripper.NeedsStrip(ctx) { 567*333d2b36SAndroid Build Coastguard Worker strippedOutputFile := outputFile 568*333d2b36SAndroid Build Coastguard Worker outputFile = android.PathForModuleOut(ctx, "unstripped", fileName) 569*333d2b36SAndroid Build Coastguard Worker library.stripper.StripExecutableOrSharedLib(ctx, outputFile, strippedOutputFile) 570*333d2b36SAndroid Build Coastguard Worker 571*333d2b36SAndroid Build Coastguard Worker library.baseCompiler.strippedOutputFile = android.OptionalPathForPath(strippedOutputFile) 572*333d2b36SAndroid Build Coastguard Worker } 573*333d2b36SAndroid Build Coastguard Worker library.baseCompiler.unstrippedOutputFile = outputFile 574*333d2b36SAndroid Build Coastguard Worker 575*333d2b36SAndroid Build Coastguard Worker flags.RustFlags = append(flags.RustFlags, deps.depFlags...) 576*333d2b36SAndroid Build Coastguard Worker flags.LinkFlags = append(flags.LinkFlags, deps.depLinkFlags...) 577*333d2b36SAndroid Build Coastguard Worker flags.LinkFlags = append(flags.LinkFlags, deps.linkObjects...) 578*333d2b36SAndroid Build Coastguard Worker 579*333d2b36SAndroid Build Coastguard Worker if library.dylib() { 580*333d2b36SAndroid Build Coastguard Worker // We need prefer-dynamic for now to avoid linking in the static stdlib. See: 581*333d2b36SAndroid Build Coastguard Worker // https://github.com/rust-lang/rust/issues/19680 582*333d2b36SAndroid Build Coastguard Worker // https://github.com/rust-lang/rust/issues/34909 583*333d2b36SAndroid Build Coastguard Worker flags.RustFlags = append(flags.RustFlags, "-C prefer-dynamic") 584*333d2b36SAndroid Build Coastguard Worker } 585*333d2b36SAndroid Build Coastguard Worker 586*333d2b36SAndroid Build Coastguard Worker // Call the appropriate builder for this library type 587*333d2b36SAndroid Build Coastguard Worker if library.rlib() { 588*333d2b36SAndroid Build Coastguard Worker ret.kytheFile = TransformSrctoRlib(ctx, crateRootPath, deps, flags, outputFile).kytheFile 589*333d2b36SAndroid Build Coastguard Worker } else if library.dylib() { 590*333d2b36SAndroid Build Coastguard Worker ret.kytheFile = TransformSrctoDylib(ctx, crateRootPath, deps, flags, outputFile).kytheFile 591*333d2b36SAndroid Build Coastguard Worker } else if library.static() { 592*333d2b36SAndroid Build Coastguard Worker ret.kytheFile = TransformSrctoStatic(ctx, crateRootPath, deps, flags, outputFile).kytheFile 593*333d2b36SAndroid Build Coastguard Worker } else if library.shared() { 594*333d2b36SAndroid Build Coastguard Worker ret.kytheFile = TransformSrctoShared(ctx, crateRootPath, deps, flags, outputFile).kytheFile 595*333d2b36SAndroid Build Coastguard Worker } 596*333d2b36SAndroid Build Coastguard Worker 597*333d2b36SAndroid Build Coastguard Worker if library.rlib() || library.dylib() { 598*333d2b36SAndroid Build Coastguard Worker library.flagExporter.exportLinkDirs(deps.linkDirs...) 599*333d2b36SAndroid Build Coastguard Worker library.flagExporter.exportLinkObjects(deps.linkObjects...) 600*333d2b36SAndroid Build Coastguard Worker } 601*333d2b36SAndroid Build Coastguard Worker 602*333d2b36SAndroid Build Coastguard Worker // Since we have FFI rlibs, we need to collect their includes as well 603*333d2b36SAndroid Build Coastguard Worker if library.static() || library.shared() || library.rlib() { 604*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, cc.FlagExporterInfoProvider, cc.FlagExporterInfo{ 605*333d2b36SAndroid Build Coastguard Worker IncludeDirs: android.FirstUniquePaths(library.includeDirs), 606*333d2b36SAndroid Build Coastguard Worker }) 607*333d2b36SAndroid Build Coastguard Worker } 608*333d2b36SAndroid Build Coastguard Worker 609*333d2b36SAndroid Build Coastguard Worker if library.shared() { 610*333d2b36SAndroid Build Coastguard Worker // Optimize out relinking against shared libraries whose interface hasn't changed by 611*333d2b36SAndroid Build Coastguard Worker // depending on a table of contents file instead of the library itself. 612*333d2b36SAndroid Build Coastguard Worker tocFile := outputFile.ReplaceExtension(ctx, flags.Toolchain.SharedLibSuffix()[1:]+".toc") 613*333d2b36SAndroid Build Coastguard Worker library.tocFile = android.OptionalPathForPath(tocFile) 614*333d2b36SAndroid Build Coastguard Worker cc.TransformSharedObjectToToc(ctx, outputFile, tocFile) 615*333d2b36SAndroid Build Coastguard Worker 616*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, cc.SharedLibraryInfoProvider, cc.SharedLibraryInfo{ 617*333d2b36SAndroid Build Coastguard Worker TableOfContents: android.OptionalPathForPath(tocFile), 618*333d2b36SAndroid Build Coastguard Worker SharedLibrary: outputFile, 619*333d2b36SAndroid Build Coastguard Worker Target: ctx.Target(), 620*333d2b36SAndroid Build Coastguard Worker // TODO: when rust supports stubs uses the stubs state rather than inferring it from 621*333d2b36SAndroid Build Coastguard Worker // apex_exclude. 622*333d2b36SAndroid Build Coastguard Worker IsStubs: Bool(library.Properties.Apex_exclude), 623*333d2b36SAndroid Build Coastguard Worker }) 624*333d2b36SAndroid Build Coastguard Worker } 625*333d2b36SAndroid Build Coastguard Worker 626*333d2b36SAndroid Build Coastguard Worker if library.static() { 627*333d2b36SAndroid Build Coastguard Worker depSet := depset.NewBuilder[android.Path](depset.TOPOLOGICAL).Direct(outputFile).Build() 628*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, cc.StaticLibraryInfoProvider, cc.StaticLibraryInfo{ 629*333d2b36SAndroid Build Coastguard Worker StaticLibrary: outputFile, 630*333d2b36SAndroid Build Coastguard Worker 631*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibrariesForOrdering: depSet, 632*333d2b36SAndroid Build Coastguard Worker }) 633*333d2b36SAndroid Build Coastguard Worker } 634*333d2b36SAndroid Build Coastguard Worker 635*333d2b36SAndroid Build Coastguard Worker library.flagExporter.setProvider(ctx) 636*333d2b36SAndroid Build Coastguard Worker 637*333d2b36SAndroid Build Coastguard Worker return ret 638*333d2b36SAndroid Build Coastguard Worker} 639*333d2b36SAndroid Build Coastguard Worker 640*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) checkedCrateRootPath() (android.Path, error) { 641*333d2b36SAndroid Build Coastguard Worker if library.sourceProvider != nil { 642*333d2b36SAndroid Build Coastguard Worker srcs := library.sourceProvider.Srcs() 643*333d2b36SAndroid Build Coastguard Worker if len(srcs) == 0 { 644*333d2b36SAndroid Build Coastguard Worker return nil, errors.New("Source provider generated 0 sources") 645*333d2b36SAndroid Build Coastguard Worker } 646*333d2b36SAndroid Build Coastguard Worker // Assume the first source from the source provider is the library entry point. 647*333d2b36SAndroid Build Coastguard Worker return srcs[0], nil 648*333d2b36SAndroid Build Coastguard Worker } else { 649*333d2b36SAndroid Build Coastguard Worker return library.baseCompiler.checkedCrateRootPath() 650*333d2b36SAndroid Build Coastguard Worker } 651*333d2b36SAndroid Build Coastguard Worker} 652*333d2b36SAndroid Build Coastguard Worker 653*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) rustdoc(ctx ModuleContext, flags Flags, 654*333d2b36SAndroid Build Coastguard Worker deps PathDeps) android.OptionalPath { 655*333d2b36SAndroid Build Coastguard Worker // rustdoc has builtin support for documenting config specific information 656*333d2b36SAndroid Build Coastguard Worker // regardless of the actual config it was given 657*333d2b36SAndroid Build Coastguard Worker // (https://doc.rust-lang.org/rustdoc/advanced-features.html#cfgdoc-documenting-platform-specific-or-feature-specific-information), 658*333d2b36SAndroid Build Coastguard Worker // so we generate the rustdoc for only the primary module so that we have a 659*333d2b36SAndroid Build Coastguard Worker // single set of docs to refer to. 660*333d2b36SAndroid Build Coastguard Worker if ctx.Module() != ctx.PrimaryModule() { 661*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 662*333d2b36SAndroid Build Coastguard Worker } 663*333d2b36SAndroid Build Coastguard Worker 664*333d2b36SAndroid Build Coastguard Worker return android.OptionalPathForPath(Rustdoc(ctx, crateRootPath(ctx, library), 665*333d2b36SAndroid Build Coastguard Worker deps, flags)) 666*333d2b36SAndroid Build Coastguard Worker} 667*333d2b36SAndroid Build Coastguard Worker 668*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) getStem(ctx ModuleContext) string { 669*333d2b36SAndroid Build Coastguard Worker stem := library.baseCompiler.getStemWithoutSuffix(ctx) 670*333d2b36SAndroid Build Coastguard Worker validateLibraryStem(ctx, stem, library.crateName()) 671*333d2b36SAndroid Build Coastguard Worker 672*333d2b36SAndroid Build Coastguard Worker return stem + String(library.baseCompiler.Properties.Suffix) 673*333d2b36SAndroid Build Coastguard Worker} 674*333d2b36SAndroid Build Coastguard Worker 675*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) install(ctx ModuleContext) { 676*333d2b36SAndroid Build Coastguard Worker // Only shared and dylib variants make sense to install. 677*333d2b36SAndroid Build Coastguard Worker if library.shared() || library.dylib() { 678*333d2b36SAndroid Build Coastguard Worker library.baseCompiler.install(ctx) 679*333d2b36SAndroid Build Coastguard Worker } 680*333d2b36SAndroid Build Coastguard Worker} 681*333d2b36SAndroid Build Coastguard Worker 682*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) Disabled() bool { 683*333d2b36SAndroid Build Coastguard Worker return library.MutatedProperties.VariantIsDisabled 684*333d2b36SAndroid Build Coastguard Worker} 685*333d2b36SAndroid Build Coastguard Worker 686*333d2b36SAndroid Build Coastguard Workerfunc (library *libraryDecorator) SetDisabled() { 687*333d2b36SAndroid Build Coastguard Worker library.MutatedProperties.VariantIsDisabled = true 688*333d2b36SAndroid Build Coastguard Worker} 689*333d2b36SAndroid Build Coastguard Worker 690*333d2b36SAndroid Build Coastguard Workervar validCrateName = regexp.MustCompile("[^a-zA-Z0-9_]+") 691*333d2b36SAndroid Build Coastguard Worker 692*333d2b36SAndroid Build Coastguard Workerfunc validateLibraryStem(ctx BaseModuleContext, filename string, crate_name string) { 693*333d2b36SAndroid Build Coastguard Worker if crate_name == "" { 694*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("crate_name", "crate_name must be defined.") 695*333d2b36SAndroid Build Coastguard Worker } 696*333d2b36SAndroid Build Coastguard Worker 697*333d2b36SAndroid Build Coastguard Worker // crate_names are used for the library output file, and rustc expects these 698*333d2b36SAndroid Build Coastguard Worker // to be alphanumeric with underscores allowed. 699*333d2b36SAndroid Build Coastguard Worker if validCrateName.MatchString(crate_name) { 700*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("crate_name", 701*333d2b36SAndroid Build Coastguard Worker "library crate_names must be alphanumeric with underscores allowed") 702*333d2b36SAndroid Build Coastguard Worker } 703*333d2b36SAndroid Build Coastguard Worker 704*333d2b36SAndroid Build Coastguard Worker // Libraries are expected to begin with "lib" followed by the crate_name 705*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(filename, "lib"+crate_name) { 706*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Invalid name or stem property; library filenames must start with lib<crate_name>") 707*333d2b36SAndroid Build Coastguard Worker } 708*333d2b36SAndroid Build Coastguard Worker} 709*333d2b36SAndroid Build Coastguard Worker 710*333d2b36SAndroid Build Coastguard Workertype libraryTransitionMutator struct{} 711*333d2b36SAndroid Build Coastguard Worker 712*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) Split(ctx android.BaseModuleContext) []string { 713*333d2b36SAndroid Build Coastguard Worker m, ok := ctx.Module().(*Module) 714*333d2b36SAndroid Build Coastguard Worker if !ok || m.compiler == nil { 715*333d2b36SAndroid Build Coastguard Worker return []string{""} 716*333d2b36SAndroid Build Coastguard Worker } 717*333d2b36SAndroid Build Coastguard Worker library, ok := m.compiler.(libraryInterface) 718*333d2b36SAndroid Build Coastguard Worker if !ok { 719*333d2b36SAndroid Build Coastguard Worker return []string{""} 720*333d2b36SAndroid Build Coastguard Worker } 721*333d2b36SAndroid Build Coastguard Worker 722*333d2b36SAndroid Build Coastguard Worker // Don't produce rlib/dylib/source variants for shared or static variants 723*333d2b36SAndroid Build Coastguard Worker if library.shared() || library.static() { 724*333d2b36SAndroid Build Coastguard Worker return []string{""} 725*333d2b36SAndroid Build Coastguard Worker } 726*333d2b36SAndroid Build Coastguard Worker 727*333d2b36SAndroid Build Coastguard Worker var variants []string 728*333d2b36SAndroid Build Coastguard Worker // The source variant is used for SourceProvider modules. The other variants (i.e. rlib and dylib) 729*333d2b36SAndroid Build Coastguard Worker // depend on this variant. It must be the first variant to be declared. 730*333d2b36SAndroid Build Coastguard Worker if m.sourceProvider != nil { 731*333d2b36SAndroid Build Coastguard Worker variants = append(variants, sourceVariation) 732*333d2b36SAndroid Build Coastguard Worker } 733*333d2b36SAndroid Build Coastguard Worker if library.buildRlib() { 734*333d2b36SAndroid Build Coastguard Worker variants = append(variants, rlibVariation) 735*333d2b36SAndroid Build Coastguard Worker } 736*333d2b36SAndroid Build Coastguard Worker if library.buildDylib() { 737*333d2b36SAndroid Build Coastguard Worker variants = append(variants, dylibVariation) 738*333d2b36SAndroid Build Coastguard Worker } 739*333d2b36SAndroid Build Coastguard Worker 740*333d2b36SAndroid Build Coastguard Worker if len(variants) == 0 { 741*333d2b36SAndroid Build Coastguard Worker return []string{""} 742*333d2b36SAndroid Build Coastguard Worker } 743*333d2b36SAndroid Build Coastguard Worker 744*333d2b36SAndroid Build Coastguard Worker return variants 745*333d2b36SAndroid Build Coastguard Worker} 746*333d2b36SAndroid Build Coastguard Worker 747*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { 748*333d2b36SAndroid Build Coastguard Worker return "" 749*333d2b36SAndroid Build Coastguard Worker} 750*333d2b36SAndroid Build Coastguard Worker 751*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { 752*333d2b36SAndroid Build Coastguard Worker m, ok := ctx.Module().(*Module) 753*333d2b36SAndroid Build Coastguard Worker if !ok || m.compiler == nil { 754*333d2b36SAndroid Build Coastguard Worker return "" 755*333d2b36SAndroid Build Coastguard Worker } 756*333d2b36SAndroid Build Coastguard Worker library, ok := m.compiler.(libraryInterface) 757*333d2b36SAndroid Build Coastguard Worker if !ok { 758*333d2b36SAndroid Build Coastguard Worker return "" 759*333d2b36SAndroid Build Coastguard Worker } 760*333d2b36SAndroid Build Coastguard Worker 761*333d2b36SAndroid Build Coastguard Worker if incomingVariation == "" { 762*333d2b36SAndroid Build Coastguard Worker if m.sourceProvider != nil { 763*333d2b36SAndroid Build Coastguard Worker return sourceVariation 764*333d2b36SAndroid Build Coastguard Worker } 765*333d2b36SAndroid Build Coastguard Worker if library.shared() { 766*333d2b36SAndroid Build Coastguard Worker return "" 767*333d2b36SAndroid Build Coastguard Worker } 768*333d2b36SAndroid Build Coastguard Worker if library.buildRlib() { 769*333d2b36SAndroid Build Coastguard Worker return rlibVariation 770*333d2b36SAndroid Build Coastguard Worker } 771*333d2b36SAndroid Build Coastguard Worker if library.buildDylib() { 772*333d2b36SAndroid Build Coastguard Worker return dylibVariation 773*333d2b36SAndroid Build Coastguard Worker } 774*333d2b36SAndroid Build Coastguard Worker } 775*333d2b36SAndroid Build Coastguard Worker return incomingVariation 776*333d2b36SAndroid Build Coastguard Worker} 777*333d2b36SAndroid Build Coastguard Worker 778*333d2b36SAndroid Build Coastguard Workerfunc (libraryTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { 779*333d2b36SAndroid Build Coastguard Worker m, ok := ctx.Module().(*Module) 780*333d2b36SAndroid Build Coastguard Worker if !ok || m.compiler == nil { 781*333d2b36SAndroid Build Coastguard Worker return 782*333d2b36SAndroid Build Coastguard Worker } 783*333d2b36SAndroid Build Coastguard Worker library, ok := m.compiler.(libraryInterface) 784*333d2b36SAndroid Build Coastguard Worker if !ok { 785*333d2b36SAndroid Build Coastguard Worker return 786*333d2b36SAndroid Build Coastguard Worker } 787*333d2b36SAndroid Build Coastguard Worker 788*333d2b36SAndroid Build Coastguard Worker switch variation { 789*333d2b36SAndroid Build Coastguard Worker case rlibVariation: 790*333d2b36SAndroid Build Coastguard Worker library.setRlib() 791*333d2b36SAndroid Build Coastguard Worker case dylibVariation: 792*333d2b36SAndroid Build Coastguard Worker library.setDylib() 793*333d2b36SAndroid Build Coastguard Worker if m.ModuleBase.ImageVariation().Variation == android.VendorRamdiskVariation { 794*333d2b36SAndroid Build Coastguard Worker // TODO(b/165791368) 795*333d2b36SAndroid Build Coastguard Worker // Disable dylib Vendor Ramdisk variations until we support these. 796*333d2b36SAndroid Build Coastguard Worker m.Disable() 797*333d2b36SAndroid Build Coastguard Worker } 798*333d2b36SAndroid Build Coastguard Worker 799*333d2b36SAndroid Build Coastguard Worker case sourceVariation: 800*333d2b36SAndroid Build Coastguard Worker library.setSource() 801*333d2b36SAndroid Build Coastguard Worker // The source variant does not produce any library. 802*333d2b36SAndroid Build Coastguard Worker // Disable the compilation steps. 803*333d2b36SAndroid Build Coastguard Worker m.compiler.SetDisabled() 804*333d2b36SAndroid Build Coastguard Worker } 805*333d2b36SAndroid Build Coastguard Worker 806*333d2b36SAndroid Build Coastguard Worker // If a source variant is created, add an inter-variant dependency 807*333d2b36SAndroid Build Coastguard Worker // between the other variants and the source variant. 808*333d2b36SAndroid Build Coastguard Worker if m.sourceProvider != nil && variation != sourceVariation { 809*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies( 810*333d2b36SAndroid Build Coastguard Worker []blueprint.Variation{ 811*333d2b36SAndroid Build Coastguard Worker {"rust_libraries", sourceVariation}, 812*333d2b36SAndroid Build Coastguard Worker }, 813*333d2b36SAndroid Build Coastguard Worker sourceDepTag, ctx.ModuleName()) 814*333d2b36SAndroid Build Coastguard Worker } 815*333d2b36SAndroid Build Coastguard Worker} 816*333d2b36SAndroid Build Coastguard Worker 817*333d2b36SAndroid Build Coastguard Workertype libstdTransitionMutator struct{} 818*333d2b36SAndroid Build Coastguard Worker 819*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) Split(ctx android.BaseModuleContext) []string { 820*333d2b36SAndroid Build Coastguard Worker if m, ok := ctx.Module().(*Module); ok && m.compiler != nil && !m.compiler.Disabled() { 821*333d2b36SAndroid Build Coastguard Worker // Only create a variant if a library is actually being built. 822*333d2b36SAndroid Build Coastguard Worker if library, ok := m.compiler.(libraryInterface); ok { 823*333d2b36SAndroid Build Coastguard Worker if library.rlib() && !library.sysroot() { 824*333d2b36SAndroid Build Coastguard Worker if library.isFFILibrary() { 825*333d2b36SAndroid Build Coastguard Worker return []string{"rlib-std"} 826*333d2b36SAndroid Build Coastguard Worker } else { 827*333d2b36SAndroid Build Coastguard Worker return []string{"rlib-std", "dylib-std"} 828*333d2b36SAndroid Build Coastguard Worker } 829*333d2b36SAndroid Build Coastguard Worker } 830*333d2b36SAndroid Build Coastguard Worker } 831*333d2b36SAndroid Build Coastguard Worker } 832*333d2b36SAndroid Build Coastguard Worker return []string{""} 833*333d2b36SAndroid Build Coastguard Worker} 834*333d2b36SAndroid Build Coastguard Worker 835*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { 836*333d2b36SAndroid Build Coastguard Worker return "" 837*333d2b36SAndroid Build Coastguard Worker} 838*333d2b36SAndroid Build Coastguard Worker 839*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { 840*333d2b36SAndroid Build Coastguard Worker if m, ok := ctx.Module().(*Module); ok && m.compiler != nil && !m.compiler.Disabled() { 841*333d2b36SAndroid Build Coastguard Worker if library, ok := m.compiler.(libraryInterface); ok { 842*333d2b36SAndroid Build Coastguard Worker if library.shared() { 843*333d2b36SAndroid Build Coastguard Worker return "" 844*333d2b36SAndroid Build Coastguard Worker } 845*333d2b36SAndroid Build Coastguard Worker if library.rlib() && !library.sysroot() { 846*333d2b36SAndroid Build Coastguard Worker if incomingVariation != "" { 847*333d2b36SAndroid Build Coastguard Worker return incomingVariation 848*333d2b36SAndroid Build Coastguard Worker } 849*333d2b36SAndroid Build Coastguard Worker return "rlib-std" 850*333d2b36SAndroid Build Coastguard Worker } 851*333d2b36SAndroid Build Coastguard Worker } 852*333d2b36SAndroid Build Coastguard Worker } 853*333d2b36SAndroid Build Coastguard Worker return "" 854*333d2b36SAndroid Build Coastguard Worker} 855*333d2b36SAndroid Build Coastguard Worker 856*333d2b36SAndroid Build Coastguard Workerfunc (libstdTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { 857*333d2b36SAndroid Build Coastguard Worker if variation == "rlib-std" { 858*333d2b36SAndroid Build Coastguard Worker rlib := ctx.Module().(*Module) 859*333d2b36SAndroid Build Coastguard Worker rlib.compiler.(libraryInterface).setRlibStd() 860*333d2b36SAndroid Build Coastguard Worker rlib.Properties.RustSubName += RlibStdlibSuffix 861*333d2b36SAndroid Build Coastguard Worker } else if variation == "dylib-std" { 862*333d2b36SAndroid Build Coastguard Worker dylib := ctx.Module().(*Module) 863*333d2b36SAndroid Build Coastguard Worker dylib.compiler.(libraryInterface).setDylibStd() 864*333d2b36SAndroid Build Coastguard Worker if dylib.ModuleBase.ImageVariation().Variation == android.VendorRamdiskVariation { 865*333d2b36SAndroid Build Coastguard Worker // TODO(b/165791368) 866*333d2b36SAndroid Build Coastguard Worker // Disable rlibs that link against dylib-std on vendor ramdisk variations until those dylib 867*333d2b36SAndroid Build Coastguard Worker // variants are properly supported. 868*333d2b36SAndroid Build Coastguard Worker dylib.Disable() 869*333d2b36SAndroid Build Coastguard Worker } 870*333d2b36SAndroid Build Coastguard Worker } 871*333d2b36SAndroid Build Coastguard Worker} 872