Files
poky/meta/files/ext-sdk-prepare.py
Richard Purdie 6b564ae35d ext-sdk-prepare: Catch setscene tasks which should have run but didn't
When installing the eSDK, if setscene task fail for some reason, the tests
would ignore this. This is bad since we assume they're working.

This adds some sanity test code which detects if setscene tasks are
needing to run and errors if there are any.

(From OE-Core rev: 7ea670c3b00439ca5eeb6ae1efd475f0954268b7)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2016-03-07 00:11:39 +00:00

95 lines
2.8 KiB
Python

#!/usr/bin/env python
# Prepare the build system within the extensible SDK
import sys
import os
import subprocess
def exec_watch(cmd, **options):
"""Run program with stdout shown on sys.stdout"""
if isinstance(cmd, basestring) and not "shell" in options:
options["shell"] = True
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **options
)
buf = ''
while True:
out = process.stdout.read(1)
if out:
sys.stdout.write(out)
sys.stdout.flush()
buf += out
elif out == '' and process.poll() != None:
break
return process.returncode, buf
def main():
if len(sys.argv) < 2:
print('Please specify target to prepare with')
return 1
sdk_targets = ' '.join(sys.argv[1:]).split()
print('Preparing SDK for %s...' % ', '.join(sdk_targets))
ret, out = exec_watch('bitbake %s --setscene-only' % ' '.join(sdk_targets))
if ret:
return ret
targetlist = []
for target in sdk_targets:
if ':' in target:
target = target.split(':')[0]
if not target in targetlist:
targetlist.append(target)
recipes = []
for target in targetlist:
try:
out = subprocess.check_output(('bitbake -e %s' % target).split(), stderr=subprocess.STDOUT)
for line in out.splitlines():
if line.startswith('FILE='):
splitval = line.rstrip().split('=')
if len(splitval) > 1:
recipes.append(splitval[1].strip('"'))
break
except subprocess.CalledProcessError as e:
print('ERROR: Failed to get recipe for target %s:\n%s' % (target, e.output))
return 1
try:
out = subprocess.check_output('bitbake %s -n' % ' '.join(sdk_targets), stderr=subprocess.STDOUT, shell=True)
unexpected = []
for line in out.splitlines():
if 'Running task' in line:
for recipe in recipes:
if recipe in line:
break
else:
line = line.split('Running', 1)[-1]
unexpected.append(line.rstrip())
elif 'Running setscene' in line:
unexpected.append(line.rstrip())
except subprocess.CalledProcessError as e:
print('ERROR: Failed to execute dry-run:\n%s' % e.output)
return 1
if unexpected:
print('ERROR: Unexpected tasks or setscene left over to be executed:')
for line in unexpected:
print(' ' + line)
return 1
if __name__ == "__main__":
try:
ret = main()
except Exception:
ret = 1
import traceback
traceback.print_exc(5)
sys.exit(ret)