| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # Copyright 2020 The ChromiumOS Authors |
| # 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 |
| """ |
| |
| |
| 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:])) |