xref: /aosp_15_r20/build/soong/android/package_ctx.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/remoteexec"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker// PackageContext is a wrapper for blueprint.PackageContext that adds
28*333d2b36SAndroid Build Coastguard Worker// some android-specific helper functions.
29*333d2b36SAndroid Build Coastguard Workertype PackageContext struct {
30*333d2b36SAndroid Build Coastguard Worker	blueprint.PackageContext
31*333d2b36SAndroid Build Coastguard Worker}
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Workerfunc NewPackageContext(pkgPath string) PackageContext {
34*333d2b36SAndroid Build Coastguard Worker	return PackageContext{blueprint.NewPackageContext(pkgPath)}
35*333d2b36SAndroid Build Coastguard Worker}
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Worker// configErrorWrapper can be used with Path functions when a Context is not
38*333d2b36SAndroid Build Coastguard Worker// available. A Config can be provided, and errors are stored as a list for
39*333d2b36SAndroid Build Coastguard Worker// later retrieval.
40*333d2b36SAndroid Build Coastguard Worker//
41*333d2b36SAndroid Build Coastguard Worker// The most common use here will be with VariableFunc, where only a config is
42*333d2b36SAndroid Build Coastguard Worker// provided, and an error should be returned.
43*333d2b36SAndroid Build Coastguard Workertype configErrorWrapper struct {
44*333d2b36SAndroid Build Coastguard Worker	pctx   PackageContext
45*333d2b36SAndroid Build Coastguard Worker	config Config
46*333d2b36SAndroid Build Coastguard Worker	errors []error
47*333d2b36SAndroid Build Coastguard Worker}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workervar _ PathContext = &configErrorWrapper{}
50*333d2b36SAndroid Build Coastguard Workervar _ errorfContext = &configErrorWrapper{}
51*333d2b36SAndroid Build Coastguard Workervar _ PackageVarContext = &variableFuncContextWrapper{}
52*333d2b36SAndroid Build Coastguard Workervar _ PackagePoolContext = &configErrorWrapper{}
53*333d2b36SAndroid Build Coastguard Workervar _ PackageRuleContext = &configErrorWrapper{}
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Workerfunc (e *configErrorWrapper) Config() Config {
56*333d2b36SAndroid Build Coastguard Worker	return e.config
57*333d2b36SAndroid Build Coastguard Worker}
58*333d2b36SAndroid Build Coastguard Workerfunc (e *configErrorWrapper) Errorf(format string, args ...interface{}) {
59*333d2b36SAndroid Build Coastguard Worker	e.errors = append(e.errors, fmt.Errorf(format, args...))
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Workerfunc (e *configErrorWrapper) AddNinjaFileDeps(deps ...string) {
62*333d2b36SAndroid Build Coastguard Worker	e.config.addNinjaFileDeps(deps...)
63*333d2b36SAndroid Build Coastguard Worker}
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Workertype variableFuncContextWrapper struct {
66*333d2b36SAndroid Build Coastguard Worker	configErrorWrapper
67*333d2b36SAndroid Build Coastguard Worker	blueprint.VariableFuncContext
68*333d2b36SAndroid Build Coastguard Worker}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workertype PackagePoolContext interface {
71*333d2b36SAndroid Build Coastguard Worker	PathContext
72*333d2b36SAndroid Build Coastguard Worker	errorfContext
73*333d2b36SAndroid Build Coastguard Worker}
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Workertype PackageRuleContext PackagePoolContext
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Workertype PackageVarContext interface {
78*333d2b36SAndroid Build Coastguard Worker	PackagePoolContext
79*333d2b36SAndroid Build Coastguard Worker	PathGlobContext
80*333d2b36SAndroid Build Coastguard Worker}
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Worker// VariableFunc wraps blueprint.PackageContext.VariableFunc, converting the interface{} config
83*333d2b36SAndroid Build Coastguard Worker// argument to a PackageVarContext.
84*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) VariableFunc(name string,
85*333d2b36SAndroid Build Coastguard Worker	f func(PackageVarContext) string) blueprint.Variable {
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker	return p.PackageContext.VariableFunc(name, func(bpctx blueprint.VariableFuncContext, config interface{}) (string, error) {
88*333d2b36SAndroid Build Coastguard Worker		ctx := &variableFuncContextWrapper{
89*333d2b36SAndroid Build Coastguard Worker			configErrorWrapper:  configErrorWrapper{p, config.(Config), nil},
90*333d2b36SAndroid Build Coastguard Worker			VariableFuncContext: bpctx,
91*333d2b36SAndroid Build Coastguard Worker		}
92*333d2b36SAndroid Build Coastguard Worker		ret := f(ctx)
93*333d2b36SAndroid Build Coastguard Worker		if len(ctx.errors) > 0 {
94*333d2b36SAndroid Build Coastguard Worker			return "", ctx.errors[0]
95*333d2b36SAndroid Build Coastguard Worker		}
96*333d2b36SAndroid Build Coastguard Worker		return ret, nil
97*333d2b36SAndroid Build Coastguard Worker	})
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker// PoolFunc wraps blueprint.PackageContext.PoolFunc, converting the interface{} config
101*333d2b36SAndroid Build Coastguard Worker// argument to a Context that supports Config().
102*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) PoolFunc(name string,
103*333d2b36SAndroid Build Coastguard Worker	f func(PackagePoolContext) blueprint.PoolParams) blueprint.Pool {
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker	return p.PackageContext.PoolFunc(name, func(config interface{}) (blueprint.PoolParams, error) {
106*333d2b36SAndroid Build Coastguard Worker		ctx := &configErrorWrapper{p, config.(Config), nil}
107*333d2b36SAndroid Build Coastguard Worker		params := f(ctx)
108*333d2b36SAndroid Build Coastguard Worker		if len(ctx.errors) > 0 {
109*333d2b36SAndroid Build Coastguard Worker			return params, ctx.errors[0]
110*333d2b36SAndroid Build Coastguard Worker		}
111*333d2b36SAndroid Build Coastguard Worker		return params, nil
112*333d2b36SAndroid Build Coastguard Worker	})
113*333d2b36SAndroid Build Coastguard Worker}
114*333d2b36SAndroid Build Coastguard Worker
115*333d2b36SAndroid Build Coastguard Worker// RuleFunc wraps blueprint.PackageContext.RuleFunc, converting the interface{} config
116*333d2b36SAndroid Build Coastguard Worker// argument to a Context that supports Config(), and provides a default Pool if none is
117*333d2b36SAndroid Build Coastguard Worker// specified.
118*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) RuleFunc(name string,
119*333d2b36SAndroid Build Coastguard Worker	f func(PackageRuleContext) blueprint.RuleParams, argNames ...string) blueprint.Rule {
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	return p.PackageContext.RuleFunc(name, func(config interface{}) (blueprint.RuleParams, error) {
122*333d2b36SAndroid Build Coastguard Worker		ctx := &configErrorWrapper{p, config.(Config), nil}
123*333d2b36SAndroid Build Coastguard Worker		params := f(ctx)
124*333d2b36SAndroid Build Coastguard Worker		if len(ctx.errors) > 0 {
125*333d2b36SAndroid Build Coastguard Worker			return params, ctx.errors[0]
126*333d2b36SAndroid Build Coastguard Worker		}
127*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().UseRemoteBuild() && params.Pool == nil {
128*333d2b36SAndroid Build Coastguard Worker			// When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by
129*333d2b36SAndroid Build Coastguard Worker			// goma/RBE, restrict jobs to the local parallelism value
130*333d2b36SAndroid Build Coastguard Worker			params.Pool = localPool
131*333d2b36SAndroid Build Coastguard Worker		}
132*333d2b36SAndroid Build Coastguard Worker		return params, nil
133*333d2b36SAndroid Build Coastguard Worker	}, argNames...)
134*333d2b36SAndroid Build Coastguard Worker}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker// SourcePathVariable returns a Variable whose value is the source directory
137*333d2b36SAndroid Build Coastguard Worker// appended with the supplied path. It may only be called during a Go package's
138*333d2b36SAndroid Build Coastguard Worker// initialization - either from the init() function or as part of a
139*333d2b36SAndroid Build Coastguard Worker// package-scoped variable's initialization.
140*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) SourcePathVariable(name, path string) blueprint.Variable {
141*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
142*333d2b36SAndroid Build Coastguard Worker		p, err := safePathForSource(ctx, path)
143*333d2b36SAndroid Build Coastguard Worker		if err != nil {
144*333d2b36SAndroid Build Coastguard Worker			ctx.Errorf("%s", err.Error())
145*333d2b36SAndroid Build Coastguard Worker		}
146*333d2b36SAndroid Build Coastguard Worker		return p.String()
147*333d2b36SAndroid Build Coastguard Worker	})
148*333d2b36SAndroid Build Coastguard Worker}
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker// SourcePathsVariable returns a Variable whose value is the source directory
151*333d2b36SAndroid Build Coastguard Worker// appended with the supplied paths, joined with separator. It may only be
152*333d2b36SAndroid Build Coastguard Worker// called during a Go package's initialization - either from the init()
153*333d2b36SAndroid Build Coastguard Worker// function or as part of a package-scoped variable's initialization.
154*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) SourcePathsVariable(name, separator string, paths ...string) blueprint.Variable {
155*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
156*333d2b36SAndroid Build Coastguard Worker		var ret []string
157*333d2b36SAndroid Build Coastguard Worker		for _, path := range paths {
158*333d2b36SAndroid Build Coastguard Worker			p, err := safePathForSource(ctx, path)
159*333d2b36SAndroid Build Coastguard Worker			if err != nil {
160*333d2b36SAndroid Build Coastguard Worker				ctx.Errorf("%s", err.Error())
161*333d2b36SAndroid Build Coastguard Worker			}
162*333d2b36SAndroid Build Coastguard Worker			ret = append(ret, p.String())
163*333d2b36SAndroid Build Coastguard Worker		}
164*333d2b36SAndroid Build Coastguard Worker		return strings.Join(ret, separator)
165*333d2b36SAndroid Build Coastguard Worker	})
166*333d2b36SAndroid Build Coastguard Worker}
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker// SourcePathVariableWithEnvOverride returns a Variable whose value is the source directory
169*333d2b36SAndroid Build Coastguard Worker// appended with the supplied path, or the value of the given environment variable if it is set.
170*333d2b36SAndroid Build Coastguard Worker// The environment variable is not required to point to a path inside the source tree.
171*333d2b36SAndroid Build Coastguard Worker// It may only be called during a Go package's initialization - either from the init() function or
172*333d2b36SAndroid Build Coastguard Worker// as part of a package-scoped variable's initialization.
173*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) SourcePathVariableWithEnvOverride(name, path, env string) blueprint.Variable {
174*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
175*333d2b36SAndroid Build Coastguard Worker		p, err := safePathForSource(ctx, path)
176*333d2b36SAndroid Build Coastguard Worker		if err != nil {
177*333d2b36SAndroid Build Coastguard Worker			ctx.Errorf("%s", err.Error())
178*333d2b36SAndroid Build Coastguard Worker		}
179*333d2b36SAndroid Build Coastguard Worker		return ctx.Config().GetenvWithDefault(env, p.String())
180*333d2b36SAndroid Build Coastguard Worker	})
181*333d2b36SAndroid Build Coastguard Worker}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker// HostBinToolVariable returns a Variable whose value is the path to a host tool
184*333d2b36SAndroid Build Coastguard Worker// in the bin directory for host targets. It may only be called during a Go
185*333d2b36SAndroid Build Coastguard Worker// package's initialization - either from the init() function or as part of a
186*333d2b36SAndroid Build Coastguard Worker// package-scoped variable's initialization.
187*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) HostBinToolVariable(name, path string) blueprint.Variable {
188*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
189*333d2b36SAndroid Build Coastguard Worker		return proptools.NinjaAndShellEscape(ctx.Config().HostToolPath(ctx, path).String())
190*333d2b36SAndroid Build Coastguard Worker	})
191*333d2b36SAndroid Build Coastguard Worker}
192*333d2b36SAndroid Build Coastguard Worker
193*333d2b36SAndroid Build Coastguard Worker// HostJNIToolVariable returns a Variable whose value is the path to a host tool
194*333d2b36SAndroid Build Coastguard Worker// in the lib directory for host targets. It may only be called during a Go
195*333d2b36SAndroid Build Coastguard Worker// package's initialization - either from the init() function or as part of a
196*333d2b36SAndroid Build Coastguard Worker// package-scoped variable's initialization.
197*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) HostJNIToolVariable(name, path string) blueprint.Variable {
198*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
199*333d2b36SAndroid Build Coastguard Worker		return proptools.NinjaAndShellEscape(ctx.Config().HostJNIToolPath(ctx, path).String())
200*333d2b36SAndroid Build Coastguard Worker	})
201*333d2b36SAndroid Build Coastguard Worker}
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Worker// HostJavaToolVariable returns a Variable whose value is the path to a host
204*333d2b36SAndroid Build Coastguard Worker// tool in the frameworks directory for host targets. It may only be called
205*333d2b36SAndroid Build Coastguard Worker// during a Go package's initialization - either from the init() function or as
206*333d2b36SAndroid Build Coastguard Worker// part of a package-scoped variable's initialization.
207*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) HostJavaToolVariable(name, path string) blueprint.Variable {
208*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
209*333d2b36SAndroid Build Coastguard Worker		return proptools.NinjaAndShellEscape(ctx.Config().HostJavaToolPath(ctx, path).String())
210*333d2b36SAndroid Build Coastguard Worker	})
211*333d2b36SAndroid Build Coastguard Worker}
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker// IntermediatesPathVariable returns a Variable whose value is the intermediate
214*333d2b36SAndroid Build Coastguard Worker// directory appended with the supplied path. It may only be called during a Go
215*333d2b36SAndroid Build Coastguard Worker// package's initialization - either from the init() function or as part of a
216*333d2b36SAndroid Build Coastguard Worker// package-scoped variable's initialization.
217*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) IntermediatesPathVariable(name, path string) blueprint.Variable {
218*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
219*333d2b36SAndroid Build Coastguard Worker		return PathForIntermediates(ctx, path).String()
220*333d2b36SAndroid Build Coastguard Worker	})
221*333d2b36SAndroid Build Coastguard Worker}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker// PrefixedExistentPathsForSourcesVariable returns a Variable whose value is the
224*333d2b36SAndroid Build Coastguard Worker// list of present source paths prefixed with the supplied prefix. It may only
225*333d2b36SAndroid Build Coastguard Worker// be called during a Go package's initialization - either from the init()
226*333d2b36SAndroid Build Coastguard Worker// function or as part of a package-scoped variable's initialization.
227*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) PrefixedExistentPathsForSourcesVariable(
228*333d2b36SAndroid Build Coastguard Worker	name, prefix string, paths []string) blueprint.Variable {
229*333d2b36SAndroid Build Coastguard Worker
230*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
231*333d2b36SAndroid Build Coastguard Worker		paths := ExistentPathsForSources(ctx, paths)
232*333d2b36SAndroid Build Coastguard Worker		return JoinWithPrefix(paths.Strings(), prefix)
233*333d2b36SAndroid Build Coastguard Worker	})
234*333d2b36SAndroid Build Coastguard Worker}
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Worker// AndroidStaticRule is an alias for StaticRule.
237*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) AndroidStaticRule(name string, params blueprint.RuleParams,
238*333d2b36SAndroid Build Coastguard Worker	argNames ...string) blueprint.Rule {
239*333d2b36SAndroid Build Coastguard Worker	return p.StaticRule(name, params, argNames...)
240*333d2b36SAndroid Build Coastguard Worker}
241*333d2b36SAndroid Build Coastguard Worker
242*333d2b36SAndroid Build Coastguard Worker// StaticRule wraps blueprint.StaticRule and provides a default Pool if none is specified.
243*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) StaticRule(name string, params blueprint.RuleParams,
244*333d2b36SAndroid Build Coastguard Worker	argNames ...string) blueprint.Rule {
245*333d2b36SAndroid Build Coastguard Worker	return p.RuleFunc(name, func(PackageRuleContext) blueprint.RuleParams {
246*333d2b36SAndroid Build Coastguard Worker		return params
247*333d2b36SAndroid Build Coastguard Worker	}, argNames...)
248*333d2b36SAndroid Build Coastguard Worker}
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker// RemoteRuleSupports configures rules with whether they have Goma and/or RBE support.
251*333d2b36SAndroid Build Coastguard Workertype RemoteRuleSupports struct {
252*333d2b36SAndroid Build Coastguard Worker	Goma bool
253*333d2b36SAndroid Build Coastguard Worker	RBE  bool
254*333d2b36SAndroid Build Coastguard Worker}
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Worker// AndroidRemoteStaticRule wraps blueprint.StaticRule but uses goma or RBE's parallelism if goma or RBE are enabled
257*333d2b36SAndroid Build Coastguard Worker// and the appropriate SUPPORTS_* flag is set.
258*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) AndroidRemoteStaticRule(name string, supports RemoteRuleSupports, params blueprint.RuleParams,
259*333d2b36SAndroid Build Coastguard Worker	argNames ...string) blueprint.Rule {
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Worker	return p.PackageContext.RuleFunc(name, func(config interface{}) (blueprint.RuleParams, error) {
262*333d2b36SAndroid Build Coastguard Worker		ctx := &configErrorWrapper{p, config.(Config), nil}
263*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().UseGoma() && !supports.Goma {
264*333d2b36SAndroid Build Coastguard Worker			// When USE_GOMA=true is set and the rule is not supported by goma, restrict jobs to the
265*333d2b36SAndroid Build Coastguard Worker			// local parallelism value
266*333d2b36SAndroid Build Coastguard Worker			params.Pool = localPool
267*333d2b36SAndroid Build Coastguard Worker		}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().UseRBE() && !supports.RBE {
270*333d2b36SAndroid Build Coastguard Worker			// When USE_RBE=true is set and the rule is not supported by RBE, restrict jobs to the
271*333d2b36SAndroid Build Coastguard Worker			// local parallelism value
272*333d2b36SAndroid Build Coastguard Worker			params.Pool = localPool
273*333d2b36SAndroid Build Coastguard Worker		}
274*333d2b36SAndroid Build Coastguard Worker
275*333d2b36SAndroid Build Coastguard Worker		return params, nil
276*333d2b36SAndroid Build Coastguard Worker	}, argNames...)
277*333d2b36SAndroid Build Coastguard Worker}
278*333d2b36SAndroid Build Coastguard Worker
279*333d2b36SAndroid Build Coastguard Worker// RemoteStaticRules returns a pair of rules based on the given RuleParams, where the first rule is a
280*333d2b36SAndroid Build Coastguard Worker// locally executable rule and the second rule is a remotely executable rule. commonArgs are args
281*333d2b36SAndroid Build Coastguard Worker// used for both the local and remotely executable rules. reArgs are used only for remote
282*333d2b36SAndroid Build Coastguard Worker// execution.
283*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) RemoteStaticRules(name string, ruleParams blueprint.RuleParams, reParams *remoteexec.REParams, commonArgs []string, reArgs []string) (blueprint.Rule, blueprint.Rule) {
284*333d2b36SAndroid Build Coastguard Worker	ruleParamsRE := ruleParams
285*333d2b36SAndroid Build Coastguard Worker	ruleParams.Command = strings.ReplaceAll(ruleParams.Command, "$reTemplate", "")
286*333d2b36SAndroid Build Coastguard Worker	ruleParamsRE.Command = strings.ReplaceAll(ruleParamsRE.Command, "$reTemplate", reParams.Template())
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker	return p.AndroidStaticRule(name, ruleParams, commonArgs...),
289*333d2b36SAndroid Build Coastguard Worker		p.AndroidRemoteStaticRule(name+"RE", RemoteRuleSupports{RBE: true}, ruleParamsRE, append(commonArgs, reArgs...)...)
290*333d2b36SAndroid Build Coastguard Worker}
291*333d2b36SAndroid Build Coastguard Worker
292*333d2b36SAndroid Build Coastguard Worker// MultiCommandStaticRules returns a pair of rules based on the given RuleParams, where the first
293*333d2b36SAndroid Build Coastguard Worker// rule is a locally executable rule and the second rule is a remotely executable rule. This
294*333d2b36SAndroid Build Coastguard Worker// function supports multiple remote execution wrappers placed in the template when commands are
295*333d2b36SAndroid Build Coastguard Worker// chained together with &&. commonArgs are args used for both the local and remotely executable
296*333d2b36SAndroid Build Coastguard Worker// rules. reArgs are args used only for remote execution.
297*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) MultiCommandRemoteStaticRules(name string, ruleParams blueprint.RuleParams, reParams map[string]*remoteexec.REParams, commonArgs []string, reArgs []string) (blueprint.Rule, blueprint.Rule) {
298*333d2b36SAndroid Build Coastguard Worker	ruleParamsRE := ruleParams
299*333d2b36SAndroid Build Coastguard Worker	for k, v := range reParams {
300*333d2b36SAndroid Build Coastguard Worker		ruleParams.Command = strings.ReplaceAll(ruleParams.Command, k, "")
301*333d2b36SAndroid Build Coastguard Worker		ruleParamsRE.Command = strings.ReplaceAll(ruleParamsRE.Command, k, v.Template())
302*333d2b36SAndroid Build Coastguard Worker	}
303*333d2b36SAndroid Build Coastguard Worker
304*333d2b36SAndroid Build Coastguard Worker	return p.AndroidStaticRule(name, ruleParams, commonArgs...),
305*333d2b36SAndroid Build Coastguard Worker		p.AndroidRemoteStaticRule(name+"RE", RemoteRuleSupports{RBE: true}, ruleParamsRE, append(commonArgs, reArgs...)...)
306*333d2b36SAndroid Build Coastguard Worker}
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Worker// StaticVariableWithEnvOverride creates a static variable that evaluates to the value of the given
309*333d2b36SAndroid Build Coastguard Worker// environment variable if set, otherwise the given default.
310*333d2b36SAndroid Build Coastguard Workerfunc (p PackageContext) StaticVariableWithEnvOverride(name, envVar, defaultVal string) blueprint.Variable {
311*333d2b36SAndroid Build Coastguard Worker	return p.VariableFunc(name, func(ctx PackageVarContext) string {
312*333d2b36SAndroid Build Coastguard Worker		return ctx.Config().GetenvWithDefault(envVar, defaultVal)
313*333d2b36SAndroid Build Coastguard Worker	})
314*333d2b36SAndroid Build Coastguard Worker}
315