diff options
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 318 |
1 files changed, 153 insertions, 165 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 8a9c588633..4b2a906133 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -31,29 +31,6 @@ import itertools | |||
31 | parsespin = itertools.cycle( r'|/-\\' ) | 31 | parsespin = itertools.cycle( r'|/-\\' ) |
32 | 32 | ||
33 | #============================================================================# | 33 | #============================================================================# |
34 | # BBStatistics | ||
35 | #============================================================================# | ||
36 | class BBStatistics: | ||
37 | """ | ||
38 | Manage build statistics for one run | ||
39 | """ | ||
40 | def __init__(self ): | ||
41 | self.attempt = 0 | ||
42 | self.success = 0 | ||
43 | self.fail = 0 | ||
44 | self.deps = 0 | ||
45 | |||
46 | def show( self ): | ||
47 | print "Build statistics:" | ||
48 | print " Attempted builds: %d" % self.attempt | ||
49 | if self.fail: | ||
50 | print " Failed builds: %d" % self.fail | ||
51 | if self.deps: | ||
52 | print " Dependencies not satisfied: %d" % self.deps | ||
53 | if self.fail or self.deps: return 1 | ||
54 | else: return 0 | ||
55 | |||
56 | #============================================================================# | ||
57 | # BBCooker | 34 | # BBCooker |
58 | #============================================================================# | 35 | #============================================================================# |
59 | class BBCooker: | 36 | class BBCooker: |
@@ -61,43 +38,61 @@ class BBCooker: | |||
61 | Manages one bitbake build run | 38 | Manages one bitbake build run |
62 | """ | 39 | """ |
63 | 40 | ||
64 | Statistics = BBStatistics # make it visible from the shell | 41 | def __init__(self, configuration): |
65 | |||
66 | def __init__( self ): | ||
67 | self.build_cache_fail = [] | ||
68 | self.build_cache = [] | ||
69 | self.stats = BBStatistics() | ||
70 | self.status = None | 42 | self.status = None |
71 | 43 | ||
72 | self.cache = None | 44 | self.cache = None |
73 | self.bb_cache = None | 45 | self.bb_cache = None |
74 | 46 | ||
47 | self.configuration = configuration | ||
48 | |||
49 | if self.configuration.verbose: | ||
50 | bb.msg.set_verbose(True) | ||
51 | |||
52 | if self.configuration.debug: | ||
53 | bb.msg.set_debug_level(self.configuration.debug) | ||
54 | else: | ||
55 | bb.msg.set_debug_level(0) | ||
56 | |||
57 | if self.configuration.debug_domains: | ||
58 | bb.msg.set_debug_domains(self.configuration.debug_domains) | ||
59 | |||
60 | self.configuration.data = bb.data.init() | ||
61 | |||
62 | for f in self.configuration.file: | ||
63 | self.parseConfigurationFile( f ) | ||
64 | |||
65 | self.parseConfigurationFile( os.path.join( "conf", "bitbake.conf" ) ) | ||
66 | |||
67 | if not self.configuration.cmd: | ||
68 | self.configuration.cmd = bb.data.getVar("BB_DEFAULT_TASK", self.configuration.data) or "build" | ||
69 | |||
70 | # | ||
71 | # Special updated configuration we use for firing events | ||
72 | # | ||
73 | self.configuration.event_data = bb.data.createCopy(self.configuration.data) | ||
74 | bb.data.update_data(self.configuration.event_data) | ||
75 | |||
75 | def tryBuildPackage(self, fn, item, task, the_data, build_depends): | 76 | def tryBuildPackage(self, fn, item, task, the_data, build_depends): |
76 | """ | 77 | """ |
77 | Build one task of a package, optionally build following task depends | 78 | Build one task of a package, optionally build following task depends |
78 | """ | 79 | """ |
79 | bb.event.fire(bb.event.PkgStarted(item, the_data)) | 80 | bb.event.fire(bb.event.PkgStarted(item, the_data)) |
80 | try: | 81 | try: |
81 | self.stats.attempt += 1 | ||
82 | if not build_depends: | 82 | if not build_depends: |
83 | bb.data.setVarFlag('do_%s' % task, 'dontrundeps', 1, the_data) | 83 | bb.data.setVarFlag('do_%s' % task, 'dontrundeps', 1, the_data) |
84 | if not self.configuration.dry_run: | 84 | if not self.configuration.dry_run: |
85 | bb.build.exec_task('do_%s' % task, the_data) | 85 | bb.build.exec_task('do_%s' % task, the_data) |
86 | bb.event.fire(bb.event.PkgSucceeded(item, the_data)) | 86 | bb.event.fire(bb.event.PkgSucceeded(item, the_data)) |
87 | self.build_cache.append(fn) | ||
88 | return True | 87 | return True |
89 | except bb.build.FuncFailed: | 88 | except bb.build.FuncFailed: |
90 | self.stats.fail += 1 | ||
91 | bb.msg.error(bb.msg.domain.Build, "task stack execution failed") | 89 | bb.msg.error(bb.msg.domain.Build, "task stack execution failed") |
92 | bb.event.fire(bb.event.PkgFailed(item, the_data)) | 90 | bb.event.fire(bb.event.PkgFailed(item, the_data)) |
93 | self.build_cache_fail.append(fn) | ||
94 | raise | 91 | raise |
95 | except bb.build.EventException, e: | 92 | except bb.build.EventException, e: |
96 | self.stats.fail += 1 | ||
97 | event = e.args[1] | 93 | event = e.args[1] |
98 | bb.msg.error(bb.msg.domain.Build, "%s event exception, aborting" % bb.event.getName(event)) | 94 | bb.msg.error(bb.msg.domain.Build, "%s event exception, aborting" % bb.event.getName(event)) |
99 | bb.event.fire(bb.event.PkgFailed(item, the_data)) | 95 | bb.event.fire(bb.event.PkgFailed(item, the_data)) |
100 | self.build_cache_fail.append(fn) | ||
101 | raise | 96 | raise |
102 | 97 | ||
103 | def tryBuild( self, fn, build_depends): | 98 | def tryBuild( self, fn, build_depends): |
@@ -112,12 +107,11 @@ class BBCooker: | |||
112 | item = self.status.pkg_fn[fn] | 107 | item = self.status.pkg_fn[fn] |
113 | 108 | ||
114 | if bb.build.stamp_is_current('do_%s' % self.configuration.cmd, the_data): | 109 | if bb.build.stamp_is_current('do_%s' % self.configuration.cmd, the_data): |
115 | self.build_cache.append(fn) | ||
116 | return True | 110 | return True |
117 | 111 | ||
118 | return self.tryBuildPackage(fn, item, self.configuration.cmd, the_data, build_depends) | 112 | return self.tryBuildPackage(fn, item, self.configuration.cmd, the_data, build_depends) |
119 | 113 | ||
120 | def showVersions( self ): | 114 | def showVersions(self): |
121 | pkg_pn = self.status.pkg_pn | 115 | pkg_pn = self.status.pkg_pn |
122 | preferred_versions = {} | 116 | preferred_versions = {} |
123 | latest_versions = {} | 117 | latest_versions = {} |
@@ -136,11 +130,11 @@ class BBCooker: | |||
136 | latest = latest_versions[p] | 130 | latest = latest_versions[p] |
137 | 131 | ||
138 | if pref != latest: | 132 | if pref != latest: |
139 | prefstr = pref[0][0] + "-" + pref[0][1] | 133 | prefstr = pref[0][0] + ":" + pref[0][1] + '-' + pref[0][2] |
140 | else: | 134 | else: |
141 | prefstr = "" | 135 | prefstr = "" |
142 | 136 | ||
143 | print "%-30s %20s %20s" % (p, latest[0][0] + "-" + latest[0][1], | 137 | print "%-30s %20s %20s" % (p, latest[0][0] + ":" + latest[0][1] + "-" + latest[0][2], |
144 | prefstr) | 138 | prefstr) |
145 | 139 | ||
146 | 140 | ||
@@ -192,8 +186,8 @@ class BBCooker: | |||
192 | taskdata.add_unresolved(localdata, self.status) | 186 | taskdata.add_unresolved(localdata, self.status) |
193 | except bb.providers.NoProvider: | 187 | except bb.providers.NoProvider: |
194 | sys.exit(1) | 188 | sys.exit(1) |
195 | rq = bb.runqueue.RunQueue() | 189 | rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) |
196 | rq.prepare_runqueue(self, self.configuration.data, self.status, taskdata, runlist) | 190 | rq.prepare_runqueue() |
197 | 191 | ||
198 | seen_fnids = [] | 192 | seen_fnids = [] |
199 | depends_file = file('depends.dot', 'w' ) | 193 | depends_file = file('depends.dot', 'w' ) |
@@ -371,98 +365,138 @@ class BBCooker: | |||
371 | except ValueError: | 365 | except ValueError: |
372 | bb.msg.error(bb.msg.domain.Parsing, "invalid value for BBFILE_PRIORITY_%s: \"%s\"" % (c, priority)) | 366 | bb.msg.error(bb.msg.domain.Parsing, "invalid value for BBFILE_PRIORITY_%s: \"%s\"" % (c, priority)) |
373 | 367 | ||
368 | def buildSetVars(self): | ||
369 | """ | ||
370 | Setup any variables needed before starting a build | ||
371 | """ | ||
372 | if not bb.data.getVar("BUILDNAME", self.configuration.data): | ||
373 | bb.data.setVar("BUILDNAME", os.popen('date +%Y%m%d%H%M').readline().strip(), self.configuration.data) | ||
374 | bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S',time.gmtime()),self.configuration.data) | ||
374 | 375 | ||
375 | def cook(self, configuration): | 376 | def buildFile(self, buildfile): |
376 | """ | 377 | """ |
377 | We are building stuff here. We do the building | 378 | Build the file matching regexp buildfile |
378 | from here. By default we try to execute task | ||
379 | build. | ||
380 | """ | 379 | """ |
381 | 380 | ||
382 | self.configuration = configuration | 381 | bf = os.path.abspath(buildfile) |
382 | try: | ||
383 | os.stat(bf) | ||
384 | except OSError: | ||
385 | (filelist, masked) = self.collect_bbfiles() | ||
386 | regexp = re.compile(buildfile) | ||
387 | matches = [] | ||
388 | for f in filelist: | ||
389 | if regexp.search(f) and os.path.isfile(f): | ||
390 | bf = f | ||
391 | matches.append(f) | ||
392 | if len(matches) != 1: | ||
393 | bb.msg.error(bb.msg.domain.Parsing, "Unable to match %s (%s matches found):" % (buildfile, len(matches))) | ||
394 | for f in matches: | ||
395 | bb.msg.error(bb.msg.domain.Parsing, " %s" % f) | ||
396 | sys.exit(1) | ||
397 | bf = matches[0] | ||
383 | 398 | ||
384 | if self.configuration.verbose: | 399 | bbfile_data = bb.parse.handle(bf, self.configuration.data) |
385 | bb.msg.set_verbose(True) | ||
386 | 400 | ||
387 | if self.configuration.debug: | 401 | # Remove stamp for target if force mode active |
388 | bb.msg.set_debug_level(self.configuration.debug) | 402 | if self.configuration.force: |
403 | bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (self.configuration.cmd, bf)) | ||
404 | bb.build.del_stamp('do_%s' % self.configuration.cmd, bbfile_data) | ||
405 | |||
406 | item = bb.data.getVar('PN', bbfile_data, 1) | ||
407 | try: | ||
408 | self.tryBuildPackage(bf, item, self.configuration.cmd, bbfile_data, True) | ||
409 | except bb.build.EventException: | ||
410 | bb.msg.error(bb.msg.domain.Build, "Build of '%s' failed" % item ) | ||
411 | |||
412 | sys.exit(0) | ||
413 | |||
414 | def buildTargets(self, targets): | ||
415 | """ | ||
416 | Attempt to build the targets specified | ||
417 | """ | ||
418 | |||
419 | buildname = bb.data.getVar("BUILDNAME", self.configuration.data) | ||
420 | bb.event.fire(bb.event.BuildStarted(buildname, targets, self.configuration.event_data)) | ||
421 | |||
422 | localdata = data.createCopy(self.configuration.data) | ||
423 | bb.data.update_data(localdata) | ||
424 | bb.data.expandKeys(localdata) | ||
425 | |||
426 | taskdata = bb.taskdata.TaskData(self.configuration.abort) | ||
427 | |||
428 | runlist = [] | ||
429 | try: | ||
430 | for k in targets: | ||
431 | taskdata.add_provider(localdata, self.status, k) | ||
432 | runlist.append([k, "do_%s" % self.configuration.cmd]) | ||
433 | taskdata.add_unresolved(localdata, self.status) | ||
434 | except bb.providers.NoProvider: | ||
435 | sys.exit(1) | ||
436 | |||
437 | rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist) | ||
438 | rq.prepare_runqueue() | ||
439 | try: | ||
440 | failures = rq.execute_runqueue() | ||
441 | except runqueue.TaskFailure, fnids: | ||
442 | for fnid in fnids: | ||
443 | bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) | ||
444 | sys.exit(1) | ||
445 | bb.event.fire(bb.event.BuildCompleted(buildname, targets, self.configuration.event_data, failures)) | ||
446 | |||
447 | sys.exit(0) | ||
448 | |||
449 | def updateCache(self): | ||
450 | # Import Psyco if available and not disabled | ||
451 | if not self.configuration.disable_psyco: | ||
452 | try: | ||
453 | import psyco | ||
454 | except ImportError: | ||
455 | bb.msg.note(1, bb.msg.domain.Collection, "Psyco JIT Compiler (http://psyco.sf.net) not available. Install it to increase performance.") | ||
456 | else: | ||
457 | psyco.bind( self.parse_bbfiles ) | ||
389 | else: | 458 | else: |
390 | bb.msg.set_debug_level(0) | 459 | bb.msg.note(1, bb.msg.domain.Collection, "You have disabled Psyco. This decreases performance.") |
391 | 460 | ||
392 | if self.configuration.debug_domains: | 461 | self.status = bb.cache.CacheData() |
393 | bb.msg.set_debug_domains(self.configuration.debug_domains) | ||
394 | 462 | ||
395 | self.configuration.data = bb.data.init() | 463 | ignore = bb.data.getVar("ASSUME_PROVIDED", self.configuration.data, 1) or "" |
464 | self.status.ignored_dependencies = Set( ignore.split() ) | ||
396 | 465 | ||
397 | for f in self.configuration.file: | 466 | self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) ) |
398 | self.parseConfigurationFile( f ) | ||
399 | 467 | ||
400 | self.parseConfigurationFile( os.path.join( "conf", "bitbake.conf" ) ) | 468 | bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files") |
469 | (filelist, masked) = self.collect_bbfiles() | ||
470 | self.parse_bbfiles(filelist, masked, self.myProgressCallback) | ||
471 | bb.msg.debug(1, bb.msg.domain.Collection, "parsing complete") | ||
401 | 472 | ||
402 | if not self.configuration.cmd: | 473 | self.buildDepgraph() |
403 | self.configuration.cmd = bb.data.getVar("BB_DEFAULT_TASK", self.configuration.data) or "build" | ||
404 | 474 | ||
405 | # | 475 | def cook(self): |
406 | # Special updated configuration we use for firing events | 476 | """ |
407 | # | 477 | We are building stuff here. We do the building |
408 | self.configuration.event_data = bb.data.createCopy(self.configuration.data) | 478 | from here. By default we try to execute task |
409 | bb.data.update_data(self.configuration.event_data) | 479 | build. |
480 | """ | ||
410 | 481 | ||
411 | if self.configuration.show_environment: | 482 | if self.configuration.show_environment: |
412 | self.showEnvironment() | 483 | self.showEnvironment() |
413 | sys.exit( 0 ) | 484 | sys.exit( 0 ) |
414 | 485 | ||
415 | # inject custom variables | 486 | self.buildSetVars() |
416 | if not bb.data.getVar("BUILDNAME", self.configuration.data): | ||
417 | bb.data.setVar("BUILDNAME", os.popen('date +%Y%m%d%H%M').readline().strip(), self.configuration.data) | ||
418 | bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S',time.gmtime()),self.configuration.data) | ||
419 | |||
420 | buildname = bb.data.getVar("BUILDNAME", self.configuration.data) | ||
421 | 487 | ||
422 | if self.configuration.interactive: | 488 | if self.configuration.interactive: |
423 | self.interactiveMode() | 489 | self.interactiveMode() |
424 | 490 | ||
425 | if self.configuration.buildfile is not None: | 491 | if self.configuration.buildfile is not None: |
426 | bf = os.path.abspath( self.configuration.buildfile ) | 492 | return self.buildFile(self.configuration.buildfile) |
427 | try: | ||
428 | os.stat(bf) | ||
429 | except OSError: | ||
430 | (filelist, masked) = self.collect_bbfiles() | ||
431 | regexp = re.compile(self.configuration.buildfile) | ||
432 | matches = [] | ||
433 | for f in filelist: | ||
434 | if regexp.search(f) and os.path.isfile(f): | ||
435 | bf = f | ||
436 | matches.append(f) | ||
437 | if len(matches) != 1: | ||
438 | bb.msg.error(bb.msg.domain.Parsing, "Unable to match %s (%s matches found):" % (self.configuration.buildfile, len(matches))) | ||
439 | for f in matches: | ||
440 | bb.msg.error(bb.msg.domain.Parsing, " %s" % f) | ||
441 | sys.exit(1) | ||
442 | bf = matches[0] | ||
443 | |||
444 | bbfile_data = bb.parse.handle(bf, self.configuration.data) | ||
445 | |||
446 | # Remove stamp for target if force mode active | ||
447 | if self.configuration.force: | ||
448 | bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (self.configuration.cmd, bf)) | ||
449 | bb.build.del_stamp('do_%s' % self.configuration.cmd, bbfile_data) | ||
450 | |||
451 | item = bb.data.getVar('PN', bbfile_data, 1) | ||
452 | try: | ||
453 | self.tryBuildPackage(bf, item, self.configuration.cmd, bbfile_data, True) | ||
454 | except bb.build.EventException: | ||
455 | bb.msg.error(bb.msg.domain.Build, "Build of '%s' failed" % item ) | ||
456 | |||
457 | sys.exit( self.stats.show() ) | ||
458 | 493 | ||
459 | # initialise the parsing status now we know we will need deps | 494 | # initialise the parsing status now we know we will need deps |
460 | self.status = bb.cache.CacheData() | 495 | self.updateCache() |
461 | 496 | ||
462 | ignore = bb.data.getVar("ASSUME_PROVIDED", self.configuration.data, 1) or "" | 497 | if self.configuration.parse_only: |
463 | self.status.ignored_dependencies = Set( ignore.split() ) | 498 | bb.msg.note(1, bb.msg.domain.Collection, "Requested parsing .bb files only. Exiting.") |
464 | 499 | return 0 | |
465 | self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) ) | ||
466 | 500 | ||
467 | pkgs_to_build = self.configuration.pkgs_to_build | 501 | pkgs_to_build = self.configuration.pkgs_to_build |
468 | 502 | ||
@@ -475,30 +509,7 @@ class BBCooker: | |||
475 | print "for usage information." | 509 | print "for usage information." |
476 | sys.exit(0) | 510 | sys.exit(0) |
477 | 511 | ||
478 | # Import Psyco if available and not disabled | ||
479 | if not self.configuration.disable_psyco: | ||
480 | try: | ||
481 | import psyco | ||
482 | except ImportError: | ||
483 | bb.msg.note(1, bb.msg.domain.Collection, "Psyco JIT Compiler (http://psyco.sf.net) not available. Install it to increase performance.") | ||
484 | else: | ||
485 | psyco.bind( self.parse_bbfiles ) | ||
486 | else: | ||
487 | bb.msg.note(1, bb.msg.domain.Collection, "You have disabled Psyco. This decreases performance.") | ||
488 | |||
489 | try: | 512 | try: |
490 | bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files") | ||
491 | (filelist, masked) = self.collect_bbfiles() | ||
492 | self.parse_bbfiles(filelist, masked, self.myProgressCallback) | ||
493 | bb.msg.debug(1, bb.msg.domain.Collection, "parsing complete") | ||
494 | |||
495 | if self.configuration.parse_only: | ||
496 | bb.msg.note(1, bb.msg.domain.Collection, "Requested parsing .bb files only. Exiting.") | ||
497 | return | ||
498 | |||
499 | |||
500 | self.buildDepgraph() | ||
501 | |||
502 | if self.configuration.show_versions: | 513 | if self.configuration.show_versions: |
503 | self.showVersions() | 514 | self.showVersions() |
504 | sys.exit( 0 ) | 515 | sys.exit( 0 ) |
@@ -512,34 +523,7 @@ class BBCooker: | |||
512 | self.generateDotGraph( pkgs_to_build, self.configuration.ignored_dot_deps ) | 523 | self.generateDotGraph( pkgs_to_build, self.configuration.ignored_dot_deps ) |
513 | sys.exit( 0 ) | 524 | sys.exit( 0 ) |
514 | 525 | ||
515 | bb.event.fire(bb.event.BuildStarted(buildname, pkgs_to_build, self.configuration.event_data)) | 526 | return self.buildTargets(pkgs_to_build) |
516 | |||
517 | localdata = data.createCopy(self.configuration.data) | ||
518 | bb.data.update_data(localdata) | ||
519 | bb.data.expandKeys(localdata) | ||
520 | |||
521 | taskdata = bb.taskdata.TaskData(self.configuration.abort) | ||
522 | |||
523 | runlist = [] | ||
524 | try: | ||
525 | for k in pkgs_to_build: | ||
526 | taskdata.add_provider(localdata, self.status, k) | ||
527 | runlist.append([k, "do_%s" % self.configuration.cmd]) | ||
528 | taskdata.add_unresolved(localdata, self.status) | ||
529 | except bb.providers.NoProvider: | ||
530 | sys.exit(1) | ||
531 | |||
532 | rq = bb.runqueue.RunQueue() | ||
533 | rq.prepare_runqueue(self, self.configuration.data, self.status, taskdata, runlist) | ||
534 | try: | ||
535 | failures = rq.execute_runqueue(self, self.configuration.data, self.status, taskdata, runlist) | ||
536 | except runqueue.TaskFailure, fnids: | ||
537 | for fnid in fnids: | ||
538 | bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) | ||
539 | sys.exit(1) | ||
540 | bb.event.fire(bb.event.BuildCompleted(buildname, pkgs_to_build, self.configuration.event_data, failures)) | ||
541 | |||
542 | sys.exit( self.stats.show() ) | ||
543 | 527 | ||
544 | except KeyboardInterrupt: | 528 | except KeyboardInterrupt: |
545 | bb.msg.note(1, bb.msg.domain.Collection, "KeyboardInterrupt - Build not completed.") | 529 | bb.msg.note(1, bb.msg.domain.Collection, "KeyboardInterrupt - Build not completed.") |
@@ -556,13 +540,17 @@ class BBCooker: | |||
556 | return bbfiles | 540 | return bbfiles |
557 | 541 | ||
558 | def find_bbfiles( self, path ): | 542 | def find_bbfiles( self, path ): |
559 | """Find all the .bb files in a directory (uses find)""" | 543 | """Find all the .bb files in a directory""" |
560 | findcmd = 'find ' + path + ' -name *.bb | grep -v SCCS/' | 544 | from os.path import join |
561 | try: | 545 | |
562 | finddata = os.popen(findcmd) | 546 | found = [] |
563 | except OSError: | 547 | for dir, dirs, files in os.walk(path): |
564 | return [] | 548 | for ignored in ('SCCS', 'CVS', '.svn'): |
565 | return finddata.readlines() | 549 | if ignored in dirs: |
550 | dirs.remove(ignored) | ||
551 | found += [join(dir,f) for f in files if f.endswith('.bb')] | ||
552 | |||
553 | return found | ||
566 | 554 | ||
567 | def collect_bbfiles( self ): | 555 | def collect_bbfiles( self ): |
568 | """Collect all available .bb build files""" | 556 | """Collect all available .bb build files""" |