diff options
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 232 | ||||
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 4 |
2 files changed, 128 insertions, 108 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 5c52d85901..da598c9330 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -89,7 +89,6 @@ class BBCooker: | |||
| 89 | 89 | ||
| 90 | def __init__(self, configuration, server_registration_cb, savedenv={}): | 90 | def __init__(self, configuration, server_registration_cb, savedenv={}): |
| 91 | self.status = None | 91 | self.status = None |
| 92 | self.appendlist = {} | ||
| 93 | self.skiplist = {} | 92 | self.skiplist = {} |
| 94 | 93 | ||
| 95 | self.server_registration_cb = server_registration_cb | 94 | self.server_registration_cb = server_registration_cb |
| @@ -419,7 +418,7 @@ class BBCooker: | |||
| 419 | 418 | ||
| 420 | if fn: | 419 | if fn: |
| 421 | try: | 420 | try: |
| 422 | envdata = bb.cache.Cache.loadDataFull(fn, self.get_file_appends(fn), self.configuration.data) | 421 | envdata = bb.cache.Cache.loadDataFull(fn, self.collection.get_file_appends(fn), self.configuration.data) |
| 423 | except Exception as e: | 422 | except Exception as e: |
| 424 | parselog.exception("Unable to read %s", fn) | 423 | parselog.exception("Unable to read %s", fn) |
| 425 | raise | 424 | raise |
| @@ -698,22 +697,13 @@ class BBCooker: | |||
| 698 | print("}", file=tdepends_file) | 697 | print("}", file=tdepends_file) |
| 699 | logger.info("Task dependencies saved to 'task-depends.dot'") | 698 | logger.info("Task dependencies saved to 'task-depends.dot'") |
| 700 | 699 | ||
| 701 | def calc_bbfile_priority( self, filename, matched = None ): | ||
| 702 | for _, _, regex, pri in self.status.bbfile_config_priorities: | ||
| 703 | if regex.match(filename): | ||
| 704 | if matched != None: | ||
| 705 | if not regex in matched: | ||
| 706 | matched.add(regex) | ||
| 707 | return pri | ||
| 708 | return 0 | ||
| 709 | |||
| 710 | def show_appends_with_no_recipes( self ): | 700 | def show_appends_with_no_recipes( self ): |
| 711 | recipes = set(os.path.basename(f) | 701 | recipes = set(os.path.basename(f) |
| 712 | for f in self.status.pkg_fn.iterkeys()) | 702 | for f in self.status.pkg_fn.iterkeys()) |
| 713 | recipes |= set(os.path.basename(f) | 703 | recipes |= set(os.path.basename(f) |
| 714 | for f in self.skiplist.iterkeys()) | 704 | for f in self.skiplist.iterkeys()) |
| 715 | appended_recipes = self.appendlist.iterkeys() | 705 | appended_recipes = self.collection.appendlist.iterkeys() |
| 716 | appends_without_recipes = [self.appendlist[recipe] | 706 | appends_without_recipes = [self.collection.appendlist[recipe] |
| 717 | for recipe in appended_recipes | 707 | for recipe in appended_recipes |
| 718 | if recipe not in recipes] | 708 | if recipe not in recipes] |
| 719 | if appends_without_recipes: | 709 | if appends_without_recipes: |
| @@ -747,32 +737,8 @@ class BBCooker: | |||
| 747 | providerlog.error("conflicting preferences for %s: both %s and %s specified", providee, provider, self.status.preferred[providee]) | 737 | providerlog.error("conflicting preferences for %s: both %s and %s specified", providee, provider, self.status.preferred[providee]) |
| 748 | self.status.preferred[providee] = provider | 738 | self.status.preferred[providee] = provider |
| 749 | 739 | ||
| 750 | # Calculate priorities for each file | ||
| 751 | matched = set() | ||
| 752 | for p in self.status.pkg_fn: | ||
| 753 | realfn, cls = bb.cache.Cache.virtualfn2realfn(p) | ||
| 754 | self.status.bbfile_priority[p] = self.calc_bbfile_priority(realfn, matched) | ||
| 755 | 740 | ||
| 756 | # Don't show the warning if the BBFILE_PATTERN did match .bbappend files | 741 | self.status.bbfile_priority = self.collection.collection_priorities(self.status.pkg_fn) |
| 757 | unmatched = set() | ||
| 758 | for _, _, regex, pri in self.status.bbfile_config_priorities: | ||
| 759 | if not regex in matched: | ||
| 760 | unmatched.add(regex) | ||
| 761 | |||
| 762 | def findmatch(regex): | ||
| 763 | for bbfile in self.appendlist: | ||
| 764 | for append in self.appendlist[bbfile]: | ||
| 765 | if regex.match(append): | ||
| 766 | return True | ||
| 767 | return False | ||
| 768 | |||
| 769 | for unmatch in unmatched.copy(): | ||
| 770 | if findmatch(unmatch): | ||
| 771 | unmatched.remove(unmatch) | ||
| 772 | |||
| 773 | for collection, pattern, regex, _ in self.status.bbfile_config_priorities: | ||
| 774 | if regex in unmatched: | ||
| 775 | collectlog.warn("No bb files matched BBFILE_PATTERN_%s '%s'" % (collection, pattern)) | ||
| 776 | 742 | ||
| 777 | def findCoreBaseFiles(self, subdir, configfile): | 743 | def findCoreBaseFiles(self, subdir, configfile): |
| 778 | corebase = self.configuration.data.getVar('COREBASE', True) or "" | 744 | corebase = self.configuration.data.getVar('COREBASE', True) or "" |
| @@ -1111,7 +1077,9 @@ class BBCooker: | |||
| 1111 | """ | 1077 | """ |
| 1112 | if bf.startswith("/") or bf.startswith("../"): | 1078 | if bf.startswith("/") or bf.startswith("../"): |
| 1113 | bf = os.path.abspath(bf) | 1079 | bf = os.path.abspath(bf) |
| 1114 | filelist, masked = self.collect_bbfiles() | 1080 | |
| 1081 | self.collection = CookerCollectFiles(self.status.bbfile_config_priorities) | ||
| 1082 | filelist, masked = self.collection.collect_bbfiles(self.configuration.data, self.configuration.event_data) | ||
| 1115 | try: | 1083 | try: |
| 1116 | os.stat(bf) | 1084 | os.stat(bf) |
| 1117 | bf = os.path.abspath(bf) | 1085 | bf = os.path.abspath(bf) |
| @@ -1165,7 +1133,7 @@ class BBCooker: | |||
| 1165 | self.buildSetVars() | 1133 | self.buildSetVars() |
| 1166 | 1134 | ||
| 1167 | self.status = bb.cache.CacheData(self.caches_array) | 1135 | self.status = bb.cache.CacheData(self.caches_array) |
| 1168 | infos = bb.cache.Cache.parse(fn, self.get_file_appends(fn), \ | 1136 | infos = bb.cache.Cache.parse(fn, self.collection.get_file_appends(fn), \ |
| 1169 | self.configuration.data, | 1137 | self.configuration.data, |
| 1170 | self.caches_array) | 1138 | self.caches_array) |
| 1171 | infos = dict(infos) | 1139 | infos = dict(infos) |
| @@ -1332,7 +1300,9 @@ class BBCooker: | |||
| 1332 | for dep in self.configuration.extra_assume_provided: | 1300 | for dep in self.configuration.extra_assume_provided: |
| 1333 | self.status.ignored_dependencies.add(dep) | 1301 | self.status.ignored_dependencies.add(dep) |
| 1334 | 1302 | ||
| 1335 | (filelist, masked) = self.collect_bbfiles() | 1303 | self.collection = CookerCollectFiles(self.status.bbfile_config_priorities) |
| 1304 | (filelist, masked) = self.collection.collect_bbfiles(self.configuration.data, self.configuration.event_data) | ||
| 1305 | |||
| 1336 | self.configuration.data.renameVar("__depends", "__base_depends") | 1306 | self.configuration.data.renameVar("__depends", "__base_depends") |
| 1337 | 1307 | ||
| 1338 | self.parser = CookerParser(self, filelist, masked) | 1308 | self.parser = CookerParser(self, filelist, masked) |
| @@ -1369,7 +1339,87 @@ class BBCooker: | |||
| 1369 | 1339 | ||
| 1370 | return pkgs_to_build | 1340 | return pkgs_to_build |
| 1371 | 1341 | ||
| 1372 | def get_bbfiles( self, path = os.getcwd() ): | 1342 | |
| 1343 | |||
| 1344 | |||
| 1345 | def pre_serve(self): | ||
| 1346 | # Empty the environment. The environment will be populated as | ||
| 1347 | # necessary from the data store. | ||
| 1348 | #bb.utils.empty_environment() | ||
| 1349 | try: | ||
| 1350 | prserv.serv.auto_start(self.configuration.data) | ||
| 1351 | except prserv.serv.PRServiceConfigError: | ||
| 1352 | bb.event.fire(CookerExit(), self.configuration.event_data) | ||
| 1353 | return | ||
| 1354 | |||
| 1355 | def post_serve(self): | ||
| 1356 | prserv.serv.auto_shutdown(self.configuration.data) | ||
| 1357 | bb.event.fire(CookerExit(), self.configuration.event_data) | ||
| 1358 | |||
| 1359 | def shutdown(self): | ||
| 1360 | self.state = state.shutdown | ||
| 1361 | |||
| 1362 | def stop(self): | ||
| 1363 | self.state = state.stop | ||
| 1364 | |||
| 1365 | def reparseFiles(self): | ||
| 1366 | return | ||
| 1367 | |||
| 1368 | def initialize(self): | ||
| 1369 | self.state = state.initial | ||
| 1370 | self.initConfigurationData() | ||
| 1371 | |||
| 1372 | def reset(self): | ||
| 1373 | self.state = state.initial | ||
| 1374 | self.loadConfigurationData() | ||
| 1375 | |||
| 1376 | def server_main(cooker, func, *args): | ||
| 1377 | cooker.pre_serve() | ||
| 1378 | |||
| 1379 | if cooker.configuration.profile: | ||
| 1380 | try: | ||
| 1381 | import cProfile as profile | ||
| 1382 | except: | ||
| 1383 | import profile | ||
| 1384 | prof = profile.Profile() | ||
| 1385 | |||
| 1386 | ret = profile.Profile.runcall(prof, func, *args) | ||
| 1387 | |||
| 1388 | prof.dump_stats("profile.log") | ||
| 1389 | bb.utils.process_profilelog("profile.log") | ||
| 1390 | print("Raw profiling information saved to profile.log and processed statistics to profile.log.processed") | ||
| 1391 | |||
| 1392 | else: | ||
| 1393 | ret = func(*args) | ||
| 1394 | |||
| 1395 | cooker.post_serve() | ||
| 1396 | |||
| 1397 | return ret | ||
| 1398 | |||
| 1399 | class CookerExit(bb.event.Event): | ||
| 1400 | """ | ||
| 1401 | Notify clients of the Cooker shutdown | ||
| 1402 | """ | ||
| 1403 | |||
| 1404 | def __init__(self): | ||
| 1405 | bb.event.Event.__init__(self) | ||
| 1406 | |||
| 1407 | |||
| 1408 | class CookerCollectFiles(object): | ||
| 1409 | def __init__(self, priorities): | ||
| 1410 | self.appendlist = {} | ||
| 1411 | self.bbfile_config_priorities = priorities | ||
| 1412 | |||
| 1413 | def calc_bbfile_priority( self, filename, matched = None ): | ||
| 1414 | for _, _, regex, pri in self.bbfile_config_priorities: | ||
| 1415 | if regex.match(filename): | ||
| 1416 | if matched != None: | ||
| 1417 | if not regex in matched: | ||
| 1418 | matched.add(regex) | ||
| 1419 | return pri | ||
| 1420 | return 0 | ||
| 1421 | |||
| 1422 | def get_bbfiles(self, path = os.getcwd()): | ||
| 1373 | """Get list of default .bb files by reading out the current directory""" | 1423 | """Get list of default .bb files by reading out the current directory""" |
| 1374 | contents = os.listdir(path) | 1424 | contents = os.listdir(path) |
| 1375 | bbfiles = [] | 1425 | bbfiles = [] |
| @@ -1379,7 +1429,7 @@ class BBCooker: | |||
| 1379 | bbfiles.append(os.path.abspath(os.path.join(os.getcwd(), f))) | 1429 | bbfiles.append(os.path.abspath(os.path.join(os.getcwd(), f))) |
| 1380 | return bbfiles | 1430 | return bbfiles |
| 1381 | 1431 | ||
| 1382 | def find_bbfiles( self, path ): | 1432 | def find_bbfiles(self, path): |
| 1383 | """Find all the .bb and .bbappend files in a directory""" | 1433 | """Find all the .bb and .bbappend files in a directory""" |
| 1384 | from os.path import join | 1434 | from os.path import join |
| 1385 | 1435 | ||
| @@ -1392,14 +1442,14 @@ class BBCooker: | |||
| 1392 | 1442 | ||
| 1393 | return found | 1443 | return found |
| 1394 | 1444 | ||
| 1395 | def collect_bbfiles( self ): | 1445 | def collect_bbfiles(self, config, eventdata): |
| 1396 | """Collect all available .bb build files""" | 1446 | """Collect all available .bb build files""" |
| 1397 | masked = 0 | 1447 | masked = 0 |
| 1398 | 1448 | ||
| 1399 | collectlog.debug(1, "collecting .bb files") | 1449 | collectlog.debug(1, "collecting .bb files") |
| 1400 | 1450 | ||
| 1401 | files = (data.getVar( "BBFILES", self.configuration.data, True) or "").split() | 1451 | files = (config.getVar( "BBFILES", True) or "").split() |
| 1402 | data.setVar("BBFILES", " ".join(files), self.configuration.data) | 1452 | config.setVar("BBFILES", " ".join(files)) |
| 1403 | 1453 | ||
| 1404 | # Sort files by priority | 1454 | # Sort files by priority |
| 1405 | files.sort( key=lambda fileitem: self.calc_bbfile_priority(fileitem) ) | 1455 | files.sort( key=lambda fileitem: self.calc_bbfile_priority(fileitem) ) |
| @@ -1409,7 +1459,7 @@ class BBCooker: | |||
| 1409 | 1459 | ||
| 1410 | if not len(files): | 1460 | if not len(files): |
| 1411 | collectlog.error("no recipe files to build, check your BBPATH and BBFILES?") | 1461 | collectlog.error("no recipe files to build, check your BBPATH and BBFILES?") |
| 1412 | bb.event.fire(CookerExit(), self.configuration.event_data) | 1462 | bb.event.fire(CookerExit(), eventdata) |
| 1413 | 1463 | ||
| 1414 | # Can't use set here as order is important | 1464 | # Can't use set here as order is important |
| 1415 | newfiles = [] | 1465 | newfiles = [] |
| @@ -1427,7 +1477,7 @@ class BBCooker: | |||
| 1427 | if g not in newfiles: | 1477 | if g not in newfiles: |
| 1428 | newfiles.append(g) | 1478 | newfiles.append(g) |
| 1429 | 1479 | ||
| 1430 | bbmask = self.configuration.data.getVar('BBMASK', True) | 1480 | bbmask = config.getVar('BBMASK', True) |
| 1431 | 1481 | ||
| 1432 | if bbmask: | 1482 | if bbmask: |
| 1433 | try: | 1483 | try: |
| @@ -1475,74 +1525,44 @@ class BBCooker: | |||
| 1475 | def get_file_appends(self, fn): | 1525 | def get_file_appends(self, fn): |
| 1476 | """ | 1526 | """ |
| 1477 | Returns a list of .bbappend files to apply to fn | 1527 | Returns a list of .bbappend files to apply to fn |
| 1478 | NB: collect_bbfiles() must have been called prior to this | ||
| 1479 | """ | 1528 | """ |
| 1480 | f = os.path.basename(fn) | 1529 | f = os.path.basename(fn) |
| 1481 | if f in self.appendlist: | 1530 | if f in self.appendlist: |
| 1482 | return self.appendlist[f] | 1531 | return self.appendlist[f] |
| 1483 | return [] | 1532 | return [] |
| 1484 | 1533 | ||
| 1485 | def pre_serve(self): | 1534 | def collection_priorities(self, pkgfns): |
| 1486 | # Empty the environment. The environment will be populated as | ||
| 1487 | # necessary from the data store. | ||
| 1488 | #bb.utils.empty_environment() | ||
| 1489 | try: | ||
| 1490 | prserv.serv.auto_start(self.configuration.data) | ||
| 1491 | except prserv.serv.PRServiceConfigError: | ||
| 1492 | bb.event.fire(CookerExit(), self.configuration.event_data) | ||
| 1493 | return | ||
| 1494 | |||
| 1495 | def post_serve(self): | ||
| 1496 | prserv.serv.auto_shutdown(self.configuration.data) | ||
| 1497 | bb.event.fire(CookerExit(), self.configuration.event_data) | ||
| 1498 | |||
| 1499 | def shutdown(self): | ||
| 1500 | self.state = state.shutdown | ||
| 1501 | 1535 | ||
| 1502 | def stop(self): | 1536 | priorities = {} |
| 1503 | self.state = state.stop | ||
| 1504 | |||
| 1505 | def reparseFiles(self): | ||
| 1506 | return | ||
| 1507 | |||
| 1508 | def initialize(self): | ||
| 1509 | self.state = state.initial | ||
| 1510 | self.initConfigurationData() | ||
| 1511 | |||
| 1512 | def reset(self): | ||
| 1513 | self.state = state.initial | ||
| 1514 | self.loadConfigurationData() | ||
| 1515 | 1537 | ||
| 1516 | def server_main(cooker, func, *args): | 1538 | # Calculate priorities for each file |
| 1517 | cooker.pre_serve() | 1539 | matched = set() |
| 1518 | 1540 | for p in pkgfns: | |
| 1519 | if cooker.configuration.profile: | 1541 | realfn, cls = bb.cache.Cache.virtualfn2realfn(p) |
| 1520 | try: | 1542 | priorities[p] = self.calc_bbfile_priority(realfn, matched) |
| 1521 | import cProfile as profile | 1543 | |
| 1522 | except: | 1544 | # Don't show the warning if the BBFILE_PATTERN did match .bbappend files |
| 1523 | import profile | 1545 | unmatched = set() |
| 1524 | prof = profile.Profile() | 1546 | for _, _, regex, pri in self.bbfile_config_priorities: |
| 1525 | 1547 | if not regex in matched: | |
| 1526 | ret = profile.Profile.runcall(prof, func, *args) | 1548 | unmatched.add(regex) |
| 1527 | |||
| 1528 | prof.dump_stats("profile.log") | ||
| 1529 | bb.utils.process_profilelog("profile.log") | ||
| 1530 | print("Raw profiling information saved to profile.log and processed statistics to profile.log.processed") | ||
| 1531 | |||
| 1532 | else: | ||
| 1533 | ret = func(*args) | ||
| 1534 | 1549 | ||
| 1535 | cooker.post_serve() | 1550 | def findmatch(regex): |
| 1551 | for bbfile in self.appendlist: | ||
| 1552 | for append in self.appendlist[bbfile]: | ||
| 1553 | if regex.match(append): | ||
| 1554 | return True | ||
| 1555 | return False | ||
| 1536 | 1556 | ||
| 1537 | return ret | 1557 | for unmatch in unmatched.copy(): |
| 1558 | if findmatch(unmatch): | ||
| 1559 | unmatched.remove(unmatch) | ||
| 1538 | 1560 | ||
| 1539 | class CookerExit(bb.event.Event): | 1561 | for collection, pattern, regex, _ in self.bbfile_config_priorities: |
| 1540 | """ | 1562 | if regex in unmatched: |
| 1541 | Notify clients of the Cooker shutdown | 1563 | collectlog.warn("No bb files matched BBFILE_PATTERN_%s '%s'" % (collection, pattern)) |
| 1542 | """ | ||
| 1543 | 1564 | ||
| 1544 | def __init__(self): | 1565 | return priorities |
| 1545 | bb.event.Event.__init__(self) | ||
| 1546 | 1566 | ||
| 1547 | def catch_parse_error(func): | 1567 | def catch_parse_error(func): |
| 1548 | """Exception handling bits for our parsing""" | 1568 | """Exception handling bits for our parsing""" |
| @@ -1677,7 +1697,7 @@ class CookerParser(object): | |||
| 1677 | self.fromcache = [] | 1697 | self.fromcache = [] |
| 1678 | self.willparse = [] | 1698 | self.willparse = [] |
| 1679 | for filename in self.filelist: | 1699 | for filename in self.filelist: |
| 1680 | appends = self.cooker.get_file_appends(filename) | 1700 | appends = self.cooker.collection.get_file_appends(filename) |
| 1681 | if not self.bb_cache.cacheValid(filename, appends): | 1701 | if not self.bb_cache.cacheValid(filename, appends): |
| 1682 | self.willparse.append((filename, appends, cooker.caches_array)) | 1702 | self.willparse.append((filename, appends, cooker.caches_array)) |
| 1683 | else: | 1703 | else: |
| @@ -1840,7 +1860,7 @@ class CookerParser(object): | |||
| 1840 | 1860 | ||
| 1841 | def reparse(self, filename): | 1861 | def reparse(self, filename): |
| 1842 | infos = self.bb_cache.parse(filename, | 1862 | infos = self.bb_cache.parse(filename, |
| 1843 | self.cooker.get_file_appends(filename), | 1863 | self.cooker.collection.get_file_appends(filename), |
| 1844 | self.cfgdata, self.cooker.caches_array) | 1864 | self.cfgdata, self.cooker.caches_array) |
| 1845 | for vfn, info_array in infos: | 1865 | for vfn, info_array in infos: |
| 1846 | self.cooker.status.add_from_recipeinfo(vfn, info_array) | 1866 | self.cooker.status.add_from_recipeinfo(vfn, info_array) |
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 872bb784d3..e960b4f9da 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -957,7 +957,7 @@ class RunQueue: | |||
| 957 | for task in range(len(self.rqdata.runq_fnid)): | 957 | for task in range(len(self.rqdata.runq_fnid)): |
| 958 | if self.rqdata.runq_fnid[task] not in done: | 958 | if self.rqdata.runq_fnid[task] not in done: |
| 959 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] | 959 | fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[task]] |
| 960 | the_data = bb.cache.Cache.loadDataFull(fn, self.cooker.get_file_appends(fn), self.cooker.configuration.data) | 960 | the_data = bb.cache.Cache.loadDataFull(fn, self.cooker.collection.get_file_appends(fn), self.cooker.configuration.data) |
| 961 | done.add(self.rqdata.runq_fnid[task]) | 961 | done.add(self.rqdata.runq_fnid[task]) |
| 962 | 962 | ||
| 963 | bb.parse.siggen.dump_sigs(self.rqdata.dataCache) | 963 | bb.parse.siggen.dump_sigs(self.rqdata.dataCache) |
| @@ -1123,7 +1123,7 @@ class RunQueueExecute: | |||
| 1123 | bb.parse.siggen.set_taskdata(self.rqdata.hashes, self.rqdata.hash_deps) | 1123 | bb.parse.siggen.set_taskdata(self.rqdata.hashes, self.rqdata.hash_deps) |
| 1124 | ret = 0 | 1124 | ret = 0 |
| 1125 | try: | 1125 | try: |
| 1126 | the_data = bb.cache.Cache.loadDataFull(fn, self.cooker.get_file_appends(fn), self.cooker.configuration.data) | 1126 | the_data = bb.cache.Cache.loadDataFull(fn, self.cooker.collection.get_file_appends(fn), self.cooker.configuration.data) |
| 1127 | the_data.setVar('BB_TASKHASH', self.rqdata.runq_hash[task]) | 1127 | the_data.setVar('BB_TASKHASH', self.rqdata.runq_hash[task]) |
| 1128 | for h in self.rqdata.hashes: | 1128 | for h in self.rqdata.hashes: |
| 1129 | the_data.setVar("BBHASH_%s" % h, self.rqdata.hashes[h]) | 1129 | the_data.setVar("BBHASH_%s" % h, self.rqdata.hashes[h]) |
