xref: /aosp_15_r20/build/soong/android/module_info_json.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Workerpackage android
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Workerimport (
4*333d2b36SAndroid Build Coastguard Worker	"encoding/json"
5*333d2b36SAndroid Build Coastguard Worker	"io"
6*333d2b36SAndroid Build Coastguard Worker	"slices"
7*333d2b36SAndroid Build Coastguard Worker
8*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
9*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/gobtools"
10*333d2b36SAndroid Build Coastguard Worker)
11*333d2b36SAndroid Build Coastguard Worker
12*333d2b36SAndroid Build Coastguard Workertype CoreModuleInfoJSON struct {
13*333d2b36SAndroid Build Coastguard Worker	RegisterName       string   `json:"-"`
14*333d2b36SAndroid Build Coastguard Worker	Path               []string `json:"path,omitempty"`                // $(sort $(ALL_MODULES.$(m).PATH))
15*333d2b36SAndroid Build Coastguard Worker	Installed          []string `json:"installed,omitempty"`           // $(sort $(ALL_MODULES.$(m).INSTALLED))
16*333d2b36SAndroid Build Coastguard Worker	ModuleName         string   `json:"module_name,omitempty"`         // $(ALL_MODULES.$(m).MODULE_NAME)
17*333d2b36SAndroid Build Coastguard Worker	SupportedVariants  []string `json:"supported_variants,omitempty"`  // $(sort $(ALL_MODULES.$(m).SUPPORTED_VARIANTS))
18*333d2b36SAndroid Build Coastguard Worker	HostDependencies   []string `json:"host_dependencies,omitempty"`   // $(sort $(ALL_MODULES.$(m).HOST_REQUIRED_FROM_TARGET))
19*333d2b36SAndroid Build Coastguard Worker	TargetDependencies []string `json:"target_dependencies,omitempty"` // $(sort $(ALL_MODULES.$(m).TARGET_REQUIRED_FROM_HOST))
20*333d2b36SAndroid Build Coastguard Worker	Data               []string `json:"data,omitempty"`                // $(sort $(ALL_MODULES.$(m).TEST_DATA))
21*333d2b36SAndroid Build Coastguard Worker	Required           []string `json:"required,omitempty"`            // $(sort $(ALL_MODULES.$(m).REQUIRED_FROM_TARGET))
22*333d2b36SAndroid Build Coastguard Worker}
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Workertype ExtraModuleInfoJSON struct {
25*333d2b36SAndroid Build Coastguard Worker	SubName             string   `json:"-"`
26*333d2b36SAndroid Build Coastguard Worker	Uninstallable       bool     `json:"-"`
27*333d2b36SAndroid Build Coastguard Worker	Class               []string `json:"class,omitempty"`                 // $(sort $(ALL_MODULES.$(m).CLASS))
28*333d2b36SAndroid Build Coastguard Worker	Tags                []string `json:"tags,omitempty"`                  // $(sort $(ALL_MODULES.$(m).TAGS))
29*333d2b36SAndroid Build Coastguard Worker	Dependencies        []string `json:"dependencies,omitempty"`          // $(sort $(ALL_DEPS.$(m).ALL_DEPS))
30*333d2b36SAndroid Build Coastguard Worker	SharedLibs          []string `json:"shared_libs,omitempty"`           // $(sort $(ALL_MODULES.$(m).SHARED_LIBS))
31*333d2b36SAndroid Build Coastguard Worker	StaticLibs          []string `json:"static_libs,omitempty"`           // $(sort $(ALL_MODULES.$(m).STATIC_LIBS))
32*333d2b36SAndroid Build Coastguard Worker	SystemSharedLibs    []string `json:"system_shared_libs,omitempty"`    // $(sort $(ALL_MODULES.$(m).SYSTEM_SHARED_LIBS))
33*333d2b36SAndroid Build Coastguard Worker	Srcs                []string `json:"srcs,omitempty"`                  // $(sort $(ALL_MODULES.$(m).SRCS))
34*333d2b36SAndroid Build Coastguard Worker	SrcJars             []string `json:"srcjars,omitempty"`               // $(sort $(ALL_MODULES.$(m).SRCJARS))
35*333d2b36SAndroid Build Coastguard Worker	ClassesJar          []string `json:"classes_jar,omitempty"`           // $(sort $(ALL_MODULES.$(m).CLASSES_JAR))
36*333d2b36SAndroid Build Coastguard Worker	TestMainlineModules []string `json:"test_mainline_modules,omitempty"` // $(sort $(ALL_MODULES.$(m).TEST_MAINLINE_MODULES))
37*333d2b36SAndroid Build Coastguard Worker	IsUnitTest          bool     `json:"is_unit_test,omitempty"`          // $(ALL_MODULES.$(m).IS_UNIT_TEST)
38*333d2b36SAndroid Build Coastguard Worker	TestOptionsTags     []string `json:"test_options_tags,omitempty"`     // $(sort $(ALL_MODULES.$(m).TEST_OPTIONS_TAGS))
39*333d2b36SAndroid Build Coastguard Worker	RuntimeDependencies []string `json:"runtime_dependencies,omitempty"`  // $(sort $(ALL_MODULES.$(m).LOCAL_RUNTIME_LIBRARIES))
40*333d2b36SAndroid Build Coastguard Worker	StaticDependencies  []string `json:"static_dependencies,omitempty"`   // $(sort $(ALL_MODULES.$(m).LOCAL_STATIC_LIBRARIES))
41*333d2b36SAndroid Build Coastguard Worker	DataDependencies    []string `json:"data_dependencies,omitempty"`     // $(sort $(ALL_MODULES.$(m).TEST_DATA_BINS))
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker	CompatibilitySuites []string `json:"compatibility_suites,omitempty"` // $(sort $(ALL_MODULES.$(m).COMPATIBILITY_SUITES))
44*333d2b36SAndroid Build Coastguard Worker	AutoTestConfig      []string `json:"auto_test_config,omitempty"`     // $(ALL_MODULES.$(m).auto_test_config)
45*333d2b36SAndroid Build Coastguard Worker	TestConfig          []string `json:"test_config,omitempty"`          // $(strip $(ALL_MODULES.$(m).TEST_CONFIG) $(ALL_MODULES.$(m).EXTRA_TEST_CONFIGS)
46*333d2b36SAndroid Build Coastguard Worker}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workertype ModuleInfoJSON struct {
49*333d2b36SAndroid Build Coastguard Worker	core CoreModuleInfoJSON
50*333d2b36SAndroid Build Coastguard Worker	ExtraModuleInfoJSON
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker//ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS := $(sort \
54*333d2b36SAndroid Build Coastguard Worker//$(ALL_DEPS.$(LOCAL_MODULE).ALL_DEPS) \
55*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_STATIC_LIBRARIES) \
56*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_WHOLE_STATIC_LIBRARIES) \
57*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_SHARED_LIBRARIES) \
58*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_DYLIB_LIBRARIES) \
59*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_RLIB_LIBRARIES) \
60*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_PROC_MACRO_LIBRARIES) \
61*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_HEADER_LIBRARIES) \
62*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_STATIC_JAVA_LIBRARIES) \
63*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_JAVA_LIBRARIES) \
64*333d2b36SAndroid Build Coastguard Worker//$(LOCAL_JNI_SHARED_LIBRARIES))
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Workertype combinedModuleInfoJSON struct {
67*333d2b36SAndroid Build Coastguard Worker	*CoreModuleInfoJSON
68*333d2b36SAndroid Build Coastguard Worker	*ExtraModuleInfoJSON
69*333d2b36SAndroid Build Coastguard Worker}
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Workerfunc encodeModuleInfoJSON(w io.Writer, moduleInfoJSON *ModuleInfoJSON) error {
72*333d2b36SAndroid Build Coastguard Worker	moduleInfoJSONCopy := *moduleInfoJSON
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker	sortAndUnique := func(s *[]string) {
75*333d2b36SAndroid Build Coastguard Worker		*s = slices.Clone(*s)
76*333d2b36SAndroid Build Coastguard Worker		slices.Sort(*s)
77*333d2b36SAndroid Build Coastguard Worker		*s = slices.Compact(*s)
78*333d2b36SAndroid Build Coastguard Worker	}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.core.Path)
81*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.core.Installed)
82*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.core.SupportedVariants)
83*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.core.HostDependencies)
84*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.core.TargetDependencies)
85*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.core.Data)
86*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.core.Required)
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.Class)
89*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.Tags)
90*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.Dependencies)
91*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.SharedLibs)
92*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.StaticLibs)
93*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.SystemSharedLibs)
94*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.Srcs)
95*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.SrcJars)
96*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.ClassesJar)
97*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.TestMainlineModules)
98*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.TestOptionsTags)
99*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.RuntimeDependencies)
100*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.StaticDependencies)
101*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.DataDependencies)
102*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.CompatibilitySuites)
103*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.AutoTestConfig)
104*333d2b36SAndroid Build Coastguard Worker	sortAndUnique(&moduleInfoJSONCopy.TestConfig)
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Worker	encoder := json.NewEncoder(w)
107*333d2b36SAndroid Build Coastguard Worker	return encoder.Encode(combinedModuleInfoJSON{&moduleInfoJSONCopy.core, &moduleInfoJSONCopy.ExtraModuleInfoJSON})
108*333d2b36SAndroid Build Coastguard Worker}
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Workerfunc (p *ModuleInfoJSON) ToGob() *combinedModuleInfoJSON {
111*333d2b36SAndroid Build Coastguard Worker	return &combinedModuleInfoJSON{
112*333d2b36SAndroid Build Coastguard Worker		CoreModuleInfoJSON:  &p.core,
113*333d2b36SAndroid Build Coastguard Worker		ExtraModuleInfoJSON: &p.ExtraModuleInfoJSON,
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker}
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Workerfunc (p *ModuleInfoJSON) FromGob(data *combinedModuleInfoJSON) {
118*333d2b36SAndroid Build Coastguard Worker	p.core = *data.CoreModuleInfoJSON
119*333d2b36SAndroid Build Coastguard Worker	p.ExtraModuleInfoJSON = *data.ExtraModuleInfoJSON
120*333d2b36SAndroid Build Coastguard Worker}
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Workerfunc (m *ModuleInfoJSON) GobEncode() ([]byte, error) {
123*333d2b36SAndroid Build Coastguard Worker	return gobtools.CustomGobEncode[combinedModuleInfoJSON](m)
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc (m *ModuleInfoJSON) GobDecode(data []byte) error {
127*333d2b36SAndroid Build Coastguard Worker	return gobtools.CustomGobDecode[combinedModuleInfoJSON](data, m)
128*333d2b36SAndroid Build Coastguard Worker}
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Workervar ModuleInfoJSONProvider = blueprint.NewProvider[*ModuleInfoJSON]()
131