/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package apex import ( "encoding/json" "github.com/google/blueprint" "android/soong/android" ) var ( mtctx = android.NewPackageContext("android/soong/multitree_apex") ) func init() { RegisterModulesSingleton(android.InitRegistrationContext) } func RegisterModulesSingleton(ctx android.RegistrationContext) { ctx.RegisterSingletonType("apex_multitree_singleton", multitreeAnalysisSingletonFactory) } var PrepareForTestWithApexMultitreeSingleton = android.FixtureRegisterWithContext(RegisterModulesSingleton) func multitreeAnalysisSingletonFactory() android.Singleton { return &multitreeAnalysisSingleton{} } type multitreeAnalysisSingleton struct { multitreeApexMetadataPath android.OutputPath } type ApexMultitreeMetadataEntry struct { // The name of the apex. Name string // TODO: Add other properties as needed. } type ApexMultitreeMetadata struct { // Information about the installable apexes. Apexes map[string]ApexMultitreeMetadataEntry } func (p *multitreeAnalysisSingleton) GenerateBuildActions(context android.SingletonContext) { data := ApexMultitreeMetadata{ Apexes: make(map[string]ApexMultitreeMetadataEntry, 0), } context.VisitAllModules(func(module android.Module) { // If this module is not being installed, ignore it. if !module.Enabled() || module.IsSkipInstall() { return } // Actual apexes provide ApexBundleInfoProvider. if _, ok := context.ModuleProvider(module, ApexBundleInfoProvider).(ApexBundleInfo); !ok { return } bundle, ok := module.(*apexBundle) if ok && !bundle.testApex && !bundle.vndkApex && bundle.primaryApexType { name := module.Name() entry := ApexMultitreeMetadataEntry{ Name: name, } data.Apexes[name] = entry } }) p.multitreeApexMetadataPath = android.PathForOutput(context, "multitree_apex_metadata.json") jsonStr, err := json.Marshal(data) if err != nil { context.Errorf(err.Error()) } android.WriteFileRule(context, p.multitreeApexMetadataPath, string(jsonStr)) // This seems cleaner, but doesn't emit the phony rule in testing. // context.Phony("multitree_apex_metadata", p.multitreeApexMetadataPath) context.Build(mtctx, android.BuildParams{ Rule: blueprint.Phony, Description: "phony rule for multitree_apex_metadata", Inputs: []android.Path{p.multitreeApexMetadataPath}, Output: android.PathForPhony(context, "multitree_apex_metadata"), }) }