summaryrefslogtreecommitdiff
path: root/android/rule_builder.go
diff options
context:
space:
mode:
Diffstat (limited to 'android/rule_builder.go')
-rw-r--r--android/rule_builder.go42
1 files changed, 33 insertions, 9 deletions
diff --git a/android/rule_builder.go b/android/rule_builder.go
index 22ae2b24a..cc0bfa6af 100644
--- a/android/rule_builder.go
+++ b/android/rule_builder.go
@@ -385,6 +385,21 @@ func (r *RuleBuilder) RspFileInputs() Paths {
return rspFileInputs
}
+// RspFile returns the path to the rspfile that was passed to the RuleBuilderCommand.FlagWithRspFileInputList method.
+func (r *RuleBuilder) RspFile() WritablePath {
+ var rspFile WritablePath
+ for _, c := range r.commands {
+ if c.rspFile != nil {
+ if rspFile != nil {
+ panic("Multiple commands in a rule may not have rsp file inputs")
+ }
+ rspFile = c.rspFile
+ }
+ }
+
+ return rspFile
+}
+
// Commands returns a slice containing the built command line for each call to RuleBuilder.Command.
func (r *RuleBuilder) Commands() []string {
var commands []string
@@ -461,6 +476,8 @@ func (r *RuleBuilder) Build(name string, desc string) {
commands := r.NinjaEscapedCommands()
outputs := r.Outputs()
inputs := r.Inputs()
+ rspFileInputs := r.RspFileInputs()
+ rspFilePath := r.RspFile()
if len(commands) == 0 {
return
@@ -559,15 +576,14 @@ func (r *RuleBuilder) Build(name string, desc string) {
}
// Ninja doesn't like multiple outputs when depfiles are enabled, move all but the first output to
- // ImplicitOutputs. RuleBuilder only uses "$out" for the rsp file location, so the distinction between Outputs and
+ // ImplicitOutputs. RuleBuilder doesn't use "$out", so the distinction between Outputs and
// ImplicitOutputs doesn't matter.
output := outputs[0]
implicitOutputs := outputs[1:]
var rspFile, rspFileContent string
- rspFileInputs := r.RspFileInputs()
- if rspFileInputs != nil {
- rspFile = "$out.rsp"
+ if rspFilePath != nil {
+ rspFile = rspFilePath.String()
rspFileContent = "$in"
}
@@ -620,6 +636,7 @@ type RuleBuilderCommand struct {
tools Paths
packagedTools []PackagingSpec
rspFileInputs Paths
+ rspFile WritablePath
// spans [start,end) of the command that should not be ninja escaped
unescapedSpans [][2]int
@@ -1020,8 +1037,9 @@ func (c *RuleBuilderCommand) FlagWithDepFile(flag string, path WritablePath) *Ru
}
// FlagWithRspFileInputList adds the specified flag and path to an rspfile to the command line, with no separator
-// between them. The paths will be written to the rspfile.
-func (c *RuleBuilderCommand) FlagWithRspFileInputList(flag string, paths Paths) *RuleBuilderCommand {
+// between them. The paths will be written to the rspfile. If sbox is enabled, the rspfile must
+// be outside the sbox directory.
+func (c *RuleBuilderCommand) FlagWithRspFileInputList(flag string, rspFile WritablePath, paths Paths) *RuleBuilderCommand {
if c.rspFileInputs != nil {
panic("FlagWithRspFileInputList cannot be called if rsp file inputs have already been provided")
}
@@ -1033,10 +1051,16 @@ func (c *RuleBuilderCommand) FlagWithRspFileInputList(flag string, paths Paths)
}
c.rspFileInputs = paths
+ c.rspFile = rspFile
+
+ if c.rule.sbox {
+ if _, isRel, _ := maybeRelErr(c.rule.outDir.String(), rspFile.String()); isRel {
+ panic(fmt.Errorf("FlagWithRspFileInputList rspfile %q must not be inside out dir %q",
+ rspFile.String(), c.rule.outDir.String()))
+ }
+ }
- rspFile := "$out.rsp"
- c.FlagWithArg(flag, rspFile)
- c.unescapedSpans = append(c.unescapedSpans, [2]int{c.buf.Len() - len(rspFile), c.buf.Len()})
+ c.FlagWithArg(flag, rspFile.String())
return c
}