Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7767922 authored by Andrei Homescu's avatar Andrei Homescu
Browse files

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
parent d13b3089
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -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")
	})
+10 −19
Original line number Diff line number Diff line
@@ -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)
	}
+5 −5
Original line number Diff line number Diff line
@@ -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 {
+34 −17
Original line number Diff line number Diff line
@@ -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
}