gsi_util: try to use executable in local bin/ folder

cmd_utils.run_command() will try to find the executable file
in the local bin/ folder firstly.

The patch also add some missing dependency files and make sure
gsi_util could run alone.

Bug: 75992357
Test: ./run_test.py
Test: './build.py setup_env',
  then './gsi_util.bin check_compat --system adb --vendor adb' in
  another terminal without lunch

Change-Id: I923eb68b4a6829c8ed5e5d8278e97fd4f5860efc
This commit is contained in:
SzuWei Lin
2018-03-20 18:21:19 +08:00
parent a96b403e20
commit a3424fde0b
3 changed files with 24 additions and 0 deletions

View File

@@ -28,6 +28,7 @@ python_binary_host {
"adb", "adb",
"avbtool", "avbtool",
"checkvintf", "checkvintf",
"secilc",
"simg2img", "simg2img",
], ],
version: { version: {

View File

@@ -37,6 +37,8 @@ REQUIRED_ITEMS = [
RequiredItem('bin/checkvintf', 'bin/checkvintf'), RequiredItem('bin/checkvintf', 'bin/checkvintf'),
RequiredItem('lib64/libbase.so', 'lib64/libbase.so'), RequiredItem('lib64/libbase.so', 'lib64/libbase.so'),
RequiredItem('lib64/liblog.so', 'lib64/liblog.so'), RequiredItem('lib64/liblog.so', 'lib64/liblog.so'),
RequiredItem('bin/secilc', 'bin/secilc'),
RequiredItem('lib64/libsepol.so', 'lib64/libsepol.so'),
RequiredItem('bin/simg2img', 'bin/simg2img'), RequiredItem('bin/simg2img', 'bin/simg2img'),
RequiredItem('lib64/libc++.so', 'lib64/libc++.so'), RequiredItem('lib64/libc++.so', 'lib64/libc++.so'),
] # pyformat: disable ] # pyformat: disable

View File

@@ -17,18 +17,37 @@
from collections import namedtuple from collections import namedtuple
import logging import logging
import os import os
import shlex
import subprocess import subprocess
import sys
CommandResult = namedtuple('CommandResult', 'returncode stdoutdata, stderrdata') CommandResult = namedtuple('CommandResult', 'returncode stdoutdata, stderrdata')
PIPE = subprocess.PIPE PIPE = subprocess.PIPE
_LOCAL_BIN_PATH = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])),
'bin')
def _update_command_for_local(command, kwargs):
if kwargs.get('shell', False):
# do nothing for shell commands
return
prog = command[0]
local_prog = os.path.join(_LOCAL_BIN_PATH, prog)
if os.path.isfile(local_prog) and os.access(local_prog, os.X_OK):
logging.debug('Using local executable: %s', local_prog)
command[0] = local_prog
def run_command(command, read_stdout=False, read_stderr=False, def run_command(command, read_stdout=False, read_stderr=False,
log_stdout=False, log_stderr=False, log_stdout=False, log_stderr=False,
raise_on_error=True, sudo=False, **kwargs): raise_on_error=True, sudo=False, **kwargs):
"""Runs a command and returns the results. """Runs a command and returns the results.
The method tries to use the executable in bin/ firstly.
Args: Args:
command: A sequence of command arguments or else a single string. command: A sequence of command arguments or else a single string.
read_stdout: If True, includes stdout data in the returned tuple. read_stdout: If True, includes stdout data in the returned tuple.
@@ -50,6 +69,8 @@ def run_command(command, read_stdout=False, read_stderr=False,
OSError: Not such a command to execute, raised by subprocess.Popen(). OSError: Not such a command to execute, raised by subprocess.Popen().
subprocess.CalledProcessError: The return code of the command is nonzero. subprocess.CalledProcessError: The return code of the command is nonzero.
""" """
_update_command_for_local(command, kwargs)
if sudo and os.getuid() != 0: if sudo and os.getuid() != 0:
if kwargs.pop('shell', False): if kwargs.pop('shell', False):
command = ['sudo', 'sh', '-c', command] command = ['sudo', 'sh', '-c', command]