• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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          string   `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	TestModuleConfigBase string   `json:"test_module_config_base,omitempty"`
47	ExtraRequired        []string `json:"-"`
48	ExtraHostRequired    []string `json:"-"`
49
50	SupportedVariantsOverride []string `json:"-"`
51	Disabled                  bool     `json:"-"`
52	RegisterNameOverride      string   `json:"-"`
53	ModuleNameOverride        string   `json:"-"`
54}
55
56type ModuleInfoJSON struct {
57	core CoreModuleInfoJSON
58	ExtraModuleInfoJSON
59}
60
61//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
76	*ExtraModuleInfoJSON
77}
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)
94	sortAndUnique(&moduleInfoJSONCopy.core.Required)
95
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)
115	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)
136}
137
138func (m *ModuleInfoJSON) GetInstalled() []string {
139	return m.core.Installed
140}
141
142func (m *ModuleInfoJSON) GetClass() []string {
143	return m.Class
144}
145
146var ModuleInfoJSONProvider = blueprint.NewProvider[[]*ModuleInfoJSON]()
147