diff --git a/android/module.go b/android/module.go index 70b602bf4..a6b8d5364 100644 --- a/android/module.go +++ b/android/module.go @@ -1195,9 +1195,9 @@ func (m *moduleContext) Variable(pctx PackageContext, name, value string) { func (m *moduleContext) Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule { - if m.config.UseGoma() && params.Pool == nil { - // When USE_GOMA=true is set and the rule is not supported by goma, restrict jobs to the - // local parallelism value + if (m.config.UseGoma() || m.config.UseRBE()) && params.Pool == nil { + // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict + // jobs to the local parallelism value params.Pool = localPool } diff --git a/android/package_ctx.go b/android/package_ctx.go index 548450e44..cf8facef4 100644 --- a/android/package_ctx.go +++ b/android/package_ctx.go @@ -115,9 +115,9 @@ func (p PackageContext) RuleFunc(name string, if len(ctx.errors) > 0 { return params, ctx.errors[0] } - if ctx.Config().UseGoma() && params.Pool == nil { - // When USE_GOMA=true is set and the rule is not supported by goma, restrict jobs to the - // local parallelism value + if (ctx.Config().UseGoma() || ctx.Config().UseRBE()) && params.Pool == nil { + // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by + // goma/RBE, restrict jobs to the local parallelism value params.Pool = localPool } return params, nil @@ -254,9 +254,35 @@ func (p PackageContext) StaticRule(name string, params blueprint.RuleParams, }, argNames...) } -// AndroidGomaStaticRule wraps blueprint.StaticRule but uses goma's parallelism if goma is enabled -func (p PackageContext) AndroidGomaStaticRule(name string, params blueprint.RuleParams, +// RemoteRuleSupports selects if a AndroidRemoteStaticRule supports goma, RBE, or both. +type RemoteRuleSupports int + +const ( + SUPPORTS_NONE = 0 + SUPPORTS_GOMA = 1 << iota + SUPPORTS_RBE = 1 << iota + SUPPORTS_BOTH = SUPPORTS_GOMA | SUPPORTS_RBE +) + +// AndroidRemoteStaticRule wraps blueprint.StaticRule but uses goma or RBE's parallelism if goma or RBE are enabled +// and the appropriate SUPPORTS_* flag is set. +func (p PackageContext) AndroidRemoteStaticRule(name string, supports RemoteRuleSupports, params blueprint.RuleParams, argNames ...string) blueprint.Rule { - // bypass android.PackageContext.StaticRule so that Pool does not get set to local_pool. - return p.PackageContext.StaticRule(name, params, argNames...) + + return p.PackageContext.RuleFunc(name, func(config interface{}) (blueprint.RuleParams, error) { + ctx := &configErrorWrapper{p, config.(Config), nil} + if ctx.Config().UseGoma() && supports&SUPPORTS_GOMA == 0 { + // When USE_GOMA=true is set and the rule is not supported by goma, restrict jobs to the + // local parallelism value + params.Pool = localPool + } + + if ctx.Config().UseRBE() && supports&SUPPORTS_RBE == 0 { + // When USE_RBE=true is set and the rule is not supported by RBE, restrict jobs to the + // local parallelism value + params.Pool = localPool + } + + return params, nil + }, argNames...) } diff --git a/android/singleton.go b/android/singleton.go index 33bc6d147..5519ca019 100644 --- a/android/singleton.go +++ b/android/singleton.go @@ -131,9 +131,9 @@ func (s *singletonContextAdaptor) Variable(pctx PackageContext, name, value stri } func (s *singletonContextAdaptor) Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule { - if s.Config().UseGoma() && params.Pool == nil { - // When USE_GOMA=true is set and the rule is not supported by goma, restrict jobs to the - // local parallelism value + if (s.Config().UseGoma() || s.Config().UseRBE()) && params.Pool == nil { + // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict + // jobs to the local parallelism value params.Pool = localPool } rule := s.SingletonContext.Rule(pctx.PackageContext, name, params, argNames...) diff --git a/bpf/bpf.go b/bpf/bpf.go index 90ec963d1..024fcbccc 100644 --- a/bpf/bpf.go +++ b/bpf/bpf.go @@ -33,7 +33,7 @@ func init() { var ( pctx = android.NewPackageContext("android/soong/bpf") - ccRule = pctx.AndroidGomaStaticRule("ccRule", + ccRule = pctx.AndroidRemoteStaticRule("ccRule", android.SUPPORTS_GOMA, blueprint.RuleParams{ Depfile: "${out}.d", Deps: blueprint.DepsGCC, diff --git a/cc/builder.go b/cc/builder.go index 491ebc59e..068c930de 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -46,7 +46,7 @@ var ( var ( pctx = android.NewPackageContext("android/soong/cc") - cc = pctx.AndroidGomaStaticRule("cc", + cc = pctx.AndroidRemoteStaticRule("cc", android.SUPPORTS_BOTH, blueprint.RuleParams{ Depfile: "${out}.d", Deps: blueprint.DepsGCC, @@ -55,7 +55,7 @@ var ( }, "ccCmd", "cFlags") - ccNoDeps = pctx.AndroidGomaStaticRule("ccNoDeps", + ccNoDeps = pctx.AndroidRemoteStaticRule("ccNoDeps", android.SUPPORTS_GOMA, blueprint.RuleParams{ Command: "$relPwd ${config.CcWrapper}$ccCmd -c $cFlags -o $out $in", CommandDeps: []string{"$ccCmd"}, diff --git a/java/builder.go b/java/builder.go index 169d85318..3380420f6 100644 --- a/java/builder.go +++ b/java/builder.go @@ -38,7 +38,7 @@ var ( // this, all java rules write into separate directories and then are combined into a .jar file // (if the rule produces .class files) or a .srcjar file (if the rule produces .java files). // .srcjar files are unzipped into a temporary directory when compiled with javac. - javac = pctx.AndroidGomaStaticRule("javac", + javac = pctx.AndroidRemoteStaticRule("javac", android.SUPPORTS_GOMA, blueprint.RuleParams{ Command: `rm -rf "$outDir" "$annoDir" "$srcJarDir" && mkdir -p "$outDir" "$annoDir" "$srcJarDir" && ` + `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` + diff --git a/java/kotlin.go b/java/kotlin.go index f8ae229de..aa653145a 100644 --- a/java/kotlin.go +++ b/java/kotlin.go @@ -26,7 +26,7 @@ import ( "github.com/google/blueprint" ) -var kotlinc = pctx.AndroidGomaStaticRule("kotlinc", +var kotlinc = pctx.AndroidRemoteStaticRule("kotlinc", android.SUPPORTS_GOMA, blueprint.RuleParams{ Command: `rm -rf "$classesDir" "$srcJarDir" "$kotlinBuildFile" "$emptyDir" && ` + `mkdir -p "$classesDir" "$srcJarDir" "$emptyDir" && ` + @@ -88,7 +88,7 @@ func kotlinCompile(ctx android.ModuleContext, outputFile android.WritablePath, }) } -var kapt = pctx.AndroidGomaStaticRule("kapt", +var kapt = pctx.AndroidRemoteStaticRule("kapt", android.SUPPORTS_GOMA, blueprint.RuleParams{ Command: `rm -rf "$srcJarDir" "$kotlinBuildFile" "$kaptDir" && mkdir -p "$srcJarDir" "$kaptDir" && ` + `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +