aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2015-05-14 10:18:18 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-06-28 09:42:00 +0100
commit2791fe9236f7173e6b998cf9b40fe238566ed8ee (patch)
tree5017666d96fe19f18be69152d7da3706e54b43c9 /scripts
parentd8f151b6a385f81abead65624ba15d42cbd90e11 (diff)
downloadopenembedded-core-2791fe9236f7173e6b998cf9b40fe238566ed8ee.tar.gz
devtool: fix build env command execution error handling
If we execute an external command, we ought to prepare for the possibility that it can fail and handle the failure appropriately. We can especially expect this to happen when running bitbake in this scenario. Ensure we return the appropriate exit code to the calling process. Fixes [YOCTO #7757]. (From OE-Core master rev: 98a716d79bfc5434a5b42d3ca683eab3eea30a41) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/lib/devtool/__init__.py9
-rw-r--r--scripts/lib/devtool/standard.py22
2 files changed, 24 insertions, 7 deletions
diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py
index 78ae0aabc8..4c0d5397dc 100644
--- a/scripts/lib/devtool/__init__.py
+++ b/scripts/lib/devtool/__init__.py
@@ -43,12 +43,13 @@ def exec_build_env_command(init_path, builddir, cmd, watch=False, **options):
if watch:
if sys.stdout.isatty():
# Fool bitbake into thinking it's outputting to a terminal (because it is, indirectly)
- cmd = 'script -q -c "%s" /dev/null' % cmd
+ cmd = 'script -e -q -c "%s" /dev/null' % cmd
return exec_watch('%s%s' % (init_prefix, cmd), **options)
else:
return bb.process.run('%s%s' % (init_prefix, cmd), **options)
def exec_watch(cmd, **options):
+ import bb
if isinstance(cmd, basestring) and not "shell" in options:
options["shell"] = True
@@ -65,7 +66,11 @@ def exec_watch(cmd, **options):
buf += out
elif out == '' and process.poll() != None:
break
- return buf
+
+ if process.returncode != 0:
+ raise bb.process.ExecutionError(cmd, process.returncode, buf, None)
+
+ return buf, None
def setup_tinfoil():
import scriptpath
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index 4dc175d117..d9b5d15279 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -64,8 +64,12 @@ def add(args, config, basepath, workspace):
color = 'always'
else:
color = args.color
- stdout, stderr = exec_build_env_command(config.init_path, basepath, 'recipetool --color=%s create -o %s %s' % (color, recipefile, srctree))
- logger.info('Recipe %s has been automatically created; further editing may be required to make it fully functional' % recipefile)
+ try:
+ stdout, stderr = exec_build_env_command(config.init_path, basepath, 'recipetool --color=%s create -o %s "%s"' % (color, recipefile, srctree))
+ logger.info('Recipe %s has been automatically created; further editing may be required to make it fully functional' % recipefile)
+ except bb.process.ExecutionError as e:
+ logger.error('Command \'%s\' failed:\n%s' % (e.command, e.stdout))
+ return 1
_add_md5(config, args.recipename, recipefile)
@@ -610,7 +614,7 @@ def status(args, config, basepath, workspace):
def reset(args, config, basepath, workspace):
- import bb.utils
+ import bb
if args.recipename:
if args.all:
logger.error("Recipe cannot be specified if -a/--all is used")
@@ -630,7 +634,11 @@ def reset(args, config, basepath, workspace):
for pn in recipes:
if not args.no_clean:
logger.info('Cleaning sysroot for recipe %s...' % pn)
- exec_build_env_command(config.init_path, basepath, 'bitbake -c clean %s' % pn)
+ try:
+ exec_build_env_command(config.init_path, basepath, 'bitbake -c clean %s' % pn)
+ except bb.process.ExecutionError as e:
+ logger.error('Command \'%s\' failed, output:\n%s\nIf you wish, you may specify -n/--no-clean to skip running this command when resetting' % (e.command, e.stdout))
+ return 1
_check_preserve(config, pn)
@@ -656,7 +664,11 @@ def build(args, config, basepath, workspace):
logger.error("no recipe named %s in your workspace" % args.recipename)
return -1
build_task = config.get('Build', 'build_task', 'populate_sysroot')
- exec_build_env_command(config.init_path, basepath, 'bitbake -c %s %s' % (build_task, args.recipename), watch=True)
+ try:
+ exec_build_env_command(config.init_path, basepath, 'bitbake -c %s %s' % (build_task, args.recipename), watch=True)
+ except bb.process.ExecutionError as e:
+ # We've already seen the output since watch=True, so just ensure we return something to the user
+ return e.exitcode
return 0