1*760c253cSXin Li// Copyright 2019 The ChromiumOS Authors 2*760c253cSXin Li// Use of this source code is governed by a BSD-style license that can be 3*760c253cSXin Li// found in the LICENSE file. 4*760c253cSXin Li 5*760c253cSXin Lipackage main 6*760c253cSXin Li 7*760c253cSXin Liimport ( 8*760c253cSXin Li "errors" 9*760c253cSXin Li "os" 10*760c253cSXin Li "os/exec" 11*760c253cSXin Li "path/filepath" 12*760c253cSXin Li) 13*760c253cSXin Li 14*760c253cSXin Li// Note: We keep this code in python as golang has no builtin 15*760c253cSXin Li// shlex function. 16*760c253cSXin Liconst bisectPythonCommand = ` 17*760c253cSXin Liimport bisect_driver 18*760c253cSXin Liimport shlex 19*760c253cSXin Liimport sys 20*760c253cSXin Li 21*760c253cSXin Lidef ExpandArgs(args, target): 22*760c253cSXin Li for arg in args: 23*760c253cSXin Li if arg[0] == '@': 24*760c253cSXin Li with open(arg[1:], 'r', encoding='utf-8') as f: 25*760c253cSXin Li ExpandArgs(shlex.split(f.read()), target) 26*760c253cSXin Li else: 27*760c253cSXin Li target.append(arg) 28*760c253cSXin Li return target 29*760c253cSXin Li 30*760c253cSXin Listage = sys.argv[1] 31*760c253cSXin Lidir = sys.argv[2] 32*760c253cSXin Liexecargs = ExpandArgs(sys.argv[3:], []) 33*760c253cSXin Li 34*760c253cSXin Lisys.exit(bisect_driver.bisect_driver(stage, dir, execargs)) 35*760c253cSXin Li` 36*760c253cSXin Li 37*760c253cSXin Lifunc getBisectStage(env env) string { 38*760c253cSXin Li value, _ := env.getenv("BISECT_STAGE") 39*760c253cSXin Li return value 40*760c253cSXin Li} 41*760c253cSXin Li 42*760c253cSXin Lifunc calcBisectCommand(env env, cfg *config, bisectStage string, compilerCmd *command) (*command, error) { 43*760c253cSXin Li bisectDir, _ := env.getenv("BISECT_DIR") 44*760c253cSXin Li if bisectDir == "" { 45*760c253cSXin Li if cfg.isAndroidWrapper { 46*760c253cSXin Li homeDir, ok := env.getenv("HOME") 47*760c253cSXin Li if !ok { 48*760c253cSXin Li return nil, errors.New("$HOME is not set") 49*760c253cSXin Li } 50*760c253cSXin Li bisectDir = filepath.Join(homeDir, "ANDROID_BISECT") 51*760c253cSXin Li } else { 52*760c253cSXin Li bisectDir = "/tmp/sysroot_bisect" 53*760c253cSXin Li } 54*760c253cSXin Li } 55*760c253cSXin Li absCompilerPath := getAbsCmdPath(env, compilerCmd) 56*760c253cSXin Li pythonPath, err := exec.LookPath(os.Args[0]) 57*760c253cSXin Li if err != nil { 58*760c253cSXin Li return nil, err 59*760c253cSXin Li } 60*760c253cSXin Li pythonPath, err = filepath.EvalSymlinks(pythonPath) 61*760c253cSXin Li if err != nil { 62*760c253cSXin Li return nil, err 63*760c253cSXin Li } 64*760c253cSXin Li pythonPath = filepath.Dir(pythonPath) 65*760c253cSXin Li return &command{ 66*760c253cSXin Li Path: "/usr/bin/env", 67*760c253cSXin Li Args: append([]string{ 68*760c253cSXin Li "python3", 69*760c253cSXin Li "-c", 70*760c253cSXin Li bisectPythonCommand, 71*760c253cSXin Li bisectStage, 72*760c253cSXin Li bisectDir, 73*760c253cSXin Li absCompilerPath, 74*760c253cSXin Li }, compilerCmd.Args...), 75*760c253cSXin Li EnvUpdates: append(compilerCmd.EnvUpdates, "PYTHONPATH="+pythonPath), 76*760c253cSXin Li }, nil 77*760c253cSXin Li} 78