You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.8 KiB
78 lines
1.8 KiB
4 months ago
|
// Copyright 2019 The Chromium OS Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
"path/filepath"
|
||
|
)
|
||
|
|
||
|
// Note: We keep this code in python as golang has no builtin
|
||
|
// shlex function.
|
||
|
const bisectPythonCommand = `
|
||
|
import bisect_driver
|
||
|
import shlex
|
||
|
import sys
|
||
|
|
||
|
def ExpandArgs(args, target):
|
||
|
for arg in args:
|
||
|
if arg[0] == '@':
|
||
|
with open(arg[1:], 'r', encoding='utf-8') as f:
|
||
|
ExpandArgs(shlex.split(f.read()), target)
|
||
|
else:
|
||
|
target.append(arg)
|
||
|
return target
|
||
|
|
||
|
stage = sys.argv[1]
|
||
|
dir = sys.argv[2]
|
||
|
execargs = ExpandArgs(sys.argv[3:], [])
|
||
|
|
||
|
sys.exit(bisect_driver.bisect_driver(stage, dir, execargs))
|
||
|
`
|
||
|
|
||
|
func getBisectStage(env env) string {
|
||
|
value, _ := env.getenv("BISECT_STAGE")
|
||
|
return value
|
||
|
}
|
||
|
|
||
|
func calcBisectCommand(env env, cfg *config, bisectStage string, compilerCmd *command) (*command, error) {
|
||
|
bisectDir, _ := env.getenv("BISECT_DIR")
|
||
|
if bisectDir == "" {
|
||
|
if cfg.isAndroidWrapper {
|
||
|
homeDir, ok := env.getenv("HOME")
|
||
|
if !ok {
|
||
|
return nil, errors.New("$HOME is not set")
|
||
|
}
|
||
|
bisectDir = filepath.Join(homeDir, "ANDROID_BISECT")
|
||
|
} else {
|
||
|
bisectDir = "/tmp/sysroot_bisect"
|
||
|
}
|
||
|
}
|
||
|
absCompilerPath := getAbsCmdPath(env, compilerCmd)
|
||
|
pythonPath, err := exec.LookPath(os.Args[0])
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
pythonPath, err = filepath.EvalSymlinks(pythonPath)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
pythonPath = filepath.Dir(pythonPath)
|
||
|
return &command{
|
||
|
Path: "/usr/bin/env",
|
||
|
Args: append([]string{
|
||
|
"python3",
|
||
|
"-c",
|
||
|
bisectPythonCommand,
|
||
|
bisectStage,
|
||
|
bisectDir,
|
||
|
absCompilerPath,
|
||
|
}, compilerCmd.Args...),
|
||
|
EnvUpdates: append(compilerCmd.EnvUpdates, "PYTHONPATH="+pythonPath),
|
||
|
}, nil
|
||
|
}
|