| Yu Liu | eae7b36 | 2023-11-16 17:05:47 -0800 | [diff] [blame] | 1 | package codegen | 
| Vinh Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 2 |  | 
|  | 3 | import ( | 
| Zi Wang | 275f654 | 2023-11-09 14:59:31 -0800 | [diff] [blame] | 4 | "fmt" | 
|  | 5 |  | 
| Yu Liu | eae7b36 | 2023-11-16 17:05:47 -0800 | [diff] [blame] | 6 | "android/soong/aconfig" | 
| Vinh Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 7 | "android/soong/android" | 
|  | 8 | "android/soong/rust" | 
| Vinh Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 9 |  | 
|  | 10 | "github.com/google/blueprint" | 
| Vinh Tran | 0ea4ffa | 2023-08-11 17:29:33 -0400 | [diff] [blame] | 11 | "github.com/google/blueprint/proptools" | 
| Vinh Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 12 | ) | 
|  | 13 |  | 
|  | 14 | type rustDeclarationsTagType struct { | 
|  | 15 | blueprint.BaseDependencyTag | 
|  | 16 | } | 
|  | 17 |  | 
|  | 18 | var rustDeclarationsTag = rustDeclarationsTagType{} | 
|  | 19 |  | 
|  | 20 | type RustAconfigLibraryProperties struct { | 
|  | 21 | // name of the aconfig_declarations module to generate a library for | 
|  | 22 | Aconfig_declarations string | 
| Zi Wang | 275f654 | 2023-11-09 14:59:31 -0800 | [diff] [blame] | 23 |  | 
| Zi Wang | 275f654 | 2023-11-09 14:59:31 -0800 | [diff] [blame] | 24 | // 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 Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 29 | } | 
|  | 30 |  | 
|  | 31 | type aconfigDecorator struct { | 
|  | 32 | *rust.BaseSourceProvider | 
|  | 33 |  | 
|  | 34 | Properties RustAconfigLibraryProperties | 
|  | 35 | } | 
|  | 36 |  | 
|  | 37 | func 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. | 
|  | 50 | func RustAconfigLibraryFactory() android.Module { | 
|  | 51 | module, _ := NewRustAconfigLibrary(android.HostAndDeviceSupported) | 
|  | 52 | return module.Init() | 
|  | 53 | } | 
|  | 54 |  | 
|  | 55 | func (a *aconfigDecorator) SourceProviderProps() []interface{} { | 
|  | 56 | return append(a.BaseSourceProvider.SourceProviderProps(), &a.Properties) | 
|  | 57 | } | 
|  | 58 |  | 
|  | 59 | func (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 Liu | eae7b36 | 2023-11-16 17:05:47 -0800 | [diff] [blame] | 68 | declarations := ctx.OtherModuleProvider(declarationsModules[0], aconfig.DeclarationsProviderKey).(aconfig.DeclarationsProviderData) | 
| Vinh Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 69 |  | 
| Zi Wang | 275f654 | 2023-11-09 14:59:31 -0800 | [diff] [blame] | 70 | 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 Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 75 | 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 Tran | 0ea4ffa | 2023-08-11 17:29:33 -0400 | [diff] [blame] | 84 | "mode":   mode, | 
| Vinh Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 85 | }, | 
|  | 86 | }) | 
|  | 87 | a.BaseSourceProvider.OutputFiles = android.Paths{generatedSource} | 
|  | 88 | return generatedSource | 
|  | 89 | } | 
|  | 90 |  | 
|  | 91 | func (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 Shen | ba6ed2d | 2023-11-08 21:02:53 +0000 | [diff] [blame] | 94 | deps.Rustlibs = append(deps.Rustlibs, "liblazy_static") | 
| Vinh Tran | 457ddef | 2023-08-02 13:50:26 -0400 | [diff] [blame] | 95 | ctx.AddDependency(ctx.Module(), rustDeclarationsTag, a.Properties.Aconfig_declarations) | 
|  | 96 | return deps | 
|  | 97 | } |