# 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)