From 4ad6a9e946f7128112f147610aedf69b0432ec0b Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Thu, 13 Mar 2008 22:31:01 +0000 Subject: runqueue.py: Fix problems with recrdeptask handling where some idepends weren't handled correctly --- ChangeLog | 2 ++ lib/bb/runqueue.py | 44 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9fc095f80..94479c000 100644 --- a/ChangeLog +++ b/ChangeLog @@ -119,6 +119,8 @@ Changes in Bitbake 1.9.x: - When handling build target failures make sure idepends are checked and failed where needed. Fixes --continue mode crashes. - Fix -f (force) in conjunction with -b + - Fix problems with recrdeptask handling where some idepends weren't handled + correctly. Changes in Bitbake 1.8.0: - Release 1.7.x as a stable series diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index 7c3ea31cf..94c4d1376 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -337,6 +337,7 @@ class RunQueue: depends = [] runq_build = [] + recursive_tdepends = {} taskData = self.taskData @@ -410,6 +411,38 @@ class RunQueue: dep = taskData.fn_index[depdata] depends.append(taskData.gettask_id(dep, idependtask)) + # Create a list of recursive dependent tasks (from tdepends) and cache + def get_recursive_tdepends(task): + if not task: + return [] + if task in recursive_tdepends: + return recursive_tdepends[task] + rectdepends = [task] + nextdeps = [task] + while len(nextdeps) != 0: + newdeps = [] + for nextdep in nextdeps: + for tdepend in taskData.tasks_tdepends[nextdep]: + if tdepend not in rectdepends: + rectdepends.append(tdepend) + newdeps.append(tdepend) + nextdeps = newdeps + recursive_tdepends[task] = rectdepends + return rectdepends + + # Using the list of tdepends for this task create a list of + # the recursive idepends we have + def get_recursive_idepends(task): + if not task: + return [] + rectdepends = get_recursive_tdepends(task) + + recidepends = [] + for tdepend in rectdepends: + for idepend in taskData.tasks_idepends[tdepend]: + recidepends.append(idepend) + return recidepends + def add_recursive_build(depid, depfnid): """ Add build depends of depid to depends @@ -423,13 +456,11 @@ class RunQueue: depdata = taskData.build_targets[depid][0] if depdata is not None: dep = taskData.fn_index[depdata] - idepends = [] # Need to avoid creating new tasks here taskid = taskData.gettask_id(dep, taskname, False) if taskid is not None: depends.append(taskid) fnid = taskData.tasks_fnid[taskid] - idepends = taskData.tasks_idepends[taskid] #print "Added %s (%s) due to %s" % (taskid, taskData.fn_index[fnid], taskData.fn_index[depfnid]) else: fnid = taskData.getfn_id(dep) @@ -439,7 +470,7 @@ class RunQueue: for nextdepid in taskData.rdepids[fnid]: if nextdepid not in rdep_seen: add_recursive_run(nextdepid, fnid) - for (idependid, idependtask) in idepends: + for (idependid, idependtask) in get_recursive_idepends(taskid): if idependid not in dep_seen: add_recursive_build(idependid, fnid) @@ -456,13 +487,11 @@ class RunQueue: depdata = taskData.run_targets[rdepid][0] if depdata is not None: dep = taskData.fn_index[depdata] - idepends = [] # Need to avoid creating new tasks here taskid = taskData.gettask_id(dep, taskname, False) if taskid is not None: depends.append(taskid) fnid = taskData.tasks_fnid[taskid] - idepends = taskData.tasks_idepends[taskid] #print "Added %s (%s) due to %s" % (taskid, taskData.fn_index[fnid], taskData.fn_index[depfnid]) else: fnid = taskData.getfn_id(dep) @@ -472,7 +501,7 @@ class RunQueue: for nextdepid in taskData.rdepids[fnid]: if nextdepid not in rdep_seen: add_recursive_run(nextdepid, fnid) - for (idependid, idependtask) in idepends: + for (idependid, idependtask) in get_recursive_idepends(taskid): if idependid not in dep_seen: add_recursive_build(idependid, fnid) @@ -489,7 +518,8 @@ class RunQueue: add_recursive_build(depid, fnid) for rdepid in taskData.rdepids[fnid]: add_recursive_run(rdepid, fnid) - for (idependid, idependtask) in idepends: + deptaskid = taskData.gettask_id(fn, taskname, False) + for (idependid, idependtask) in get_recursive_idepends(deptaskid): add_recursive_build(idependid, fnid) # Rmove all self references -- cgit 1.2.3-korg