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 "android/soong/android" 19*333d2b36SAndroid Build Coastguard Worker) 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Workerfunc init() { 22*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_prebuilt_library", PrebuiltLibraryFactory) 23*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_prebuilt_dylib", PrebuiltDylibFactory) 24*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_prebuilt_rlib", PrebuiltRlibFactory) 25*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("rust_prebuilt_proc_macro", PrebuiltProcMacroFactory) 26*333d2b36SAndroid Build Coastguard Worker} 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workertype PrebuiltProperties struct { 29*333d2b36SAndroid Build Coastguard Worker // path to the prebuilt file 30*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 31*333d2b36SAndroid Build Coastguard Worker // directories containing associated rlib dependencies 32*333d2b36SAndroid Build Coastguard Worker Link_dirs []string `android:"path,arch_variant"` 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workertype prebuiltLibraryDecorator struct { 36*333d2b36SAndroid Build Coastguard Worker android.Prebuilt 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker *libraryDecorator 39*333d2b36SAndroid Build Coastguard Worker Properties PrebuiltProperties 40*333d2b36SAndroid Build Coastguard Worker} 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workertype prebuiltProcMacroDecorator struct { 43*333d2b36SAndroid Build Coastguard Worker android.Prebuilt 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker *procMacroDecorator 46*333d2b36SAndroid Build Coastguard Worker Properties PrebuiltProperties 47*333d2b36SAndroid Build Coastguard Worker} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltProcMacroFactory() android.Module { 50*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltProcMacro(android.HostSupportedNoCross) 51*333d2b36SAndroid Build Coastguard Worker return module.Init() 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workertype rustPrebuilt interface { 55*333d2b36SAndroid Build Coastguard Worker prebuiltSrcs() []string 56*333d2b36SAndroid Build Coastguard Worker prebuilt() *android.Prebuilt 57*333d2b36SAndroid Build Coastguard Worker} 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltProcMacro(hod android.HostOrDeviceSupported) (*Module, *prebuiltProcMacroDecorator) { 60*333d2b36SAndroid Build Coastguard Worker module, library := NewProcMacro(hod) 61*333d2b36SAndroid Build Coastguard Worker prebuilt := &prebuiltProcMacroDecorator{ 62*333d2b36SAndroid Build Coastguard Worker procMacroDecorator: library, 63*333d2b36SAndroid Build Coastguard Worker } 64*333d2b36SAndroid Build Coastguard Worker module.compiler = prebuilt 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Worker addSrcSupplier(module, prebuilt) 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker return module, prebuilt 69*333d2b36SAndroid Build Coastguard Worker} 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*prebuiltLibraryDecorator)(nil) 72*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*prebuiltLibraryDecorator)(nil) 73*333d2b36SAndroid Build Coastguard Workervar _ rustPrebuilt = (*prebuiltLibraryDecorator)(nil) 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*prebuiltProcMacroDecorator)(nil) 76*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*prebuiltProcMacroDecorator)(nil) 77*333d2b36SAndroid Build Coastguard Workervar _ rustPrebuilt = (*prebuiltProcMacroDecorator)(nil) 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Workerfunc prebuiltPath(ctx ModuleContext, prebuilt rustPrebuilt) android.Path { 80*333d2b36SAndroid Build Coastguard Worker srcs := android.PathsForModuleSrc(ctx, prebuilt.prebuiltSrcs()) 81*333d2b36SAndroid Build Coastguard Worker if len(srcs) == 0 { 82*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("srcs", "srcs must not be empty") 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker if len(srcs) > 1 { 85*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("srcs", "prebuilt libraries can only have one entry in srcs (the prebuilt path)") 86*333d2b36SAndroid Build Coastguard Worker } 87*333d2b36SAndroid Build Coastguard Worker return srcs[0] 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltLibraryFactory() android.Module { 91*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported) 92*333d2b36SAndroid Build Coastguard Worker return module.Init() 93*333d2b36SAndroid Build Coastguard Worker} 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltDylibFactory() android.Module { 96*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltDylib(android.HostAndDeviceSupported) 97*333d2b36SAndroid Build Coastguard Worker return module.Init() 98*333d2b36SAndroid Build Coastguard Worker} 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltRlibFactory() android.Module { 101*333d2b36SAndroid Build Coastguard Worker module, _ := NewPrebuiltRlib(android.HostAndDeviceSupported) 102*333d2b36SAndroid Build Coastguard Worker return module.Init() 103*333d2b36SAndroid Build Coastguard Worker} 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workerfunc addSrcSupplier(module android.PrebuiltInterface, prebuilt rustPrebuilt) { 106*333d2b36SAndroid Build Coastguard Worker srcsSupplier := func(_ android.BaseModuleContext, _ android.Module) []string { 107*333d2b36SAndroid Build Coastguard Worker return prebuilt.prebuiltSrcs() 108*333d2b36SAndroid Build Coastguard Worker } 109*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, "srcs") 110*333d2b36SAndroid Build Coastguard Worker} 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltLibrary(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) { 113*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(hod) 114*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRust() 115*333d2b36SAndroid Build Coastguard Worker library.setNoStdlibs() 116*333d2b36SAndroid Build Coastguard Worker prebuilt := &prebuiltLibraryDecorator{ 117*333d2b36SAndroid Build Coastguard Worker libraryDecorator: library, 118*333d2b36SAndroid Build Coastguard Worker } 119*333d2b36SAndroid Build Coastguard Worker module.compiler = prebuilt 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Worker addSrcSupplier(module, prebuilt) 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker return module, prebuilt 124*333d2b36SAndroid Build Coastguard Worker} 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltDylib(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) { 127*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(hod) 128*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyDylib() 129*333d2b36SAndroid Build Coastguard Worker library.setNoStdlibs() 130*333d2b36SAndroid Build Coastguard Worker prebuilt := &prebuiltLibraryDecorator{ 131*333d2b36SAndroid Build Coastguard Worker libraryDecorator: library, 132*333d2b36SAndroid Build Coastguard Worker } 133*333d2b36SAndroid Build Coastguard Worker module.compiler = prebuilt 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker addSrcSupplier(module, prebuilt) 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Worker return module, prebuilt 138*333d2b36SAndroid Build Coastguard Worker} 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Workerfunc NewPrebuiltRlib(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) { 141*333d2b36SAndroid Build Coastguard Worker module, library := NewRustLibrary(hod) 142*333d2b36SAndroid Build Coastguard Worker library.BuildOnlyRlib() 143*333d2b36SAndroid Build Coastguard Worker library.setNoStdlibs() 144*333d2b36SAndroid Build Coastguard Worker prebuilt := &prebuiltLibraryDecorator{ 145*333d2b36SAndroid Build Coastguard Worker libraryDecorator: library, 146*333d2b36SAndroid Build Coastguard Worker } 147*333d2b36SAndroid Build Coastguard Worker module.compiler = prebuilt 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Worker addSrcSupplier(module, prebuilt) 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker return module, prebuilt 152*333d2b36SAndroid Build Coastguard Worker} 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) compilerProps() []interface{} { 155*333d2b36SAndroid Build Coastguard Worker return append(prebuilt.libraryDecorator.compilerProps(), 156*333d2b36SAndroid Build Coastguard Worker &prebuilt.Properties) 157*333d2b36SAndroid Build Coastguard Worker} 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { 160*333d2b36SAndroid Build Coastguard Worker prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) 161*333d2b36SAndroid Build Coastguard Worker prebuilt.flagExporter.setProvider(ctx) 162*333d2b36SAndroid Build Coastguard Worker srcPath := prebuiltPath(ctx, prebuilt) 163*333d2b36SAndroid Build Coastguard Worker prebuilt.baseCompiler.unstrippedOutputFile = srcPath 164*333d2b36SAndroid Build Coastguard Worker return buildOutput{outputFile: srcPath} 165*333d2b36SAndroid Build Coastguard Worker} 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) rustdoc(ctx ModuleContext, flags Flags, 168*333d2b36SAndroid Build Coastguard Worker deps PathDeps) android.OptionalPath { 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 171*333d2b36SAndroid Build Coastguard Worker} 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { 174*333d2b36SAndroid Build Coastguard Worker deps = prebuilt.baseCompiler.compilerDeps(ctx, deps) 175*333d2b36SAndroid Build Coastguard Worker return deps 176*333d2b36SAndroid Build Coastguard Worker} 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) nativeCoverage() bool { 179*333d2b36SAndroid Build Coastguard Worker return false 180*333d2b36SAndroid Build Coastguard Worker} 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) prebuiltSrcs() []string { 183*333d2b36SAndroid Build Coastguard Worker srcs := prebuilt.Properties.Srcs 184*333d2b36SAndroid Build Coastguard Worker if prebuilt.rlib() { 185*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, prebuilt.libraryDecorator.Properties.Rlib.Srcs...) 186*333d2b36SAndroid Build Coastguard Worker } 187*333d2b36SAndroid Build Coastguard Worker if prebuilt.dylib() { 188*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, prebuilt.libraryDecorator.Properties.Dylib.Srcs...) 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker return srcs 192*333d2b36SAndroid Build Coastguard Worker} 193*333d2b36SAndroid Build Coastguard Worker 194*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltLibraryDecorator) prebuilt() *android.Prebuilt { 195*333d2b36SAndroid Build Coastguard Worker return &prebuilt.Prebuilt 196*333d2b36SAndroid Build Coastguard Worker} 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) prebuiltSrcs() []string { 199*333d2b36SAndroid Build Coastguard Worker srcs := prebuilt.Properties.Srcs 200*333d2b36SAndroid Build Coastguard Worker return srcs 201*333d2b36SAndroid Build Coastguard Worker} 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) prebuilt() *android.Prebuilt { 204*333d2b36SAndroid Build Coastguard Worker return &prebuilt.Prebuilt 205*333d2b36SAndroid Build Coastguard Worker} 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) compilerProps() []interface{} { 208*333d2b36SAndroid Build Coastguard Worker return append(prebuilt.procMacroDecorator.compilerProps(), 209*333d2b36SAndroid Build Coastguard Worker &prebuilt.Properties) 210*333d2b36SAndroid Build Coastguard Worker} 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { 213*333d2b36SAndroid Build Coastguard Worker prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) 214*333d2b36SAndroid Build Coastguard Worker prebuilt.flagExporter.setProvider(ctx) 215*333d2b36SAndroid Build Coastguard Worker srcPath := prebuiltPath(ctx, prebuilt) 216*333d2b36SAndroid Build Coastguard Worker prebuilt.baseCompiler.unstrippedOutputFile = srcPath 217*333d2b36SAndroid Build Coastguard Worker return buildOutput{outputFile: srcPath} 218*333d2b36SAndroid Build Coastguard Worker} 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) rustdoc(ctx ModuleContext, flags Flags, 221*333d2b36SAndroid Build Coastguard Worker deps PathDeps) android.OptionalPath { 222*333d2b36SAndroid Build Coastguard Worker 223*333d2b36SAndroid Build Coastguard Worker return android.OptionalPath{} 224*333d2b36SAndroid Build Coastguard Worker} 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { 227*333d2b36SAndroid Build Coastguard Worker deps = prebuilt.baseCompiler.compilerDeps(ctx, deps) 228*333d2b36SAndroid Build Coastguard Worker return deps 229*333d2b36SAndroid Build Coastguard Worker} 230*333d2b36SAndroid Build Coastguard Worker 231*333d2b36SAndroid Build Coastguard Workerfunc (prebuilt *prebuiltProcMacroDecorator) nativeCoverage() bool { 232*333d2b36SAndroid Build Coastguard Worker return false 233*333d2b36SAndroid Build Coastguard Worker} 234