| Index: build/android/pylib/build_utils.py
|
| diff --git a/build/android/pylib/build_utils.py b/build/android/pylib/build_utils.py
|
| index 8849a77df69b7ea79876bfbbf308f390cc2f3a25..ce7ed9e80dd0ab2a3316527bba562e9897310602 100644
|
| --- a/build/android/pylib/build_utils.py
|
| +++ b/build/android/pylib/build_utils.py
|
| @@ -4,8 +4,12 @@
|
|
|
| import fnmatch
|
| import os
|
| +import pipes
|
| import shlex
|
| import shutil
|
| +import subprocess
|
| +import sys
|
| +import traceback
|
|
|
|
|
| def MakeDirectory(dir_path):
|
| @@ -51,3 +55,36 @@ def ParseGypList(gyp_string):
|
| return shlex.split(gyp_string)
|
|
|
|
|
| +# This can be used in most cases like subprocess.check_call. The output,
|
| +# particularly when the command fails, better highlights the command's failure.
|
| +# This call will directly exit on a failure in the subprocess so that no python
|
| +# stacktrace is printed after the output of the failed command.
|
| +def CheckCallDie(args, cwd=None):
|
| + if not cwd:
|
| + cwd = os.getcwd()
|
| +
|
| + child = subprocess.Popen(args,
|
| + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=cwd)
|
| +
|
| + stdout, _ = child.communicate()
|
| +
|
| + if child.returncode:
|
| + stacktrace = traceback.extract_stack()
|
| + print >> sys.stderr, ''.join(traceback.format_list(stacktrace))
|
| + # A user should be able to simply copy and paste the command that failed
|
| + # into their shell.
|
| + copyable_command = ' '.join(map(pipes.quote, args))
|
| + copyable_command = ('( cd ' + os.path.abspath(cwd) + '; '
|
| + + copyable_command + ' )')
|
| + print >> sys.stderr, 'Command failed:', copyable_command, '\n'
|
| +
|
| + if stdout:
|
| + print stdout,
|
| +
|
| + # Directly exit to avoid printing stacktrace.
|
| + sys.exit(child.returncode)
|
| +
|
| + else:
|
| + if stdout:
|
| + print stdout,
|
| +
|
|
|