#!/usr/bin/env python3 # 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. """Install the parts of emscripten needed for end users. This works like a traditional `make dist` target but is written in python so it can be portable and run on non-unix platforms (basically windows). """ import argparse import fnmatch import logging import os import shutil import subprocess import sys EXCLUDES = [os.path.normpath(x) for x in ''' tests/third_party site node_modules Makefile .git cache cache.lock '''.split()] EXCLUDE_PATTERNS = ''' *.pyc .* __pycache__ '''.split() logger = logging.getLogger('install') def add_revision_file(target): # text=True would be better than encoding here, but it's only supported in 3.7+ git_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD'], encoding='utf-8').strip() with open(os.path.join(target, 'emscripten-revision.txt'), 'w') as f: f.write(git_hash + '\n') def copy_emscripten(target): script_dir = os.path.dirname(os.path.abspath(__file__)) emscripten_root = os.path.dirname(script_dir) os.chdir(emscripten_root) for root, dirs, files in os.walk('.'): # Handle the case where the target directory is underneath emscripten_root if os.path.abspath(root) == os.path.abspath(target): dirs.clear() continue remove_dirs = [] for d in dirs: if d in EXCLUDE_PATTERNS: remove_dirs.append(d) continue fulldir = os.path.normpath(os.path.join(root, d)) if fulldir in EXCLUDES: remove_dirs.append(d) continue os.makedirs(os.path.join(target, fulldir)) for d in remove_dirs: # Prevent recursion in excluded dirs logger.debug('skipping dir: ' + os.path.join(root, d)) dirs.remove(d) for f in files: if any(fnmatch.fnmatch(f, pat) for pat in EXCLUDE_PATTERNS): logger.debug('skipping file: ' + os.path.join(root, f)) continue full = os.path.normpath(os.path.join(root, f)) if full in EXCLUDES: logger.debug('skipping file: ' + os.path.join(root, f)) continue logger.debug('installing file: ' + os.path.join(root, f)) shutil.copy2(full, os.path.join(target, root, f), follow_symlinks=False) def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('-v', '--verbose', action='store_true', help='verbose', default=int(os.environ.get('EMCC_DEBUG', '0'))) parser.add_argument('target', help='target directory') args = parser.parse_args() target = os.path.abspath(args.target) if os.path.exists(target): print('target directory already exists: %s' % target) return 1 logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO) os.makedirs(target) copy_emscripten(target) add_revision_file(target) return 0 if __name__ == '__main__': sys.exit(main())