#!/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 to .real 2. Create symlink from this script (compiler_wrapper.py), and name it . 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:]))