diff options
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 92 |
1 files changed, 51 insertions, 41 deletions
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index b7be102a8a..2543d4ebcc 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -681,49 +681,59 @@ class RunQueueData: | |||
| 681 | # e.g. do_sometask[recrdeptask] = "do_someothertask" | 681 | # e.g. do_sometask[recrdeptask] = "do_someothertask" |
| 682 | # (makes sure sometask runs after someothertask of all DEPENDS, RDEPENDS and intertask dependencies, recursively) | 682 | # (makes sure sometask runs after someothertask of all DEPENDS, RDEPENDS and intertask dependencies, recursively) |
| 683 | # We need to do this separately since we need all of runtaskentries[*].depends to be complete before this is processed | 683 | # We need to do this separately since we need all of runtaskentries[*].depends to be complete before this is processed |
| 684 | self.init_progress_reporter.next_stage(len(recursivetasks)) | 684 | self.init_progress_reporter.next_stage() |
| 685 | extradeps = {} | 685 | extradeps = True |
| 686 | for taskcounter, tid in enumerate(recursivetasks): | 686 | # Loop here since recrdeptasks can depend upon other recrdeptasks and we have to |
| 687 | extradeps[tid] = set(self.runtaskentries[tid].depends) | 687 | # resolve these recursively until we aren't adding any further extra dependencies |
| 688 | 688 | while extradeps: | |
| 689 | tasknames = recursivetasks[tid] | 689 | extradeps = {} |
| 690 | seendeps = set() | 690 | |
| 691 | 691 | for taskcounter, tid in enumerate(recursivetasks): | |
| 692 | def generate_recdeps(t): | 692 | extradeps[tid] = set(self.runtaskentries[tid].depends) |
| 693 | newdeps = set() | 693 | |
| 694 | (mc, fn, taskname, _) = split_tid_mcfn(t) | 694 | tasknames = recursivetasks[tid] |
| 695 | add_resolved_dependencies(mc, fn, tasknames, newdeps) | 695 | seendeps = set() |
| 696 | extradeps[tid].update(newdeps) | 696 | |
| 697 | seendeps.add(t) | 697 | def generate_recdeps(t): |
| 698 | newdeps.add(t) | 698 | newdeps = set() |
| 699 | for i in newdeps: | 699 | (mc, fn, taskname, _) = split_tid_mcfn(t) |
| 700 | if i not in self.runtaskentries: | 700 | add_resolved_dependencies(mc, fn, tasknames, newdeps) |
| 701 | # Not all recipes might have the recrdeptask task as a task | 701 | extradeps[tid].update(newdeps) |
| 702 | continue | 702 | seendeps.add(t) |
| 703 | task = self.runtaskentries[i].task | 703 | newdeps.add(t) |
| 704 | for n in self.runtaskentries[i].depends: | 704 | for i in newdeps: |
| 705 | if n not in seendeps: | 705 | if i not in self.runtaskentries: |
| 706 | generate_recdeps(n) | 706 | # Not all recipes might have the recrdeptask task as a task |
| 707 | generate_recdeps(tid) | 707 | continue |
| 708 | 708 | task = self.runtaskentries[i].task | |
| 709 | if tid in recursiveitasks: | 709 | for n in self.runtaskentries[i].depends: |
| 710 | for dep in recursiveitasks[tid]: | 710 | if n not in seendeps: |
| 711 | generate_recdeps(dep) | 711 | generate_recdeps(n) |
| 712 | self.init_progress_reporter.update(taskcounter) | 712 | generate_recdeps(tid) |
| 713 | 713 | ||
| 714 | # Remove circular references so that do_a[recrdeptask] = "do_a do_b" can work | 714 | if tid in recursiveitasks: |
| 715 | for tid in recursivetasks: | 715 | for dep in recursiveitasks[tid]: |
| 716 | extradeps[tid].difference_update(recursivetasksselfref) | 716 | generate_recdeps(dep) |
| 717 | 717 | ||
| 718 | for tid in self.runtaskentries: | 718 | for tid in self.runtaskentries: |
| 719 | task = self.runtaskentries[tid].task | 719 | task = self.runtaskentries[tid].task |
| 720 | # Add in extra dependencies | 720 | # Add in extra dependencies |
| 721 | if tid in extradeps: | 721 | if tid in extradeps: |
| 722 | self.runtaskentries[tid].depends = extradeps[tid] | 722 | extradeps[tid].difference_update(self.runtaskentries[tid].depends) |
| 723 | # Remove all self references | 723 | self.runtaskentries[tid].depends.update(extradeps[tid]) |
| 724 | if tid in self.runtaskentries[tid].depends: | 724 | # Remove circular references so that do_a[recrdeptask] = "do_a do_b" can work |
| 725 | logger.debug(2, "Task %s contains self reference!", tid) | 725 | self.runtaskentries[tid].depends.difference_update(recursivetasksselfref) |
| 726 | self.runtaskentries[tid].depends.remove(tid) | 726 | extradeps[tid].difference_update(recursivetasksselfref) |
| 727 | if not len(extradeps[tid]): | ||
| 728 | del extradeps[tid] | ||
| 729 | if tid not in recursivetasks: | ||
| 730 | bb.warn(tid) | ||
| 731 | # Remove all self references | ||
| 732 | if tid in self.runtaskentries[tid].depends: | ||
| 733 | logger.debug(2, "Task %s contains self reference!", tid) | ||
| 734 | self.runtaskentries[tid].depends.remove(tid) | ||
| 735 | |||
| 736 | bb.debug(1, "Added %s recursive dependencies in this loop" % len(extradeps)) | ||
| 727 | 737 | ||
| 728 | self.init_progress_reporter.next_stage() | 738 | self.init_progress_reporter.next_stage() |
| 729 | 739 | ||
