summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-12-03 18:11:17 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2024-12-03 18:11:17 +0000
commit44c5548d05722cd1733796c3db7215968bd183a3 (patch)
tree8957e58ac1c5e25112518307cfcbc6d4261cf494
parentc11407b4fce764fec9affe51d8dfe8822af80d1a (diff)
parent7195b065b61af4c82fa4e45fc0d9783d1a01ac53 (diff)
Merge "Add property for incremental nsjail genrules" into main
-rw-r--r--android/neverallow.go9
-rw-r--r--android/rule_builder.go22
-rw-r--r--genrule/genrule.go31
3 files changed, 53 insertions, 9 deletions
diff --git a/android/neverallow.go b/android/neverallow.go
index d590d8ec9..e0af98149 100644
--- a/android/neverallow.go
+++ b/android/neverallow.go
@@ -282,7 +282,7 @@ func createLimitNdkExportRule() []Rule {
}
func createLimitDirgroupRule() []Rule {
- reason := "dirgroup module and dir_srcs property of genrule is allowed only to Trusty build rule."
+ reason := "dirgroup module and dir_srcs / keep_gendir property of genrule is allowed only to Trusty build rule."
return []Rule{
NeverAllow().
ModuleType("dirgroup").
@@ -297,6 +297,13 @@ func createLimitDirgroupRule() []Rule {
Without("name", "trusty-x86_64.lk.elf.gen").
Without("name", "trusty-x86_64-test.lk.elf.gen").
WithMatcher("dir_srcs", isSetMatcherInstance).Because(reason),
+ NeverAllow().
+ ModuleType("genrule").
+ Without("name", "trusty-arm64.lk.elf.gen").
+ Without("name", "trusty-arm64-virt-test-debug.lk.elf.gen").
+ Without("name", "trusty-x86_64.lk.elf.gen").
+ Without("name", "trusty-x86_64-test.lk.elf.gen").
+ With("keep_gendir", "true").Because(reason),
}
}
diff --git a/android/rule_builder.go b/android/rule_builder.go
index 89cb9cfe7..db56c3f29 100644
--- a/android/rule_builder.go
+++ b/android/rule_builder.go
@@ -63,6 +63,7 @@ type RuleBuilder struct {
missingDeps []string
args map[string]string
nsjail bool
+ nsjailKeepGendir bool
nsjailBasePath WritablePath
nsjailImplicits Paths
}
@@ -208,6 +209,18 @@ func (r *RuleBuilder) NsjailImplicits(inputs Paths) *RuleBuilder {
return r
}
+// By default, nsjail rules truncate outputDir and baseDir before running commands, similar to Sbox
+// rules which always run commands in a fresh sandbox. Calling NsjailKeepGendir keeps outputDir and
+// baseDir as-is, leaving previous artifacts. This is useful when the rules support incremental
+// builds.
+func (r *RuleBuilder) NsjailKeepGendir() *RuleBuilder {
+ if !r.nsjail {
+ panic("NsjailKeepGendir() must be called after Nsjail()")
+ }
+ r.nsjailKeepGendir = true
+ return r
+}
+
// SandboxTools enables tool sandboxing for the rule by copying any referenced tools into the
// sandbox.
func (r *RuleBuilder) SandboxTools() *RuleBuilder {
@@ -555,8 +568,17 @@ func (r *RuleBuilder) build(name string, desc string) {
if r.nsjail {
var nsjailCmd strings.Builder
nsjailPath := r.ctx.Config().PrebuiltBuildTool(r.ctx, "nsjail")
+ if !r.nsjailKeepGendir {
+ nsjailCmd.WriteString("rm -rf ")
+ nsjailCmd.WriteString(r.nsjailBasePath.String())
+ nsjailCmd.WriteRune(' ')
+ nsjailCmd.WriteString(r.outDir.String())
+ nsjailCmd.WriteString(" && ")
+ }
nsjailCmd.WriteString("mkdir -p ")
nsjailCmd.WriteString(r.nsjailBasePath.String())
+ nsjailCmd.WriteRune(' ')
+ nsjailCmd.WriteString(r.outDir.String())
nsjailCmd.WriteString(" && ")
nsjailCmd.WriteString(nsjailPath.String())
nsjailCmd.WriteRune(' ')
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 9d2dbc71a..ac62b8d06 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -230,8 +230,9 @@ type generateTask struct {
shards int
// For nsjail tasks
- useNsjail bool
- dirSrcs android.DirectoryPaths
+ useNsjail bool
+ dirSrcs android.DirectoryPaths
+ keepGendir bool
}
func (g *Module) GeneratedSourceFiles() android.Paths {
@@ -487,6 +488,9 @@ func (g *Module) generateCommonBuildActions(ctx android.ModuleContext) {
name := "generator"
if task.useNsjail {
rule = android.NewRuleBuilder(pctx, ctx).Nsjail(task.genDir, android.PathForModuleOut(ctx, "nsjail_build_sandbox"))
+ if task.keepGendir {
+ rule.NsjailKeepGendir()
+ }
} else {
manifestName := "genrule.sbox.textproto"
if task.shards > 0 {
@@ -897,17 +901,24 @@ func NewGenRule() *Module {
return nil
}
+ keepGendir := Bool(properties.Keep_gendir)
+ if keepGendir && !useNsjail {
+ ctx.PropertyErrorf("keep_gendir", "can't use keep_gendir if use_nsjail is false")
+ return nil
+ }
+
outs := make(android.WritablePaths, len(properties.Out))
for i, out := range properties.Out {
outs[i] = android.PathForModuleGen(ctx, out)
}
return []generateTask{{
- in: srcFiles,
- out: outs,
- genDir: android.PathForModuleGen(ctx),
- cmd: rawCommand,
- useNsjail: useNsjail,
- dirSrcs: dirSrcs,
+ in: srcFiles,
+ out: outs,
+ genDir: android.PathForModuleGen(ctx),
+ cmd: rawCommand,
+ useNsjail: useNsjail,
+ dirSrcs: dirSrcs,
+ keepGendir: keepGendir,
}}
}
@@ -928,6 +939,10 @@ type genRuleProperties struct {
// dir_srcs is limited only to Trusty build.
Dir_srcs []string `android:"path"`
+ // If set to true, $(genDir) is not truncated. Useful when this genrule can be incrementally
+ // built. Can be set only when use_nsjail is true.
+ Keep_gendir *bool
+
// names of the output files that will be generated
Out []string `android:"arch_variant"`
}