summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/recipeutils.py
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oe/recipeutils.py')
-rw-r--r--meta/lib/oe/recipeutils.py71
1 files changed, 68 insertions, 3 deletions
diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py
index aa64553c06..9de291f5b5 100644
--- a/meta/lib/oe/recipeutils.py
+++ b/meta/lib/oe/recipeutils.py
@@ -52,6 +52,29 @@ def parse_recipe(cooker, fn, appendfiles):
52 return envdata 52 return envdata
53 53
54 54
55def simplify_history(history, d):
56 """
57 Eliminate any irrelevant events from a variable history
58 """
59 ret_history = []
60 has_set = False
61 # Go backwards through the history and remove any immediate operations
62 # before the most recent set
63 for event in reversed(history):
64 if 'flag' in event or not 'file' in event:
65 continue
66 if event['op'] == 'set':
67 if has_set:
68 continue
69 has_set = True
70 elif event['op'] in ('append', 'prepend', 'postdot', 'predot'):
71 # Reminder: "append" and "prepend" mean += and =+ respectively, NOT _append / _prepend
72 if has_set:
73 continue
74 ret_history.insert(0, event)
75 return ret_history
76
77
55def get_var_files(fn, varlist, d): 78def get_var_files(fn, varlist, d):
56 """Find the file in which each of a list of variables is set. 79 """Find the file in which each of a list of variables is set.
57 Note: requires variable history to be enabled when parsing. 80 Note: requires variable history to be enabled when parsing.
@@ -176,7 +199,14 @@ def patch_recipe_lines(fromlines, values, trailing_newline=True):
176 def outputvalue(name, lines, rewindcomments=False): 199 def outputvalue(name, lines, rewindcomments=False):
177 if values[name] is None: 200 if values[name] is None:
178 return 201 return
179 rawtext = '%s = "%s"%s' % (name, values[name], newline) 202 if isinstance(values[name], tuple):
203 op, value = values[name]
204 if op == '+=' and value.strip() == '':
205 return
206 else:
207 value = values[name]
208 op = '='
209 rawtext = '%s %s "%s"%s' % (name, op, value, newline)
180 addlines = [] 210 addlines = []
181 nowrap = False 211 nowrap = False
182 for nowrap_re in nowrap_vars_res: 212 for nowrap_re in nowrap_vars_res:
@@ -186,10 +216,10 @@ def patch_recipe_lines(fromlines, values, trailing_newline=True):
186 if nowrap: 216 if nowrap:
187 addlines.append(rawtext) 217 addlines.append(rawtext)
188 elif name in list_vars: 218 elif name in list_vars:
189 splitvalue = split_var_value(values[name], assignment=False) 219 splitvalue = split_var_value(value, assignment=False)
190 if len(splitvalue) > 1: 220 if len(splitvalue) > 1:
191 linesplit = ' \\\n' + (' ' * (len(name) + 4)) 221 linesplit = ' \\\n' + (' ' * (len(name) + 4))
192 addlines.append('%s = "%s%s"%s' % (name, linesplit.join(splitvalue), linesplit, newline)) 222 addlines.append('%s %s "%s%s"%s' % (name, op, linesplit.join(splitvalue), linesplit, newline))
193 else: 223 else:
194 addlines.append(rawtext) 224 addlines.append(rawtext)
195 else: 225 else:
@@ -321,12 +351,47 @@ def patch_recipe(d, fn, varvalues, patch=False, relpath='', redirect_output=None
321 """Modify a list of variable values in the specified recipe. Handles inc files if 351 """Modify a list of variable values in the specified recipe. Handles inc files if
322 used by the recipe. 352 used by the recipe.
323 """ 353 """
354 overrides = d.getVar('OVERRIDES').split(':')
355 def override_applicable(hevent):
356 op = hevent['op']
357 if '[' in op:
358 opoverrides = op.split('[')[1].split(']')[0].split('_')
359 for opoverride in opoverrides:
360 if not opoverride in overrides:
361 return False
362 return True
363
324 varlist = varvalues.keys() 364 varlist = varvalues.keys()
365 fn = os.path.abspath(fn)
325 varfiles = get_var_files(fn, varlist, d) 366 varfiles = get_var_files(fn, varlist, d)
326 locs = localise_file_vars(fn, varfiles, varlist) 367 locs = localise_file_vars(fn, varfiles, varlist)
327 patches = [] 368 patches = []
328 for f,v in locs.items(): 369 for f,v in locs.items():
329 vals = {k: varvalues[k] for k in v} 370 vals = {k: varvalues[k] for k in v}
371 f = os.path.abspath(f)
372 if f == fn:
373 extravals = {}
374 for var, value in vals.items():
375 if var in list_vars:
376 history = simplify_history(d.varhistory.variable(var), d)
377 recipe_set = False
378 for event in history:
379 if os.path.abspath(event['file']) == fn:
380 if event['op'] == 'set':
381 recipe_set = True
382 if not recipe_set:
383 for event in history:
384 if event['op'].startswith('_remove'):
385 continue
386 if not override_applicable(event):
387 continue
388 newvalue = value.replace(event['detail'], '')
389 if newvalue == value and os.path.abspath(event['file']) == fn and event['op'].startswith('_'):
390 op = event['op'].replace('[', '_').replace(']', '')
391 extravals[var + op] = None
392 value = newvalue
393 vals[var] = ('+=', value)
394 vals.update(extravals)
330 patchdata = patch_recipe_file(f, vals, patch, relpath, redirect_output) 395 patchdata = patch_recipe_file(f, vals, patch, relpath, redirect_output)
331 if patch: 396 if patch:
332 patches.append(patchdata) 397 patches.append(patchdata)