blob: 50c961abeee21f7521967350acd86459b7388abb [file] [log] [blame]
Colin Crossd6fd0132023-11-06 13:54:06 -08001package android
2
3import (
4 "encoding/json"
5 "io"
6 "slices"
7
8 "github.com/google/blueprint"
Yu Liuca280bf2024-10-29 00:15:36 +00009 "github.com/google/blueprint/gobtools"
Colin Crossd6fd0132023-11-06 13:54:06 -080010)
11
12type CoreModuleInfoJSON struct {
13 RegisterName string `json:"-"`
14 Path []string `json:"path,omitempty"` // $(sort $(ALL_MODULES.$(m).PATH))
15 Installed []string `json:"installed,omitempty"` // $(sort $(ALL_MODULES.$(m).INSTALLED))
16 ModuleName string `json:"module_name,omitempty"` // $(ALL_MODULES.$(m).MODULE_NAME)
17 SupportedVariants []string `json:"supported_variants,omitempty"` // $(sort $(ALL_MODULES.$(m).SUPPORTED_VARIANTS))
18 HostDependencies []string `json:"host_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).HOST_REQUIRED_FROM_TARGET))
19 TargetDependencies []string `json:"target_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).TARGET_REQUIRED_FROM_HOST))
20 Data []string `json:"data,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_DATA))
Hugo Drumond Jacob44616cc2024-05-20 18:39:44 +020021 Required []string `json:"required,omitempty"` // $(sort $(ALL_MODULES.$(m).REQUIRED_FROM_TARGET))
Colin Crossd6fd0132023-11-06 13:54:06 -080022}
23
Yu Liuca280bf2024-10-29 00:15:36 +000024type ExtraModuleInfoJSON struct {
Colin Crossd6fd0132023-11-06 13:54:06 -080025 SubName string `json:"-"`
26 Uninstallable bool `json:"-"`
27 Class []string `json:"class,omitempty"` // $(sort $(ALL_MODULES.$(m).CLASS))
28 Tags []string `json:"tags,omitempty"` // $(sort $(ALL_MODULES.$(m).TAGS))
29 Dependencies []string `json:"dependencies,omitempty"` // $(sort $(ALL_DEPS.$(m).ALL_DEPS))
30 SharedLibs []string `json:"shared_libs,omitempty"` // $(sort $(ALL_MODULES.$(m).SHARED_LIBS))
31 StaticLibs []string `json:"static_libs,omitempty"` // $(sort $(ALL_MODULES.$(m).STATIC_LIBS))
32 SystemSharedLibs []string `json:"system_shared_libs,omitempty"` // $(sort $(ALL_MODULES.$(m).SYSTEM_SHARED_LIBS))
33 Srcs []string `json:"srcs,omitempty"` // $(sort $(ALL_MODULES.$(m).SRCS))
34 SrcJars []string `json:"srcjars,omitempty"` // $(sort $(ALL_MODULES.$(m).SRCJARS))
35 ClassesJar []string `json:"classes_jar,omitempty"` // $(sort $(ALL_MODULES.$(m).CLASSES_JAR))
36 TestMainlineModules []string `json:"test_mainline_modules,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_MAINLINE_MODULES))
Jihoon Kangd4063812025-01-24 00:25:30 +000037 IsUnitTest string `json:"is_unit_test,omitempty"` // $(ALL_MODULES.$(m).IS_UNIT_TEST)
Colin Crossd6fd0132023-11-06 13:54:06 -080038 TestOptionsTags []string `json:"test_options_tags,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_OPTIONS_TAGS))
39 RuntimeDependencies []string `json:"runtime_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).LOCAL_RUNTIME_LIBRARIES))
40 StaticDependencies []string `json:"static_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).LOCAL_STATIC_LIBRARIES))
41 DataDependencies []string `json:"data_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_DATA_BINS))
42
Cole Faust156085b2025-03-04 11:34:55 -080043 CompatibilitySuites []string `json:"compatibility_suites,omitempty"` // $(sort $(ALL_MODULES.$(m).COMPATIBILITY_SUITES))
44 AutoTestConfig []string `json:"auto_test_config,omitempty"` // $(ALL_MODULES.$(m).auto_test_config)
45 TestConfig []string `json:"test_config,omitempty"` // $(strip $(ALL_MODULES.$(m).TEST_CONFIG) $(ALL_MODULES.$(m).EXTRA_TEST_CONFIGS)
46 TestModuleConfigBase string `json:"test_module_config_base,omitempty"`
47 ExtraRequired []string `json:"-"`
48 ExtraHostRequired []string `json:"-"`
Jihoon Kangd4063812025-01-24 00:25:30 +000049
50 SupportedVariantsOverride []string `json:"-"`
51 Disabled bool `json:"-"`
52 RegisterNameOverride string `json:"-"`
53 ModuleNameOverride string `json:"-"`
Colin Crossd6fd0132023-11-06 13:54:06 -080054}
55
Yu Liuca280bf2024-10-29 00:15:36 +000056type ModuleInfoJSON struct {
57 core CoreModuleInfoJSON
58 ExtraModuleInfoJSON
59}
60
Colin Crossd6fd0132023-11-06 13:54:06 -080061//ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS := $(sort \
62//$(ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS) \
63//$(LOCAL_STATIC_LIBRARIES) \
64//$(LOCAL_WHOLE_STATIC_LIBRARIES) \
65//$(LOCAL_SHARED_LIBRARIES) \
66//$(LOCAL_DYLIB_LIBRARIES) \
67//$(LOCAL_RLIB_LIBRARIES) \
68//$(LOCAL_PROC_MACRO_LIBRARIES) \
69//$(LOCAL_HEADER_LIBRARIES) \
70//$(LOCAL_STATIC_JAVA_LIBRARIES) \
71//$(LOCAL_JAVA_LIBRARIES) \
72//$(LOCAL_JNI_SHARED_LIBRARIES))
73
74type combinedModuleInfoJSON struct {
75 *CoreModuleInfoJSON
Yu Liuca280bf2024-10-29 00:15:36 +000076 *ExtraModuleInfoJSON
Colin Crossd6fd0132023-11-06 13:54:06 -080077}
78
79func encodeModuleInfoJSON(w io.Writer, moduleInfoJSON *ModuleInfoJSON) error {
80 moduleInfoJSONCopy := *moduleInfoJSON
81
82 sortAndUnique := func(s *[]string) {
83 *s = slices.Clone(*s)
84 slices.Sort(*s)
85 *s = slices.Compact(*s)
86 }
87
88 sortAndUnique(&moduleInfoJSONCopy.core.Path)
89 sortAndUnique(&moduleInfoJSONCopy.core.Installed)
90 sortAndUnique(&moduleInfoJSONCopy.core.SupportedVariants)
91 sortAndUnique(&moduleInfoJSONCopy.core.HostDependencies)
92 sortAndUnique(&moduleInfoJSONCopy.core.TargetDependencies)
93 sortAndUnique(&moduleInfoJSONCopy.core.Data)
Hugo Drumond Jacob44616cc2024-05-20 18:39:44 +020094 sortAndUnique(&moduleInfoJSONCopy.core.Required)
Colin Crossd6fd0132023-11-06 13:54:06 -080095
96 sortAndUnique(&moduleInfoJSONCopy.Class)
97 sortAndUnique(&moduleInfoJSONCopy.Tags)
98 sortAndUnique(&moduleInfoJSONCopy.Dependencies)
99 sortAndUnique(&moduleInfoJSONCopy.SharedLibs)
100 sortAndUnique(&moduleInfoJSONCopy.StaticLibs)
101 sortAndUnique(&moduleInfoJSONCopy.SystemSharedLibs)
102 sortAndUnique(&moduleInfoJSONCopy.Srcs)
103 sortAndUnique(&moduleInfoJSONCopy.SrcJars)
104 sortAndUnique(&moduleInfoJSONCopy.ClassesJar)
105 sortAndUnique(&moduleInfoJSONCopy.TestMainlineModules)
106 sortAndUnique(&moduleInfoJSONCopy.TestOptionsTags)
107 sortAndUnique(&moduleInfoJSONCopy.RuntimeDependencies)
108 sortAndUnique(&moduleInfoJSONCopy.StaticDependencies)
109 sortAndUnique(&moduleInfoJSONCopy.DataDependencies)
110 sortAndUnique(&moduleInfoJSONCopy.CompatibilitySuites)
111 sortAndUnique(&moduleInfoJSONCopy.AutoTestConfig)
112 sortAndUnique(&moduleInfoJSONCopy.TestConfig)
113
114 encoder := json.NewEncoder(w)
Yu Liuca280bf2024-10-29 00:15:36 +0000115 return encoder.Encode(combinedModuleInfoJSON{&moduleInfoJSONCopy.core, &moduleInfoJSONCopy.ExtraModuleInfoJSON})
116}
117
118func (p *ModuleInfoJSON) ToGob() *combinedModuleInfoJSON {
119 return &combinedModuleInfoJSON{
120 CoreModuleInfoJSON: &p.core,
121 ExtraModuleInfoJSON: &p.ExtraModuleInfoJSON,
122 }
123}
124
125func (p *ModuleInfoJSON) FromGob(data *combinedModuleInfoJSON) {
126 p.core = *data.CoreModuleInfoJSON
127 p.ExtraModuleInfoJSON = *data.ExtraModuleInfoJSON
128}
129
130func (m *ModuleInfoJSON) GobEncode() ([]byte, error) {
131 return gobtools.CustomGobEncode[combinedModuleInfoJSON](m)
132}
133
134func (m *ModuleInfoJSON) GobDecode(data []byte) error {
135 return gobtools.CustomGobDecode[combinedModuleInfoJSON](data, m)
Colin Crossd6fd0132023-11-06 13:54:06 -0800136}
137
mrziwangd7318ff2025-02-05 00:28:25 +0000138func (m *ModuleInfoJSON) GetInstalled() []string {
139 return m.core.Installed
140}
141
142func (m *ModuleInfoJSON) GetClass() []string {
143 return m.Class
144}
145
Jihoon Kangd4063812025-01-24 00:25:30 +0000146var ModuleInfoJSONProvider = blueprint.NewProvider[[]*ModuleInfoJSON]()