xref: /aosp_15_r20/external/toolchain-utils/llvm_tools/subprocess_helpers.py (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 Li"""Helpers/wrappers for the subprocess module for migration to python3."""
6*760c253cSXin Li
7*760c253cSXin Liimport subprocess
8*760c253cSXin Li
9*760c253cSXin Li
10*760c253cSXin Lidef CheckCommand(cmd):
11*760c253cSXin Li    """Executes the command using Popen()."""
12*760c253cSXin Li    with subprocess.Popen(
13*760c253cSXin Li        cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, encoding="utf-8"
14*760c253cSXin Li    ) as cmd_obj:
15*760c253cSXin Li        stdout, _ = cmd_obj.communicate()
16*760c253cSXin Li
17*760c253cSXin Li    if cmd_obj.returncode:
18*760c253cSXin Li        print(stdout)
19*760c253cSXin Li        raise subprocess.CalledProcessError(cmd_obj.returncode, cmd)
20*760c253cSXin Li
21*760c253cSXin Li
22*760c253cSXin Lidef check_output(cmd, cwd=None):
23*760c253cSXin Li    """Wrapper for pre-python3 subprocess.check_output()."""
24*760c253cSXin Li
25*760c253cSXin Li    return subprocess.check_output(cmd, encoding="utf-8", cwd=cwd)
26*760c253cSXin Li
27*760c253cSXin Li
28*760c253cSXin Lidef check_call(cmd, cwd=None):
29*760c253cSXin Li    """Wrapper for pre-python3 subprocess.check_call()."""
30*760c253cSXin Li
31*760c253cSXin Li    subprocess.check_call(cmd, encoding="utf-8", cwd=cwd)
32*760c253cSXin Li
33*760c253cSXin Li
34*760c253cSXin Li# FIXME: CTRL+C does not work when executing a command inside the chroot via
35*760c253cSXin Li# `cros_sdk`.
36*760c253cSXin Lidef ChrootRunCommand(
37*760c253cSXin Li    chroot_path,
38*760c253cSXin Li    cmd,
39*760c253cSXin Li    verbose: bool = False,
40*760c253cSXin Li    chroot_name: str = "chroot",
41*760c253cSXin Li    out_name: str = "out",
42*760c253cSXin Li):
43*760c253cSXin Li    """Runs the command inside the chroot."""
44*760c253cSXin Li
45*760c253cSXin Li    exec_chroot_cmd = [
46*760c253cSXin Li        "cros_sdk",
47*760c253cSXin Li        f"--chroot={chroot_name}",
48*760c253cSXin Li        f"--out-dir={out_name}",
49*760c253cSXin Li        "--",
50*760c253cSXin Li    ]
51*760c253cSXin Li    exec_chroot_cmd.extend(cmd)
52*760c253cSXin Li
53*760c253cSXin Li    return ExecCommandAndCaptureOutput(
54*760c253cSXin Li        exec_chroot_cmd, cwd=chroot_path, verbose=verbose
55*760c253cSXin Li    )
56*760c253cSXin Li
57*760c253cSXin Li
58*760c253cSXin Lidef ExecCommandAndCaptureOutput(cmd, cwd=None, verbose=False):
59*760c253cSXin Li    """Executes the command and prints to stdout if possible."""
60*760c253cSXin Li
61*760c253cSXin Li    out = check_output(cmd, cwd=cwd).rstrip()
62*760c253cSXin Li
63*760c253cSXin Li    if verbose and out:
64*760c253cSXin Li        print(out)
65*760c253cSXin Li
66*760c253cSXin Li    return out
67