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:
parent
52226ad920
commit
baccf5b984
2 changed files with 34 additions and 23 deletions
|
@ -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...)
|
||||
|
|
|
@ -114,6 +114,7 @@ type taskFunc func(ctx android.ModuleContext, rawCommand string, srcFiles androi
|
|||
type generateTask struct {
|
||||
in android.Paths
|
||||
out android.WritablePaths
|
||||
sandboxOuts []string
|
||||
cmd string
|
||||
}
|
||||
|
||||
|
@ -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":
|
||||
|
@ -386,6 +395,7 @@ func NewGenSrcs() *Module {
|
|||
return generateTask{
|
||||
in: srcFiles,
|
||||
out: outFiles,
|
||||
sandboxOuts: sandboxOuts,
|
||||
cmd: fullCommand,
|
||||
}
|
||||
}
|
||||
|
@ -409,12 +419,16 @@ 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,
|
||||
sandboxOuts: sandboxOuts,
|
||||
cmd: rawCommand,
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue