summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/data_smart.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/data_smart.py')
-rw-r--r--bitbake/lib/bb/data_smart.py113
1 files changed, 55 insertions, 58 deletions
diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py
index b4ed62a4e5..43e9e78555 100644
--- a/bitbake/lib/bb/data_smart.py
+++ b/bitbake/lib/bb/data_smart.py
@@ -26,8 +26,8 @@ from bb.COW import COWDictBase
26 26
27logger = logging.getLogger("BitBake.Data") 27logger = logging.getLogger("BitBake.Data")
28 28
29__setvar_keyword__ = ["_append", "_prepend", "_remove"] 29__setvar_keyword__ = [":append", ":prepend", ":remove"]
30__setvar_regexp__ = re.compile(r'(?P<base>.*?)(?P<keyword>_append|_prepend|_remove)(_(?P<add>[^A-Z]*))?$') 30__setvar_regexp__ = re.compile(r'(?P<base>.*?)(?P<keyword>:append|:prepend|:remove)(:(?P<add>[^A-Z]*))?$')
31__expand_var_regexp__ = re.compile(r"\${[a-zA-Z0-9\-_+./~:]+?}") 31__expand_var_regexp__ = re.compile(r"\${[a-zA-Z0-9\-_+./~:]+?}")
32__expand_python_regexp__ = re.compile(r"\${@.+?}") 32__expand_python_regexp__ = re.compile(r"\${@.+?}")
33__whitespace_split__ = re.compile(r'(\s)') 33__whitespace_split__ = re.compile(r'(\s)')
@@ -277,7 +277,7 @@ class VariableHistory(object):
277 for (r, override) in d.overridedata[var]: 277 for (r, override) in d.overridedata[var]:
278 for event in self.variable(r): 278 for event in self.variable(r):
279 loginfo = event.copy() 279 loginfo = event.copy()
280 if 'flag' in loginfo and not loginfo['flag'].startswith("_"): 280 if 'flag' in loginfo and not loginfo['flag'].startswith(("_", ":")):
281 continue 281 continue
282 loginfo['variable'] = var 282 loginfo['variable'] = var
283 loginfo['op'] = 'override[%s]:%s' % (override, loginfo['op']) 283 loginfo['op'] = 'override[%s]:%s' % (override, loginfo['op'])
@@ -342,7 +342,7 @@ class VariableHistory(object):
342 for event in history: 342 for event in history:
343 if 'flag' in event: 343 if 'flag' in event:
344 continue 344 continue
345 if event['op'] == '_remove': 345 if event['op'] == ':remove':
346 continue 346 continue
347 if isset and event['op'] == 'set?': 347 if isset and event['op'] == 'set?':
348 continue 348 continue
@@ -481,7 +481,15 @@ class DataSmart(MutableMapping):
481 481
482 def setVar(self, var, value, **loginfo): 482 def setVar(self, var, value, **loginfo):
483 #print("var=" + str(var) + " val=" + str(value)) 483 #print("var=" + str(var) + " val=" + str(value))
484 var = var.replace(":", "_") 484
485 if "_append" in var or "_prepend" in var or "_remove" in var:
486 info = "%s" % var
487 if "filename" in loginfo:
488 info += " file: %s" % loginfo[filename]
489 if "lineno" in loginfo:
490 info += " line: %s" % loginfo[lineno]
491 bb.fatal("Variable %s contains an operation using the old override syntax. Please convert this layer/metadata before attempting to use with a newer bitbake." % info)
492
485 self.expand_cache = {} 493 self.expand_cache = {}
486 parsing=False 494 parsing=False
487 if 'parsing' in loginfo: 495 if 'parsing' in loginfo:
@@ -510,7 +518,7 @@ class DataSmart(MutableMapping):
510 # pay the cookie monster 518 # pay the cookie monster
511 519
512 # more cookies for the cookie monster 520 # more cookies for the cookie monster
513 if '_' in var: 521 if ':' in var:
514 self._setvar_update_overrides(base, **loginfo) 522 self._setvar_update_overrides(base, **loginfo)
515 523
516 if base in self.overridevars: 524 if base in self.overridevars:
@@ -521,27 +529,27 @@ class DataSmart(MutableMapping):
521 self._makeShadowCopy(var) 529 self._makeShadowCopy(var)
522 530
523 if not parsing: 531 if not parsing:
524 if "_append" in self.dict[var]: 532 if ":append" in self.dict[var]:
525 del self.dict[var]["_append"] 533 del self.dict[var][":append"]
526 if "_prepend" in self.dict[var]: 534 if ":prepend" in self.dict[var]:
527 del self.dict[var]["_prepend"] 535 del self.dict[var][":prepend"]
528 if "_remove" in self.dict[var]: 536 if ":remove" in self.dict[var]:
529 del self.dict[var]["_remove"] 537 del self.dict[var][":remove"]
530 if var in self.overridedata: 538 if var in self.overridedata:
531 active = [] 539 active = []
532 self.need_overrides() 540 self.need_overrides()
533 for (r, o) in self.overridedata[var]: 541 for (r, o) in self.overridedata[var]:
534 if o in self.overridesset: 542 if o in self.overridesset:
535 active.append(r) 543 active.append(r)
536 elif "_" in o: 544 elif ":" in o:
537 if set(o.split("_")).issubset(self.overridesset): 545 if set(o.split(":")).issubset(self.overridesset):
538 active.append(r) 546 active.append(r)
539 for a in active: 547 for a in active:
540 self.delVar(a) 548 self.delVar(a)
541 del self.overridedata[var] 549 del self.overridedata[var]
542 550
543 # more cookies for the cookie monster 551 # more cookies for the cookie monster
544 if '_' in var: 552 if ':' in var:
545 self._setvar_update_overrides(var, **loginfo) 553 self._setvar_update_overrides(var, **loginfo)
546 554
547 # setting var 555 # setting var
@@ -567,8 +575,8 @@ class DataSmart(MutableMapping):
567 575
568 def _setvar_update_overrides(self, var, **loginfo): 576 def _setvar_update_overrides(self, var, **loginfo):
569 # aka pay the cookie monster 577 # aka pay the cookie monster
570 override = var[var.rfind('_')+1:] 578 override = var[var.rfind(':')+1:]
571 shortvar = var[:var.rfind('_')] 579 shortvar = var[:var.rfind(':')]
572 while override and __override_regexp__.match(override): 580 while override and __override_regexp__.match(override):
573 if shortvar not in self.overridedata: 581 if shortvar not in self.overridedata:
574 self.overridedata[shortvar] = [] 582 self.overridedata[shortvar] = []
@@ -577,9 +585,9 @@ class DataSmart(MutableMapping):
577 self.overridedata[shortvar] = list(self.overridedata[shortvar]) 585 self.overridedata[shortvar] = list(self.overridedata[shortvar])
578 self.overridedata[shortvar].append([var, override]) 586 self.overridedata[shortvar].append([var, override])
579 override = None 587 override = None
580 if "_" in shortvar: 588 if ":" in shortvar:
581 override = var[shortvar.rfind('_')+1:] 589 override = var[shortvar.rfind(':')+1:]
582 shortvar = var[:shortvar.rfind('_')] 590 shortvar = var[:shortvar.rfind(':')]
583 if len(shortvar) == 0: 591 if len(shortvar) == 0:
584 override = None 592 override = None
585 593
@@ -590,8 +598,6 @@ class DataSmart(MutableMapping):
590 """ 598 """
591 Rename the variable key to newkey 599 Rename the variable key to newkey
592 """ 600 """
593 key = key.replace(":", "_")
594 newkey = newkey.replace(":", "_")
595 if key == newkey: 601 if key == newkey:
596 bb.warn("Calling renameVar with equivalent keys (%s) is invalid" % key) 602 bb.warn("Calling renameVar with equivalent keys (%s) is invalid" % key)
597 return 603 return
@@ -620,7 +626,7 @@ class DataSmart(MutableMapping):
620 self.overridedata[newkey].append([v.replace(key, newkey), o]) 626 self.overridedata[newkey].append([v.replace(key, newkey), o])
621 self.renameVar(v, v.replace(key, newkey)) 627 self.renameVar(v, v.replace(key, newkey))
622 628
623 if '_' in newkey and val is None: 629 if ':' in newkey and val is None:
624 self._setvar_update_overrides(newkey, **loginfo) 630 self._setvar_update_overrides(newkey, **loginfo)
625 631
626 loginfo['variable'] = key 632 loginfo['variable'] = key
@@ -632,15 +638,14 @@ class DataSmart(MutableMapping):
632 def appendVar(self, var, value, **loginfo): 638 def appendVar(self, var, value, **loginfo):
633 loginfo['op'] = 'append' 639 loginfo['op'] = 'append'
634 self.varhistory.record(**loginfo) 640 self.varhistory.record(**loginfo)
635 self.setVar(var + "_append", value, ignore=True, parsing=True) 641 self.setVar(var + ":append", value, ignore=True, parsing=True)
636 642
637 def prependVar(self, var, value, **loginfo): 643 def prependVar(self, var, value, **loginfo):
638 loginfo['op'] = 'prepend' 644 loginfo['op'] = 'prepend'
639 self.varhistory.record(**loginfo) 645 self.varhistory.record(**loginfo)
640 self.setVar(var + "_prepend", value, ignore=True, parsing=True) 646 self.setVar(var + ":prepend", value, ignore=True, parsing=True)
641 647
642 def delVar(self, var, **loginfo): 648 def delVar(self, var, **loginfo):
643 var = var.replace(":", "_")
644 self.expand_cache = {} 649 self.expand_cache = {}
645 650
646 loginfo['detail'] = "" 651 loginfo['detail'] = ""
@@ -649,9 +654,9 @@ class DataSmart(MutableMapping):
649 self.dict[var] = {} 654 self.dict[var] = {}
650 if var in self.overridedata: 655 if var in self.overridedata:
651 del self.overridedata[var] 656 del self.overridedata[var]
652 if '_' in var: 657 if ':' in var:
653 override = var[var.rfind('_')+1:] 658 override = var[var.rfind(':')+1:]
654 shortvar = var[:var.rfind('_')] 659 shortvar = var[:var.rfind(':')]
655 while override and override.islower(): 660 while override and override.islower():
656 try: 661 try:
657 if shortvar in self.overridedata: 662 if shortvar in self.overridedata:
@@ -661,14 +666,13 @@ class DataSmart(MutableMapping):
661 except ValueError as e: 666 except ValueError as e:
662 pass 667 pass
663 override = None 668 override = None
664 if "_" in shortvar: 669 if ":" in shortvar:
665 override = var[shortvar.rfind('_')+1:] 670 override = var[shortvar.rfind(':')+1:]
666 shortvar = var[:shortvar.rfind('_')] 671 shortvar = var[:shortvar.rfind(':')]
667 if len(shortvar) == 0: 672 if len(shortvar) == 0:
668 override = None 673 override = None
669 674
670 def setVarFlag(self, var, flag, value, **loginfo): 675 def setVarFlag(self, var, flag, value, **loginfo):
671 var = var.replace(":", "_")
672 self.expand_cache = {} 676 self.expand_cache = {}
673 677
674 if 'op' not in loginfo: 678 if 'op' not in loginfo:
@@ -679,7 +683,7 @@ class DataSmart(MutableMapping):
679 self._makeShadowCopy(var) 683 self._makeShadowCopy(var)
680 self.dict[var][flag] = value 684 self.dict[var][flag] = value
681 685
682 if flag == "_defaultval" and '_' in var: 686 if flag == "_defaultval" and ':' in var:
683 self._setvar_update_overrides(var, **loginfo) 687 self._setvar_update_overrides(var, **loginfo)
684 if flag == "_defaultval" and var in self.overridevars: 688 if flag == "_defaultval" and var in self.overridevars:
685 self._setvar_update_overridevars(var, value) 689 self._setvar_update_overridevars(var, value)
@@ -692,7 +696,6 @@ class DataSmart(MutableMapping):
692 self.dict["__exportlist"]["_content"].add(var) 696 self.dict["__exportlist"]["_content"].add(var)
693 697
694 def getVarFlag(self, var, flag, expand=True, noweakdefault=False, parsing=False, retparser=False): 698 def getVarFlag(self, var, flag, expand=True, noweakdefault=False, parsing=False, retparser=False):
695 var = var.replace(":", "_")
696 if flag == "_content": 699 if flag == "_content":
697 cachename = var 700 cachename = var
698 else: 701 else:
@@ -712,11 +715,11 @@ class DataSmart(MutableMapping):
712 active = {} 715 active = {}
713 self.need_overrides() 716 self.need_overrides()
714 for (r, o) in overridedata: 717 for (r, o) in overridedata:
715 # What about double overrides both with "_" in the name? 718 # FIXME What about double overrides both with "_" in the name?
716 if o in self.overridesset: 719 if o in self.overridesset:
717 active[o] = r 720 active[o] = r
718 elif "_" in o: 721 elif ":" in o:
719 if set(o.split("_")).issubset(self.overridesset): 722 if set(o.split(":")).issubset(self.overridesset):
720 active[o] = r 723 active[o] = r
721 724
722 mod = True 725 mod = True
@@ -724,10 +727,10 @@ class DataSmart(MutableMapping):
724 mod = False 727 mod = False
725 for o in self.overrides: 728 for o in self.overrides:
726 for a in active.copy(): 729 for a in active.copy():
727 if a.endswith("_" + o): 730 if a.endswith(":" + o):
728 t = active[a] 731 t = active[a]
729 del active[a] 732 del active[a]
730 active[a.replace("_" + o, "")] = t 733 active[a.replace(":" + o, "")] = t
731 mod = True 734 mod = True
732 elif a == o: 735 elif a == o:
733 match = active[a] 736 match = active[a]
@@ -746,28 +749,28 @@ class DataSmart(MutableMapping):
746 value = copy.copy(local_var["_defaultval"]) 749 value = copy.copy(local_var["_defaultval"])
747 750
748 751
749 if flag == "_content" and local_var is not None and "_append" in local_var and not parsing: 752 if flag == "_content" and local_var is not None and ":append" in local_var and not parsing:
750 if not value: 753 if not value:
751 value = "" 754 value = ""
752 self.need_overrides() 755 self.need_overrides()
753 for (r, o) in local_var["_append"]: 756 for (r, o) in local_var[":append"]:
754 match = True 757 match = True
755 if o: 758 if o:
756 for o2 in o.split("_"): 759 for o2 in o.split(":"):
757 if not o2 in self.overrides: 760 if not o2 in self.overrides:
758 match = False 761 match = False
759 if match: 762 if match:
760 value = value + r 763 value = value + r
761 764
762 if flag == "_content" and local_var is not None and "_prepend" in local_var and not parsing: 765 if flag == "_content" and local_var is not None and ":prepend" in local_var and not parsing:
763 if not value: 766 if not value:
764 value = "" 767 value = ""
765 self.need_overrides() 768 self.need_overrides()
766 for (r, o) in local_var["_prepend"]: 769 for (r, o) in local_var[":prepend"]:
767 770
768 match = True 771 match = True
769 if o: 772 if o:
770 for o2 in o.split("_"): 773 for o2 in o.split(":"):
771 if not o2 in self.overrides: 774 if not o2 in self.overrides:
772 match = False 775 match = False
773 if match: 776 if match:
@@ -779,12 +782,12 @@ class DataSmart(MutableMapping):
779 if expand: 782 if expand:
780 value = parser.value 783 value = parser.value
781 784
782 if value and flag == "_content" and local_var is not None and "_remove" in local_var and not parsing: 785 if value and flag == "_content" and local_var is not None and ":remove" in local_var and not parsing:
783 self.need_overrides() 786 self.need_overrides()
784 for (r, o) in local_var["_remove"]: 787 for (r, o) in local_var[":remove"]:
785 match = True 788 match = True
786 if o: 789 if o:
787 for o2 in o.split("_"): 790 for o2 in o.split(":"):
788 if not o2 in self.overrides: 791 if not o2 in self.overrides:
789 match = False 792 match = False
790 if match: 793 if match:
@@ -820,7 +823,6 @@ class DataSmart(MutableMapping):
820 return value 823 return value
821 824
822 def delVarFlag(self, var, flag, **loginfo): 825 def delVarFlag(self, var, flag, **loginfo):
823 var = var.replace(":", "_")
824 self.expand_cache = {} 826 self.expand_cache = {}
825 827
826 local_var, _ = self._findVar(var) 828 local_var, _ = self._findVar(var)
@@ -838,7 +840,6 @@ class DataSmart(MutableMapping):
838 del self.dict[var][flag] 840 del self.dict[var][flag]
839 841
840 def appendVarFlag(self, var, flag, value, **loginfo): 842 def appendVarFlag(self, var, flag, value, **loginfo):
841 var = var.replace(":", "_")
842 loginfo['op'] = 'append' 843 loginfo['op'] = 'append'
843 loginfo['flag'] = flag 844 loginfo['flag'] = flag
844 self.varhistory.record(**loginfo) 845 self.varhistory.record(**loginfo)
@@ -846,7 +847,6 @@ class DataSmart(MutableMapping):
846 self.setVarFlag(var, flag, newvalue, ignore=True) 847 self.setVarFlag(var, flag, newvalue, ignore=True)
847 848
848 def prependVarFlag(self, var, flag, value, **loginfo): 849 def prependVarFlag(self, var, flag, value, **loginfo):
849 var = var.replace(":", "_")
850 loginfo['op'] = 'prepend' 850 loginfo['op'] = 'prepend'
851 loginfo['flag'] = flag 851 loginfo['flag'] = flag
852 self.varhistory.record(**loginfo) 852 self.varhistory.record(**loginfo)
@@ -854,7 +854,6 @@ class DataSmart(MutableMapping):
854 self.setVarFlag(var, flag, newvalue, ignore=True) 854 self.setVarFlag(var, flag, newvalue, ignore=True)
855 855
856 def setVarFlags(self, var, flags, **loginfo): 856 def setVarFlags(self, var, flags, **loginfo):
857 var = var.replace(":", "_")
858 self.expand_cache = {} 857 self.expand_cache = {}
859 infer_caller_details(loginfo) 858 infer_caller_details(loginfo)
860 if not var in self.dict: 859 if not var in self.dict:
@@ -869,13 +868,12 @@ class DataSmart(MutableMapping):
869 self.dict[var][i] = flags[i] 868 self.dict[var][i] = flags[i]
870 869
871 def getVarFlags(self, var, expand = False, internalflags=False): 870 def getVarFlags(self, var, expand = False, internalflags=False):
872 var = var.replace(":", "_")
873 local_var, _ = self._findVar(var) 871 local_var, _ = self._findVar(var)
874 flags = {} 872 flags = {}
875 873
876 if local_var: 874 if local_var:
877 for i in local_var: 875 for i in local_var:
878 if i.startswith("_") and not internalflags: 876 if i.startswith(("_", ":")) and not internalflags:
879 continue 877 continue
880 flags[i] = local_var[i] 878 flags[i] = local_var[i]
881 if expand and i in expand: 879 if expand and i in expand:
@@ -886,7 +884,6 @@ class DataSmart(MutableMapping):
886 884
887 885
888 def delVarFlags(self, var, **loginfo): 886 def delVarFlags(self, var, **loginfo):
889 var = var.replace(":", "_")
890 self.expand_cache = {} 887 self.expand_cache = {}
891 if not var in self.dict: 888 if not var in self.dict:
892 self._makeShadowCopy(var) 889 self._makeShadowCopy(var)
@@ -974,8 +971,8 @@ class DataSmart(MutableMapping):
974 for (r, o) in self.overridedata[var]: 971 for (r, o) in self.overridedata[var]:
975 if o in self.overridesset: 972 if o in self.overridesset:
976 overrides.add(var) 973 overrides.add(var)
977 elif "_" in o: 974 elif ":" in o:
978 if set(o.split("_")).issubset(self.overridesset): 975 if set(o.split(":")).issubset(self.overridesset):
979 overrides.add(var) 976 overrides.add(var)
980 977
981 for k in keylist(self.dict): 978 for k in keylist(self.dict):