diff options
-rw-r--r-- | android/rule_builder.go | 22 | ||||
-rw-r--r-- | java/droiddoc.go | 65 |
2 files changed, 57 insertions, 30 deletions
diff --git a/android/rule_builder.go b/android/rule_builder.go index 6226548b..afb5f4e4 100644 --- a/android/rule_builder.go +++ b/android/rule_builder.go @@ -172,7 +172,7 @@ func (r *RuleBuilder) Inputs() Paths { inputs := make(map[string]Path) for _, c := range r.commands { - for _, input := range c.inputs { + for _, input := range append(c.inputs, c.implicits...) { inputStr := input.String() if _, isOutput := outputs[inputStr]; !isOutput { if _, isDepFile := depFiles[inputStr]; !isDepFile { @@ -480,6 +480,7 @@ func (r *RuleBuilder) Build(pctx PackageContext, ctx BuilderContext, name string type RuleBuilderCommand struct { buf strings.Builder inputs Paths + implicits Paths orderOnlys Paths outputs WritablePaths depFiles WritablePaths @@ -503,6 +504,16 @@ func (c *RuleBuilderCommand) addInput(path Path) string { return path.String() } +func (c *RuleBuilderCommand) addImplicit(path Path) string { + if c.sbox { + if rel, isRel, _ := maybeRelErr(c.sboxOutDir.String(), path.String()); isRel { + return "__SBOX_OUT_DIR__/" + rel + } + } + c.implicits = append(c.implicits, path) + return path.String() +} + func (c *RuleBuilderCommand) addOrderOnly(path Path) { c.orderOnlys = append(c.orderOnlys, path) } @@ -623,7 +634,7 @@ func (c *RuleBuilderCommand) Inputs(paths Paths) *RuleBuilderCommand { // Implicit adds the specified input path to the dependencies returned by RuleBuilder.Inputs without modifying the // command line. func (c *RuleBuilderCommand) Implicit(path Path) *RuleBuilderCommand { - c.addInput(path) + c.addImplicit(path) return c } @@ -631,11 +642,16 @@ func (c *RuleBuilderCommand) Implicit(path Path) *RuleBuilderCommand { // command line. func (c *RuleBuilderCommand) Implicits(paths Paths) *RuleBuilderCommand { for _, path := range paths { - c.addInput(path) + c.addImplicit(path) } return c } +// GetImplicits returns the command's implicit inputs. +func (c *RuleBuilderCommand) GetImplicits() Paths { + return c.implicits +} + // OrderOnly adds the specified input path to the dependencies returned by RuleBuilder.OrderOnlys // without modifying the command line. func (c *RuleBuilderCommand) OrderOnly(path Path) *RuleBuilderCommand { diff --git a/java/droiddoc.go b/java/droiddoc.go index 355904d6..230b1f02 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -121,6 +121,10 @@ type JavadocProperties struct { // names of the output files used in args that will be generated Out []string + + // If set, metalava is sandboxed to only read files explicitly specified on the command + // line. Defaults to false. + Sandbox *bool } type ApiToCheck struct { @@ -1434,34 +1438,18 @@ func (d *Droidstubs) apiToXmlFlags(ctx android.ModuleContext, cmd *android.RuleB } func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersion javaVersion, srcs android.Paths, - srcJarList android.Path, bootclasspath, classpath classpath, sourcepaths android.Paths, implicits android.Paths) *android.RuleBuilderCommand { + srcJarList android.Path, bootclasspath, classpath classpath, sourcepaths android.Paths, implicitsRsp android.WritablePath, sandbox bool) *android.RuleBuilderCommand { // Metalava uses lots of memory, restrict the number of metalava jobs that can run in parallel. rule.HighMem() cmd := rule.Command() - - var implicitsRsp android.WritablePath - if len(implicits) > 0 { - implicitsRsp = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"implicits.rsp") - impRule := android.NewRuleBuilder() - impCmd := impRule.Command() - // A dummy action that copies the ninja generated rsp file to a new location. This allows us to - // add a large number of inputs to a file without exceeding bash command length limits (which - // would happen if we use the WriteFile rule). The cp is needed because RuleBuilder sets the - // rsp file to be ${output}.rsp. - impCmd.Text("cp").FlagWithRspFileInputList("", implicits).Output(implicitsRsp) - impRule.Build(pctx, ctx, "implicitsGen", "implicits generation") - cmd.Implicits(implicits) - cmd.Implicit(implicitsRsp) - } if ctx.Config().IsEnvTrue("RBE_METALAVA") { rule.Remoteable(android.RemoteRuleSupports{RBE: true}) - execStrategy := remoteexec.LocalExecStrategy - if v := ctx.Config().Getenv("RBE_METALAVA_EXEC_STRATEGY"); v != "" { - execStrategy = v - } - pool := "metalava" - if v := ctx.Config().Getenv("RBE_METALAVA_POOL"); v != "" { - pool = v + pool := ctx.Config().GetenvWithDefault("RBE_METALAVA_POOL", "metalava") + execStrategy := ctx.Config().GetenvWithDefault("RBE_METALAVA_EXEC_STRATEGY", remoteexec.LocalExecStrategy) + labels := map[string]string{"type": "compile", "lang": "java", "compiler": "metalava"} + if !sandbox { + execStrategy = remoteexec.LocalExecStrategy + labels["shallow"] = "true" } inputs := []string{android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "metalava.jar").String()} inputs = append(inputs, sourcepaths.Strings()...) @@ -1469,7 +1457,7 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi inputs = append(inputs, strings.Split(v, ",")...) } cmd.Text((&remoteexec.REParams{ - Labels: map[string]string{"type": "compile", "lang": "java", "compiler": "metalava", "shallow": "true"}, + Labels: labels, ExecStrategy: execStrategy, Inputs: inputs, RSPFile: implicitsRsp.String(), @@ -1483,8 +1471,17 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi FlagWithArg("-encoding ", "UTF-8"). FlagWithArg("-source ", javaVersion.String()). FlagWithRspFileInputList("@", srcs). - FlagWithInput("@", srcJarList). - FlagWithOutput("--strict-input-files:warn ", android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"violations.txt")) + FlagWithInput("@", srcJarList) + + if javaHome := ctx.Config().Getenv("ANDROID_JAVA_HOME"); javaHome != "" { + cmd.Implicit(android.PathForSource(ctx, javaHome)) + } + + if sandbox { + cmd.FlagWithOutput("--strict-input-files ", android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"violations.txt")) + } else { + cmd.FlagWithOutput("--strict-input-files:warn ", android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"violations.txt")) + } if implicitsRsp != nil { cmd.FlagWithArg("--strict-input-files-exempt ", "@"+implicitsRsp.String()) @@ -1534,8 +1531,12 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars) + implicitsRsp := android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"implicits.rsp") + cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList, - deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths, d.Javadoc.implicits) + deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths, implicitsRsp, + Bool(d.Javadoc.properties.Sandbox)) + cmd.Implicits(d.Javadoc.implicits) d.stubsFlags(ctx, cmd, stubsDir) @@ -1663,6 +1664,16 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { cmd.FlagWithArg("--error-message:compatibility:released ", msg) } + impRule := android.NewRuleBuilder() + impCmd := impRule.Command() + // A dummy action that copies the ninja generated rsp file to a new location. This allows us to + // add a large number of inputs to a file without exceeding bash command length limits (which + // would happen if we use the WriteFile rule). The cp is needed because RuleBuilder sets the + // rsp file to be ${output}.rsp. + impCmd.Text("cp").FlagWithRspFileInputList("", cmd.GetImplicits()).Output(implicitsRsp) + impRule.Build(pctx, ctx, "implicitsGen", "implicits generation") + cmd.Implicit(implicitsRsp) + if generateStubs { rule.Command(). BuiltTool(ctx, "soong_zip"). |