xref: /aosp_15_r20/external/toolchain-utils/compiler_wrapper/bisect_flag.go (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
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