| # Copyright 2020 The Emscripten Authors. All rights reserved. |
| # Emscripten is available under two separate licenses, the MIT license and the |
| # University of Illinois/NCSA Open Source License. Both these licenses can be |
| # found in the LICENSE file. |
| |
| import contextlib |
| import os |
| import sys |
| |
| from . import diagnostics |
| |
| __rootpath__ = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) |
| WINDOWS = sys.platform.startswith('win') |
| MACOS = sys.platform == 'darwin' |
| LINUX = sys.platform.startswith('linux') |
| |
| |
| def exit_with_error(msg, *args): |
| diagnostics.error(msg, *args) |
| |
| |
| def path_from_root(*pathelems): |
| return os.path.join(__rootpath__, *pathelems) |
| |
| |
| def safe_ensure_dirs(dirname): |
| os.makedirs(dirname, exist_ok=True) |
| |
| |
| @contextlib.contextmanager |
| def chdir(dir): |
| """A context manager that performs actions in the given directory.""" |
| orig_cwd = os.getcwd() |
| os.chdir(dir) |
| try: |
| yield |
| finally: |
| os.chdir(orig_cwd) |
| |
| |
| # Finds the given executable 'program' in PATH. Operates like the Unix tool 'which'. |
| def which(program): |
| def is_exe(fpath): |
| return os.path.isfile(fpath) and os.access(fpath, os.X_OK) |
| |
| if os.path.isabs(program): |
| if os.path.isfile(program): |
| return program |
| |
| if WINDOWS: |
| for suffix in ['.exe', '.cmd', '.bat']: |
| if is_exe(program + suffix): |
| return program + suffix |
| |
| fpath, fname = os.path.split(program) |
| if fpath: |
| if is_exe(program): |
| return program |
| else: |
| for path in os.environ["PATH"].split(os.pathsep): |
| path = path.strip('"') |
| exe_file = os.path.join(path, program) |
| if is_exe(exe_file): |
| return exe_file |
| if WINDOWS: |
| for suffix in ('.exe', '.cmd', '.bat'): |
| if is_exe(exe_file + suffix): |
| return exe_file + suffix |
| |
| return None |
| |
| |
| def read_file(file_path): |
| """Read from a file opened in text mode""" |
| with open(file_path) as fh: |
| return fh.read() |
| |
| |
| def read_binary(file_path): |
| """Read from a file opened in binary mode""" |
| with open(file_path, 'rb') as fh: |
| return fh.read() |
| |
| |
| def write_file(file_path, text): |
| """Write to a file opened in text mode""" |
| with open(file_path, 'w') as fh: |
| fh.write(text) |