diff options
Diffstat (limited to 'bitbake/lib/bb/checksum.py')
-rw-r--r-- | bitbake/lib/bb/checksum.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/bitbake/lib/bb/checksum.py b/bitbake/lib/bb/checksum.py new file mode 100644 index 0000000000..514ff0b1e6 --- /dev/null +++ b/bitbake/lib/bb/checksum.py | |||
@@ -0,0 +1,90 @@ | |||
1 | # Local file checksum cache implementation | ||
2 | # | ||
3 | # Copyright (C) 2012 Intel Corporation | ||
4 | # | ||
5 | # This program is free software; you can redistribute it and/or modify | ||
6 | # it under the terms of the GNU General Public License version 2 as | ||
7 | # published by the Free Software Foundation. | ||
8 | # | ||
9 | # This program is distributed in the hope that it will be useful, | ||
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | # GNU General Public License for more details. | ||
13 | # | ||
14 | # You should have received a copy of the GNU General Public License along | ||
15 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
16 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | |||
18 | import os | ||
19 | import stat | ||
20 | import bb.utils | ||
21 | import logging | ||
22 | from bb.cache import MultiProcessCache | ||
23 | |||
24 | logger = logging.getLogger("BitBake.Cache") | ||
25 | |||
26 | try: | ||
27 | import cPickle as pickle | ||
28 | except ImportError: | ||
29 | import pickle | ||
30 | logger.info("Importing cPickle failed. " | ||
31 | "Falling back to a very slow implementation.") | ||
32 | |||
33 | |||
34 | # mtime cache (non-persistent) | ||
35 | # based upon the assumption that files do not change during bitbake run | ||
36 | class FileMtimeCache(object): | ||
37 | cache = {} | ||
38 | |||
39 | def cached_mtime(self, f): | ||
40 | if f not in self.cache: | ||
41 | self.cache[f] = os.stat(f)[stat.ST_MTIME] | ||
42 | return self.cache[f] | ||
43 | |||
44 | def cached_mtime_noerror(self, f): | ||
45 | if f not in self.cache: | ||
46 | try: | ||
47 | self.cache[f] = os.stat(f)[stat.ST_MTIME] | ||
48 | except OSError: | ||
49 | return 0 | ||
50 | return self.cache[f] | ||
51 | |||
52 | def update_mtime(self, f): | ||
53 | self.cache[f] = os.stat(f)[stat.ST_MTIME] | ||
54 | return self.cache[f] | ||
55 | |||
56 | def clear(self): | ||
57 | self.cache.clear() | ||
58 | |||
59 | # Checksum + mtime cache (persistent) | ||
60 | class FileChecksumCache(MultiProcessCache): | ||
61 | cache_file_name = "local_file_checksum_cache.dat" | ||
62 | CACHE_VERSION = 1 | ||
63 | |||
64 | def __init__(self): | ||
65 | self.mtime_cache = FileMtimeCache() | ||
66 | MultiProcessCache.__init__(self) | ||
67 | |||
68 | def get_checksum(self, f): | ||
69 | entry = self.cachedata[0].get(f) | ||
70 | cmtime = self.mtime_cache.cached_mtime(f) | ||
71 | if entry: | ||
72 | (mtime, hashval) = entry | ||
73 | if cmtime == mtime: | ||
74 | return hashval | ||
75 | else: | ||
76 | bb.debug(2, "file %s changed mtime, recompute checksum" % f) | ||
77 | |||
78 | hashval = bb.utils.md5_file(f) | ||
79 | self.cachedata_extras[0][f] = (cmtime, hashval) | ||
80 | return hashval | ||
81 | |||
82 | def merge_data(self, source, dest): | ||
83 | for h in source[0]: | ||
84 | if h in dest: | ||
85 | (smtime, _) = source[0][h] | ||
86 | (dmtime, _) = dest[0][h] | ||
87 | if smtime > dmtime: | ||
88 | dest[0][h] = source[0][h] | ||
89 | else: | ||
90 | dest[0][h] = source[0][h] | ||