Refactor the genrule allowlists code to support internal allowlists
Bug: 281067655
Test: build locally
Change-Id: Iedac64c3d59fc48f1b5a1b461c53d00e92b653b5
diff --git a/genrule/genrule.go b/genrule/genrule.go
index c830fcc..4992625 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -24,6 +24,7 @@
"path/filepath"
"strconv"
"strings"
+ "sync"
"android/soong/bazel/cquery"
@@ -60,6 +61,12 @@
PrepareForTestWithGenRuleBuildComponents,
)
+var DepfileAllowSet map[string]bool
+var SandboxingDenyModuleSet map[string]bool
+var SandboxingDenyPathSet map[string]bool
+var SandboxingDenyModuleSetLock sync.Mutex
+var DepfileAllowSetLock sync.Mutex
+
func RegisterGenruleBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("genrule_defaults", defaultsFactory)
@@ -595,6 +602,12 @@
// Allowlist genrule to use depfile until we have a solution to remove it.
// TODO(b/235582219): Remove allowlist for genrule
if Bool(g.properties.Depfile) {
+ if DepfileAllowSet == nil {
+ DepfileAllowSetLock.Lock()
+ defer DepfileAllowSetLock.Unlock()
+ DepfileAllowSet = map[string]bool{}
+ android.AddToStringSet(DepfileAllowSet, DepfileAllowList)
+ }
// TODO(b/283852474): Checking the GenruleSandboxing flag is temporary in
// order to pass the presubmit before internal master is updated.
if ctx.DeviceConfig().GenruleSandboxing() && !DepfileAllowSet[g.Name()] {
@@ -1024,8 +1037,19 @@
}
func getSandboxedRuleBuilder(ctx android.ModuleContext, r *android.RuleBuilder) *android.RuleBuilder {
- if !ctx.DeviceConfig().GenruleSandboxing() || SandboxingDenyPathSet[ctx.ModuleDir()] ||
- SandboxingDenyModuleSet[ctx.ModuleName()] {
+ if !ctx.DeviceConfig().GenruleSandboxing() {
+ return r.SandboxTools()
+ }
+ if SandboxingDenyModuleSet == nil {
+ SandboxingDenyModuleSetLock.Lock()
+ defer SandboxingDenyModuleSetLock.Unlock()
+ SandboxingDenyModuleSet = map[string]bool{}
+ SandboxingDenyPathSet = map[string]bool{}
+ android.AddToStringSet(SandboxingDenyModuleSet, append(DepfileAllowList, SandboxingDenyModuleList...))
+ android.AddToStringSet(SandboxingDenyPathSet, SandboxingDenyPathList)
+ }
+
+ if SandboxingDenyPathSet[ctx.ModuleDir()] || SandboxingDenyModuleSet[ctx.ModuleName()] {
return r.SandboxTools()
}
return r.SandboxInputs()