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