From c7767922e06fd6513e0b1e6846a21dfe44df8823 Mon Sep 17 00:00:00 2001 From: Andrei Homescu Date: Wed, 5 Aug 2020 06:36:19 -0700 Subject: [PATCH] Export Rust SourceProvider types and methods The AIDL compiler now uses SourceProvider to compiler the generated Rust code from system/tools/aidl/build/aidl_interface.go using its own SourceProvider object, which needs access to baseSourceProvider and all methods of SourceProvider. Test: mmma system/tools/aidl with 1357705 applied Change-Id: I226609a7fccca2e7e1bfbad5d69d1821d37e43a1 --- rust/androidmk.go | 26 ++++++++++----------- rust/bindgen.go | 29 ++++++++--------------- rust/rust.go | 10 ++++---- rust/source_provider.go | 51 +++++++++++++++++++++++++++-------------- 4 files changed, 62 insertions(+), 54 deletions(-) diff --git a/rust/androidmk.go b/rust/androidmk.go index 580601734..fda0a2579 100644 --- a/rust/androidmk.go +++ b/rust/androidmk.go @@ -26,18 +26,18 @@ import ( type AndroidMkContext interface { Name() string Target() android.Target - subAndroidMk(*android.AndroidMkData, interface{}) + SubAndroidMk(*android.AndroidMkData, interface{}) } -type subAndroidMkProvider interface { +type SubAndroidMkProvider interface { AndroidMk(AndroidMkContext, *android.AndroidMkData) } -func (mod *Module) subAndroidMk(data *android.AndroidMkData, obj interface{}) { +func (mod *Module) SubAndroidMk(data *android.AndroidMkData, obj interface{}) { if mod.subAndroidMkOnce == nil { - mod.subAndroidMkOnce = make(map[subAndroidMkProvider]bool) + mod.subAndroidMkOnce = make(map[SubAndroidMkProvider]bool) } - if androidmk, ok := obj.(subAndroidMkProvider); ok { + if androidmk, ok := obj.(SubAndroidMkProvider); ok { if !mod.subAndroidMkOnce[androidmk] { mod.subAndroidMkOnce[androidmk] = true androidmk.AndroidMk(mod, data) @@ -77,10 +77,10 @@ func (mod *Module) AndroidMk() android.AndroidMkData { } if mod.compiler != nil && !mod.compiler.Disabled() { - mod.subAndroidMk(&ret, mod.compiler) + mod.SubAndroidMk(&ret, mod.compiler) } else if mod.sourceProvider != nil { // If the compiler is disabled, this is a SourceProvider. - mod.subAndroidMk(&ret, mod.sourceProvider) + mod.SubAndroidMk(&ret, mod.sourceProvider) } ret.SubName += mod.Properties.SubName @@ -88,7 +88,7 @@ func (mod *Module) AndroidMk() android.AndroidMkData { } func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { - ctx.subAndroidMk(ret, binary.baseCompiler) + ctx.SubAndroidMk(ret, binary.baseCompiler) if binary.distFile.Valid() { ret.DistFiles = android.MakeDefaultDistFiles(binary.distFile.Path()) @@ -122,7 +122,7 @@ func (test *testDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidM } func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { - ctx.subAndroidMk(ret, library.baseCompiler) + ctx.SubAndroidMk(ret, library.baseCompiler) if library.rlib() { ret.Class = "RLIB_LIBRARIES" @@ -150,7 +150,7 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An } func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { - ctx.subAndroidMk(ret, procMacro.baseCompiler) + ctx.SubAndroidMk(ret, procMacro.baseCompiler) ret.Class = "PROC_MACRO_LIBRARIES" if procMacro.distFile.Valid() { @@ -159,8 +159,8 @@ func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *androi } -func (sourceProvider *baseSourceProvider) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { - outFile := sourceProvider.outputFile +func (sourceProvider *BaseSourceProvider) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { + outFile := sourceProvider.OutputFile ret.Class = "ETC" ret.OutputFile = android.OptionalPathForPath(outFile) ret.SubName += sourceProvider.subName @@ -173,7 +173,7 @@ func (sourceProvider *baseSourceProvider) AndroidMk(ctx AndroidMkContext, ret *a } func (bindgen *bindgenDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { - ctx.subAndroidMk(ret, bindgen.baseSourceProvider) + ctx.SubAndroidMk(ret, bindgen.BaseSourceProvider) ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") }) diff --git a/rust/bindgen.go b/rust/bindgen.go index 2224a9cca..844290742 100644 --- a/rust/bindgen.go +++ b/rust/bindgen.go @@ -86,12 +86,12 @@ type BindgenProperties struct { } type bindgenDecorator struct { - *baseSourceProvider + *BaseSourceProvider Properties BindgenProperties } -func (b *bindgenDecorator) generateSource(ctx android.ModuleContext, deps PathDeps) android.Path { +func (b *bindgenDecorator) GenerateSource(ctx android.ModuleContext, deps PathDeps) android.Path { ccToolchain := ccConfig.FindToolchain(ctx.Os(), ctx.Arch()) var cflags []string @@ -134,7 +134,7 @@ func (b *bindgenDecorator) generateSource(ctx android.ModuleContext, deps PathDe ctx.PropertyErrorf("wrapper_src", "invalid path to wrapper source") } - outputFile := android.PathForModuleOut(ctx, b.baseSourceProvider.getStem(ctx)+".rs") + outputFile := android.PathForModuleOut(ctx, b.BaseSourceProvider.getStem(ctx)+".rs") var cmd, cmdDesc string if b.Properties.Custom_bindgen != "" { @@ -158,12 +158,12 @@ func (b *bindgenDecorator) generateSource(ctx android.ModuleContext, deps PathDe }, }) - b.baseSourceProvider.outputFile = outputFile + b.BaseSourceProvider.OutputFile = outputFile return outputFile } -func (b *bindgenDecorator) sourceProviderProps() []interface{} { - return append(b.baseSourceProvider.sourceProviderProps(), +func (b *bindgenDecorator) SourceProviderProps() []interface{} { + return append(b.BaseSourceProvider.SourceProviderProps(), &b.Properties) } @@ -181,27 +181,18 @@ func RustBindgenHostFactory() android.Module { } func NewRustBindgen(hod android.HostOrDeviceSupported) (*Module, *bindgenDecorator) { - module := newModule(hod, android.MultilibBoth) - bindgen := &bindgenDecorator{ - baseSourceProvider: NewSourceProvider(), + BaseSourceProvider: NewSourceProvider(), Properties: BindgenProperties{}, } - _, library := NewRustLibrary(hod) - library.BuildOnlyRust() - library.setNoLint() - library.sourceProvider = bindgen - - module.sourceProvider = bindgen - module.compiler = library - module.setClippy(false) + module := NewSourceProviderModule(hod, bindgen, false) return module, bindgen } -func (b *bindgenDecorator) sourceProviderDeps(ctx DepsContext, deps Deps) Deps { - deps = b.baseSourceProvider.sourceProviderDeps(ctx, deps) +func (b *bindgenDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps { + deps = b.BaseSourceProvider.SourceProviderDeps(ctx, deps) if ctx.toolchain().Bionic() { deps = bionicDeps(deps) } diff --git a/rust/rust.go b/rust/rust.go index 7ec2d736b..e56a6ae26 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -83,7 +83,7 @@ type Module struct { clippy *clippy cachedToolchain config.Toolchain sourceProvider SourceProvider - subAndroidMkOnce map[subAndroidMkProvider]bool + subAndroidMkOnce map[SubAndroidMkProvider]bool outputFile android.OptionalPath generatedFile android.OptionalPath @@ -537,7 +537,7 @@ func (mod *Module) Init() android.Module { mod.AddProperties(mod.clippy.props()...) } if mod.sourceProvider != nil { - mod.AddProperties(mod.sourceProvider.sourceProviderProps()...) + mod.AddProperties(mod.sourceProvider.SourceProviderProps()...) } android.InitAndroidArchModule(mod, mod.hod, mod.multilib) @@ -671,10 +671,10 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { flags, deps = mod.clippy.flags(ctx, flags, deps) } - // SourceProvider needs to call generateSource() before compiler calls compile() so it can provide the source. + // SourceProvider needs to call GenerateSource() before compiler calls compile() so it can provide the source. // TODO(b/162588681) This shouldn't have to run for every variant. if mod.sourceProvider != nil { - generatedFile := mod.sourceProvider.generateSource(ctx, deps) + generatedFile := mod.sourceProvider.GenerateSource(ctx, deps) mod.generatedFile = android.OptionalPathForPath(generatedFile) mod.sourceProvider.setSubName(ctx.ModuleSubDir()) } @@ -696,7 +696,7 @@ func (mod *Module) deps(ctx DepsContext) Deps { deps = mod.compiler.compilerDeps(ctx, deps) } if mod.sourceProvider != nil { - deps = mod.sourceProvider.sourceProviderDeps(ctx, deps) + deps = mod.sourceProvider.SourceProviderDeps(ctx, deps) } if mod.coverage != nil { diff --git a/rust/source_provider.go b/rust/source_provider.go index 503880f84..76679c222 100644 --- a/rust/source_provider.go +++ b/rust/source_provider.go @@ -27,43 +27,60 @@ type SourceProviderProperties struct { Crate_name string `android:"arch_variant"` } -type baseSourceProvider struct { +type BaseSourceProvider struct { Properties SourceProviderProperties - outputFile android.Path - subAndroidMkOnce map[subAndroidMkProvider]bool + OutputFile android.Path + subAndroidMkOnce map[SubAndroidMkProvider]bool subName string } -var _ SourceProvider = (*baseSourceProvider)(nil) +var _ SourceProvider = (*BaseSourceProvider)(nil) type SourceProvider interface { - generateSource(ctx android.ModuleContext, deps PathDeps) android.Path + GenerateSource(ctx android.ModuleContext, deps PathDeps) android.Path Srcs() android.Paths - sourceProviderProps() []interface{} - sourceProviderDeps(ctx DepsContext, deps Deps) Deps + SourceProviderProps() []interface{} + SourceProviderDeps(ctx DepsContext, deps Deps) Deps setSubName(subName string) } -func (sp *baseSourceProvider) Srcs() android.Paths { - return android.Paths{sp.outputFile} +func (sp *BaseSourceProvider) Srcs() android.Paths { + return android.Paths{sp.OutputFile} } -func (sp *baseSourceProvider) generateSource(ctx android.ModuleContext, deps PathDeps) android.Path { - panic("baseSourceProviderModule does not implement generateSource()") +func (sp *BaseSourceProvider) GenerateSource(ctx android.ModuleContext, deps PathDeps) android.Path { + panic("BaseSourceProviderModule does not implement GenerateSource()") } -func (sp *baseSourceProvider) sourceProviderProps() []interface{} { +func (sp *BaseSourceProvider) SourceProviderProps() []interface{} { return []interface{}{&sp.Properties} } -func NewSourceProvider() *baseSourceProvider { - return &baseSourceProvider{ +func NewSourceProvider() *BaseSourceProvider { + return &BaseSourceProvider{ Properties: SourceProviderProperties{}, } } -func (sp *baseSourceProvider) getStem(ctx android.ModuleContext) string { +func NewSourceProviderModule(hod android.HostOrDeviceSupported, sourceProvider SourceProvider, enableLints bool) *Module { + _, library := NewRustLibrary(hod) + library.BuildOnlyRust() + library.sourceProvider = sourceProvider + + module := newModule(hod, android.MultilibBoth) + module.sourceProvider = sourceProvider + module.compiler = library + + if !enableLints { + library.setNoLint() + module.setClippy(false) + } + + return module +} + +func (sp *BaseSourceProvider) getStem(ctx android.ModuleContext) string { if String(sp.Properties.Source_stem) == "" { ctx.PropertyErrorf("source_stem", "source_stem property is undefined but required for rust_bindgen modules") @@ -71,10 +88,10 @@ func (sp *baseSourceProvider) getStem(ctx android.ModuleContext) string { return String(sp.Properties.Source_stem) } -func (sp *baseSourceProvider) sourceProviderDeps(ctx DepsContext, deps Deps) Deps { +func (sp *BaseSourceProvider) SourceProviderDeps(ctx DepsContext, deps Deps) Deps { return deps } -func (sp *baseSourceProvider) setSubName(subName string) { +func (sp *BaseSourceProvider) setSubName(subName string) { sp.subName = subName }