summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/build.py
diff options
context:
space:
mode:
authorRoss Burton <ross.burton@intel.com>2016-07-25 23:32:26 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-07-26 08:10:37 +0100
commit1393b23f512b42d0dc547677f3fc3a88f3864a31 (patch)
tree42c71f8c9cf70d11dcdfd5e1ab5d775fa7d963fe /bitbake/lib/bb/build.py
parent9411e33b8863d5b88042a03b8e1950c5fcbae36b (diff)
downloadpoky-1393b23f512b42d0dc547677f3fc3a88f3864a31.tar.gz
bitbake: lib/bb/build: handle incomplete message fragments in log FIFO
It's possible that the logging FIFO doesn't do a complete read (or the sender a complete write) with the result that an incomplete message is read in bitbake. This used to result in silently truncated lines but since 42d727 now also results in a warning as the start of the rest of the message isn't a valid logging command. Solve this by storing incoming bytes in a bytearray() across reads, and parsing complete messages from that. [ YOCTO #9999 ] (Bitbake rev: 508112793ee7ace613f07695222997309a2ca58f) Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/build.py')
-rw-r--r--bitbake/lib/bb/build.py67
1 files changed, 36 insertions, 31 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index a4deb00b88..c632a271fe 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -385,39 +385,44 @@ exit $ret
385 else: 385 else:
386 bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress)) 386 bb.warn('%s: invalid task progress varflag value "%s", ignoring' % (func, progress))
387 387
388 fifobuffer = bytearray()
388 def readfifo(data): 389 def readfifo(data):
389 lines = data.split(b'\0') 390 nonlocal fifobuffer
390 for line in lines: 391 fifobuffer.extend(data)
391 # Just skip empty commands 392 while fifobuffer:
392 if not line: 393 message, token, nextmsg = fifobuffer.partition(b"\00")
393 continue 394 if token:
394 splitval = line.split(b' ', 1) 395 splitval = message.split(b' ', 1)
395 cmd = splitval[0].decode("utf-8") 396 cmd = splitval[0].decode("utf-8")
396 if len(splitval) > 1: 397 if len(splitval) > 1:
397 value = splitval[1].decode("utf-8") 398 value = splitval[1].decode("utf-8")
398 else: 399 else:
399 value = '' 400 value = ''
400 if cmd == 'bbplain': 401 if cmd == 'bbplain':
401 bb.plain(value) 402 bb.plain(value)
402 elif cmd == 'bbnote': 403 elif cmd == 'bbnote':
403 bb.note(value) 404 bb.note(value)
404 elif cmd == 'bbwarn': 405 elif cmd == 'bbwarn':
405 bb.warn(value) 406 bb.warn(value)
406 elif cmd == 'bberror': 407 elif cmd == 'bberror':
407 bb.error(value) 408 bb.error(value)
408 elif cmd == 'bbfatal': 409 elif cmd == 'bbfatal':
409 # The caller will call exit themselves, so bb.error() is 410 # The caller will call exit themselves, so bb.error() is
410 # what we want here rather than bb.fatal() 411 # what we want here rather than bb.fatal()
411 bb.error(value) 412 bb.error(value)
412 elif cmd == 'bbfatal_log': 413 elif cmd == 'bbfatal_log':
413 bb.error(value, forcelog=True) 414 bb.error(value, forcelog=True)
414 elif cmd == 'bbdebug': 415 elif cmd == 'bbdebug':
415 splitval = value.split(' ', 1) 416 splitval = value.split(' ', 1)
416 level = int(splitval[0]) 417 level = int(splitval[0])
417 value = splitval[1] 418 value = splitval[1]
418 bb.debug(level, value) 419 bb.debug(level, value)
420 else:
421 bb.warn("Unrecognised command '%s' on FIFO" % cmd)
422 fifobuffer = nextmsg
419 else: 423 else:
420 bb.warn("Unrecognised command '%s' on FIFO" % cmd) 424 break
425
421 tempdir = d.getVar('T', True) 426 tempdir = d.getVar('T', True)
422 fifopath = os.path.join(tempdir, 'fifo.%s' % os.getpid()) 427 fifopath = os.path.join(tempdir, 'fifo.%s' % os.getpid())
423 if os.path.exists(fifopath): 428 if os.path.exists(fifopath):