diff options
Diffstat (limited to 'binary_search_tool/compiler_wrapper.py')
-rwxr-xr-x | binary_search_tool/compiler_wrapper.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/binary_search_tool/compiler_wrapper.py b/binary_search_tool/compiler_wrapper.py new file mode 100755 index 00000000..3d6403a2 --- /dev/null +++ b/binary_search_tool/compiler_wrapper.py @@ -0,0 +1,63 @@ +#!/usr/bin/python2 +"""Prototype compiler wrapper. + +Only tested with: gcc, g++, clang, clang++ +Installation instructions: + 1. Rename compiler from <compiler_name> to <compiler_name>.real + 2. Create symlink from this script (compiler_wrapper.py), and name it + <compiler_name>. compiler_wrapper.py can live anywhere as long as it is + executable. + +Reference page: +https://sites.google.com/a/google.com/chromeos-toolchain-team-home2/home/team-tools-and-scripts/bisecting-chromeos-compiler-problems/bisection-compiler-wrapper + +Design doc: +https://docs.google.com/document/d/1yDgaUIa2O5w6dc3sSTe1ry-1ehKajTGJGQCbyn0fcEM +""" + +from __future__ import print_function + +import os +import shlex +import sys + +import bisect_driver + +WRAPPED = '%s.real' % sys.argv[0] +BISECT_STAGE = os.environ.get('BISECT_STAGE') +DEFAULT_BISECT_DIR = os.path.expanduser('~/ANDROID_BISECT') +BISECT_DIR = os.environ.get('BISECT_DIR') or DEFAULT_BISECT_DIR + + +def ProcessArgFile(arg_file): + args = [] + # Read in entire file at once and parse as if in shell + with open(arg_file, 'rb') as f: + args.extend(shlex.split(f.read())) + + return args + + +def Main(_): + if not os.path.islink(sys.argv[0]): + print("Compiler wrapper can't be called directly!") + return 1 + + execargs = [WRAPPED] + sys.argv[1:] + + if BISECT_STAGE not in bisect_driver.VALID_MODES or '-o' not in execargs: + os.execv(WRAPPED, [WRAPPED] + sys.argv[1:]) + + # Handle @file argument syntax with compiler + for idx, _ in enumerate(execargs): + # @file can be nested in other @file arguments, use While to re-evaluate + # the first argument of the embedded file. + while execargs[idx][0] == '@': + args_in_file = ProcessArgFile(execargs[idx][1:]) + execargs = execargs[0:idx] + args_in_file + execargs[idx + 1:] + + bisect_driver.bisect_driver(BISECT_STAGE, BISECT_DIR, execargs) + + +if __name__ == '__main__': + sys.exit(Main(sys.argv[1:])) |