xref: /aosp_15_r20/build/soong/android/module_info_json.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1package android
2
3import (
4	"encoding/json"
5	"io"
6	"slices"
7
8	"github.com/google/blueprint"
9	"github.com/google/blueprint/gobtools"
10)
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))
21	Required           []string `json:"required,omitempty"`            // $(sort $(ALL_MODULES.$(m).REQUIRED_FROM_TARGET))
22}
23
24type ExtraModuleInfoJSON struct {
25	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))
37	IsUnitTest          bool     `json:"is_unit_test,omitempty"`          // $(ALL_MODULES.$(m).IS_UNIT_TEST)
38	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
43	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}
47
48type ModuleInfoJSON struct {
49	core CoreModuleInfoJSON
50	ExtraModuleInfoJSON
51}
52
53//ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS := $(sort \
54//$(ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS) \
55//$(LOCAL_STATIC_LIBRARIES) \
56//$(LOCAL_WHOLE_STATIC_LIBRARIES) \
57//$(LOCAL_SHARED_LIBRARIES) \
58//$(LOCAL_DYLIB_LIBRARIES) \
59//$(LOCAL_RLIB_LIBRARIES) \
60//$(LOCAL_PROC_MACRO_LIBRARIES) \
61//$(LOCAL_HEADER_LIBRARIES) \
62//$(LOCAL_STATIC_JAVA_LIBRARIES) \
63//$(LOCAL_JAVA_LIBRARIES) \
64//$(LOCAL_JNI_SHARED_LIBRARIES))
65
66type combinedModuleInfoJSON struct {
67	*CoreModuleInfoJSON
68	*ExtraModuleInfoJSON
69}
70
71func encodeModuleInfoJSON(w io.Writer, moduleInfoJSON *ModuleInfoJSON) error {
72	moduleInfoJSONCopy := *moduleInfoJSON
73
74	sortAndUnique := func(s *[]string) {
75		*s = slices.Clone(*s)
76		slices.Sort(*s)
77		*s = slices.Compact(*s)
78	}
79
80	sortAndUnique(&moduleInfoJSONCopy.core.Path)
81	sortAndUnique(&moduleInfoJSONCopy.core.Installed)
82	sortAndUnique(&moduleInfoJSONCopy.core.SupportedVariants)
83	sortAndUnique(&moduleInfoJSONCopy.core.HostDependencies)
84	sortAndUnique(&moduleInfoJSONCopy.core.TargetDependencies)
85	sortAndUnique(&moduleInfoJSONCopy.core.Data)
86	sortAndUnique(&moduleInfoJSONCopy.core.Required)
87
88	sortAndUnique(&moduleInfoJSONCopy.Class)
89	sortAndUnique(&moduleInfoJSONCopy.Tags)
90	sortAndUnique(&moduleInfoJSONCopy.Dependencies)
91	sortAndUnique(&moduleInfoJSONCopy.SharedLibs)
92	sortAndUnique(&moduleInfoJSONCopy.StaticLibs)
93	sortAndUnique(&moduleInfoJSONCopy.SystemSharedLibs)
94	sortAndUnique(&moduleInfoJSONCopy.Srcs)
95	sortAndUnique(&moduleInfoJSONCopy.SrcJars)
96	sortAndUnique(&moduleInfoJSONCopy.ClassesJar)
97	sortAndUnique(&moduleInfoJSONCopy.TestMainlineModules)
98	sortAndUnique(&moduleInfoJSONCopy.TestOptionsTags)
99	sortAndUnique(&moduleInfoJSONCopy.RuntimeDependencies)
100	sortAndUnique(&moduleInfoJSONCopy.StaticDependencies)
101	sortAndUnique(&moduleInfoJSONCopy.DataDependencies)
102	sortAndUnique(&moduleInfoJSONCopy.CompatibilitySuites)
103	sortAndUnique(&moduleInfoJSONCopy.AutoTestConfig)
104	sortAndUnique(&moduleInfoJSONCopy.TestConfig)
105
106	encoder := json.NewEncoder(w)
107	return encoder.Encode(combinedModuleInfoJSON{&moduleInfoJSONCopy.core, &moduleInfoJSONCopy.ExtraModuleInfoJSON})
108}
109
110func (p *ModuleInfoJSON) ToGob() *combinedModuleInfoJSON {
111	return &combinedModuleInfoJSON{
112		CoreModuleInfoJSON:  &p.core,
113		ExtraModuleInfoJSON: &p.ExtraModuleInfoJSON,
114	}
115}
116
117func (p *ModuleInfoJSON) FromGob(data *combinedModuleInfoJSON) {
118	p.core = *data.CoreModuleInfoJSON
119	p.ExtraModuleInfoJSON = *data.ExtraModuleInfoJSON
120}
121
122func (m *ModuleInfoJSON) GobEncode() ([]byte, error) {
123	return gobtools.CustomGobEncode[combinedModuleInfoJSON](m)
124}
125
126func (m *ModuleInfoJSON) GobDecode(data []byte) error {
127	return gobtools.CustomGobDecode[combinedModuleInfoJSON](data, m)
128}
129
130var ModuleInfoJSONProvider = blueprint.NewProvider[*ModuleInfoJSON]()
131