Add initial signature.bbclass, which generates a hash of the recipe data
authorChris Larson <chris_larson@mentor.com>
Mon, 19 Apr 2010 18:20:37 +0000 (11:20 -0700)
committerChris Larson <chris_larson@mentor.com>
Tue, 20 Apr 2010 00:47:29 +0000 (17:47 -0700)
If the datastore has a 'hash' method, it will use that, otherwise it uses its
own implementation.  Datastore hashing will be added to bitbake master at some
point, to prepare for the move away from stamps.

Signed-off-by: Chris Larson <chris_larson@mentor.com>
classes/signature.bbclass [new file with mode: 0644]

diff --git a/classes/signature.bbclass b/classes/signature.bbclass
new file mode 100644 (file)
index 0000000..17f7f6c
--- /dev/null
@@ -0,0 +1,29 @@
+# Generate a signature / hash from the metadata
+#
+# Using a blacklist rather than a whitelist is safest, at least if you're
+# utilizing the signature in your pstage package filenames, as the failure
+# mode for blacklist is an unnecessary rebuild from source, whereas the
+# failure case for a whitelist is use of incorrect binaries.
+
+BB_HASH_BLACKLIST += "BUILDSTART DATE TIME DATETIME \
+                      __* *DIR \
+                      BB_*"
+
+def get_data_hash(d):
+    from fnmatch import fnmatchcase
+
+    try:
+        signature = d.hash()
+    except AttributeError:
+        blacklist = (d.getVar("BB_HASH_BLACKLIST", True) or "").split()
+        items = ((key, repr(d.getVar(key, False)))
+                 for key in d.keys()
+                 if not any(fnmatchcase(key, pattern) for pattern in blacklist))
+        signature = hash(frozenset(items))
+    return str(signature)
+
+SIGNATURE = "${@get_data_hash(d.getVar('__RECIPEDATA', False) or d)}"
+
+python () {
+    d.setVar("__RECIPEDATA", d)
+}