blob: 605e2ebefa28ec9a4686441d5c4a744c0b9876fc [file] [log] [blame]
#!/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 check_unexpected(lines, recipes):
"""Check for unexpected output lines from dry run"""
unexpected = []
for line in lines.splitlines():
if 'Running task' in line:
for recipe in recipes:
if recipe in line:
break
else:
line = line.split('Running', 1)[-1]
if 'do_rm_work' not in line:
unexpected.append(line.rstrip())
elif 'Running setscene' in line:
unexpected.append(line.rstrip())
return unexpected
def main():
if len(sys.argv) < 2:
sdk_targets = []
else:
sdk_targets = ' '.join(sys.argv[1:]).split()
if not sdk_targets:
# Just do a parse so the cache is primed
ret, _ = exec_watch('bitbake -p')
return ret
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 = check_unexpected(out, recipes)
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()
sys.exit(ret)