| // Copyright 2019 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package rust |
| |
| import ( |
| "android/soong/android" |
| ) |
| |
| func init() { |
| android.RegisterModuleType("rust_prebuilt_library", PrebuiltLibraryFactory) |
| android.RegisterModuleType("rust_prebuilt_dylib", PrebuiltDylibFactory) |
| android.RegisterModuleType("rust_prebuilt_rlib", PrebuiltRlibFactory) |
| android.RegisterModuleType("rust_prebuilt_proc_macro", PrebuiltProcMacroFactory) |
| } |
| |
| type PrebuiltProperties struct { |
| // path to the prebuilt file |
| Srcs []string `android:"path,arch_variant"` |
| // directories containing associated rlib dependencies |
| Link_dirs []string `android:"path,arch_variant"` |
| } |
| |
| type prebuiltLibraryDecorator struct { |
| android.Prebuilt |
| |
| *libraryDecorator |
| Properties PrebuiltProperties |
| } |
| |
| type prebuiltProcMacroDecorator struct { |
| android.Prebuilt |
| |
| *procMacroDecorator |
| Properties PrebuiltProperties |
| } |
| |
| func PrebuiltProcMacroFactory() android.Module { |
| module, _ := NewPrebuiltProcMacro(android.HostSupportedNoCross) |
| return module.Init() |
| } |
| |
| type rustPrebuilt interface { |
| prebuiltSrcs() []string |
| prebuilt() *android.Prebuilt |
| } |
| |
| func NewPrebuiltProcMacro(hod android.HostOrDeviceSupported) (*Module, *prebuiltProcMacroDecorator) { |
| module, library := NewProcMacro(hod) |
| prebuilt := &prebuiltProcMacroDecorator{ |
| procMacroDecorator: library, |
| } |
| module.compiler = prebuilt |
| |
| addSrcSupplier(module, prebuilt) |
| |
| return module, prebuilt |
| } |
| |
| var _ compiler = (*prebuiltLibraryDecorator)(nil) |
| var _ exportedFlagsProducer = (*prebuiltLibraryDecorator)(nil) |
| var _ rustPrebuilt = (*prebuiltLibraryDecorator)(nil) |
| |
| var _ compiler = (*prebuiltProcMacroDecorator)(nil) |
| var _ exportedFlagsProducer = (*prebuiltProcMacroDecorator)(nil) |
| var _ rustPrebuilt = (*prebuiltProcMacroDecorator)(nil) |
| |
| func prebuiltPath(ctx ModuleContext, prebuilt rustPrebuilt) android.Path { |
| srcs := android.PathsForModuleSrc(ctx, prebuilt.prebuiltSrcs()) |
| if len(srcs) == 0 { |
| ctx.PropertyErrorf("srcs", "srcs must not be empty") |
| } |
| if len(srcs) > 1 { |
| ctx.PropertyErrorf("srcs", "prebuilt libraries can only have one entry in srcs (the prebuilt path)") |
| } |
| return srcs[0] |
| } |
| |
| func PrebuiltLibraryFactory() android.Module { |
| module, _ := NewPrebuiltLibrary(android.HostAndDeviceSupported) |
| return module.Init() |
| } |
| |
| func PrebuiltDylibFactory() android.Module { |
| module, _ := NewPrebuiltDylib(android.HostAndDeviceSupported) |
| return module.Init() |
| } |
| |
| func PrebuiltRlibFactory() android.Module { |
| module, _ := NewPrebuiltRlib(android.HostAndDeviceSupported) |
| return module.Init() |
| } |
| |
| func addSrcSupplier(module android.PrebuiltInterface, prebuilt rustPrebuilt) { |
| srcsSupplier := func(_ android.BaseModuleContext, _ android.Module) []string { |
| return prebuilt.prebuiltSrcs() |
| } |
| android.InitPrebuiltModuleWithSrcSupplier(module, srcsSupplier, "srcs") |
| } |
| |
| func NewPrebuiltLibrary(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) { |
| module, library := NewRustLibrary(hod) |
| library.BuildOnlyRust() |
| library.setNoStdlibs() |
| prebuilt := &prebuiltLibraryDecorator{ |
| libraryDecorator: library, |
| } |
| module.compiler = prebuilt |
| |
| addSrcSupplier(module, prebuilt) |
| |
| return module, prebuilt |
| } |
| |
| func NewPrebuiltDylib(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) { |
| module, library := NewRustLibrary(hod) |
| library.BuildOnlyDylib() |
| library.setNoStdlibs() |
| prebuilt := &prebuiltLibraryDecorator{ |
| libraryDecorator: library, |
| } |
| module.compiler = prebuilt |
| |
| addSrcSupplier(module, prebuilt) |
| |
| return module, prebuilt |
| } |
| |
| func NewPrebuiltRlib(hod android.HostOrDeviceSupported) (*Module, *prebuiltLibraryDecorator) { |
| module, library := NewRustLibrary(hod) |
| library.BuildOnlyRlib() |
| library.setNoStdlibs() |
| prebuilt := &prebuiltLibraryDecorator{ |
| libraryDecorator: library, |
| } |
| module.compiler = prebuilt |
| |
| addSrcSupplier(module, prebuilt) |
| |
| return module, prebuilt |
| } |
| |
| func (prebuilt *prebuiltLibraryDecorator) compilerProps() []interface{} { |
| return append(prebuilt.libraryDecorator.compilerProps(), |
| &prebuilt.Properties) |
| } |
| |
| func (prebuilt *prebuiltLibraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { |
| prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) |
| prebuilt.flagExporter.setProvider(ctx) |
| srcPath := prebuiltPath(ctx, prebuilt) |
| prebuilt.baseCompiler.unstrippedOutputFile = srcPath |
| return buildOutput{outputFile: srcPath} |
| } |
| |
| func (prebuilt *prebuiltLibraryDecorator) rustdoc(ctx ModuleContext, flags Flags, |
| deps PathDeps) android.OptionalPath { |
| |
| return android.OptionalPath{} |
| } |
| |
| func (prebuilt *prebuiltLibraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { |
| deps = prebuilt.baseCompiler.compilerDeps(ctx, deps) |
| return deps |
| } |
| |
| func (prebuilt *prebuiltLibraryDecorator) nativeCoverage() bool { |
| return false |
| } |
| |
| func (prebuilt *prebuiltLibraryDecorator) prebuiltSrcs() []string { |
| srcs := prebuilt.Properties.Srcs |
| if prebuilt.rlib() { |
| srcs = append(srcs, prebuilt.libraryDecorator.Properties.Rlib.Srcs...) |
| } |
| if prebuilt.dylib() { |
| srcs = append(srcs, prebuilt.libraryDecorator.Properties.Dylib.Srcs...) |
| } |
| |
| return srcs |
| } |
| |
| func (prebuilt *prebuiltLibraryDecorator) prebuilt() *android.Prebuilt { |
| return &prebuilt.Prebuilt |
| } |
| |
| func (prebuilt *prebuiltProcMacroDecorator) prebuiltSrcs() []string { |
| srcs := prebuilt.Properties.Srcs |
| return srcs |
| } |
| |
| func (prebuilt *prebuiltProcMacroDecorator) prebuilt() *android.Prebuilt { |
| return &prebuilt.Prebuilt |
| } |
| |
| func (prebuilt *prebuiltProcMacroDecorator) compilerProps() []interface{} { |
| return append(prebuilt.procMacroDecorator.compilerProps(), |
| &prebuilt.Properties) |
| } |
| |
| func (prebuilt *prebuiltProcMacroDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { |
| prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) |
| prebuilt.flagExporter.setProvider(ctx) |
| srcPath := prebuiltPath(ctx, prebuilt) |
| prebuilt.baseCompiler.unstrippedOutputFile = srcPath |
| return buildOutput{outputFile: srcPath} |
| } |
| |
| func (prebuilt *prebuiltProcMacroDecorator) rustdoc(ctx ModuleContext, flags Flags, |
| deps PathDeps) android.OptionalPath { |
| |
| return android.OptionalPath{} |
| } |
| |
| func (prebuilt *prebuiltProcMacroDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { |
| deps = prebuilt.baseCompiler.compilerDeps(ctx, deps) |
| return deps |
| } |
| |
| func (prebuilt *prebuiltProcMacroDecorator) nativeCoverage() bool { |
| return false |
| } |