// Copyright 2019 The ChromiumOS Authors // 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 }