// Copyright 2019 Google Inc. All rights reserved. // // 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 android import ( "fmt" "sync/atomic" "github.com/google/blueprint" ) func init() { RegisterModuleType("package", PackageFactory) } type packageProperties struct { // Specifies the default visibility for all modules defined in this package. Default_visibility []string // Specifies the names of the default licenses for all modules defined in this package. Default_applicable_licenses []string } type packageModule struct { ModuleBase properties packageProperties // The module dir name string `blueprint:"mutated"` } func (p *packageModule) GenerateAndroidBuildActions(ModuleContext) { // Nothing to do. } func (p *packageModule) GenerateBuildActions(ctx blueprint.ModuleContext) { // Nothing to do. } func (p *packageModule) DepsMutator(ctx BottomUpMutatorContext) { // Nothing to do. } func (p *packageModule) Name() string { return p.name } func registerPackageRenamer(ctx RegisterMutatorsContext) { ctx.BottomUp("packages", packageRenamer).Parallel() } // packageRenamer ensures that every package gets named func packageRenamer(ctx BottomUpMutatorContext) { if p, ok := ctx.Module().(*packageModule); ok { p.name = "//" + ctx.ModuleDir() ctx.Rename("//" + ctx.ModuleDir()) } } // Counter to ensure package modules are created with a unique name within whatever namespace they // belong. var packageCount uint32 = 0 func PackageFactory() Module { module := &packageModule{} // Get a unique if for the package. Has to be done atomically as the creation of the modules are // done in parallel. id := atomic.AddUint32(&packageCount, 1) module.name = fmt.Sprintf("soong_package_%d", id) module.AddProperties(&module.properties) // The name is the relative path from build root to the directory containing this // module. Set that name at the earliest possible moment that information is available // which is in a LoadHook. AddLoadHook(module, func(ctx LoadHookContext) { module.name = "//" + ctx.ModuleDir() }) return module }