diff options
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 182 |
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 | ||
25 | import sys, os, getopt, glob, copy, os.path, re, time | 25 | from __future__ import print_function |
26 | import sys, os, glob, os.path, re, time | ||
27 | import sre_constants | ||
28 | from cStringIO import StringIO | ||
29 | from contextlib import closing | ||
26 | import bb | 30 | import bb |
27 | from bb import utils, data, parse, event, cache, providers, taskdata, runqueue | 31 | from bb import utils, data, parse, event, cache, providers, taskdata, command, runqueue |
28 | from bb import command | ||
29 | import itertools, sre_constants | ||
30 | 32 | ||
31 | class MultipleMatches(Exception): | 33 | class 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 | ||
912 | class CookerExit(bb.event.Event): | 947 | class 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 | |||