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