diff options
Diffstat (limited to 'scripts/devtool')
-rwxr-xr-x | scripts/devtool | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/scripts/devtool b/scripts/devtool index 8a4f41bc372..cfc26cfb855 100755 --- a/scripts/devtool +++ b/scripts/devtool @@ -15,6 +15,8 @@ import re import configparser import subprocess import logging +import json +from collections import OrderedDict basepath = '' workspace = {} @@ -99,32 +101,59 @@ def read_workspace(): if not context.fixed_setup: _enable_workspace_layer(config.workspace_path, config, basepath) + def process_inline_json(strvalue, in_value): + if strvalue.count('{') == strvalue.count('}') and strvalue.count('[') == strvalue.count(']'): + pnvalues[in_value] = json.loads(strvalue, object_pairs_hook=OrderedDict) + return True + return False + logger.debug('Reading workspace in %s' % config.workspace_path) externalsrc_re = re.compile(r'^EXTERNALSRC(_pn-([^ =]+))? *= *"([^"]*)"$') for fn in glob.glob(os.path.join(config.workspace_path, 'appends', '*.bbappend')): with open(fn, 'r') as f: pnvalues = {} + in_value = None + strvalue = '' for line in f: - res = externalsrc_re.match(line.rstrip()) - if res: - recipepn = os.path.splitext(os.path.basename(fn))[0].split('_')[0] - pn = res.group(2) or recipepn - # Find the recipe file within the workspace, if any - bbfile = os.path.basename(fn).replace('.bbappend', '.bb').replace('%', '*') - recipefile = glob.glob(os.path.join(config.workspace_path, - 'recipes', - recipepn, - bbfile)) - if recipefile: - recipefile = recipefile[0] - pnvalues['srctree'] = res.group(3) - pnvalues['bbappend'] = fn - pnvalues['recipefile'] = recipefile - elif line.startswith('# srctreebase: '): - pnvalues['srctreebase'] = line.split(':', 1)[1].strip() + if in_value: + if not line.startswith('#'): + logger.error('Syntax error in %s - invalid in-line json' % fn) + sys.exit(1) + strvalue += line[1:] + if process_inline_json(strvalue, in_value): + in_value = None + else: + res = externalsrc_re.match(line.rstrip()) + if res: + recipepn = os.path.splitext(os.path.basename(fn))[0].split('_')[0] + pn = res.group(2) or recipepn + # Find the recipe file within the workspace, if any + bbfile = os.path.basename(fn).replace('.bbappend', '.bb').replace('%', '*') + recipefile = glob.glob(os.path.join(config.workspace_path, + 'recipes', + recipepn, + bbfile)) + if recipefile: + recipefile = recipefile[0] + pnvalues['srctree'] = res.group(3) + pnvalues['bbappend'] = fn + pnvalues['recipefile'] = recipefile + elif line.startswith('# srctreebase: '): + pnvalues['srctreebase'] = line.split(':', 1)[1].strip() + elif line.startswith('# srctreetop: '): + pnvalues['srctreetop'] = line.split(':', 1)[1].strip() + elif line.startswith('# extradirs: '): + strvalue = line.split(':', 1)[1].strip() + in_value = 'extradirs' + if process_inline_json(strvalue, in_value): + in_value = None if pnvalues: if not pnvalues.get('srctreebase', None): pnvalues['srctreebase'] = pnvalues['srctree'] + if not 'srctreetop' in pnvalues: + pnvalues['srctreetop'] = pnvalues['srctreebase'] + if not 'extradirs' in pnvalues: + pnvalues['extradirs'] = [] logger.debug('Found recipe %s' % pnvalues) workspace[pn] = pnvalues |