1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage android 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "sync" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workervar phonyMapOnceKey = NewOnceKey("phony") 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workertype phonyMap map[string]Paths 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workervar phonyMapLock sync.Mutex 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workertype ModulePhonyInfo struct { 30*333d2b36SAndroid Build Coastguard Worker Phonies map[string]Paths 31*333d2b36SAndroid Build Coastguard Worker} 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workervar ModulePhonyProvider = blueprint.NewProvider[ModulePhonyInfo]() 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workerfunc getSingletonPhonyMap(config Config) phonyMap { 36*333d2b36SAndroid Build Coastguard Worker return config.Once(phonyMapOnceKey, func() interface{} { 37*333d2b36SAndroid Build Coastguard Worker return make(phonyMap) 38*333d2b36SAndroid Build Coastguard Worker }).(phonyMap) 39*333d2b36SAndroid Build Coastguard Worker} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workerfunc addSingletonPhony(config Config, name string, deps ...Path) { 42*333d2b36SAndroid Build Coastguard Worker phonyMap := getSingletonPhonyMap(config) 43*333d2b36SAndroid Build Coastguard Worker phonyMapLock.Lock() 44*333d2b36SAndroid Build Coastguard Worker defer phonyMapLock.Unlock() 45*333d2b36SAndroid Build Coastguard Worker phonyMap[name] = append(phonyMap[name], deps...) 46*333d2b36SAndroid Build Coastguard Worker} 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Workertype phonySingleton struct { 49*333d2b36SAndroid Build Coastguard Worker phonyMap phonyMap 50*333d2b36SAndroid Build Coastguard Worker phonyList []string 51*333d2b36SAndroid Build Coastguard Worker} 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Workervar _ SingletonMakeVarsProvider = (*phonySingleton)(nil) 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Workerfunc (p *phonySingleton) GenerateBuildActions(ctx SingletonContext) { 56*333d2b36SAndroid Build Coastguard Worker p.phonyMap = getSingletonPhonyMap(ctx.Config()) 57*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(m Module) { 58*333d2b36SAndroid Build Coastguard Worker if info, ok := OtherModuleProvider(ctx, m, ModulePhonyProvider); ok { 59*333d2b36SAndroid Build Coastguard Worker for k, v := range info.Phonies { 60*333d2b36SAndroid Build Coastguard Worker p.phonyMap[k] = append(p.phonyMap[k], v...) 61*333d2b36SAndroid Build Coastguard Worker } 62*333d2b36SAndroid Build Coastguard Worker } 63*333d2b36SAndroid Build Coastguard Worker }) 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker p.phonyList = SortedKeys(p.phonyMap) 66*333d2b36SAndroid Build Coastguard Worker for _, phony := range p.phonyList { 67*333d2b36SAndroid Build Coastguard Worker p.phonyMap[phony] = SortedUniquePaths(p.phonyMap[phony]) 68*333d2b36SAndroid Build Coastguard Worker } 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker if !ctx.Config().KatiEnabled() { 71*333d2b36SAndroid Build Coastguard Worker for _, phony := range p.phonyList { 72*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, BuildParams{ 73*333d2b36SAndroid Build Coastguard Worker Rule: blueprint.Phony, 74*333d2b36SAndroid Build Coastguard Worker Outputs: []WritablePath{PathForPhony(ctx, phony)}, 75*333d2b36SAndroid Build Coastguard Worker Implicits: p.phonyMap[phony], 76*333d2b36SAndroid Build Coastguard Worker }) 77*333d2b36SAndroid Build Coastguard Worker } 78*333d2b36SAndroid Build Coastguard Worker } 79*333d2b36SAndroid Build Coastguard Worker} 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Workerfunc (p phonySingleton) MakeVars(ctx MakeVarsContext) { 82*333d2b36SAndroid Build Coastguard Worker for _, phony := range p.phonyList { 83*333d2b36SAndroid Build Coastguard Worker ctx.Phony(phony, p.phonyMap[phony]...) 84*333d2b36SAndroid Build Coastguard Worker } 85*333d2b36SAndroid Build Coastguard Worker} 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Workerfunc phonySingletonFactory() Singleton { 88*333d2b36SAndroid Build Coastguard Worker return &phonySingleton{} 89*333d2b36SAndroid Build Coastguard Worker} 90