summaryrefslogtreecommitdiff
path: root/third_party/waf/waflib/extras/md5_tstamp.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/waf/waflib/extras/md5_tstamp.py')
-rw-r--r--third_party/waf/waflib/extras/md5_tstamp.py67
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