summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/cooker.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r--bitbake/lib/bb/cooker.py182
1 files changed, 108 insertions, 74 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index 2406dfe95b..488bc610d2 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -22,11 +22,13 @@
22# with this program; if not, write to the Free Software Foundation, Inc., 22# with this program; if not, write to the Free Software Foundation, Inc.,
23# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 23# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 24
25import sys, os, getopt, glob, copy, os.path, re, time 25from __future__ import print_function
26import sys, os, glob, os.path, re, time
27import sre_constants
28from cStringIO import StringIO
29from contextlib import closing
26import bb 30import bb
27from bb import utils, data, parse, event, cache, providers, taskdata, runqueue 31from bb import utils, data, parse, event, cache, providers, taskdata, command, runqueue
28from bb import command
29import itertools, sre_constants
30 32
31class MultipleMatches(Exception): 33class MultipleMatches(Exception):
32 """ 34 """
@@ -121,11 +123,11 @@ class BBCooker:
121 self.commandlineAction = None 123 self.commandlineAction = None
122 124
123 if 'world' in self.configuration.pkgs_to_build: 125 if 'world' in self.configuration.pkgs_to_build:
124 bb.error("'world' is not a valid target for --environment.") 126 bb.msg.error(bb.msg.domain.Build, "'world' is not a valid target for --environment.")
125 elif len(self.configuration.pkgs_to_build) > 1: 127 elif len(self.configuration.pkgs_to_build) > 1:
126 bb.error("Only one target can be used with the --environment option.") 128 bb.msg.error(bb.msg.domain.Build, "Only one target can be used with the --environment option.")
127 elif self.configuration.buildfile and len(self.configuration.pkgs_to_build) > 0: 129 elif self.configuration.buildfile and len(self.configuration.pkgs_to_build) > 0:
128 bb.error("No target should be used with the --environment and --buildfile options.") 130 bb.msg.error(bb.msg.domain.Build, "No target should be used with the --environment and --buildfile options.")
129 elif len(self.configuration.pkgs_to_build) > 0: 131 elif len(self.configuration.pkgs_to_build) > 0:
130 self.commandlineAction = ["showEnvironmentTarget", self.configuration.pkgs_to_build] 132 self.commandlineAction = ["showEnvironmentTarget", self.configuration.pkgs_to_build]
131 else: 133 else:
@@ -138,21 +140,18 @@ class BBCooker:
138 self.commandlineAction = ["showVersions"] 140 self.commandlineAction = ["showVersions"]
139 elif self.configuration.parse_only: 141 elif self.configuration.parse_only:
140 self.commandlineAction = ["parseFiles"] 142 self.commandlineAction = ["parseFiles"]
141 # FIXME - implement
142 #elif self.configuration.interactive:
143 # self.interactiveMode()
144 elif self.configuration.dot_graph: 143 elif self.configuration.dot_graph:
145 if self.configuration.pkgs_to_build: 144 if self.configuration.pkgs_to_build:
146 self.commandlineAction = ["generateDotGraph", self.configuration.pkgs_to_build, self.configuration.cmd] 145 self.commandlineAction = ["generateDotGraph", self.configuration.pkgs_to_build, self.configuration.cmd]
147 else: 146 else:
148 self.commandlineAction = None 147 self.commandlineAction = None
149 bb.error("Please specify a package name for dependency graph generation.") 148 bb.msg.error(bb.msg.domain.Build, "Please specify a package name for dependency graph generation.")
150 else: 149 else:
151 if self.configuration.pkgs_to_build: 150 if self.configuration.pkgs_to_build:
152 self.commandlineAction = ["buildTargets", self.configuration.pkgs_to_build, self.configuration.cmd] 151 self.commandlineAction = ["buildTargets", self.configuration.pkgs_to_build, self.configuration.cmd]
153 else: 152 else:
154 self.commandlineAction = None 153 self.commandlineAction = None
155 bb.error("Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.") 154 bb.msg.error(bb.msg.domain.Build, "Nothing to do. Use 'bitbake world' to build everything, or run 'bitbake --help' for usage information.")
156 155
157 def runCommands(self, server, data, abort): 156 def runCommands(self, server, data, abort):
158 """ 157 """
@@ -174,14 +173,14 @@ class BBCooker:
174 except bb.build.FuncFailed: 173 except bb.build.FuncFailed:
175 bb.msg.error(bb.msg.domain.Build, "task stack execution failed") 174 bb.msg.error(bb.msg.domain.Build, "task stack execution failed")
176 raise 175 raise
177 except bb.build.EventException, e: 176 except bb.build.EventException as e:
178 event = e.args[1] 177 event = e.args[1]
179 bb.msg.error(bb.msg.domain.Build, "%s event exception, aborting" % bb.event.getName(event)) 178 bb.msg.error(bb.msg.domain.Build, "%s event exception, aborting" % bb.event.getName(event))
180 raise 179 raise
181 180
182 def tryBuild(self, fn, task): 181 def tryBuild(self, fn, task):
183 """ 182 """
184 Build a provider and its dependencies. 183 Build a provider and its dependencies.
185 build_depends is a list of previous build dependencies (not runtime) 184 build_depends is a list of previous build dependencies (not runtime)
186 If build_depends is empty, we're dealing with a runtime depends 185 If build_depends is empty, we're dealing with a runtime depends
187 """ 186 """
@@ -206,7 +205,7 @@ class BBCooker:
206 205
207 # Sort by priority 206 # Sort by priority
208 for pn in pkg_pn: 207 for pn in pkg_pn:
209 (last_ver,last_file,pref_ver,pref_file) = bb.providers.findBestProvider(pn, self.configuration.data, self.status) 208 (last_ver, last_file, pref_ver, pref_file) = bb.providers.findBestProvider(pn, self.configuration.data, self.status)
210 preferred_versions[pn] = (pref_ver, pref_file) 209 preferred_versions[pn] = (pref_ver, pref_file)
211 latest_versions[pn] = (last_ver, last_file) 210 latest_versions[pn] = (last_ver, last_file)
212 211
@@ -260,27 +259,22 @@ class BBCooker:
260 if fn: 259 if fn:
261 try: 260 try:
262 envdata = self.bb_cache.loadDataFull(fn, self.configuration.data) 261 envdata = self.bb_cache.loadDataFull(fn, self.configuration.data)
263 except IOError, e: 262 except IOError as e:
264 bb.msg.error(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e)) 263 bb.msg.error(bb.msg.domain.Parsing, "Unable to read %s: %s" % (fn, e))
265 raise 264 raise
266 except Exception, e: 265 except Exception as e:
267 bb.msg.error(bb.msg.domain.Parsing, "%s" % e) 266 bb.msg.error(bb.msg.domain.Parsing, "%s" % e)
268 raise 267 raise
269 268
270 class dummywrite:
271 def __init__(self):
272 self.writebuf = ""
273 def write(self, output):
274 self.writebuf = self.writebuf + output
275
276 # emit variables and shell functions 269 # emit variables and shell functions
277 try: 270 try:
278 data.update_data(envdata) 271 data.update_data(envdata)
279 wb = dummywrite() 272 with closing(StringIO()) as env:
280 data.emit_env(wb, envdata, True) 273 data.emit_env(env, envdata, True)
281 bb.msg.plain(wb.writebuf) 274 bb.msg.plain(env.getvalue())
282 except Exception, e: 275 except Exception as e:
283 bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e) 276 bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e)
277
284 # emit the metadata which isnt valid shell 278 # emit the metadata which isnt valid shell
285 data.expandKeys(envdata) 279 data.expandKeys(envdata)
286 for e in envdata.keys(): 280 for e in envdata.keys():
@@ -315,7 +309,7 @@ class BBCooker:
315 rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) 309 rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist)
316 rq.prepare_runqueue() 310 rq.prepare_runqueue()
317 311
318 seen_fnids = [] 312 seen_fnids = []
319 depend_tree = {} 313 depend_tree = {}
320 depend_tree["depends"] = {} 314 depend_tree["depends"] = {}
321 depend_tree["tdepends"] = {} 315 depend_tree["tdepends"] = {}
@@ -352,7 +346,7 @@ class BBCooker:
352 346
353 depend_tree["rdepends-pn"][pn] = [] 347 depend_tree["rdepends-pn"][pn] = []
354 for rdep in taskdata.rdepids[fnid]: 348 for rdep in taskdata.rdepids[fnid]:
355 depend_tree["rdepends-pn"][pn].append(taskdata.run_names_index[rdep]) 349 depend_tree["rdepends-pn"][pn].append(taskdata.run_names_index[rdep])
356 350
357 rdepends = self.status.rundeps[fn] 351 rdepends = self.status.rundeps[fn]
358 for package in rdepends: 352 for package in rdepends:
@@ -397,51 +391,51 @@ class BBCooker:
397 391
398 # Prints a flattened form of package-depends below where subpackages of a package are merged into the main pn 392 # Prints a flattened form of package-depends below where subpackages of a package are merged into the main pn
399 depends_file = file('pn-depends.dot', 'w' ) 393 depends_file = file('pn-depends.dot', 'w' )
400 print >> depends_file, "digraph depends {" 394 print("digraph depends {", file=depends_file)
401 for pn in depgraph["pn"]: 395 for pn in depgraph["pn"]:
402 fn = depgraph["pn"][pn]["filename"] 396 fn = depgraph["pn"][pn]["filename"]
403 version = depgraph["pn"][pn]["version"] 397 version = depgraph["pn"][pn]["version"]
404 print >> depends_file, '"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn) 398 print('"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn), file=depends_file)
405 for pn in depgraph["depends"]: 399 for pn in depgraph["depends"]:
406 for depend in depgraph["depends"][pn]: 400 for depend in depgraph["depends"][pn]:
407 print >> depends_file, '"%s" -> "%s"' % (pn, depend) 401 print('"%s" -> "%s"' % (pn, depend), file=depends_file)
408 for pn in depgraph["rdepends-pn"]: 402 for pn in depgraph["rdepends-pn"]:
409 for rdepend in depgraph["rdepends-pn"][pn]: 403 for rdepend in depgraph["rdepends-pn"][pn]:
410 print >> depends_file, '"%s" -> "%s" [style=dashed]' % (pn, rdepend) 404 print('"%s" -> "%s" [style=dashed]' % (pn, rdepend), file=depends_file)
411 print >> depends_file, "}" 405 print("}", file=depends_file)
412 bb.msg.plain("PN dependencies saved to 'pn-depends.dot'") 406 bb.msg.plain("PN dependencies saved to 'pn-depends.dot'")
413 407
414 depends_file = file('package-depends.dot', 'w' ) 408 depends_file = file('package-depends.dot', 'w' )
415 print >> depends_file, "digraph depends {" 409 print("digraph depends {", file=depends_file)
416 for package in depgraph["packages"]: 410 for package in depgraph["packages"]:
417 pn = depgraph["packages"][package]["pn"] 411 pn = depgraph["packages"][package]["pn"]
418 fn = depgraph["packages"][package]["filename"] 412 fn = depgraph["packages"][package]["filename"]
419 version = depgraph["packages"][package]["version"] 413 version = depgraph["packages"][package]["version"]
420 if package == pn: 414 if package == pn:
421 print >> depends_file, '"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn) 415 print('"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn), file=depends_file)
422 else: 416 else:
423 print >> depends_file, '"%s" [label="%s(%s) %s\\n%s"]' % (package, package, pn, version, fn) 417 print('"%s" [label="%s(%s) %s\\n%s"]' % (package, package, pn, version, fn), file=depends_file)
424 for depend in depgraph["depends"][pn]: 418 for depend in depgraph["depends"][pn]:
425 print >> depends_file, '"%s" -> "%s"' % (package, depend) 419 print('"%s" -> "%s"' % (package, depend), file=depends_file)
426 for package in depgraph["rdepends-pkg"]: 420 for package in depgraph["rdepends-pkg"]:
427 for rdepend in depgraph["rdepends-pkg"][package]: 421 for rdepend in depgraph["rdepends-pkg"][package]:
428 print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) 422 print('"%s" -> "%s" [style=dashed]' % (package, rdepend), file=depends_file)
429 for package in depgraph["rrecs-pkg"]: 423 for package in depgraph["rrecs-pkg"]:
430 for rdepend in depgraph["rrecs-pkg"][package]: 424 for rdepend in depgraph["rrecs-pkg"][package]:
431 print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) 425 print('"%s" -> "%s" [style=dashed]' % (package, rdepend), file=depends_file)
432 print >> depends_file, "}" 426 print("}", file=depends_file)
433 bb.msg.plain("Package dependencies saved to 'package-depends.dot'") 427 bb.msg.plain("Package dependencies saved to 'package-depends.dot'")
434 428
435 tdepends_file = file('task-depends.dot', 'w' ) 429 tdepends_file = file('task-depends.dot', 'w' )
436 print >> tdepends_file, "digraph depends {" 430 print("digraph depends {", file=tdepends_file)
437 for task in depgraph["tdepends"]: 431 for task in depgraph["tdepends"]:
438 (pn, taskname) = task.rsplit(".", 1) 432 (pn, taskname) = task.rsplit(".", 1)
439 fn = depgraph["pn"][pn]["filename"] 433 fn = depgraph["pn"][pn]["filename"]
440 version = depgraph["pn"][pn]["version"] 434 version = depgraph["pn"][pn]["version"]
441 print >> tdepends_file, '"%s.%s" [label="%s %s\\n%s\\n%s"]' % (pn, taskname, pn, taskname, version, fn) 435 print('"%s.%s" [label="%s %s\\n%s\\n%s"]' % (pn, taskname, pn, taskname, version, fn), file=tdepends_file)
442 for dep in depgraph["tdepends"][task]: 436 for dep in depgraph["tdepends"][task]:
443 print >> tdepends_file, '"%s" -> "%s"' % (task, dep) 437 print('"%s" -> "%s"' % (task, dep), file=tdepends_file)
444 print >> tdepends_file, "}" 438 print("}", file=tdepends_file)
445 bb.msg.plain("Task dependencies saved to 'task-depends.dot'") 439 bb.msg.plain("Task dependencies saved to 'task-depends.dot'")
446 440
447 def buildDepgraph( self ): 441 def buildDepgraph( self ):
@@ -452,9 +446,12 @@ class BBCooker:
452 bb.data.update_data(localdata) 446 bb.data.update_data(localdata)
453 bb.data.expandKeys(localdata) 447 bb.data.expandKeys(localdata)
454 448
449 matched = set()
455 def calc_bbfile_priority(filename): 450 def calc_bbfile_priority(filename):
456 for (regex, pri) in self.status.bbfile_config_priorities: 451 for _, _, regex, pri in self.status.bbfile_config_priorities:
457 if regex.match(filename): 452 if regex.match(filename):
453 if not regex in matched:
454 matched.add(regex)
458 return pri 455 return pri
459 return 0 456 return 0
460 457
@@ -473,6 +470,11 @@ class BBCooker:
473 for p in self.status.pkg_fn: 470 for p in self.status.pkg_fn:
474 self.status.bbfile_priority[p] = calc_bbfile_priority(p) 471 self.status.bbfile_priority[p] = calc_bbfile_priority(p)
475 472
473 for collection, pattern, regex, _ in self.status.bbfile_config_priorities:
474 if not regex in matched:
475 bb.msg.warn(bb.msg.domain.Provider, "No bb files matched BBFILE_PATTERN_%s '%s'" %
476 (collection, pattern))
477
476 def buildWorldTargetList(self): 478 def buildWorldTargetList(self):
477 """ 479 """
478 Build package list for "bitbake world" 480 Build package list for "bitbake world"
@@ -505,31 +507,57 @@ class BBCooker:
505 """Drop off into a shell""" 507 """Drop off into a shell"""
506 try: 508 try:
507 from bb import shell 509 from bb import shell
508 except ImportError, details: 510 except ImportError as details:
509 bb.msg.fatal(bb.msg.domain.Parsing, "Sorry, shell not available (%s)" % details ) 511 bb.msg.fatal(bb.msg.domain.Parsing, "Sorry, shell not available (%s)" % details )
510 else: 512 else:
511 shell.start( self ) 513 shell.start( self )
512 514
515 def _findLayerConf(self):
516 path = os.getcwd()
517 while path != "/":
518 bblayers = os.path.join(path, "conf", "bblayers.conf")
519 if os.path.exists(bblayers):
520 return bblayers
521
522 path, _ = os.path.split(path)
523
513 def parseConfigurationFiles(self, files): 524 def parseConfigurationFiles(self, files):
514 try: 525 try:
515 data = self.configuration.data 526 data = self.configuration.data
516 for f in files: 527 for f in files:
517 data = bb.parse.handle(f, data) 528 data = bb.parse.handle(f, data)
518 529
519 layerconf = os.path.join(os.getcwd(), "conf", "bblayers.conf") 530 layerconf = self._findLayerConf()
520 if os.path.exists(layerconf): 531 if layerconf:
521 bb.msg.debug(2, bb.msg.domain.Parsing, "Found bblayers.conf (%s)" % layerconf) 532 bb.msg.debug(2, bb.msg.domain.Parsing, "Found bblayers.conf (%s)" % layerconf)
522 data = bb.parse.handle(layerconf, data) 533 data = bb.parse.handle(layerconf, data)
523 534
524 layers = (bb.data.getVar('BBLAYERS', data, True) or "").split() 535 layers = (bb.data.getVar('BBLAYERS', data, True) or "").split()
525 536
537 data = bb.data.createCopy(data)
526 for layer in layers: 538 for layer in layers:
527 bb.msg.debug(2, bb.msg.domain.Parsing, "Adding layer %s" % layer) 539 bb.msg.debug(2, bb.msg.domain.Parsing, "Adding layer %s" % layer)
528 bb.data.setVar('LAYERDIR', layer, data) 540 bb.data.setVar('LAYERDIR', layer, data)
529 data = bb.parse.handle(os.path.join(layer, "conf", "layer.conf"), data) 541 data = bb.parse.handle(os.path.join(layer, "conf", "layer.conf"), data)
530 542
543 # XXX: Hack, relies on the local keys of the datasmart
544 # instance being stored in the 'dict' attribute and makes
545 # assumptions about how variable expansion works, but
546 # there's no better way to force an expansion of a single
547 # variable across the datastore today, and this at least
548 # lets us reference LAYERDIR without having to immediately
549 # eval all our variables that use it.
550 for key in data.dict:
551 if key != "_data":
552 value = data.getVar(key, False)
553 if value and "${LAYERDIR}" in value:
554 data.setVar(key, value.replace("${LAYERDIR}", layer))
555
531 bb.data.delVar('LAYERDIR', data) 556 bb.data.delVar('LAYERDIR', data)
532 557
558 if not data.getVar("BBPATH", True):
559 bb.fatal("The BBPATH variable is not set")
560
533 data = bb.parse.handle(os.path.join("conf", "bitbake.conf"), data) 561 data = bb.parse.handle(os.path.join("conf", "bitbake.conf"), data)
534 562
535 self.configuration.data = data 563 self.configuration.data = data
@@ -541,16 +569,17 @@ class BBCooker:
541 569
542 # Nomally we only register event handlers at the end of parsing .bb files 570 # Nomally we only register event handlers at the end of parsing .bb files
543 # We register any handlers we've found so far here... 571 # We register any handlers we've found so far here...
544 for var in data.getVar('__BBHANDLERS', self.configuration.data) or []: 572 for var in bb.data.getVar('__BBHANDLERS', self.configuration.data) or []:
545 bb.event.register(var,bb.data.getVar(var, self.configuration.data)) 573 bb.event.register(var, bb.data.getVar(var, self.configuration.data))
546 574
547 bb.fetch.fetcher_init(self.configuration.data) 575 bb.fetch.fetcher_init(self.configuration.data)
548 576
549 bb.event.fire(bb.event.ConfigParsed(), self.configuration.data) 577 bb.event.fire(bb.event.ConfigParsed(), self.configuration.data)
550 578
551 except IOError, e: 579
580 except IOError as e:
552 bb.msg.fatal(bb.msg.domain.Parsing, "Error when parsing %s: %s" % (files, str(e))) 581 bb.msg.fatal(bb.msg.domain.Parsing, "Error when parsing %s: %s" % (files, str(e)))
553 except bb.parse.ParseError, details: 582 except bb.parse.ParseError as details:
554 bb.msg.fatal(bb.msg.domain.Parsing, "Unable to parse %s (%s)" % (files, details) ) 583 bb.msg.fatal(bb.msg.domain.Parsing, "Unable to parse %s (%s)" % (files, details) )
555 584
556 def handleCollections( self, collections ): 585 def handleCollections( self, collections ):
@@ -573,7 +602,7 @@ class BBCooker:
573 continue 602 continue
574 try: 603 try:
575 pri = int(priority) 604 pri = int(priority)
576 self.status.bbfile_config_priorities.append((cre, pri)) 605 self.status.bbfile_config_priorities.append((c, regex, cre, pri))
577 except ValueError: 606 except ValueError:
578 bb.msg.error(bb.msg.domain.Parsing, "invalid value for BBFILE_PRIORITY_%s: \"%s\"" % (c, priority)) 607 bb.msg.error(bb.msg.domain.Parsing, "invalid value for BBFILE_PRIORITY_%s: \"%s\"" % (c, priority))
579 608
@@ -582,8 +611,8 @@ class BBCooker:
582 Setup any variables needed before starting a build 611 Setup any variables needed before starting a build
583 """ 612 """
584 if not bb.data.getVar("BUILDNAME", self.configuration.data): 613 if not bb.data.getVar("BUILDNAME", self.configuration.data):
585 bb.data.setVar("BUILDNAME", os.popen('date +%Y%m%d%H%M').readline().strip(), self.configuration.data) 614 bb.data.setVar("BUILDNAME", time.strftime('%Y%m%d%H%M'), self.configuration.data)
586 bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S',time.gmtime()), self.configuration.data) 615 bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S', time.gmtime()), self.configuration.data)
587 616
588 def matchFiles(self, buildfile): 617 def matchFiles(self, buildfile):
589 """ 618 """
@@ -630,13 +659,19 @@ class BBCooker:
630 if (task == None): 659 if (task == None):
631 task = self.configuration.cmd 660 task = self.configuration.cmd
632 661
633 fn = self.matchFile(buildfile) 662 self.bb_cache = bb.cache.init(self)
663 self.status = bb.cache.CacheData()
664
665 (fn, cls) = self.bb_cache.virtualfn2realfn(buildfile)
666 buildfile = self.matchFile(fn)
667 fn = self.bb_cache.realfn2virtual(buildfile, cls)
668
634 self.buildSetVars() 669 self.buildSetVars()
635 670
636 # Load data into the cache for fn and parse the loaded cache data 671 # Load data into the cache for fn and parse the loaded cache data
637 self.bb_cache = bb.cache.init(self) 672 the_data = self.bb_cache.loadDataFull(fn, self.configuration.data)
638 self.status = bb.cache.CacheData() 673 self.bb_cache.setData(fn, buildfile, the_data)
639 self.bb_cache.loadData(fn, self.configuration.data, self.status) 674 self.bb_cache.handle_data(fn, self.status)
640 675
641 # Tweak some variables 676 # Tweak some variables
642 item = self.bb_cache.getVar('PN', fn, True) 677 item = self.bb_cache.getVar('PN', fn, True)
@@ -675,8 +710,8 @@ class BBCooker:
675 failures = 0 710 failures = 0
676 try: 711 try:
677 retval = rq.execute_runqueue() 712 retval = rq.execute_runqueue()
678 except runqueue.TaskFailure, fnids: 713 except runqueue.TaskFailure as exc:
679 for fnid in fnids: 714 for fnid in exc.args:
680 bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) 715 bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid])
681 failures = failures + 1 716 failures = failures + 1
682 retval = False 717 retval = False
@@ -711,8 +746,8 @@ class BBCooker:
711 failures = 0 746 failures = 0
712 try: 747 try:
713 retval = rq.execute_runqueue() 748 retval = rq.execute_runqueue()
714 except runqueue.TaskFailure, fnids: 749 except runqueue.TaskFailure as exc:
715 for fnid in fnids: 750 for fnid in exc.args:
716 bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) 751 bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid])
717 failures = failures + 1 752 failures = failures + 1
718 retval = False 753 retval = False
@@ -769,10 +804,10 @@ class BBCooker:
769 804
770 ignore = bb.data.getVar("ASSUME_PROVIDED", self.configuration.data, 1) or "" 805 ignore = bb.data.getVar("ASSUME_PROVIDED", self.configuration.data, 1) or ""
771 self.status.ignored_dependencies = set(ignore.split()) 806 self.status.ignored_dependencies = set(ignore.split())
772 807
773 for dep in self.configuration.extra_assume_provided: 808 for dep in self.configuration.extra_assume_provided:
774 self.status.ignored_dependencies.add(dep) 809 self.status.ignored_dependencies.add(dep)
775 810
776 self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) ) 811 self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) )
777 812
778 bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files") 813 bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files")
@@ -810,7 +845,7 @@ class BBCooker:
810 for f in contents: 845 for f in contents:
811 (root, ext) = os.path.splitext(f) 846 (root, ext) = os.path.splitext(f)
812 if ext == ".bb": 847 if ext == ".bb":
813 bbfiles.append(os.path.abspath(os.path.join(os.getcwd(),f))) 848 bbfiles.append(os.path.abspath(os.path.join(os.getcwd(), f)))
814 return bbfiles 849 return bbfiles
815 850
816 def find_bbfiles( self, path ): 851 def find_bbfiles( self, path ):
@@ -822,7 +857,7 @@ class BBCooker:
822 for ignored in ('SCCS', 'CVS', '.svn'): 857 for ignored in ('SCCS', 'CVS', '.svn'):
823 if ignored in dirs: 858 if ignored in dirs:
824 dirs.remove(ignored) 859 dirs.remove(ignored)
825 found += [join(dir,f) for f in files if f.endswith('.bb')] 860 found += [join(dir, f) for f in files if f.endswith('.bb')]
826 861
827 return found 862 return found
828 863
@@ -906,9 +941,9 @@ class BBCooker:
906 pout.close() 941 pout.close()
907 else: 942 else:
908 self.server.serve_forever() 943 self.server.serve_forever()
909 944
910 bb.event.fire(CookerExit(), self.configuration.event_data) 945 bb.event.fire(CookerExit(), self.configuration.event_data)
911 946
912class CookerExit(bb.event.Event): 947class CookerExit(bb.event.Event):
913 """ 948 """
914 Notify clients of the Cooker shutdown 949 Notify clients of the Cooker shutdown
@@ -937,9 +972,9 @@ class CookerParser:
937 self.pointer = 0 972 self.pointer = 0
938 973
939 def parse_next(self): 974 def parse_next(self):
975 cooker = self.cooker
940 if self.pointer < len(self.filelist): 976 if self.pointer < len(self.filelist):
941 f = self.filelist[self.pointer] 977 f = self.filelist[self.pointer]
942 cooker = self.cooker
943 978
944 try: 979 try:
945 fromCache, skipped, virtuals = cooker.bb_cache.loadData(f, cooker.configuration.data, cooker.status) 980 fromCache, skipped, virtuals = cooker.bb_cache.loadData(f, cooker.configuration.data, cooker.status)
@@ -951,7 +986,7 @@ class CookerParser:
951 self.skipped += skipped 986 self.skipped += skipped
952 self.virtuals += virtuals 987 self.virtuals += virtuals
953 988
954 except IOError, e: 989 except IOError as e:
955 self.error += 1 990 self.error += 1
956 cooker.bb_cache.remove(f) 991 cooker.bb_cache.remove(f)
957 bb.msg.error(bb.msg.domain.Collection, "opening %s: %s" % (f, e)) 992 bb.msg.error(bb.msg.domain.Collection, "opening %s: %s" % (f, e))
@@ -960,7 +995,7 @@ class CookerParser:
960 cooker.bb_cache.remove(f) 995 cooker.bb_cache.remove(f)
961 cooker.bb_cache.sync() 996 cooker.bb_cache.sync()
962 raise 997 raise
963 except Exception, e: 998 except Exception as e:
964 self.error += 1 999 self.error += 1
965 cooker.bb_cache.remove(f) 1000 cooker.bb_cache.remove(f)
966 bb.msg.error(bb.msg.domain.Collection, "%s while parsing %s" % (e, f)) 1001 bb.msg.error(bb.msg.domain.Collection, "%s while parsing %s" % (e, f))
@@ -978,4 +1013,3 @@ class CookerParser:
978 raise ParsingErrorsFound 1013 raise ParsingErrorsFound
979 return False 1014 return False
980 return True 1015 return True
981