Use __SBOX_OUT_DIR__ in sbox output file list

The path to the output directory may be arbitrarily long, use
__SBOX_OUT_DIR__ in the list of output files passed to sbox
to avoid expanding it multiple times in the command line.

Fixes:
ninja: fatal: posix_spawn: Argument list too long
09:40:14 ninja failed with: exit status 1
when building libchrome with a long OUT or OUT_DIR_COMMON_BASE.

Bug: 73726635
Test: m checkbuild
Change-Id: I59024b2164287c8e531711afd9273b692ce9c28a
This commit is contained in:
Colin Cross 2018-02-21 14:07:48 -08:00
parent 52226ad920
commit baccf5b984
2 changed files with 34 additions and 23 deletions

View file

@ -136,14 +136,11 @@ func run() error {
tempDir, err := ioutil.TempDir(sandboxesRoot, "sbox")
// Rewrite output file paths to be relative to output root
// This facilitates matching them up against the corresponding paths in the temporary directory in case they're absolute
for i, filePath := range outputsVarEntries {
relativePath, err := filepath.Rel(outputRoot, filePath)
if err != nil {
return err
if !strings.HasPrefix(filePath, "__SBOX_OUT_DIR__/") {
return fmt.Errorf("output files must start with `__SBOX_OUT_DIR__/`")
}
outputsVarEntries[i] = relativePath
outputsVarEntries[i] = strings.TrimPrefix(filePath, "__SBOX_OUT_DIR__/")
}
allOutputs = append([]string(nil), outputsVarEntries...)

View file

@ -112,9 +112,10 @@ type Module struct {
type taskFunc func(ctx android.ModuleContext, rawCommand string, srcFiles android.Paths) generateTask
type generateTask struct {
in android.Paths
out android.WritablePaths
cmd string
in android.Paths
out android.WritablePaths
sandboxOuts []string
cmd string
}
func (g *Module) GeneratedSourceFiles() android.Paths {
@ -320,7 +321,7 @@ func (g *Module) generateSourceFile(ctx android.ModuleContext, task generateTask
Inputs: task.in,
Implicits: g.deps,
Args: map[string]string{
"allouts": strings.Join(task.out.Strings(), " "),
"allouts": strings.Join(task.sandboxOuts, " "),
},
}
if Bool(g.properties.Depfile) {
@ -346,23 +347,31 @@ func generatorFactory(taskGenerator taskFunc, props ...interface{}) *Module {
return module
}
// replace "out" with "__SBOX_OUT_DIR__/<the value of ${out}>"
func pathToSandboxOut(path android.Path, genDir android.Path) string {
relOut, err := filepath.Rel(genDir.String(), path.String())
if err != nil {
panic(fmt.Sprintf("Could not make ${out} relative: %v", err))
}
return filepath.Join("__SBOX_OUT_DIR__", relOut)
}
func NewGenSrcs() *Module {
properties := &genSrcsProperties{}
taskGenerator := func(ctx android.ModuleContext, rawCommand string, srcFiles android.Paths) generateTask {
commands := []string{}
outFiles := android.WritablePaths{}
genPath := android.PathForModuleGen(ctx).String()
genDir := android.PathForModuleGen(ctx)
sandboxOuts := []string{}
for _, in := range srcFiles {
outFile := android.GenPathWithExt(ctx, "", in, String(properties.Output_extension))
outFiles = append(outFiles, outFile)
// replace "out" with "__SBOX_OUT_DIR__/<the value of ${out}>"
relOut, err := filepath.Rel(genPath, outFile.String())
if err != nil {
panic(fmt.Sprintf("Could not make ${out} relative: %v", err))
}
sandboxOutfile := filepath.Join("__SBOX_OUT_DIR__", relOut)
sandboxOutfile := pathToSandboxOut(outFile, genDir)
sandboxOuts = append(sandboxOuts, sandboxOutfile)
command, err := android.Expand(rawCommand, func(name string) (string, error) {
switch name {
case "in":
@ -384,9 +393,10 @@ func NewGenSrcs() *Module {
fullCommand := strings.Join(commands, " && ")
return generateTask{
in: srcFiles,
out: outFiles,
cmd: fullCommand,
in: srcFiles,
out: outFiles,
sandboxOuts: sandboxOuts,
cmd: fullCommand,
}
}
@ -409,13 +419,17 @@ func NewGenRule() *Module {
taskGenerator := func(ctx android.ModuleContext, rawCommand string, srcFiles android.Paths) generateTask {
outs := make(android.WritablePaths, len(properties.Out))
sandboxOuts := make([]string, len(properties.Out))
genDir := android.PathForModuleGen(ctx)
for i, out := range properties.Out {
outs[i] = android.PathForModuleGen(ctx, out)
sandboxOuts[i] = pathToSandboxOut(outs[i], genDir)
}
return generateTask{
in: srcFiles,
out: outs,
cmd: rawCommand,
in: srcFiles,
out: outs,
sandboxOuts: sandboxOuts,
cmd: rawCommand,
}
}