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