From a0955f22087ecdab7a7f51909cc424725b3643dd Mon Sep 17 00:00:00 2001 From: Cassidy Burden Date: Wed, 3 Aug 2016 16:19:34 -0700 Subject: binary search tool: Support @file compiler arguments Gradle passes arguments to gcc/clang by using the @file argument. Implement expansion of this argument so that bisect_driver can analyze all arguments being sent to the compiler. TEST=Tested with NDK sample app Change-Id: I1e1dae001a062c118b6d5c36e367612c9e4116b7 Reviewed-on: https://chrome-internal-review.googlesource.com/272935 Commit-Ready: Cassidy Burden Tested-by: Cassidy Burden Reviewed-by: Caroline Tice --- binary_search_tool/compiler_wrapper.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'binary_search_tool') diff --git a/binary_search_tool/compiler_wrapper.py b/binary_search_tool/compiler_wrapper.py index 42723ec0..54d5d7ea 100755 --- a/binary_search_tool/compiler_wrapper.py +++ b/binary_search_tool/compiler_wrapper.py @@ -15,6 +15,7 @@ https://docs.google.com/document/d/1yDgaUIa2O5w6dc3sSTe1ry-1ehKajTGJGQCbyn0fcEM from __future__ import print_function import os +import shlex import sys import bisect_driver @@ -25,6 +26,15 @@ 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!") @@ -35,6 +45,14 @@ def Main(_): if BISECT_STAGE not in bisect_driver.VALID_MODES: 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) -- cgit v1.2.3