diff options
| -rw-r--r-- | bitbake/ChangeLog | 14 | ||||
| -rwxr-xr-x | bitbake/bin/bitbake | 2 | ||||
| -rw-r--r-- | bitbake/lib/bb/__init__.py | 16 | ||||
| -rw-r--r-- | bitbake/lib/bb/build.py | 52 | ||||
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 13 | ||||
| -rw-r--r-- | bitbake/lib/bb/data.py | 7 | ||||
| -rw-r--r-- | bitbake/lib/bb/fetch/__init__.py | 39 | ||||
| -rw-r--r-- | bitbake/lib/bb/fetch/svn.py | 9 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/parse_py/BBHandler.py | 18 | ||||
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 30 | ||||
| -rw-r--r-- | bitbake/lib/bb/taskdata.py | 41 |
11 files changed, 159 insertions, 82 deletions
diff --git a/bitbake/ChangeLog b/bitbake/ChangeLog index 878afadb43..7b99a1b054 100644 --- a/bitbake/ChangeLog +++ b/bitbake/ChangeLog | |||
| @@ -1,4 +1,6 @@ | |||
| 1 | Changes in Bitbake 1.8.x: | 1 | Changes in BitBake 1.8.x: |
| 2 | |||
| 3 | Changes in Bitbake 1.8.8: | ||
| 2 | - Rewrite svn fetcher to make adding extra operations easier | 4 | - Rewrite svn fetcher to make adding extra operations easier |
| 3 | as part of future SRCDATE="now" fixes | 5 | as part of future SRCDATE="now" fixes |
| 4 | (requires new FETCHCMD_svn definition in bitbake.conf) | 6 | (requires new FETCHCMD_svn definition in bitbake.conf) |
| @@ -25,7 +27,15 @@ Changes in Bitbake 1.8.x: | |||
| 25 | - Fix int(0)/None confusion in runqueue.py which causes random gaps in dependency chains | 27 | - Fix int(0)/None confusion in runqueue.py which causes random gaps in dependency chains |
| 26 | - Fix handling of variables with expansion in the name using _append/_prepend | 28 | - Fix handling of variables with expansion in the name using _append/_prepend |
| 27 | e.g. RRECOMMENDS_${PN}_append_xyz = "abc" | 29 | e.g. RRECOMMENDS_${PN}_append_xyz = "abc" |
| 28 | 30 | - Expand data in addtasks | |
| 31 | - Print the list of missing DEPENDS,RDEPENDS for the "No buildable providers available for required...." | ||
| 32 | error message. | ||
| 33 | - Rework add_task to be more efficient (6% speedup, 7% number of function calls reduction) | ||
| 34 | - Sort digraph output to make builds more reproducible | ||
| 35 | - Split expandKeys into two for loops to benefit from the expand_cache (12% speedup) | ||
| 36 | - runqueue.py: Fix idepends handling to avoid dependency errors | ||
| 37 | - Clear the terminal TOSTOP flag if set (and warn the user) | ||
| 38 | - Fix regression from r653 and make SRCDATE/CVSDATE work for packages again | ||
| 29 | 39 | ||
| 30 | Changes in Bitbake 1.8.6: | 40 | Changes in Bitbake 1.8.6: |
| 31 | - Correctly redirect stdin when forking | 41 | - Correctly redirect stdin when forking |
diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index 8b69a0a33f..53185e58c6 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake | |||
| @@ -27,7 +27,7 @@ sys.path.insert(0,os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'l | |||
| 27 | import bb | 27 | import bb |
| 28 | from bb import cooker | 28 | from bb import cooker |
| 29 | 29 | ||
| 30 | __version__ = "1.8.7" | 30 | __version__ = "1.8.9" |
| 31 | 31 | ||
| 32 | #============================================================================# | 32 | #============================================================================# |
| 33 | # BBOptions | 33 | # BBOptions |
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index 585eec8875..77b1255c77 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | # with this program; if not, write to the Free Software Foundation, Inc., | 21 | # with this program; if not, write to the Free Software Foundation, Inc., |
| 22 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 22 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| 23 | 23 | ||
| 24 | __version__ = "1.8.7" | 24 | __version__ = "1.8.9" |
| 25 | 25 | ||
| 26 | __all__ = [ | 26 | __all__ = [ |
| 27 | 27 | ||
| @@ -1124,7 +1124,12 @@ class digraph: | |||
| 1124 | 1124 | ||
| 1125 | def allnodes(self): | 1125 | def allnodes(self): |
| 1126 | "returns all nodes in the dictionary" | 1126 | "returns all nodes in the dictionary" |
| 1127 | return self.dict.keys() | 1127 | keys = self.dict.keys() |
| 1128 | ret = [] | ||
| 1129 | for key in keys: | ||
| 1130 | ret.append(key) | ||
| 1131 | ret.sort() | ||
| 1132 | return ret | ||
| 1128 | 1133 | ||
| 1129 | def firstzero(self): | 1134 | def firstzero(self): |
| 1130 | "returns first node with zero references, or NULL if no such node exists" | 1135 | "returns first node with zero references, or NULL if no such node exists" |
| @@ -1168,7 +1173,12 @@ class digraph: | |||
| 1168 | def getparents(self, item): | 1173 | def getparents(self, item): |
| 1169 | if not self.hasnode(item): | 1174 | if not self.hasnode(item): |
| 1170 | return [] | 1175 | return [] |
| 1171 | return self.dict[item][1] | 1176 | parents = self.dict[item][1] |
| 1177 | ret = [] | ||
| 1178 | for parent in parents: | ||
| 1179 | ret.append(parent) | ||
| 1180 | ret.sort() | ||
| 1181 | return ret | ||
| 1172 | 1182 | ||
| 1173 | def getchildren(self, item): | 1183 | def getchildren(self, item): |
| 1174 | if not self.hasnode(item): | 1184 | if not self.hasnode(item): |
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index bcbc55eea5..e9a6fc8c61 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py | |||
| @@ -397,35 +397,41 @@ def del_stamp(task, d, file_name = None): | |||
| 397 | """ | 397 | """ |
| 398 | stamp_internal(task, d, file_name) | 398 | stamp_internal(task, d, file_name) |
| 399 | 399 | ||
| 400 | def add_task(task, deps, d): | 400 | def add_tasks(tasklist, d): |
| 401 | task_graph = data.getVar('_task_graph', d) | 401 | task_graph = data.getVar('_task_graph', d) |
| 402 | task_deps = data.getVar('_task_deps', d) | ||
| 402 | if not task_graph: | 403 | if not task_graph: |
| 403 | task_graph = bb.digraph() | 404 | task_graph = bb.digraph() |
| 404 | data.setVarFlag(task, 'task', 1, d) | ||
| 405 | task_graph.addnode(task, None) | ||
| 406 | for dep in deps: | ||
| 407 | if not task_graph.hasnode(dep): | ||
| 408 | task_graph.addnode(dep, None) | ||
| 409 | task_graph.addnode(task, dep) | ||
| 410 | # don't assume holding a reference | ||
| 411 | data.setVar('_task_graph', task_graph, d) | ||
| 412 | |||
| 413 | task_deps = data.getVar('_task_deps', d) | ||
| 414 | if not task_deps: | 405 | if not task_deps: |
| 415 | task_deps = {} | 406 | task_deps = {} |
| 416 | def getTask(name): | ||
| 417 | deptask = data.getVarFlag(task, name, d) | ||
| 418 | if deptask: | ||
| 419 | deptask = data.expand(deptask, d) | ||
| 420 | if not name in task_deps: | ||
| 421 | task_deps[name] = {} | ||
| 422 | task_deps[name][task] = deptask | ||
| 423 | getTask('depends') | ||
| 424 | getTask('deptask') | ||
| 425 | getTask('rdeptask') | ||
| 426 | getTask('recrdeptask') | ||
| 427 | getTask('nostamp') | ||
| 428 | 407 | ||
| 408 | for task in tasklist: | ||
| 409 | deps = tasklist[task] | ||
| 410 | task = data.expand(task, d) | ||
| 411 | |||
| 412 | data.setVarFlag(task, 'task', 1, d) | ||
| 413 | task_graph.addnode(task, None) | ||
| 414 | for dep in deps: | ||
| 415 | dep = data.expand(dep, d) | ||
| 416 | if not task_graph.hasnode(dep): | ||
| 417 | task_graph.addnode(dep, None) | ||
| 418 | task_graph.addnode(task, dep) | ||
| 419 | |||
| 420 | flags = data.getVarFlags(task, d) | ||
| 421 | def getTask(name): | ||
| 422 | if name in flags: | ||
| 423 | deptask = data.expand(flags[name], d) | ||
| 424 | if not name in task_deps: | ||
| 425 | task_deps[name] = {} | ||
| 426 | task_deps[name][task] = deptask | ||
| 427 | getTask('depends') | ||
| 428 | getTask('deptask') | ||
| 429 | getTask('rdeptask') | ||
| 430 | getTask('recrdeptask') | ||
| 431 | getTask('nostamp') | ||
| 432 | |||
| 433 | # don't assume holding a reference | ||
| 434 | data.setVar('_task_graph', task_graph, d) | ||
| 429 | data.setVar('_task_deps', task_deps, d) | 435 | data.setVar('_task_deps', task_deps, d) |
| 430 | 436 | ||
| 431 | def remove_task(task, kill, d): | 437 | def remove_task(task, kill, d): |
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 955fbb434c..0eda9eed99 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -73,6 +73,19 @@ class BBCooker: | |||
| 73 | self.configuration.event_data = bb.data.createCopy(self.configuration.data) | 73 | self.configuration.event_data = bb.data.createCopy(self.configuration.data) |
| 74 | bb.data.update_data(self.configuration.event_data) | 74 | bb.data.update_data(self.configuration.event_data) |
| 75 | 75 | ||
| 76 | # | ||
| 77 | # TOSTOP must not be set or our children will hang when they output | ||
| 78 | # | ||
| 79 | fd = sys.stdout.fileno() | ||
| 80 | if os.isatty(fd): | ||
| 81 | import termios | ||
| 82 | tcattr = termios.tcgetattr(fd) | ||
| 83 | if tcattr[3] & termios.TOSTOP: | ||
| 84 | bb.msg.note(1, bb.msg.domain.Build, "The terminal had the TOSTOP bit set, clearing...") | ||
| 85 | tcattr[3] = tcattr[3] & ~termios.TOSTOP | ||
| 86 | termios.tcsetattr(fd, termios.TCSANOW, tcattr) | ||
| 87 | |||
| 88 | |||
| 76 | def tryBuildPackage(self, fn, item, task, the_data, build_depends): | 89 | def tryBuildPackage(self, fn, item, task, the_data, build_depends): |
| 77 | """ | 90 | """ |
| 78 | Build one task of a package, optionally build following task depends | 91 | Build one task of a package, optionally build following task depends |
diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index 21cdde04a8..7ad1acad1c 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py | |||
| @@ -282,6 +282,7 @@ def expandKeys(alterdata, readdata = None): | |||
| 282 | if readdata == None: | 282 | if readdata == None: |
| 283 | readdata = alterdata | 283 | readdata = alterdata |
| 284 | 284 | ||
| 285 | todolist = {} | ||
| 285 | for key in keys(alterdata): | 286 | for key in keys(alterdata): |
| 286 | if not '${' in key: | 287 | if not '${' in key: |
| 287 | continue | 288 | continue |
| @@ -289,7 +290,13 @@ def expandKeys(alterdata, readdata = None): | |||
| 289 | ekey = expand(key, readdata) | 290 | ekey = expand(key, readdata) |
| 290 | if key == ekey: | 291 | if key == ekey: |
| 291 | continue | 292 | continue |
| 293 | todolist[key] = ekey | ||
| 292 | 294 | ||
| 295 | # These two for loops are split for performance to maximise the | ||
| 296 | # usefulness of the expand cache | ||
| 297 | |||
| 298 | for key in todolist: | ||
| 299 | ekey = todolist[key] | ||
| 293 | renameVar(key, ekey, alterdata) | 300 | renameVar(key, ekey, alterdata) |
| 294 | 301 | ||
| 295 | def expandData(alterdata, readdata = None): | 302 | def expandData(alterdata, readdata = None): |
diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py index bbff516ffc..c34405738b 100644 --- a/bitbake/lib/bb/fetch/__init__.py +++ b/bitbake/lib/bb/fetch/__init__.py | |||
| @@ -135,26 +135,27 @@ def go(d): | |||
| 135 | for u in urldata: | 135 | for u in urldata: |
| 136 | ud = urldata[u] | 136 | ud = urldata[u] |
| 137 | m = ud.method | 137 | m = ud.method |
| 138 | if ud.localfile and not m.forcefetch(u, ud, d) and os.path.exists(ud.md5): | 138 | if ud.localfile: |
| 139 | # File already present along with md5 stamp file | 139 | if not m.forcefetch(u, ud, d) and os.path.exists(ud.md5): |
| 140 | # Touch md5 file to show activity | 140 | # File already present along with md5 stamp file |
| 141 | os.utime(ud.md5, None) | 141 | # Touch md5 file to show activity |
| 142 | continue | 142 | os.utime(ud.md5, None) |
| 143 | lf = open(ud.lockfile, "a+") | 143 | continue |
| 144 | fcntl.flock(lf.fileno(), fcntl.LOCK_EX) | 144 | lf = open(ud.lockfile, "a+") |
| 145 | if ud.localfile and not m.forcefetch(u, ud, d) and os.path.exists(ud.md5): | 145 | fcntl.flock(lf.fileno(), fcntl.LOCK_EX) |
| 146 | # If someone else fetched this before we got the lock, | 146 | if not m.forcefetch(u, ud, d) and os.path.exists(ud.md5): |
| 147 | # notice and don't try again | 147 | # If someone else fetched this before we got the lock, |
| 148 | os.utime(ud.md5, None) | 148 | # notice and don't try again |
| 149 | os.utime(ud.md5, None) | ||
| 150 | fcntl.flock(lf.fileno(), fcntl.LOCK_UN) | ||
| 151 | lf.close | ||
| 152 | continue | ||
| 153 | m.go(u, ud, d) | ||
| 154 | if ud.localfile: | ||
| 155 | if not m.forcefetch(u, ud, d): | ||
| 156 | Fetch.write_md5sum(u, ud, d) | ||
| 149 | fcntl.flock(lf.fileno(), fcntl.LOCK_UN) | 157 | fcntl.flock(lf.fileno(), fcntl.LOCK_UN) |
| 150 | lf.close | 158 | lf.close |
| 151 | continue | ||
| 152 | m.go(u, ud, d) | ||
| 153 | if ud.localfile and not m.forcefetch(u, ud, d): | ||
| 154 | Fetch.write_md5sum(u, ud, d) | ||
| 155 | fcntl.flock(lf.fileno(), fcntl.LOCK_UN) | ||
| 156 | lf.close | ||
| 157 | |||
| 158 | 159 | ||
| 159 | def localpaths(d): | 160 | def localpaths(d): |
| 160 | """ | 161 | """ |
| @@ -339,7 +340,7 @@ class Fetch(object): | |||
| 339 | pn = data.getVar("PN", d, 1) | 340 | pn = data.getVar("PN", d, 1) |
| 340 | 341 | ||
| 341 | if pn: | 342 | if pn: |
| 342 | return data.getVar("SRCDATE_%s" % pn, d, 1) or data.getVar("CVSDATE_%s" % pn, d, 1) or data.getVar("DATE", d, 1) | 343 | return data.getVar("SRCDATE_%s" % pn, d, 1) or data.getVar("CVSDATE_%s" % pn, d, 1) or data.getVar("SRCDATE", d, 1) or data.getVar("CVSDATE", d, 1) or data.getVar("DATE", d, 1) |
| 343 | 344 | ||
| 344 | return data.getVar("SRCDATE", d, 1) or data.getVar("CVSDATE", d, 1) or data.getVar("DATE", d, 1) | 345 | return data.getVar("SRCDATE", d, 1) or data.getVar("CVSDATE", d, 1) or data.getVar("DATE", d, 1) |
| 345 | getSRCDate = staticmethod(getSRCDate) | 346 | getSRCDate = staticmethod(getSRCDate) |
diff --git a/bitbake/lib/bb/fetch/svn.py b/bitbake/lib/bb/fetch/svn.py index ca12efe158..af8543ab34 100644 --- a/bitbake/lib/bb/fetch/svn.py +++ b/bitbake/lib/bb/fetch/svn.py | |||
| @@ -74,11 +74,14 @@ class Svn(Fetch): | |||
| 74 | ud.revision = "" | 74 | ud.revision = "" |
| 75 | else: | 75 | else: |
| 76 | rev = data.getVar("SRCREV", d, 0) | 76 | rev = data.getVar("SRCREV", d, 0) |
| 77 | if "get_srcrev" in rev: | 77 | if rev and "get_srcrev" in rev: |
| 78 | ud.revision = self.latest_revision(url, ud, d) | 78 | ud.revision = self.latest_revision(url, ud, d) |
| 79 | else: | 79 | ud.date = "" |
| 80 | elif rev: | ||
| 80 | ud.revision = rev | 81 | ud.revision = rev |
| 81 | ud.date = "" | 82 | ud.date = "" |
| 83 | else: | ||
| 84 | ud.revision = "" | ||
| 82 | 85 | ||
| 83 | ud.localfile = data.expand('%s_%s_%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.path.replace('/', '.'), ud.revision, ud.date), d) | 86 | ud.localfile = data.expand('%s_%s_%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.path.replace('/', '.'), ud.revision, ud.date), d) |
| 84 | 87 | ||
diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py index aaa262d3e2..0f19f9a5d5 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py | |||
| @@ -176,15 +176,23 @@ def handle(fn, d, include = 0): | |||
| 176 | if bb.event.register(var,handler) == bb.event.Registered: | 176 | if bb.event.register(var,handler) == bb.event.Registered: |
| 177 | all_handlers[var] = handler | 177 | all_handlers[var] = handler |
| 178 | 178 | ||
| 179 | tasklist = {} | ||
| 179 | for var in data.getVar('__BBTASKS', d) or []: | 180 | for var in data.getVar('__BBTASKS', d) or []: |
| 181 | if var not in tasklist: | ||
| 182 | tasklist[var] = [] | ||
| 180 | deps = data.getVarFlag(var, 'deps', d) or [] | 183 | deps = data.getVarFlag(var, 'deps', d) or [] |
| 184 | for p in deps: | ||
| 185 | if p not in tasklist[var]: | ||
| 186 | tasklist[var].append(p) | ||
| 187 | |||
| 181 | postdeps = data.getVarFlag(var, 'postdeps', d) or [] | 188 | postdeps = data.getVarFlag(var, 'postdeps', d) or [] |
| 182 | bb.build.add_task(var, deps, d) | ||
| 183 | for p in postdeps: | 189 | for p in postdeps: |
| 184 | pdeps = data.getVarFlag(p, 'deps', d) or [] | 190 | if p not in tasklist: |
| 185 | pdeps.append(var) | 191 | tasklist[p] = [] |
| 186 | data.setVarFlag(p, 'deps', pdeps, d) | 192 | if var not in tasklist[p]: |
| 187 | bb.build.add_task(p, pdeps, d) | 193 | tasklist[p].append(var) |
| 194 | |||
| 195 | bb.build.add_tasks(tasklist, d) | ||
| 188 | 196 | ||
| 189 | # now add the handlers | 197 | # now add the handlers |
| 190 | if not len(all_handlers) == 0: | 198 | if not len(all_handlers) == 0: |
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index c55a58da2b..3dfae219d2 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -137,7 +137,7 @@ class RunQueue: | |||
| 137 | dep = taskData.fn_index[depdata] | 137 | dep = taskData.fn_index[depdata] |
| 138 | depends.append(taskData.gettask_id(dep, idepend.split(":")[1])) | 138 | depends.append(taskData.gettask_id(dep, idepend.split(":")[1])) |
| 139 | 139 | ||
| 140 | def add_recursive_build(depid): | 140 | def add_recursive_build(depid, depfnid): |
| 141 | """ | 141 | """ |
| 142 | Add build depends of depid to depends | 142 | Add build depends of depid to depends |
| 143 | (if we've not see it before) | 143 | (if we've not see it before) |
| @@ -150,26 +150,28 @@ class RunQueue: | |||
| 150 | depdata = taskData.build_targets[depid][0] | 150 | depdata = taskData.build_targets[depid][0] |
| 151 | if depdata is not None: | 151 | if depdata is not None: |
| 152 | dep = taskData.fn_index[depdata] | 152 | dep = taskData.fn_index[depdata] |
| 153 | idepends = [] | ||
| 153 | # Need to avoid creating new tasks here | 154 | # Need to avoid creating new tasks here |
| 154 | taskid = taskData.gettask_id(dep, taskname, False) | 155 | taskid = taskData.gettask_id(dep, taskname, False) |
| 155 | if taskid is not None: | 156 | if taskid is not None: |
| 156 | depends.append(taskid) | 157 | depends.append(taskid) |
| 157 | fnid = taskData.tasks_fnid[taskid] | 158 | fnid = taskData.tasks_fnid[taskid] |
| 159 | idepends = taskData.tasks_idepends[taskid] | ||
| 160 | #print "Added %s (%s) due to %s" % (taskid, taskData.fn_index[fnid], taskData.fn_index[depfnid]) | ||
| 158 | else: | 161 | else: |
| 159 | fnid = taskData.getfn_id(dep) | 162 | fnid = taskData.getfn_id(dep) |
| 160 | for nextdepid in taskData.depids[fnid]: | 163 | for nextdepid in taskData.depids[fnid]: |
| 161 | if nextdepid not in dep_seen: | 164 | if nextdepid not in dep_seen: |
| 162 | add_recursive_build(nextdepid) | 165 | add_recursive_build(nextdepid, fnid) |
| 163 | for nextdepid in taskData.rdepids[fnid]: | 166 | for nextdepid in taskData.rdepids[fnid]: |
| 164 | if nextdepid not in rdep_seen: | 167 | if nextdepid not in rdep_seen: |
| 165 | add_recursive_run(nextdepid) | 168 | add_recursive_run(nextdepid, fnid) |
| 166 | idepends = taskData.tasks_idepends[depid] | ||
| 167 | for idepend in idepends: | 169 | for idepend in idepends: |
| 168 | nextdepid = int(idepend.split(":")[0]) | 170 | nextdepid = int(idepend.split(":")[0]) |
| 169 | if nextdepid not in dep_seen: | 171 | if nextdepid not in dep_seen: |
| 170 | add_recursive_build(nextdepid) | 172 | add_recursive_build(nextdepid, fnid) |
| 171 | 173 | ||
| 172 | def add_recursive_run(rdepid): | 174 | def add_recursive_run(rdepid, depfnid): |
| 173 | """ | 175 | """ |
| 174 | Add runtime depends of rdepid to depends | 176 | Add runtime depends of rdepid to depends |
| 175 | (if we've not see it before) | 177 | (if we've not see it before) |
| @@ -182,24 +184,26 @@ class RunQueue: | |||
| 182 | depdata = taskData.run_targets[rdepid][0] | 184 | depdata = taskData.run_targets[rdepid][0] |
| 183 | if depdata is not None: | 185 | if depdata is not None: |
| 184 | dep = taskData.fn_index[depdata] | 186 | dep = taskData.fn_index[depdata] |
| 187 | idepends = [] | ||
| 185 | # Need to avoid creating new tasks here | 188 | # Need to avoid creating new tasks here |
| 186 | taskid = taskData.gettask_id(dep, taskname, False) | 189 | taskid = taskData.gettask_id(dep, taskname, False) |
| 187 | if taskid is not None: | 190 | if taskid is not None: |
| 188 | depends.append(taskid) | 191 | depends.append(taskid) |
| 189 | fnid = taskData.tasks_fnid[taskid] | 192 | fnid = taskData.tasks_fnid[taskid] |
| 193 | idepends = taskData.tasks_idepends[taskid] | ||
| 194 | #print "Added %s (%s) due to %s" % (taskid, taskData.fn_index[fnid], taskData.fn_index[depfnid]) | ||
| 190 | else: | 195 | else: |
| 191 | fnid = taskData.getfn_id(dep) | 196 | fnid = taskData.getfn_id(dep) |
| 192 | for nextdepid in taskData.depids[fnid]: | 197 | for nextdepid in taskData.depids[fnid]: |
| 193 | if nextdepid not in dep_seen: | 198 | if nextdepid not in dep_seen: |
| 194 | add_recursive_build(nextdepid) | 199 | add_recursive_build(nextdepid, fnid) |
| 195 | for nextdepid in taskData.rdepids[fnid]: | 200 | for nextdepid in taskData.rdepids[fnid]: |
| 196 | if nextdepid not in rdep_seen: | 201 | if nextdepid not in rdep_seen: |
| 197 | add_recursive_run(nextdepid) | 202 | add_recursive_run(nextdepid, fnid) |
| 198 | idepends = taskData.tasks_idepends[rdepid] | ||
| 199 | for idepend in idepends: | 203 | for idepend in idepends: |
| 200 | nextdepid = int(idepend.split(":")[0]) | 204 | nextdepid = int(idepend.split(":")[0]) |
| 201 | if nextdepid not in dep_seen: | 205 | if nextdepid not in dep_seen: |
| 202 | add_recursive_build(nextdepid) | 206 | add_recursive_build(nextdepid, fnid) |
| 203 | 207 | ||
| 204 | 208 | ||
| 205 | # Resolve Recursive Runtime Depends | 209 | # Resolve Recursive Runtime Depends |
| @@ -210,12 +214,12 @@ class RunQueue: | |||
| 210 | rdep_seen = [] | 214 | rdep_seen = [] |
| 211 | idep_seen = [] | 215 | idep_seen = [] |
| 212 | for depid in taskData.depids[fnid]: | 216 | for depid in taskData.depids[fnid]: |
| 213 | add_recursive_build(depid) | 217 | add_recursive_build(depid, fnid) |
| 214 | for rdepid in taskData.rdepids[fnid]: | 218 | for rdepid in taskData.rdepids[fnid]: |
| 215 | add_recursive_run(rdepid) | 219 | add_recursive_run(rdepid, fnid) |
| 216 | for idepend in idepends: | 220 | for idepend in idepends: |
| 217 | depid = int(idepend.split(":")[0]) | 221 | depid = int(idepend.split(":")[0]) |
| 218 | add_recursive_build(depid) | 222 | add_recursive_build(depid, fnid) |
| 219 | 223 | ||
| 220 | #Prune self references | 224 | #Prune self references |
| 221 | if task in depends: | 225 | if task in depends: |
diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py index f448b5b666..902cc140ef 100644 --- a/bitbake/lib/bb/taskdata.py +++ b/bitbake/lib/bb/taskdata.py | |||
| @@ -450,10 +450,12 @@ class TaskData: | |||
| 450 | self.add_runtime_target(fn, item) | 450 | self.add_runtime_target(fn, item) |
| 451 | self.add_tasks(fn, dataCache) | 451 | self.add_tasks(fn, dataCache) |
| 452 | 452 | ||
| 453 | def fail_fnid(self, fnid): | 453 | def fail_fnid(self, fnid, missing_list = []): |
| 454 | """ | 454 | """ |
| 455 | Mark a file as failed (unbuildable) | 455 | Mark a file as failed (unbuildable) |
| 456 | Remove any references from build and runtime provider lists | 456 | Remove any references from build and runtime provider lists |
| 457 | |||
| 458 | missing_list, A list of missing requirements for this target | ||
| 457 | """ | 459 | """ |
| 458 | if fnid in self.failed_fnids: | 460 | if fnid in self.failed_fnids: |
| 459 | return | 461 | return |
| @@ -463,14 +465,14 @@ class TaskData: | |||
| 463 | if fnid in self.build_targets[target]: | 465 | if fnid in self.build_targets[target]: |
| 464 | self.build_targets[target].remove(fnid) | 466 | self.build_targets[target].remove(fnid) |
| 465 | if len(self.build_targets[target]) == 0: | 467 | if len(self.build_targets[target]) == 0: |
| 466 | self.remove_buildtarget(target) | 468 | self.remove_buildtarget(target, missing_list) |
| 467 | for target in self.run_targets: | 469 | for target in self.run_targets: |
| 468 | if fnid in self.run_targets[target]: | 470 | if fnid in self.run_targets[target]: |
| 469 | self.run_targets[target].remove(fnid) | 471 | self.run_targets[target].remove(fnid) |
| 470 | if len(self.run_targets[target]) == 0: | 472 | if len(self.run_targets[target]) == 0: |
| 471 | self.remove_runtarget(target) | 473 | self.remove_runtarget(target, missing_list) |
| 472 | 474 | ||
| 473 | def remove_buildtarget(self, targetid): | 475 | def remove_buildtarget(self, targetid, missing_list = []): |
| 474 | """ | 476 | """ |
| 475 | Mark a build target as failed (unbuildable) | 477 | Mark a build target as failed (unbuildable) |
| 476 | Trigger removal of any files that have this as a dependency | 478 | Trigger removal of any files that have this as a dependency |
| @@ -479,21 +481,21 @@ class TaskData: | |||
| 479 | self.failed_deps.append(targetid) | 481 | self.failed_deps.append(targetid) |
| 480 | dependees = self.get_dependees(targetid) | 482 | dependees = self.get_dependees(targetid) |
| 481 | for fnid in dependees: | 483 | for fnid in dependees: |
| 482 | self.fail_fnid(fnid) | 484 | self.fail_fnid(fnid, [self.build_names_index[targetid]]+missing_list) |
| 483 | if self.abort and targetid in self.external_targets: | 485 | if self.abort and targetid in self.external_targets: |
| 484 | bb.msg.error(bb.msg.domain.Provider, "No buildable providers available for required build target %s" % self.build_names_index[targetid]) | 486 | bb.msg.error(bb.msg.domain.Provider, "No buildable providers available for required build target %s ('%s')" % (self.build_names_index[targetid], missing_list)) |
| 485 | raise bb.providers.NoProvider | 487 | raise bb.providers.NoProvider |
| 486 | 488 | ||
| 487 | def remove_runtarget(self, targetid): | 489 | def remove_runtarget(self, targetid, missing_list = []): |
| 488 | """ | 490 | """ |
| 489 | Mark a run target as failed (unbuildable) | 491 | Mark a run target as failed (unbuildable) |
| 490 | Trigger removal of any files that have this as a dependency | 492 | Trigger removal of any files that have this as a dependency |
| 491 | """ | 493 | """ |
| 492 | bb.msg.note(1, bb.msg.domain.Provider, "Removing failed runtime build target %s" % self.run_names_index[targetid]) | 494 | bb.msg.note(1, bb.msg.domain.Provider, "Removing failed runtime build target %s ('%s')" % (self.run_names_index[targetid], missing_list)) |
| 493 | self.failed_rdeps.append(targetid) | 495 | self.failed_rdeps.append(targetid) |
| 494 | dependees = self.get_rdependees(targetid) | 496 | dependees = self.get_rdependees(targetid) |
| 495 | for fnid in dependees: | 497 | for fnid in dependees: |
| 496 | self.fail_fnid(fnid) | 498 | self.fail_fnid(fnid, [self.run_names_index[targetid]]+missing_list) |
| 497 | 499 | ||
| 498 | def add_unresolved(self, cfgData, dataCache): | 500 | def add_unresolved(self, cfgData, dataCache): |
| 499 | """ | 501 | """ |
| @@ -529,14 +531,26 @@ class TaskData: | |||
| 529 | """ | 531 | """ |
| 530 | bb.msg.debug(3, bb.msg.domain.TaskData, "build_names:") | 532 | bb.msg.debug(3, bb.msg.domain.TaskData, "build_names:") |
| 531 | bb.msg.debug(3, bb.msg.domain.TaskData, ", ".join(self.build_names_index)) | 533 | bb.msg.debug(3, bb.msg.domain.TaskData, ", ".join(self.build_names_index)) |
| 534 | |||
| 532 | bb.msg.debug(3, bb.msg.domain.TaskData, "run_names:") | 535 | bb.msg.debug(3, bb.msg.domain.TaskData, "run_names:") |
| 533 | bb.msg.debug(3, bb.msg.domain.TaskData, ", ".join(self.run_names_index)) | 536 | bb.msg.debug(3, bb.msg.domain.TaskData, ", ".join(self.run_names_index)) |
| 537 | |||
| 534 | bb.msg.debug(3, bb.msg.domain.TaskData, "build_targets:") | 538 | bb.msg.debug(3, bb.msg.domain.TaskData, "build_targets:") |
| 535 | for target in self.build_targets.keys(): | 539 | for buildid in range(len(self.build_names_index)): |
| 536 | bb.msg.debug(3, bb.msg.domain.TaskData, " %s: %s" % (self.build_names_index[target], self.build_targets[target])) | 540 | target = self.build_names_index[buildid] |
| 541 | targets = "None" | ||
| 542 | if buildid in self.build_targets: | ||
| 543 | targets = self.build_targets[buildid] | ||
| 544 | bb.msg.debug(3, bb.msg.domain.TaskData, " (%s)%s: %s" % (buildid, target, targets)) | ||
| 545 | |||
| 537 | bb.msg.debug(3, bb.msg.domain.TaskData, "run_targets:") | 546 | bb.msg.debug(3, bb.msg.domain.TaskData, "run_targets:") |
| 538 | for target in self.run_targets.keys(): | 547 | for runid in range(len(self.run_names_index)): |
| 539 | bb.msg.debug(3, bb.msg.domain.TaskData, " %s: %s" % (self.run_names_index[target], self.run_targets[target])) | 548 | target = self.run_names_index[runid] |
| 549 | targets = "None" | ||
| 550 | if runid in self.run_targets: | ||
| 551 | targets = self.run_targets[runid] | ||
| 552 | bb.msg.debug(3, bb.msg.domain.TaskData, " (%s)%s: %s" % (runid, target, targets)) | ||
| 553 | |||
| 540 | bb.msg.debug(3, bb.msg.domain.TaskData, "tasks:") | 554 | bb.msg.debug(3, bb.msg.domain.TaskData, "tasks:") |
| 541 | for task in range(len(self.tasks_name)): | 555 | for task in range(len(self.tasks_name)): |
| 542 | bb.msg.debug(3, bb.msg.domain.TaskData, " (%s)%s - %s: %s" % ( | 556 | bb.msg.debug(3, bb.msg.domain.TaskData, " (%s)%s - %s: %s" % ( |
| @@ -544,6 +558,7 @@ class TaskData: | |||
| 544 | self.fn_index[self.tasks_fnid[task]], | 558 | self.fn_index[self.tasks_fnid[task]], |
| 545 | self.tasks_name[task], | 559 | self.tasks_name[task], |
| 546 | self.tasks_tdepends[task])) | 560 | self.tasks_tdepends[task])) |
| 561 | |||
| 547 | bb.msg.debug(3, bb.msg.domain.TaskData, "runtime ids (per fn):") | 562 | bb.msg.debug(3, bb.msg.domain.TaskData, "runtime ids (per fn):") |
| 548 | for fnid in self.rdepids: | 563 | for fnid in self.rdepids: |
| 549 | bb.msg.debug(3, bb.msg.domain.TaskData, " %s %s: %s" % (fnid, self.fn_index[fnid], self.rdepids[fnid])) | 564 | bb.msg.debug(3, bb.msg.domain.TaskData, " %s %s: %s" % (fnid, self.fn_index[fnid], self.rdepids[fnid])) |
