blob: 8b16372736282d13c148c5ad63c3e846f9d270d7 [file] [log] [blame]
Vinh Tran457ddef2023-08-02 13:50:26 -04001package aconfig
2
3import (
4 "android/soong/android"
5 "android/soong/rust"
6 "fmt"
7
8 "github.com/google/blueprint"
9)
10
11type rustDeclarationsTagType struct {
12 blueprint.BaseDependencyTag
13}
14
15var rustDeclarationsTag = rustDeclarationsTagType{}
16
17type RustAconfigLibraryProperties struct {
18 // name of the aconfig_declarations module to generate a library for
19 Aconfig_declarations string
20}
21
22type aconfigDecorator struct {
23 *rust.BaseSourceProvider
24
25 Properties RustAconfigLibraryProperties
26}
27
28func NewRustAconfigLibrary(hod android.HostOrDeviceSupported) (*rust.Module, *aconfigDecorator) {
29 aconfig := &aconfigDecorator{
30 BaseSourceProvider: rust.NewSourceProvider(),
31 Properties: RustAconfigLibraryProperties{},
32 }
33
34 module := rust.NewSourceProviderModule(android.HostAndDeviceSupported, aconfig, false, false)
35 return module, aconfig
36}
37
38// rust_aconfig_library generates aconfig rust code from the provided aconfig declaration. This module type will
39// create library variants that can be used as a crate dependency by adding it to the rlibs, dylibs, and rustlibs
40// properties of other modules.
41func RustAconfigLibraryFactory() android.Module {
42 module, _ := NewRustAconfigLibrary(android.HostAndDeviceSupported)
43 return module.Init()
44}
45
46func (a *aconfigDecorator) SourceProviderProps() []interface{} {
47 return append(a.BaseSourceProvider.SourceProviderProps(), &a.Properties)
48}
49
50func (a *aconfigDecorator) GenerateSource(ctx rust.ModuleContext, deps rust.PathDeps) android.Path {
51 generatedDir := android.PathForModuleGen(ctx)
52 generatedSource := android.PathForModuleGen(ctx, "src", "lib.rs")
53
54 declarationsModules := ctx.GetDirectDepsWithTag(rustDeclarationsTag)
55
56 if len(declarationsModules) != 1 {
57 panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
58 }
59 declarations := ctx.OtherModuleProvider(declarationsModules[0], declarationsProviderKey).(declarationsProviderData)
60
61 ctx.Build(pctx, android.BuildParams{
62 Rule: rustRule,
63 Input: declarations.IntermediatePath,
64 Outputs: []android.WritablePath{
65 generatedSource,
66 },
67 Description: "rust_aconfig_library",
68 Args: map[string]string{
69 "gendir": generatedDir.String(),
70 // TODO: Add test mode
71 "mode": "production",
72 },
73 })
74 a.BaseSourceProvider.OutputFiles = android.Paths{generatedSource}
75 return generatedSource
76}
77
78func (a *aconfigDecorator) SourceProviderDeps(ctx rust.DepsContext, deps rust.Deps) rust.Deps {
79 deps = a.BaseSourceProvider.SourceProviderDeps(ctx, deps)
80 deps.Rustlibs = append(deps.Rustlibs, "libflags_rust")
81 ctx.AddDependency(ctx.Module(), rustDeclarationsTag, a.Properties.Aconfig_declarations)
82 return deps
83}