xref: /aosp_15_r20/build/soong/phony/phony.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 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 phony
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"io"
20*333d2b36SAndroid Build Coastguard Worker	"strings"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workerfunc init() {
28*333d2b36SAndroid Build Coastguard Worker	registerPhonyModuleTypes(android.InitRegistrationContext)
29*333d2b36SAndroid Build Coastguard Worker}
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workerfunc registerPhonyModuleTypes(ctx android.RegistrationContext) {
32*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("phony", PhonyFactory)
33*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("phony_rule", PhonyRuleFactory)
34*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("phony_rule_defaults", PhonyRuleDefaultsFactory)
35*333d2b36SAndroid Build Coastguard Worker}
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Workervar PrepareForTestWithPhony = android.FixtureRegisterWithContext(registerPhonyModuleTypes)
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Workertype phony struct {
40*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
41*333d2b36SAndroid Build Coastguard Worker	requiredModuleNames       []string
42*333d2b36SAndroid Build Coastguard Worker	hostRequiredModuleNames   []string
43*333d2b36SAndroid Build Coastguard Worker	targetRequiredModuleNames []string
44*333d2b36SAndroid Build Coastguard Worker}
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Workerfunc PhonyFactory() android.Module {
47*333d2b36SAndroid Build Coastguard Worker	module := &phony{}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
50*333d2b36SAndroid Build Coastguard Worker	return module
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Workerfunc (p *phony) GenerateAndroidBuildActions(ctx android.ModuleContext) {
54*333d2b36SAndroid Build Coastguard Worker	p.requiredModuleNames = ctx.RequiredModuleNames(ctx)
55*333d2b36SAndroid Build Coastguard Worker	p.hostRequiredModuleNames = ctx.HostRequiredModuleNames()
56*333d2b36SAndroid Build Coastguard Worker	p.targetRequiredModuleNames = ctx.TargetRequiredModuleNames()
57*333d2b36SAndroid Build Coastguard Worker}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Workerfunc (p *phony) AndroidMk() android.AndroidMkData {
60*333d2b36SAndroid Build Coastguard Worker	return android.AndroidMkData{
61*333d2b36SAndroid Build Coastguard Worker		Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
62*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)", " # phony.phony")
63*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir)
64*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(w, "LOCAL_MODULE :=", name)
65*333d2b36SAndroid Build Coastguard Worker			if p.Host() {
66*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true")
67*333d2b36SAndroid Build Coastguard Worker			}
68*333d2b36SAndroid Build Coastguard Worker			if len(p.requiredModuleNames) > 0 {
69*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=",
70*333d2b36SAndroid Build Coastguard Worker					strings.Join(p.requiredModuleNames, " "))
71*333d2b36SAndroid Build Coastguard Worker			}
72*333d2b36SAndroid Build Coastguard Worker			if len(p.hostRequiredModuleNames) > 0 {
73*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintln(w, "LOCAL_HOST_REQUIRED_MODULES :=",
74*333d2b36SAndroid Build Coastguard Worker					strings.Join(p.hostRequiredModuleNames, " "))
75*333d2b36SAndroid Build Coastguard Worker			}
76*333d2b36SAndroid Build Coastguard Worker			if len(p.targetRequiredModuleNames) > 0 {
77*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintln(w, "LOCAL_TARGET_REQUIRED_MODULES :=",
78*333d2b36SAndroid Build Coastguard Worker					strings.Join(p.targetRequiredModuleNames, " "))
79*333d2b36SAndroid Build Coastguard Worker			}
80*333d2b36SAndroid Build Coastguard Worker			// AconfigUpdateAndroidMkData may have added elements to Extra.  Process them here.
81*333d2b36SAndroid Build Coastguard Worker			for _, extra := range data.Extra {
82*333d2b36SAndroid Build Coastguard Worker				extra(w, nil)
83*333d2b36SAndroid Build Coastguard Worker			}
84*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)")
85*333d2b36SAndroid Build Coastguard Worker		},
86*333d2b36SAndroid Build Coastguard Worker	}
87*333d2b36SAndroid Build Coastguard Worker}
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Workertype PhonyRule struct {
90*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
91*333d2b36SAndroid Build Coastguard Worker	android.DefaultableModuleBase
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker	phonyDepsModuleNames []string
94*333d2b36SAndroid Build Coastguard Worker	properties           PhonyProperties
95*333d2b36SAndroid Build Coastguard Worker}
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Workertype PhonyProperties struct {
98*333d2b36SAndroid Build Coastguard Worker	// The Phony_deps is the set of all dependencies for this target,
99*333d2b36SAndroid Build Coastguard Worker	// and it can function similarly to .PHONY in a makefile.
100*333d2b36SAndroid Build Coastguard Worker	// Additionally, dependencies within it can even include genrule.
101*333d2b36SAndroid Build Coastguard Worker	Phony_deps proptools.Configurable[[]string]
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker// The phony_rule provides functionality similar to the .PHONY in a makefile.
105*333d2b36SAndroid Build Coastguard Worker// It can create a phony target and include relevant dependencies associated with it.
106*333d2b36SAndroid Build Coastguard Workerfunc PhonyRuleFactory() android.Module {
107*333d2b36SAndroid Build Coastguard Worker	module := &PhonyRule{}
108*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidModule(module)
109*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
110*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultableModule(module)
111*333d2b36SAndroid Build Coastguard Worker	return module
112*333d2b36SAndroid Build Coastguard Worker}
113*333d2b36SAndroid Build Coastguard Worker
114*333d2b36SAndroid Build Coastguard Workerfunc (p *PhonyRule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
115*333d2b36SAndroid Build Coastguard Worker	p.phonyDepsModuleNames = p.properties.Phony_deps.GetOrDefault(ctx, nil)
116*333d2b36SAndroid Build Coastguard Worker}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Workerfunc (p *PhonyRule) AndroidMk() android.AndroidMkData {
119*333d2b36SAndroid Build Coastguard Worker	return android.AndroidMkData{
120*333d2b36SAndroid Build Coastguard Worker		Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
121*333d2b36SAndroid Build Coastguard Worker			if len(p.phonyDepsModuleNames) > 0 {
122*333d2b36SAndroid Build Coastguard Worker				depModulesStr := strings.Join(p.phonyDepsModuleNames, " ")
123*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintln(w, ".PHONY:", name)
124*333d2b36SAndroid Build Coastguard Worker				fmt.Fprintln(w, name, ":", depModulesStr)
125*333d2b36SAndroid Build Coastguard Worker			}
126*333d2b36SAndroid Build Coastguard Worker		},
127*333d2b36SAndroid Build Coastguard Worker	}
128*333d2b36SAndroid Build Coastguard Worker}
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Worker// PhonyRuleDefaults
131*333d2b36SAndroid Build Coastguard Workertype PhonyRuleDefaults struct {
132*333d2b36SAndroid Build Coastguard Worker	android.ModuleBase
133*333d2b36SAndroid Build Coastguard Worker	android.DefaultsModuleBase
134*333d2b36SAndroid Build Coastguard Worker}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker// phony_rule_defaults provides a set of properties that can be inherited by other phony_rules.
137*333d2b36SAndroid Build Coastguard Worker//
138*333d2b36SAndroid Build Coastguard Worker// A module can use the properties from a phony_rule_defaults module using `defaults: ["defaults_module_name"]`.  Each
139*333d2b36SAndroid Build Coastguard Worker// property in the defaults module that exists in the depending module will be prepended to the depending module's
140*333d2b36SAndroid Build Coastguard Worker// value for that property.
141*333d2b36SAndroid Build Coastguard Worker//
142*333d2b36SAndroid Build Coastguard Worker// Example:
143*333d2b36SAndroid Build Coastguard Worker//
144*333d2b36SAndroid Build Coastguard Worker//	phony_rule_defaults {
145*333d2b36SAndroid Build Coastguard Worker//	    name: "add_module1_defaults",
146*333d2b36SAndroid Build Coastguard Worker//	    phony_deps: [
147*333d2b36SAndroid Build Coastguard Worker//	        "module1",
148*333d2b36SAndroid Build Coastguard Worker//	    ],
149*333d2b36SAndroid Build Coastguard Worker//	}
150*333d2b36SAndroid Build Coastguard Worker//
151*333d2b36SAndroid Build Coastguard Worker//	phony_rule {
152*333d2b36SAndroid Build Coastguard Worker//	    name: "example",
153*333d2b36SAndroid Build Coastguard Worker//	    defaults: ["add_module1_defaults"],
154*333d2b36SAndroid Build Coastguard Worker//	}
155*333d2b36SAndroid Build Coastguard Worker//
156*333d2b36SAndroid Build Coastguard Worker// is functionally identical to:
157*333d2b36SAndroid Build Coastguard Worker//
158*333d2b36SAndroid Build Coastguard Worker//	phony_rule {
159*333d2b36SAndroid Build Coastguard Worker//	    name: "example",
160*333d2b36SAndroid Build Coastguard Worker//	    phony_deps: [
161*333d2b36SAndroid Build Coastguard Worker//	        "module1",
162*333d2b36SAndroid Build Coastguard Worker//	    ],
163*333d2b36SAndroid Build Coastguard Worker//	}
164*333d2b36SAndroid Build Coastguard Workerfunc PhonyRuleDefaultsFactory() android.Module {
165*333d2b36SAndroid Build Coastguard Worker	module := &PhonyRuleDefaults{}
166*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&PhonyProperties{})
167*333d2b36SAndroid Build Coastguard Worker	android.InitDefaultsModule(module)
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	return module
170*333d2b36SAndroid Build Coastguard Worker}
171