package aconfig import ( "android/soong/android" "android/soong/rust" "fmt" "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) type rustDeclarationsTagType struct { blueprint.BaseDependencyTag } var rustDeclarationsTag = rustDeclarationsTagType{} type RustAconfigLibraryProperties struct { // name of the aconfig_declarations module to generate a library for Aconfig_declarations string Test *bool } type aconfigDecorator struct { *rust.BaseSourceProvider Properties RustAconfigLibraryProperties } func NewRustAconfigLibrary(hod android.HostOrDeviceSupported) (*rust.Module, *aconfigDecorator) { aconfig := &aconfigDecorator{ BaseSourceProvider: rust.NewSourceProvider(), Properties: RustAconfigLibraryProperties{}, } module := rust.NewSourceProviderModule(android.HostAndDeviceSupported, aconfig, false, false) return module, aconfig } // rust_aconfig_library generates aconfig rust code from the provided aconfig declaration. This module type will // create library variants that can be used as a crate dependency by adding it to the rlibs, dylibs, and rustlibs // properties of other modules. func RustAconfigLibraryFactory() android.Module { module, _ := NewRustAconfigLibrary(android.HostAndDeviceSupported) return module.Init() } func (a *aconfigDecorator) SourceProviderProps() []interface{} { return append(a.BaseSourceProvider.SourceProviderProps(), &a.Properties) } func (a *aconfigDecorator) GenerateSource(ctx rust.ModuleContext, deps rust.PathDeps) android.Path { generatedDir := android.PathForModuleGen(ctx) generatedSource := android.PathForModuleGen(ctx, "src", "lib.rs") declarationsModules := ctx.GetDirectDepsWithTag(rustDeclarationsTag) if len(declarationsModules) != 1 { panic(fmt.Errorf("Exactly one aconfig_declarations property required")) } declarations := ctx.OtherModuleProvider(declarationsModules[0], declarationsProviderKey).(declarationsProviderData) mode := "production" if proptools.Bool(a.Properties.Test) { mode = "test" } ctx.Build(pctx, android.BuildParams{ Rule: rustRule, Input: declarations.IntermediatePath, Outputs: []android.WritablePath{ generatedSource, }, Description: "rust_aconfig_library", Args: map[string]string{ "gendir": generatedDir.String(), "mode": mode, }, }) a.BaseSourceProvider.OutputFiles = android.Paths{generatedSource} return generatedSource } func (a *aconfigDecorator) SourceProviderDeps(ctx rust.DepsContext, deps rust.Deps) rust.Deps { deps = a.BaseSourceProvider.SourceProviderDeps(ctx, deps) deps.Rustlibs = append(deps.Rustlibs, "libflags_rust") ctx.AddDependency(ctx.Module(), rustDeclarationsTag, a.Properties.Aconfig_declarations) return deps }