1// Copyright 2020 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 android
16
17import (
18	"sync"
19
20	"github.com/google/blueprint"
21)
22
23var phonyMapOnceKey = NewOnceKey("phony")
24
25type phonyMap map[string]Paths
26
27var phonyMapLock sync.Mutex
28
29func getPhonyMap(config Config) phonyMap {
30	return config.Once(phonyMapOnceKey, func() interface{} {
31		return make(phonyMap)
32	}).(phonyMap)
33}
34
35func addPhony(config Config, name string, deps ...Path) {
36	phonyMap := getPhonyMap(config)
37	phonyMapLock.Lock()
38	defer phonyMapLock.Unlock()
39	phonyMap[name] = append(phonyMap[name], deps...)
40}
41
42type phonySingleton struct {
43	phonyMap  phonyMap
44	phonyList []string
45}
46
47var _ SingletonMakeVarsProvider = (*phonySingleton)(nil)
48
49func (p *phonySingleton) GenerateBuildActions(ctx SingletonContext) {
50	p.phonyMap = getPhonyMap(ctx.Config())
51	p.phonyList = SortedStringKeys(p.phonyMap)
52	for _, phony := range p.phonyList {
53		p.phonyMap[phony] = SortedUniquePaths(p.phonyMap[phony])
54	}
55
56	if !ctx.Config().KatiEnabled() {
57		for _, phony := range p.phonyList {
58			ctx.Build(pctx, BuildParams{
59				Rule:      blueprint.Phony,
60				Outputs:   []WritablePath{PathForPhony(ctx, phony)},
61				Implicits: p.phonyMap[phony],
62			})
63		}
64	}
65}
66
67func (p phonySingleton) MakeVars(ctx MakeVarsContext) {
68	for _, phony := range p.phonyList {
69		ctx.Phony(phony, p.phonyMap[phony]...)
70	}
71}
72
73func phonySingletonFactory() Singleton {
74	return &phonySingleton{}
75}
76