path: root/meta/classes/buildhistory.bbclass
diff options
authorPaul Eggleton <>2017-05-02 11:41:41 +1200
committerPaul Eggleton <>2017-05-09 12:37:43 +1200
commit46e1b7defd97fc79116f9922404e9fb62cb02aa7 (patch)
tree655d8693a146d21dfabfc9033f5fc62940cc39d6 /meta/classes/buildhistory.bbclass
parent123962018251dfb1d6ca5aa5c0d02534007de3ab (diff)
classes/buildhistory: fix failures collecting output signaturespaule/buildhistory-fix1
It's possible for tasks to stage symlinks that point to non-existent files; an example is ncurses-native.do_populate_sysroot. There wasn't any error checking here so this broke the build when "task" was included in BUILDHISTORY_FEATURES. In any case we shouldn't be following symlinks and getting the sha256sum of the link target - we need concern ourselves only with the target path, so check if the file is a link and sha256 the target path instead if it is. If it's neither a regular file nor a symlink (perhaps a pipe or a device), just skip it. Signed-off-by: Paul Eggleton <>
Diffstat (limited to 'meta/classes/buildhistory.bbclass')
1 files changed, 13 insertions, 1 deletions
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass
index f543bb73d6..8eafdc9f72 100644
--- a/meta/classes/buildhistory.bbclass
+++ b/meta/classes/buildhistory.bbclass
@@ -301,6 +301,8 @@ python buildhistory_emit_outputsigs() {
if not "task" in (d.getVar('BUILDHISTORY_FEATURES') or "").split():
+ import hashlib
taskoutdir = os.path.join(d.getVar('BUILDHISTORY_DIR'), 'task', 'output')
currenttask = d.getVar('BB_CURRENTTASK')
@@ -314,7 +316,17 @@ python buildhistory_emit_outputsigs() {
if fname == 'fixmepath':
fullpath = os.path.join(root, fname)
- filesigs[os.path.relpath(fullpath, cwd)] = bb.utils.sha256_file(fullpath)
+ try:
+ if os.path.islink(fullpath):
+ sha256 = hashlib.sha256(os.readlink(fullpath).encode('utf-8')).hexdigest()
+ elif os.path.isfile(fullpath):
+ sha256 = bb.utils.sha256_file(fullpath)
+ else:
+ continue
+ except OSError:
+ bb.warn('buildhistory: unable to read %s to get output signature' % fullpath)
+ continue
+ filesigs[os.path.relpath(fullpath, cwd)] = sha256
with open(taskfile, 'w') as f:
for fpath, fsig in sorted(filesigs.items(), key=lambda item: item[0]):
f.write('%s %s\n' % (fpath, fsig))