1// Copyright 2022 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package multitree 16 17import ( 18 "android/soong/android" 19 "encoding/json" 20) 21 22func init() { 23 android.RegisterSingletonType("update-meta", UpdateMetaSingleton) 24} 25 26func UpdateMetaSingleton() android.Singleton { 27 return &updateMetaSingleton{} 28} 29 30type jsonImported struct { 31 FileGroups map[string][]string `json:",omitempty"` 32} 33 34type metadataJsonFlags struct { 35 Imported jsonImported `json:",omitempty"` 36 Exported map[string][]string `json:",omitempty"` 37} 38 39type updateMetaSingleton struct { 40 importedModules []string 41 generatedMetadataFile android.OutputPath 42} 43 44func (s *updateMetaSingleton) GenerateBuildActions(ctx android.SingletonContext) { 45 metadata := metadataJsonFlags{ 46 Imported: jsonImported{ 47 FileGroups: make(map[string][]string), 48 }, 49 Exported: make(map[string][]string), 50 } 51 ctx.VisitAllModules(func(module android.Module) { 52 if ifg, ok := module.(*importedFileGroup); ok { 53 metadata.Imported.FileGroups[ifg.BaseModuleName()] = ifg.properties.Imported 54 } 55 if e, ok := module.(ExportableModule); ok { 56 if e.IsExported() && e.Exportable() { 57 for tag, files := range e.TaggedOutputs() { 58 // TODO(b/219846705): refactor this to a dictionary 59 metadata.Exported[e.Name()+":"+tag] = append(metadata.Exported[e.Name()+":"+tag], files.Strings()...) 60 } 61 } 62 } 63 }) 64 jsonStr, err := json.Marshal(metadata) 65 if err != nil { 66 ctx.Errorf(err.Error()) 67 } 68 s.generatedMetadataFile = android.PathForOutput(ctx, "multitree", "metadata.json") 69 android.WriteFileRule(ctx, s.generatedMetadataFile, string(jsonStr)) 70} 71 72func (s *updateMetaSingleton) MakeVars(ctx android.MakeVarsContext) { 73 ctx.Strict("MULTITREE_METADATA", s.generatedMetadataFile.String()) 74} 75