diff options
Diffstat (limited to 'tools/shared.py')
-rw-r--r-- | tools/shared.py | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/tools/shared.py b/tools/shared.py index 0783dc75..3eb72a1e 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1,4 +1,4 @@ -import shutil, time, os, sys, json, tempfile, copy, shlex, atexit, subprocess, hashlib, cPickle, re +import shutil, time, os, sys, json, tempfile, copy, shlex, atexit, subprocess, hashlib, cPickle, re, errno from subprocess import Popen, PIPE, STDOUT from tempfile import mkstemp from distutils.spawn import find_executable @@ -456,6 +456,18 @@ FILE_PACKAGER = path_from_root('tools', 'file_packager.py') # Temp dir. Create a random one, unless EMCC_DEBUG is set, in which case use TEMP_DIR/emscripten_temp +def safe_ensure_dirs(dirname): + try: + os.makedirs(dirname) + except os.error, e: + # Ignore error for already existing dirname + if e.errno != errno.EEXIST: + raise e + # FIXME: Notice that this will result in a false positive, + # should the dirname be a file! There seems to no way to + # handle this atomically in Python 2.x. + # There is an additional option for Python 3.x, though. + class Configuration: def __init__(self, environ=os.environ): self.DEBUG = environ.get('EMCC_DEBUG') @@ -480,10 +492,9 @@ class Configuration: if self.DEBUG: try: self.EMSCRIPTEN_TEMP_DIR = self.CANONICAL_TEMP_DIR - if not os.path.exists(self.EMSCRIPTEN_TEMP_DIR): - os.makedirs(self.EMSCRIPTEN_TEMP_DIR) + safe_ensure_dirs(self.EMSCRIPTEN_TEMP_DIR) except Exception, e: - logging.debug(e + 'Could not create canonical temp dir. Check definition of TEMP_DIR in ~/.emscripten') + logging.error(str(e) + 'Could not create canonical temp dir. Check definition of TEMP_DIR in ~/.emscripten') def get_temp_files(self): return tempfiles.TempFiles( @@ -1017,8 +1028,7 @@ class Building: try: temp_dir = os.path.join(EMSCRIPTEN_TEMP_DIR, 'ar_output_' + str(os.getpid()) + '_' + str(len(temp_dirs))) temp_dirs.append(temp_dir) - if not os.path.exists(temp_dir): - os.makedirs(temp_dir) + safe_ensure_dirs(temp_dir) os.chdir(temp_dir) contents = filter(lambda x: len(x) > 0, Popen([LLVM_AR, 't', f], stdout=PIPE).communicate()[0].split('\n')) #print >> sys.stderr, ' considering archive', f, ':', contents @@ -1027,8 +1037,8 @@ class Building: else: for content in contents: # ar will silently fail if the directory for the file does not exist, so make all the necessary directories dirname = os.path.dirname(content) - if dirname and not os.path.exists(dirname): - os.makedirs(dirname) + if dirname: + safe_ensure_dirs(dirname) Popen([LLVM_AR, 'xo', f], stdout=PIPE).communicate() # if absolute paths, files will appear there. otherwise, in this directory contents = map(lambda content: os.path.join(temp_dir, content), contents) contents = filter(os.path.exists, map(os.path.abspath, contents)) @@ -1411,6 +1421,10 @@ class Building: @staticmethod def ensure_relooper(relooper): if os.path.exists(relooper): return + if os.environ.get('EMCC_FAST_COMPILER'): + logging.debug('not building relooper to js, using it in c++ backend') + return + Cache.ensure() curr = os.getcwd() try: @@ -1509,7 +1523,7 @@ class JS: @staticmethod def to_nice_ident(ident): # limited version of the JS function toNiceIdent - return ident.replace('%', '$').replace('@', '_') + return ident.replace('%', '$').replace('@', '_').replace('.', '_') @staticmethod def make_initializer(sig, settings=None): |