summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard@openedhand.com>2007-08-20 07:48:43 +0000
committerRichard Purdie <richard@openedhand.com>2007-08-20 07:48:43 +0000
commitd8bfa5c6eff1cff34895304a33be671fb141084e (patch)
tree8f63f2cad401f42f5dd30930b0f042aa9c5bdaf8 /bitbake
parente68823a20c6e3b629c947bc7e329e5ea71a9860c (diff)
downloadpoky-d8bfa5c6eff1cff34895304a33be671fb141084e.tar.gz
bitbake: Sync with 1.8.8 release
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@2513 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/ChangeLog14
-rwxr-xr-xbitbake/bin/bitbake2
-rw-r--r--bitbake/lib/bb/__init__.py16
-rw-r--r--bitbake/lib/bb/build.py52
-rw-r--r--bitbake/lib/bb/cooker.py13
-rw-r--r--bitbake/lib/bb/data.py7
-rw-r--r--bitbake/lib/bb/fetch/__init__.py39
-rw-r--r--bitbake/lib/bb/fetch/svn.py9
-rw-r--r--bitbake/lib/bb/parse/parse_py/BBHandler.py18
-rw-r--r--bitbake/lib/bb/runqueue.py30
-rw-r--r--bitbake/lib/bb/taskdata.py41
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 @@
1Changes in Bitbake 1.8.x: 1Changes in BitBake 1.8.x:
2
3Changes 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
30Changes in Bitbake 1.8.6: 40Changes 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
27import bb 27import bb
28from bb import cooker 28from 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
400def add_task(task, deps, d): 400def 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
431def remove_task(task, kill, d): 437def 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
295def expandData(alterdata, readdata = None): 302def 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
159def localpaths(d): 160def 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]))