diff options
author | Chris Larson <chris_larson@mentor.com> | 2010-04-19 11:20:37 -0700 |
---|---|---|
committer | Chris Larson <chris_larson@mentor.com> | 2010-04-19 17:47:29 -0700 |
commit | 4e58c37e7d905d83140c79a83c89cad01f887ea2 (patch) | |
tree | 1847e838982d13de43092b70c77d39cba961c48d /classes | |
parent | ae8e15aedef94ba49e960f7aea10960657f3b9ae (diff) |
Add initial signature.bbclass, which generates a hash of the recipe data
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>
Diffstat (limited to 'classes')
-rw-r--r-- | classes/signature.bbclass | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/classes/signature.bbclass b/classes/signature.bbclass new file mode 100644 index 0000000000..17f7f6c59d --- /dev/null +++ b/classes/signature.bbclass @@ -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) +} |