| #!/usr/bin/env python | 
 |  | 
 | import os | 
 | import re | 
 | import tempfile | 
 | import shutil | 
 | import sys | 
 | import subprocess | 
 | import zipfile | 
 |  | 
 | PYTHON_BINARY = '%interpreter%' | 
 | MAIN_FILE = '%main%' | 
 | PYTHON_PATH = 'PYTHONPATH' | 
 |  | 
 | # Don't imply 'import site' on initialization | 
 | PYTHON_ARG = '-S' | 
 |  | 
 | def SearchPathEnv(name): | 
 |   search_path = os.getenv('PATH', os.defpath).split(os.pathsep) | 
 |   for directory in search_path: | 
 |     if directory == '': continue | 
 |     path = os.path.join(directory, name) | 
 |     # Check if path is actual executable file. | 
 |     if os.path.isfile(path) and os.access(path, os.X_OK): | 
 |       return path | 
 |   return None | 
 |  | 
 | def FindPythonBinary(): | 
 |   if PYTHON_BINARY.startswith('/'): | 
 |     # Case 1: Python interpreter is directly provided with absolute path. | 
 |     return PYTHON_BINARY | 
 |   else: | 
 |     # Case 2: Find Python interpreter through environment variable: PATH. | 
 |     return SearchPathEnv(PYTHON_BINARY) | 
 |  | 
 | # Create the runfiles tree by extracting the zip file | 
 | def ExtractRunfiles(): | 
 |   temp_dir = tempfile.mkdtemp("", "Soong.python_") | 
 |   zf = zipfile.ZipFile(os.path.dirname(__file__)) | 
 |   zf.extractall(temp_dir) | 
 |   return temp_dir | 
 |  | 
 | def Main(): | 
 |   args = sys.argv[1:] | 
 |  | 
 |   new_env = {} | 
 |   runfiles_path = None | 
 |  | 
 |   try: | 
 |     runfiles_path = ExtractRunfiles() | 
 |  | 
 |     # Add runfiles path to PYTHONPATH. | 
 |     python_path_entries = [runfiles_path] | 
 |  | 
 |     # Add top dirs within runfiles path to PYTHONPATH. | 
 |     top_entries = [os.path.join(runfiles_path, i) for i in os.listdir(runfiles_path)] | 
 |     top_pkg_dirs = [i for i in top_entries if os.path.isdir(i)] | 
 |     python_path_entries += top_pkg_dirs | 
 |  | 
 |     old_python_path = os.environ.get(PYTHON_PATH) | 
 |     separator = ':' | 
 |     new_python_path = separator.join(python_path_entries) | 
 |  | 
 |     # Copy old PYTHONPATH. | 
 |     if old_python_path: | 
 |       new_python_path += separator + old_python_path | 
 |     new_env[PYTHON_PATH] = new_python_path | 
 |  | 
 |     # Now look for main python source file. | 
 |     main_filepath = os.path.join(runfiles_path, MAIN_FILE) | 
 |     assert os.path.exists(main_filepath), \ | 
 |            'Cannot exec() %r: file not found.' % main_filepath | 
 |     assert os.access(main_filepath, os.R_OK), \ | 
 |            'Cannot exec() %r: file not readable.' % main_filepath | 
 |  | 
 |     python_program = FindPythonBinary() | 
 |     if python_program is None: | 
 |       raise AssertionError('Could not find python binary: ' + PYTHON_BINARY) | 
 |     args = [python_program, PYTHON_ARG, main_filepath] + args | 
 |  | 
 |     os.environ.update(new_env) | 
 |  | 
 |     sys.stdout.flush() | 
 |     retCode = subprocess.call(args) | 
 |     exit(retCode) | 
 |   except: | 
 |     raise | 
 |   finally: | 
 |     if runfiles_path is not None: | 
 |       shutil.rmtree(runfiles_path, True) | 
 |  | 
 | if __name__ == '__main__': | 
 |   Main() |