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_proc_macro", ProcMacroFactory) 23*333d2b36SAndroid Build Coastguard Worker} 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workertype ProcMacroCompilerProperties struct { 26*333d2b36SAndroid Build Coastguard Worker} 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workertype procMacroDecorator struct { 29*333d2b36SAndroid Build Coastguard Worker *baseCompiler 30*333d2b36SAndroid Build Coastguard Worker *flagExporter 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Worker Properties ProcMacroCompilerProperties 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workertype procMacroInterface interface { 36*333d2b36SAndroid Build Coastguard Worker ProcMacro() bool 37*333d2b36SAndroid Build Coastguard Worker} 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*procMacroDecorator)(nil) 40*333d2b36SAndroid Build Coastguard Workervar _ exportedFlagsProducer = (*procMacroDecorator)(nil) 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workerfunc ProcMacroFactory() android.Module { 43*333d2b36SAndroid Build Coastguard Worker module, _ := NewProcMacro(android.HostSupportedNoCross) 44*333d2b36SAndroid Build Coastguard Worker return module.Init() 45*333d2b36SAndroid Build Coastguard Worker} 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Workerfunc NewProcMacro(hod android.HostOrDeviceSupported) (*Module, *procMacroDecorator) { 48*333d2b36SAndroid Build Coastguard Worker module := newModule(hod, android.MultilibFirst) 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker procMacro := &procMacroDecorator{ 51*333d2b36SAndroid Build Coastguard Worker baseCompiler: NewBaseCompiler("lib", "lib64", InstallInSystem), 52*333d2b36SAndroid Build Coastguard Worker flagExporter: NewFlagExporter(), 53*333d2b36SAndroid Build Coastguard Worker } 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker // Don't sanitize procMacros 56*333d2b36SAndroid Build Coastguard Worker module.sanitize = nil 57*333d2b36SAndroid Build Coastguard Worker module.compiler = procMacro 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker return module, procMacro 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) compilerProps() []interface{} { 63*333d2b36SAndroid Build Coastguard Worker return append(procMacro.baseCompiler.compilerProps(), 64*333d2b36SAndroid Build Coastguard Worker &procMacro.Properties) 65*333d2b36SAndroid Build Coastguard Worker} 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { 68*333d2b36SAndroid Build Coastguard Worker flags = procMacro.baseCompiler.compilerFlags(ctx, flags) 69*333d2b36SAndroid Build Coastguard Worker flags.RustFlags = append(flags.RustFlags, "--extern proc_macro") 70*333d2b36SAndroid Build Coastguard Worker return flags 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { 74*333d2b36SAndroid Build Coastguard Worker fileName := procMacro.getStem(ctx) + ctx.toolchain().ProcMacroSuffix() 75*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, fileName) 76*333d2b36SAndroid Build Coastguard Worker srcPath := crateRootPath(ctx, procMacro) 77*333d2b36SAndroid Build Coastguard Worker ret := TransformSrctoProcMacro(ctx, srcPath, deps, flags, outputFile) 78*333d2b36SAndroid Build Coastguard Worker procMacro.baseCompiler.unstrippedOutputFile = outputFile 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker return ret 81*333d2b36SAndroid Build Coastguard Worker} 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) getStem(ctx ModuleContext) string { 84*333d2b36SAndroid Build Coastguard Worker stem := procMacro.baseCompiler.getStemWithoutSuffix(ctx) 85*333d2b36SAndroid Build Coastguard Worker validateLibraryStem(ctx, stem, procMacro.crateName()) 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker return stem + String(procMacro.baseCompiler.Properties.Suffix) 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep { 91*333d2b36SAndroid Build Coastguard Worker return rlibAutoDep 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) ProcMacro() bool { 95*333d2b36SAndroid Build Coastguard Worker return true 96*333d2b36SAndroid Build Coastguard Worker} 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Workerfunc (procMacro *procMacroDecorator) everInstallable() bool { 99*333d2b36SAndroid Build Coastguard Worker // Proc_macros are never installed 100*333d2b36SAndroid Build Coastguard Worker return false 101*333d2b36SAndroid Build Coastguard Worker} 102