diff options
Diffstat (limited to 'third_party/waf/waflib/extras/md5_tstamp.py')
-rw-r--r-- | third_party/waf/waflib/extras/md5_tstamp.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/third_party/waf/waflib/extras/md5_tstamp.py b/third_party/waf/waflib/extras/md5_tstamp.py new file mode 100644 index 00000000000..63b71d8d27a --- /dev/null +++ b/third_party/waf/waflib/extras/md5_tstamp.py @@ -0,0 +1,67 @@ +#! /usr/bin/env python +# encoding: utf-8 + +""" +This module assumes that only one build context is running at a given time, which +is not the case if you want to execute configuration tests in parallel. + +Store some values on the buildcontext mapping file paths to +stat values and md5 values (timestamp + md5) +this way the md5 hashes are computed only when timestamp change (can be faster) +There is usually little or no gain from enabling this, but it can be used to enable +the second level cache with timestamps (WAFCACHE) + +You may have to run distclean or to remove the build directory before enabling/disabling +this hashing scheme +""" + +import os, stat +from waflib import Utils, Build, Context + +STRONGEST = True + +try: + Build.BuildContext.store_real +except AttributeError: + + Context.DBFILE += '_md5tstamp' + + Build.hashes_md5_tstamp = {} + Build.SAVED_ATTRS.append('hashes_md5_tstamp') + def store(self): + # save the hash cache as part of the default pickle file + self.hashes_md5_tstamp = Build.hashes_md5_tstamp + self.store_real() + Build.BuildContext.store_real = Build.BuildContext.store + Build.BuildContext.store = store + + def restore(self): + # we need a module variable for h_file below + self.restore_real() + try: + Build.hashes_md5_tstamp = self.hashes_md5_tstamp or {} + except AttributeError: + Build.hashes_md5_tstamp = {} + Build.BuildContext.restore_real = Build.BuildContext.restore + Build.BuildContext.restore = restore + + def h_file(filename): + st = os.stat(filename) + if stat.S_ISDIR(st[stat.ST_MODE]): raise IOError('not a file') + + if filename in Build.hashes_md5_tstamp: + if Build.hashes_md5_tstamp[filename][0] == str(st.st_mtime): + return Build.hashes_md5_tstamp[filename][1] + if STRONGEST: + ret = Utils.h_file_no_md5(filename) + Build.hashes_md5_tstamp[filename] = (str(st.st_mtime), ret) + return ret + else: + m = Utils.md5() + m.update(str(st.st_mtime)) + m.update(str(st.st_size)) + m.update(filename) + Build.hashes_md5_tstamp[filename] = (str(st.st_mtime), m.digest()) + return m.digest() + Utils.h_file_no_md5 = Utils.h_file + Utils.h_file = h_file |