classes/populate_sdk_ext: check that extensible SDK prepared correctly
After the change to use --setscene-only when running bitbake to prepare the SDK at the end of installation, add a check that the SDK got prepared correctly by doing a dry-run and looking at the output for any real tasks that we don't expect. In order to make this easier, the preparation shell script was rewritten in python. (From OE-Core rev: 2306683634435b990e63020fc5cf91753bbaf7b6) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
4685c3378d
commit
2e620a4785
|
@ -224,7 +224,7 @@ install_tools() {
|
|||
|
||||
install ${SDK_DEPLOY}/${BUILD_ARCH}-nativesdk-libc.tar.bz2 ${SDK_OUTPUT}/${SDKPATH}
|
||||
|
||||
install -m 0755 ${COREBASE}/meta/files/ext-sdk-prepare.sh ${SDK_OUTPUT}/${SDKPATH}
|
||||
install -m 0644 ${COREBASE}/meta/files/ext-sdk-prepare.py ${SDK_OUTPUT}/${SDKPATH}
|
||||
}
|
||||
|
||||
# Since bitbake won't run as root it doesn't make sense to try and install
|
||||
|
@ -270,9 +270,8 @@ sdk_ext_postinst() {
|
|||
# current working directory when first ran, nor will it set $1 when
|
||||
# sourcing a script. That is why this has to look so ugly.
|
||||
LOGFILE="$target_sdk_dir/preparing_build_system.log"
|
||||
sh -c ". buildtools/environment-setup* > $LOGFILE && cd $target_sdk_dir/`dirname ${oe_init_build_env_path}` && set $target_sdk_dir && . $target_sdk_dir/${oe_init_build_env_path} $target_sdk_dir >> $LOGFILE && $target_sdk_dir/ext-sdk-prepare.sh $target_sdk_dir '${SDK_TARGETS}' >> $LOGFILE 2>&1" || { echo "ERROR: SDK preparation failed: see $LOGFILE"; echo "printf 'ERROR: this SDK was not fully installed and needs reinstalling\n'" >> $env_setup_script ; exit 1 ; }
|
||||
sh -c ". buildtools/environment-setup* > $LOGFILE && cd $target_sdk_dir/`dirname ${oe_init_build_env_path}` && set $target_sdk_dir && . $target_sdk_dir/${oe_init_build_env_path} $target_sdk_dir >> $LOGFILE && python $target_sdk_dir/ext-sdk-prepare.py '${SDK_TARGETS}' >> $LOGFILE 2>&1" || { echo "ERROR: SDK preparation failed: see $LOGFILE"; echo "printf 'ERROR: this SDK was not fully installed and needs reinstalling\n'" >> $env_setup_script ; exit 1 ; }
|
||||
fi
|
||||
rm -f $target_sdk_dir/ext-sdk-prepare.sh
|
||||
echo done
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
#!/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())
|
||||
except subprocess.CalledProcessError as e:
|
||||
print('ERROR: Failed to execute dry-run:\n%s' % e.output)
|
||||
return 1
|
||||
|
||||
if unexpected:
|
||||
print('ERROR: Unexpected tasks 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)
|
|
@ -1,8 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Prepare the build system within the extensible SDK
|
||||
|
||||
target_sdk_dir="$1"
|
||||
sdk_targets="$2"
|
||||
|
||||
bitbake $sdk_targets --setscene-only || exit 1
|
Loading…
Reference in New Issue