diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2011-06-29 19:37:39 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-07-05 13:36:51 +0100 |
commit | 3bf2d2103e4b600b01ef99dca7ba1a47bd4438f1 (patch) | |
tree | 25b3ad261f5eee517ba62335a237fa4c008828c0 /bitbake/lib/bb/cooker.py | |
parent | 44db5d5d76e718e0b17c939c5e03d29e123386e8 (diff) | |
download | poky-3bf2d2103e4b600b01ef99dca7ba1a47bd4438f1.tar.gz |
bitbake/cooker: implement layer dependencies, make priority optional
Implement (optionally versioned) dependencies between layers, and if layer
priorities are not specified using BBFILE_PRIORITY_layername (now
optional) then work out the layer priority based on dependencies.
Define LAYERDEPENDS_layername in layer.conf to specify the dependencies
of a layer (list of layer names, split with spaces in the usual way);
LAYERVERSION_layername can be defined for each layer allowing specific
version dependencies to be specified via depname:version in the list of
dependencies. An error will be produced if any dependency is missing or
the version numbers do not match exactly (if specified).
Note: default priority if unspecified for a layer with no dependencies is
lowest defined priority + 1 (or 1 if no priorities are defined).
Addresses [YOCTO #790].
(Bitbake rev: 115b89fa279b64e79da0f72caf7b30965a83fab1)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 79 |
1 files changed, 70 insertions, 9 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index cd32dd4ca4..67f0805cbb 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -709,26 +709,87 @@ class BBCooker: | |||
709 | """Handle collections""" | 709 | """Handle collections""" |
710 | self.status.bbfile_config_priorities = [] | 710 | self.status.bbfile_config_priorities = [] |
711 | if collections: | 711 | if collections: |
712 | collection_priorities = {} | ||
713 | collection_depends = {} | ||
712 | collection_list = collections.split() | 714 | collection_list = collections.split() |
715 | min_prio = 0 | ||
713 | for c in collection_list: | 716 | for c in collection_list: |
717 | # Get collection priority if defined explicitly | ||
718 | priority = bb.data.getVar("BBFILE_PRIORITY_%s" % c, self.configuration.data, 1) | ||
719 | if priority: | ||
720 | try: | ||
721 | prio = int(priority) | ||
722 | except ValueError: | ||
723 | parselog.error("invalid value for BBFILE_PRIORITY_%s: \"%s\"", c, priority) | ||
724 | if min_prio == 0 or prio < min_prio: | ||
725 | min_prio = prio | ||
726 | collection_priorities[c] = prio | ||
727 | else: | ||
728 | collection_priorities[c] = None | ||
729 | |||
730 | # Check dependencies and store information for priority calculation | ||
731 | deps = bb.data.getVar("LAYERDEPENDS_%s" % c, self.configuration.data, 1) | ||
732 | if deps: | ||
733 | depnamelist = [] | ||
734 | deplist = deps.split() | ||
735 | for dep in deplist: | ||
736 | depsplit = dep.split(':') | ||
737 | if len(depsplit) > 1: | ||
738 | try: | ||
739 | depver = int(depsplit[1]) | ||
740 | except ValueError: | ||
741 | parselog.error("invalid version value in LAYERDEPENDS_%s: \"%s\"", c, dep) | ||
742 | continue | ||
743 | else: | ||
744 | depver = None | ||
745 | dep = depsplit[0] | ||
746 | depnamelist.append(dep) | ||
747 | |||
748 | if dep in collection_list: | ||
749 | if depver: | ||
750 | layerver = bb.data.getVar("LAYERVERSION_%s" % dep, self.configuration.data, 1) | ||
751 | if layerver: | ||
752 | try: | ||
753 | lver = int(layerver) | ||
754 | except ValueError: | ||
755 | parselog.error("invalid value for LAYERVERSION_%s: \"%s\"", c, layerver) | ||
756 | continue | ||
757 | if lver <> depver: | ||
758 | parselog.error("Layer dependency %s of layer %s is at version %d, expected %d", dep, c, lver, depver) | ||
759 | else: | ||
760 | parselog.error("Layer dependency %s of layer %s has no version, expected %d", dep, c, depver) | ||
761 | else: | ||
762 | parselog.error("Layer dependency %s of layer %s not found", dep, c) | ||
763 | collection_depends[c] = depnamelist | ||
764 | else: | ||
765 | collection_depends[c] = [] | ||
766 | |||
767 | # Recursively work out collection priorities based on dependencies | ||
768 | def calc_layer_priority(collection): | ||
769 | if not collection_priorities[collection]: | ||
770 | max_depprio = min_prio | ||
771 | for dep in collection_depends[collection]: | ||
772 | calc_layer_priority(dep) | ||
773 | depprio = collection_priorities[dep] | ||
774 | if depprio > max_depprio: | ||
775 | max_depprio = depprio | ||
776 | max_depprio += 1 | ||
777 | parselog.debug(1, "Calculated priority of layer %s as %d", collection, max_depprio) | ||
778 | collection_priorities[collection] = max_depprio | ||
779 | |||
780 | # Calculate all layer priorities using calc_layer_priority and store in bbfile_config_priorities | ||
781 | for c in collection_list: | ||
782 | calc_layer_priority(c) | ||
714 | regex = bb.data.getVar("BBFILE_PATTERN_%s" % c, self.configuration.data, 1) | 783 | regex = bb.data.getVar("BBFILE_PATTERN_%s" % c, self.configuration.data, 1) |
715 | if regex == None: | 784 | if regex == None: |
716 | parselog.error("BBFILE_PATTERN_%s not defined" % c) | 785 | parselog.error("BBFILE_PATTERN_%s not defined" % c) |
717 | continue | 786 | continue |
718 | priority = bb.data.getVar("BBFILE_PRIORITY_%s" % c, self.configuration.data, 1) | ||
719 | if priority == None: | ||
720 | parselog.error("BBFILE_PRIORITY_%s not defined" % c) | ||
721 | continue | ||
722 | try: | 787 | try: |
723 | cre = re.compile(regex) | 788 | cre = re.compile(regex) |
724 | except re.error: | 789 | except re.error: |
725 | parselog.error("BBFILE_PATTERN_%s \"%s\" is not a valid regular expression", c, regex) | 790 | parselog.error("BBFILE_PATTERN_%s \"%s\" is not a valid regular expression", c, regex) |
726 | continue | 791 | continue |
727 | try: | 792 | self.status.bbfile_config_priorities.append((c, regex, cre, collection_priorities[c])) |
728 | pri = int(priority) | ||
729 | self.status.bbfile_config_priorities.append((c, regex, cre, pri)) | ||
730 | except ValueError: | ||
731 | parselog.error("invalid value for BBFILE_PRIORITY_%s: \"%s\"", c, priority) | ||
732 | 793 | ||
733 | def buildSetVars(self): | 794 | def buildSetVars(self): |
734 | """ | 795 | """ |