import os.path, sys, shutil, time, logging import tempfiles # Permanent cache for dlmalloc and stdlibc++ class Cache: def __init__(self, dirname=None, debug=False): if dirname is None: dirname = os.environ.get('EM_CACHE') if not dirname: dirname = os.path.expanduser(os.path.join('~', '.emscripten_cache')) self.dirname = dirname self.debug = debug def ensure(self): shared.safe_ensure_dirs(self.dirname) def erase(self): tempfiles.try_delete(self.dirname) try: open(self.dirname + '__last_clear', 'w').write('last clear: ' + time.asctime() + '\n') except Exception, e: print >> sys.stderr, 'failed to save last clear time: ', e def get_path(self, shortname): return os.path.join(self.dirname, shortname) # Request a cached file. If it isn't in the cache, it will be created with # the given creator function def get(self, shortname, creator, extension='.bc', what=None): if not shortname.endswith(extension): shortname += extension cachename = os.path.join(self.dirname, shortname) if os.path.exists(cachename): return cachename if what is None: if shortname.endswith(('.bc', '.so', '.a')): what = 'system library' else: what = 'system asset' message = 'generating ' + what + ': ' + shortname + '...' logging.warn(message) self.ensure() temp = creator() if temp != cachename: shutil.copyfile(temp, cachename) logging.warn(' '*len(message) + 'ok') return cachename # Given a set of functions of form (ident, text), and a preferred chunk size, # generates a set of chunks for parallel processing and caching. def chunkify(funcs, chunk_size, DEBUG=False): chunks = [] # initialize reasonably, the rest of the funcs we need to split out curr = [] total_size = 0 for i in range(len(funcs)): func = funcs[i] curr_size = len(func[1]) if total_size + curr_size < chunk_size: curr.append(func) total_size += curr_size else: chunks.append(curr) curr = [func] total_size = curr_size if curr: chunks.append(curr) curr = None return [''.join([func[1] for func in chunk]) for chunk in chunks] # remove function names import shared