69 lines
2.1 KiB
Python
Executable File
69 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright 2020 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""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
|
|
|
|
from binary_search_tool 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, 'r', encoding='utf-8') 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:]))
|