blob: 1c0a38e5a6007436e12ba017cb31e4928f1624c9 [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"
9)
10
11type CoreModuleInfoJSON struct {
12 RegisterName string `json:"-"`
13 Path []string `json:"path,omitempty"` // $(sort $(ALL_MODULES.$(m).PATH))
14 Installed []string `json:"installed,omitempty"` // $(sort $(ALL_MODULES.$(m).INSTALLED))
15 ModuleName string `json:"module_name,omitempty"` // $(ALL_MODULES.$(m).MODULE_NAME)
16 SupportedVariants []string `json:"supported_variants,omitempty"` // $(sort $(ALL_MODULES.$(m).SUPPORTED_VARIANTS))
17 HostDependencies []string `json:"host_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).HOST_REQUIRED_FROM_TARGET))
18 TargetDependencies []string `json:"target_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).TARGET_REQUIRED_FROM_HOST))
19 Data []string `json:"data,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_DATA))
20}
21
22type ModuleInfoJSON struct {
23 core CoreModuleInfoJSON
24 SubName string `json:"-"`
25 Uninstallable bool `json:"-"`
26 Class []string `json:"class,omitempty"` // $(sort $(ALL_MODULES.$(m).CLASS))
27 Tags []string `json:"tags,omitempty"` // $(sort $(ALL_MODULES.$(m).TAGS))
28 Dependencies []string `json:"dependencies,omitempty"` // $(sort $(ALL_DEPS.$(m).ALL_DEPS))
29 SharedLibs []string `json:"shared_libs,omitempty"` // $(sort $(ALL_MODULES.$(m).SHARED_LIBS))
30 StaticLibs []string `json:"static_libs,omitempty"` // $(sort $(ALL_MODULES.$(m).STATIC_LIBS))
31 SystemSharedLibs []string `json:"system_shared_libs,omitempty"` // $(sort $(ALL_MODULES.$(m).SYSTEM_SHARED_LIBS))
32 Srcs []string `json:"srcs,omitempty"` // $(sort $(ALL_MODULES.$(m).SRCS))
33 SrcJars []string `json:"srcjars,omitempty"` // $(sort $(ALL_MODULES.$(m).SRCJARS))
34 ClassesJar []string `json:"classes_jar,omitempty"` // $(sort $(ALL_MODULES.$(m).CLASSES_JAR))
35 TestMainlineModules []string `json:"test_mainline_modules,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_MAINLINE_MODULES))
36 IsUnitTest bool `json:"is_unit_test,omitempty"` // $(ALL_MODULES.$(m).IS_UNIT_TEST)
37 TestOptionsTags []string `json:"test_options_tags,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_OPTIONS_TAGS))
38 RuntimeDependencies []string `json:"runtime_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).LOCAL_RUNTIME_LIBRARIES))
39 StaticDependencies []string `json:"static_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).LOCAL_STATIC_LIBRARIES))
40 DataDependencies []string `json:"data_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_DATA_BINS))
41
42 CompatibilitySuites []string `json:"compatibility_suites,omitempty"` // $(sort $(ALL_MODULES.$(m).COMPATIBILITY_SUITES))
43 AutoTestConfig []string `json:"auto_test_config,omitempty"` // $(ALL_MODULES.$(m).auto_test_config)
44 TestConfig []string `json:"test_config,omitempty"` // $(strip $(ALL_MODULES.$(m).TEST_CONFIG) $(ALL_MODULES.$(m).EXTRA_TEST_CONFIGS)
45}
46
47//ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS := $(sort \
48//$(ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS) \
49//$(LOCAL_STATIC_LIBRARIES) \
50//$(LOCAL_WHOLE_STATIC_LIBRARIES) \
51//$(LOCAL_SHARED_LIBRARIES) \
52//$(LOCAL_DYLIB_LIBRARIES) \
53//$(LOCAL_RLIB_LIBRARIES) \
54//$(LOCAL_PROC_MACRO_LIBRARIES) \
55//$(LOCAL_HEADER_LIBRARIES) \
56//$(LOCAL_STATIC_JAVA_LIBRARIES) \
57//$(LOCAL_JAVA_LIBRARIES) \
58//$(LOCAL_JNI_SHARED_LIBRARIES))
59
60type combinedModuleInfoJSON struct {
61 *CoreModuleInfoJSON
62 *ModuleInfoJSON
63}
64
65func encodeModuleInfoJSON(w io.Writer, moduleInfoJSON *ModuleInfoJSON) error {
66 moduleInfoJSONCopy := *moduleInfoJSON
67
68 sortAndUnique := func(s *[]string) {
69 *s = slices.Clone(*s)
70 slices.Sort(*s)
71 *s = slices.Compact(*s)
72 }
73
74 sortAndUnique(&moduleInfoJSONCopy.core.Path)
75 sortAndUnique(&moduleInfoJSONCopy.core.Installed)
76 sortAndUnique(&moduleInfoJSONCopy.core.SupportedVariants)
77 sortAndUnique(&moduleInfoJSONCopy.core.HostDependencies)
78 sortAndUnique(&moduleInfoJSONCopy.core.TargetDependencies)
79 sortAndUnique(&moduleInfoJSONCopy.core.Data)
80
81 sortAndUnique(&moduleInfoJSONCopy.Class)
82 sortAndUnique(&moduleInfoJSONCopy.Tags)
83 sortAndUnique(&moduleInfoJSONCopy.Dependencies)
84 sortAndUnique(&moduleInfoJSONCopy.SharedLibs)
85 sortAndUnique(&moduleInfoJSONCopy.StaticLibs)
86 sortAndUnique(&moduleInfoJSONCopy.SystemSharedLibs)
87 sortAndUnique(&moduleInfoJSONCopy.Srcs)
88 sortAndUnique(&moduleInfoJSONCopy.SrcJars)
89 sortAndUnique(&moduleInfoJSONCopy.ClassesJar)
90 sortAndUnique(&moduleInfoJSONCopy.TestMainlineModules)
91 sortAndUnique(&moduleInfoJSONCopy.TestOptionsTags)
92 sortAndUnique(&moduleInfoJSONCopy.RuntimeDependencies)
93 sortAndUnique(&moduleInfoJSONCopy.StaticDependencies)
94 sortAndUnique(&moduleInfoJSONCopy.DataDependencies)
95 sortAndUnique(&moduleInfoJSONCopy.CompatibilitySuites)
96 sortAndUnique(&moduleInfoJSONCopy.AutoTestConfig)
97 sortAndUnique(&moduleInfoJSONCopy.TestConfig)
98
99 encoder := json.NewEncoder(w)
100 return encoder.Encode(combinedModuleInfoJSON{&moduleInfoJSONCopy.core, &moduleInfoJSONCopy})
101}
102
103var ModuleInfoJSONProvider = blueprint.NewProvider[*ModuleInfoJSON]()