blob: 3525de19a0338d815c604de1012e433325f52cac [file] [log] [blame]
Yu Liueae7b362023-11-16 17:05:47 -08001package codegen
Vinh Tran457ddef2023-08-02 13:50:26 -04002
3import (
Zi Wang275f6542023-11-09 14:59:31 -08004 "fmt"
5
Yu Liueae7b362023-11-16 17:05:47 -08006 "android/soong/aconfig"
Vinh Tran457ddef2023-08-02 13:50:26 -04007 "android/soong/android"
8 "android/soong/rust"
Vinh Tran457ddef2023-08-02 13:50:26 -04009
10 "github.com/google/blueprint"
Vinh Tran0ea4ffa2023-08-11 17:29:33 -040011 "github.com/google/blueprint/proptools"
Vinh Tran457ddef2023-08-02 13:50:26 -040012)
13
14type rustDeclarationsTagType struct {
15 blueprint.BaseDependencyTag
16}
17
18var rustDeclarationsTag = rustDeclarationsTagType{}
19
20type RustAconfigLibraryProperties struct {
21 // name of the aconfig_declarations module to generate a library for
22 Aconfig_declarations string
Zi Wang275f6542023-11-09 14:59:31 -080023
Zi Wang275f6542023-11-09 14:59:31 -080024 // default mode is "production", the other accepted modes are:
25 // "test": to generate test mode version of the library
26 // "exported": to generate exported mode version of the library
27 // an error will be thrown if the mode is not supported
28 Mode *string
Vinh Tran457ddef2023-08-02 13:50:26 -040029}
30
31type aconfigDecorator struct {
32 *rust.BaseSourceProvider
33
34 Properties RustAconfigLibraryProperties
35}
36
37func NewRustAconfigLibrary(hod android.HostOrDeviceSupported) (*rust.Module, *aconfigDecorator) {
38 aconfig := &aconfigDecorator{
39 BaseSourceProvider: rust.NewSourceProvider(),
40 Properties: RustAconfigLibraryProperties{},
41 }
42
43 module := rust.NewSourceProviderModule(android.HostAndDeviceSupported, aconfig, false, false)
44 return module, aconfig
45}
46
47// rust_aconfig_library generates aconfig rust code from the provided aconfig declaration. This module type will
48// create library variants that can be used as a crate dependency by adding it to the rlibs, dylibs, and rustlibs
49// properties of other modules.
50func RustAconfigLibraryFactory() android.Module {
51 module, _ := NewRustAconfigLibrary(android.HostAndDeviceSupported)
52 return module.Init()
53}
54
55func (a *aconfigDecorator) SourceProviderProps() []interface{} {
56 return append(a.BaseSourceProvider.SourceProviderProps(), &a.Properties)
57}
58
59func (a *aconfigDecorator) GenerateSource(ctx rust.ModuleContext, deps rust.PathDeps) android.Path {
60 generatedDir := android.PathForModuleGen(ctx)
61 generatedSource := android.PathForModuleGen(ctx, "src", "lib.rs")
62
63 declarationsModules := ctx.GetDirectDepsWithTag(rustDeclarationsTag)
64
65 if len(declarationsModules) != 1 {
66 panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
67 }
Yu Liueae7b362023-11-16 17:05:47 -080068 declarations := ctx.OtherModuleProvider(declarationsModules[0], aconfig.DeclarationsProviderKey).(aconfig.DeclarationsProviderData)
Vinh Tran457ddef2023-08-02 13:50:26 -040069
Zi Wang275f6542023-11-09 14:59:31 -080070 mode := proptools.StringDefault(a.Properties.Mode, "production")
71 if !isModeSupported(mode) {
72 ctx.PropertyErrorf("mode", "%q is not a supported mode", mode)
73 }
74
Vinh Tran457ddef2023-08-02 13:50:26 -040075 ctx.Build(pctx, android.BuildParams{
76 Rule: rustRule,
77 Input: declarations.IntermediatePath,
78 Outputs: []android.WritablePath{
79 generatedSource,
80 },
81 Description: "rust_aconfig_library",
82 Args: map[string]string{
83 "gendir": generatedDir.String(),
Vinh Tran0ea4ffa2023-08-11 17:29:33 -040084 "mode": mode,
Vinh Tran457ddef2023-08-02 13:50:26 -040085 },
86 })
87 a.BaseSourceProvider.OutputFiles = android.Paths{generatedSource}
88 return generatedSource
89}
90
91func (a *aconfigDecorator) SourceProviderDeps(ctx rust.DepsContext, deps rust.Deps) rust.Deps {
92 deps = a.BaseSourceProvider.SourceProviderDeps(ctx, deps)
93 deps.Rustlibs = append(deps.Rustlibs, "libflags_rust")
Dennis Shenba6ed2d2023-11-08 21:02:53 +000094 deps.Rustlibs = append(deps.Rustlibs, "liblazy_static")
Vinh Tran457ddef2023-08-02 13:50:26 -040095 ctx.AddDependency(ctx.Module(), rustDeclarationsTag, a.Properties.Aconfig_declarations)
96 return deps
97}