Add property data to gensrcs for additional inputs
This enables sandboxing for inputs that are necessary but do not need to
have a source file generated.
Test: GENRULE_SANDBOXING=true m framework-javastream-protos \
framework-cppstream-protos
Change-Id: Id5ca1dab5799c25fa96b564a7d2008c2e7b5382b
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 4992625..fbe2a5d 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -203,12 +203,13 @@
type taskFunc func(ctx android.ModuleContext, rawCommand string, srcFiles android.Paths) []generateTask
type generateTask struct {
- in android.Paths
- out android.WritablePaths
- depFile android.WritablePath
- copyTo android.WritablePaths // For gensrcs to set on gensrcsMerge rule.
- genDir android.WritablePath
- extraTools android.Paths // dependencies on tools used by the generator
+ in android.Paths
+ out android.WritablePaths
+ depFile android.WritablePath
+ copyTo android.WritablePaths // For gensrcs to set on gensrcsMerge rule.
+ genDir android.WritablePath
+ extraTools android.Paths // dependencies on tools used by the generator
+ extraInputs map[string][]string
cmd string
// For gensrsc sharding.
@@ -402,30 +403,35 @@
addLocationLabel(toolFile, toolLocation{paths})
}
- includeDirInPaths := ctx.DeviceConfig().BuildBrokenInputDir(g.Name())
- var srcFiles android.Paths
- for _, in := range g.properties.Srcs {
- paths, missingDeps := android.PathsAndMissingDepsRelativeToModuleSourceDir(android.SourceInput{
- Context: ctx, Paths: []string{in}, ExcludePaths: g.properties.Exclude_srcs, IncludeDirs: includeDirInPaths,
- })
- if len(missingDeps) > 0 {
- if !ctx.Config().AllowMissingDependencies() {
- panic(fmt.Errorf("should never get here, the missing dependencies %q should have been reported in DepsMutator",
- missingDeps))
- }
+ addLabelsForInputs := func(propName string, include, exclude []string) android.Paths {
- // If AllowMissingDependencies is enabled, the build will not have stopped when
- // the dependency was added on a missing SourceFileProducer module, which will result in nonsensical
- // "cmd: label ":..." has no files" errors later. Add a placeholder file to the local label.
- // The command that uses this placeholder file will never be executed because the rule will be
- // replaced with an android.Error rule reporting the missing dependencies.
- ctx.AddMissingDependencies(missingDeps)
- addLocationLabel(in, errorLocation{"***missing srcs " + in + "***"})
- } else {
- srcFiles = append(srcFiles, paths...)
- addLocationLabel(in, inputLocation{paths})
+ includeDirInPaths := ctx.DeviceConfig().BuildBrokenInputDir(g.Name())
+ var srcFiles android.Paths
+ for _, in := range include {
+ paths, missingDeps := android.PathsAndMissingDepsRelativeToModuleSourceDir(android.SourceInput{
+ Context: ctx, Paths: []string{in}, ExcludePaths: exclude, IncludeDirs: includeDirInPaths,
+ })
+ if len(missingDeps) > 0 {
+ if !ctx.Config().AllowMissingDependencies() {
+ panic(fmt.Errorf("should never get here, the missing dependencies %q should have been reported in DepsMutator",
+ missingDeps))
+ }
+
+ // If AllowMissingDependencies is enabled, the build will not have stopped when
+ // the dependency was added on a missing SourceFileProducer module, which will result in nonsensical
+ // "cmd: label ":..." has no files" errors later. Add a placeholder file to the local label.
+ // The command that uses this placeholder file will never be executed because the rule will be
+ // replaced with an android.Error rule reporting the missing dependencies.
+ ctx.AddMissingDependencies(missingDeps)
+ addLocationLabel(in, errorLocation{"***missing " + propName + " " + in + "***"})
+ } else {
+ srcFiles = append(srcFiles, paths...)
+ addLocationLabel(in, inputLocation{paths})
+ }
}
+ return srcFiles
}
+ srcFiles := addLabelsForInputs("srcs", g.properties.Srcs, g.properties.Exclude_srcs)
var copyFrom android.Paths
var outputFiles android.WritablePaths
@@ -437,12 +443,20 @@
}
// Generate tasks, either from genrule or gensrcs.
- for _, task := range g.taskGenerator(ctx, cmd, srcFiles) {
+ for i, task := range g.taskGenerator(ctx, cmd, srcFiles) {
if len(task.out) == 0 {
ctx.ModuleErrorf("must have at least one output file")
return
}
+ var extraInputs android.Paths
+ // Only handle extra inputs once as these currently are the same across all tasks
+ if i == 0 {
+ for name, values := range task.extraInputs {
+ extraInputs = append(extraInputs, addLabelsForInputs(name, values, []string{})...)
+ }
+ }
+
// Pick a unique path outside the task.genDir for the sbox manifest textproto,
// a unique rule name, and the user-visible description.
manifestName := "genrule.sbox.textproto"
@@ -551,6 +565,8 @@
g.rawCommands = append(g.rawCommands, rawCommand)
cmd.Text(rawCommand)
+ cmd.Implicits(srcFiles) // need to be able to reference other srcs
+ cmd.Implicits(extraInputs)
cmd.ImplicitOutputs(task.out)
cmd.Implicits(task.in)
cmd.ImplicitTools(tools)
@@ -820,6 +836,9 @@
shard: i,
shards: len(shards),
extraTools: extraTools,
+ extraInputs: map[string][]string{
+ "data": properties.Data,
+ },
})
}
@@ -844,6 +863,9 @@
// maximum number of files that will be passed on a single command line.
Shard_size *int64
+
+ // Additional files needed for build that are not tooling related.
+ Data []string `android:"path"`
}
type bazelGensrcsAttributes struct {