blob: 4b896c32db13edc3d3797960fefc2d6b42af99b4 [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"
Dennis Shen58378c92024-04-03 19:26:36 +00005 "strconv"
Zi Wang275f6542023-11-09 14:59:31 -08006
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
Zhi Dou70e21242023-12-20 23:14:34 +000027 // "force-read-only": to generate force-read-only mode version of the library
Zi Wang275f6542023-11-09 14:59:31 -080028 // an error will be thrown if the mode is not supported
29 Mode *string
Vinh Tran457ddef2023-08-02 13:50:26 -040030}
31
32type aconfigDecorator struct {
33 *rust.BaseSourceProvider
34
35 Properties RustAconfigLibraryProperties
36}
37
38func NewRustAconfigLibrary(hod android.HostOrDeviceSupported) (*rust.Module, *aconfigDecorator) {
39 aconfig := &aconfigDecorator{
40 BaseSourceProvider: rust.NewSourceProvider(),
41 Properties: RustAconfigLibraryProperties{},
42 }
43
44 module := rust.NewSourceProviderModule(android.HostAndDeviceSupported, aconfig, false, false)
45 return module, aconfig
46}
47
48// rust_aconfig_library generates aconfig rust code from the provided aconfig declaration. This module type will
49// create library variants that can be used as a crate dependency by adding it to the rlibs, dylibs, and rustlibs
50// properties of other modules.
51func RustAconfigLibraryFactory() android.Module {
52 module, _ := NewRustAconfigLibrary(android.HostAndDeviceSupported)
53 return module.Init()
54}
55
56func (a *aconfigDecorator) SourceProviderProps() []interface{} {
57 return append(a.BaseSourceProvider.SourceProviderProps(), &a.Properties)
58}
59
60func (a *aconfigDecorator) GenerateSource(ctx rust.ModuleContext, deps rust.PathDeps) android.Path {
61 generatedDir := android.PathForModuleGen(ctx)
62 generatedSource := android.PathForModuleGen(ctx, "src", "lib.rs")
63
64 declarationsModules := ctx.GetDirectDepsWithTag(rustDeclarationsTag)
65
66 if len(declarationsModules) != 1 {
67 panic(fmt.Errorf("Exactly one aconfig_declarations property required"))
68 }
LaMont Jonesaa005ae2023-12-19 19:01:57 +000069 declarations, _ := android.OtherModuleProvider(ctx, declarationsModules[0], android.AconfigDeclarationsProviderKey)
Vinh Tran457ddef2023-08-02 13:50:26 -040070
Zi Wang275f6542023-11-09 14:59:31 -080071 mode := proptools.StringDefault(a.Properties.Mode, "production")
72 if !isModeSupported(mode) {
73 ctx.PropertyErrorf("mode", "%q is not a supported mode", mode)
74 }
75
Vinh Tran457ddef2023-08-02 13:50:26 -040076 ctx.Build(pctx, android.BuildParams{
77 Rule: rustRule,
Jihoon Kangcca3e0c2023-11-29 19:35:29 +000078 Input: declarations.IntermediateCacheOutputPath,
Vinh Tran457ddef2023-08-02 13:50:26 -040079 Outputs: []android.WritablePath{
80 generatedSource,
81 },
82 Description: "rust_aconfig_library",
83 Args: map[string]string{
84 "gendir": generatedDir.String(),
Vinh Tran0ea4ffa2023-08-11 17:29:33 -040085 "mode": mode,
Dennis Shen58378c92024-04-03 19:26:36 +000086 "debug": strconv.FormatBool(ctx.Config().ReleaseReadFromNewStorage()),
Vinh Tran457ddef2023-08-02 13:50:26 -040087 },
88 })
89 a.BaseSourceProvider.OutputFiles = android.Paths{generatedSource}
Yu Liu67a28422024-03-05 00:36:31 +000090
91 android.SetProvider(ctx, android.CodegenInfoProvider, android.CodegenInfo{
92 ModeInfos: map[string]android.ModeInfo{
93 ctx.ModuleName(): {
94 Container: declarations.Container,
95 Mode: mode,
96 }},
97 })
98
Vinh Tran457ddef2023-08-02 13:50:26 -040099 return generatedSource
100}
101
102func (a *aconfigDecorator) SourceProviderDeps(ctx rust.DepsContext, deps rust.Deps) rust.Deps {
103 deps = a.BaseSourceProvider.SourceProviderDeps(ctx, deps)
Ted Bauer6ef40db2024-03-29 14:04:10 +0000104 deps.Rustlibs = append(deps.Rustlibs, "libaconfig_storage_read_api")
Vinh Tran457ddef2023-08-02 13:50:26 -0400105 deps.Rustlibs = append(deps.Rustlibs, "libflags_rust")
Dennis Shenba6ed2d2023-11-08 21:02:53 +0000106 deps.Rustlibs = append(deps.Rustlibs, "liblazy_static")
Ted Bauer6ef40db2024-03-29 14:04:10 +0000107 deps.Rustlibs = append(deps.Rustlibs, "liblogger")
108 deps.Rustlibs = append(deps.Rustlibs, "liblog_rust")
Vinh Tran457ddef2023-08-02 13:50:26 -0400109 ctx.AddDependency(ctx.Module(), rustDeclarationsTag, a.Properties.Aconfig_declarations)
110 return deps
111}