diff options
| -rwxr-xr-x | bitbake/bin/bitbake-layers | 146 |
1 files changed, 47 insertions, 99 deletions
diff --git a/bitbake/bin/bitbake-layers b/bitbake/bin/bitbake-layers index f4737114d7..fa4e767acc 100755 --- a/bitbake/bin/bitbake-layers +++ b/bitbake/bin/bitbake-layers | |||
| @@ -6,10 +6,22 @@ | |||
| 6 | 6 | ||
| 7 | # Copyright (C) 2011 Mentor Graphics Corporation | 7 | # Copyright (C) 2011 Mentor Graphics Corporation |
| 8 | # Copyright (C) 2012 Intel Corporation | 8 | # Copyright (C) 2012 Intel Corporation |
| 9 | # | ||
| 10 | # This program is free software; you can redistribute it and/or modify | ||
| 11 | # it under the terms of the GNU General Public License version 2 as | ||
| 12 | # published by the Free Software Foundation. | ||
| 13 | # | ||
| 14 | # This program is distributed in the hope that it will be useful, | ||
| 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | # GNU General Public License for more details. | ||
| 18 | # | ||
| 19 | # You should have received a copy of the GNU General Public License along | ||
| 20 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
| 21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
| 9 | 22 | ||
| 10 | import cmd | 23 | import cmd |
| 11 | import logging | 24 | import logging |
| 12 | import warnings | ||
| 13 | import os | 25 | import os |
| 14 | import sys | 26 | import sys |
| 15 | import fnmatch | 27 | import fnmatch |
| @@ -23,26 +35,14 @@ import bb.cache | |||
| 23 | import bb.cooker | 35 | import bb.cooker |
| 24 | import bb.providers | 36 | import bb.providers |
| 25 | import bb.utils | 37 | import bb.utils |
| 26 | from bb.cooker import state | 38 | import bb.tinfoil |
| 27 | import bb.fetch2 | ||
| 28 | 39 | ||
| 29 | 40 | ||
| 30 | logger = logging.getLogger('BitBake') | 41 | logger = logging.getLogger('BitBake') |
| 31 | 42 | ||
| 32 | warnings.filterwarnings("ignore", category=DeprecationWarning) | ||
| 33 | 43 | ||
| 34 | def main(args): | 44 | def main(args): |
| 35 | # Set up logging | 45 | cmds = Commands() |
| 36 | console = logging.StreamHandler(sys.stdout) | ||
| 37 | format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") | ||
| 38 | bb.msg.addDefaultlogFilter(console) | ||
| 39 | console.setFormatter(format) | ||
| 40 | logger.addHandler(console) | ||
| 41 | |||
| 42 | initialenv = os.environ.copy() | ||
| 43 | bb.utils.clean_environment() | ||
| 44 | |||
| 45 | cmds = Commands(initialenv) | ||
| 46 | if args: | 46 | if args: |
| 47 | # Allow user to specify e.g. show-layers instead of show_layers | 47 | # Allow user to specify e.g. show-layers instead of show_layers |
| 48 | args = [args[0].replace('-', '_')] + args[1:] | 48 | args = [args[0].replace('-', '_')] + args[1:] |
| @@ -53,46 +53,11 @@ def main(args): | |||
| 53 | 53 | ||
| 54 | 54 | ||
| 55 | class Commands(cmd.Cmd): | 55 | class Commands(cmd.Cmd): |
| 56 | def __init__(self, initialenv): | 56 | def __init__(self): |
| 57 | cmd.Cmd.__init__(self) | 57 | cmd.Cmd.__init__(self) |
| 58 | self.bbhandler = bb.tinfoil.Tinfoil() | ||
| 58 | self.returncode = 0 | 59 | self.returncode = 0 |
| 59 | self.config = Config(parse_only=True) | 60 | self.bblayers = (self.bbhandler.config_data.getVar('BBLAYERS', True) or "").split() |
| 60 | self.cooker = bb.cooker.BBCooker(self.config, | ||
| 61 | self.register_idle_function, | ||
| 62 | initialenv) | ||
| 63 | self.config_data = self.cooker.configuration.data | ||
| 64 | bb.providers.logger.setLevel(logging.ERROR) | ||
| 65 | self.cooker_data = None | ||
| 66 | self.bblayers = (self.config_data.getVar('BBLAYERS', True) or "").split() | ||
| 67 | |||
| 68 | def register_idle_function(self, function, data): | ||
| 69 | pass | ||
| 70 | |||
| 71 | def prepare_cooker(self): | ||
| 72 | sys.stderr.write("Parsing recipes..") | ||
| 73 | logger.setLevel(logging.WARNING) | ||
| 74 | |||
| 75 | try: | ||
| 76 | while self.cooker.state in (state.initial, state.parsing): | ||
| 77 | self.cooker.updateCache() | ||
| 78 | except KeyboardInterrupt: | ||
| 79 | self.cooker.shutdown() | ||
| 80 | self.cooker.updateCache() | ||
| 81 | sys.exit(2) | ||
| 82 | |||
| 83 | logger.setLevel(logging.INFO) | ||
| 84 | sys.stderr.write("done.\n") | ||
| 85 | |||
| 86 | self.cooker_data = self.cooker.status | ||
| 87 | self.cooker_data.appends = self.cooker.appendlist | ||
| 88 | |||
| 89 | def check_prepare_cooker(self, config_only = False): | ||
| 90 | if not self.cooker_data: | ||
| 91 | if config_only: | ||
| 92 | self.cooker.parseConfiguration() | ||
| 93 | self.cooker_data = self.cooker.status | ||
| 94 | else: | ||
| 95 | self.prepare_cooker() | ||
| 96 | 61 | ||
| 97 | def default(self, line): | 62 | def default(self, line): |
| 98 | """Handle unrecognised commands""" | 63 | """Handle unrecognised commands""" |
| @@ -117,13 +82,13 @@ class Commands(cmd.Cmd): | |||
| 117 | 82 | ||
| 118 | def do_show_layers(self, args): | 83 | def do_show_layers(self, args): |
| 119 | """show current configured layers""" | 84 | """show current configured layers""" |
| 120 | self.check_prepare_cooker(config_only = True) | 85 | self.bbhandler.prepare(config_only = True) |
| 121 | logger.plain("%s %s %s" % ("layer".ljust(20), "path".ljust(40), "priority")) | 86 | logger.plain("%s %s %s" % ("layer".ljust(20), "path".ljust(40), "priority")) |
| 122 | logger.plain('=' * 74) | 87 | logger.plain('=' * 74) |
| 123 | for layerdir in self.bblayers: | 88 | for layerdir in self.bblayers: |
| 124 | layername = self.get_layer_name(layerdir) | 89 | layername = self.get_layer_name(layerdir) |
| 125 | layerpri = 0 | 90 | layerpri = 0 |
| 126 | for layer, _, regex, pri in self.cooker.status.bbfile_config_priorities: | 91 | for layer, _, regex, pri in self.bbhandler.cooker.status.bbfile_config_priorities: |
| 127 | if regex.match(os.path.join(layerdir, 'test')): | 92 | if regex.match(os.path.join(layerdir, 'test')): |
| 128 | layerpri = pri | 93 | layerpri = pri |
| 129 | break | 94 | break |
| @@ -154,7 +119,7 @@ Options: | |||
| 154 | recipes with the ones they overlay indented underneath | 119 | recipes with the ones they overlay indented underneath |
| 155 | -s only list overlayed recipes where the version is the same | 120 | -s only list overlayed recipes where the version is the same |
| 156 | """ | 121 | """ |
| 157 | self.check_prepare_cooker() | 122 | self.bbhandler.prepare() |
| 158 | 123 | ||
| 159 | show_filenames = False | 124 | show_filenames = False |
| 160 | show_same_ver_only = False | 125 | show_same_ver_only = False |
| @@ -186,7 +151,7 @@ Options: | |||
| 186 | # factor - however, each layer.conf is free to either prepend or append to | 151 | # factor - however, each layer.conf is free to either prepend or append to |
| 187 | # BBPATH (or indeed do crazy stuff with it). Thus the order in BBPATH might | 152 | # BBPATH (or indeed do crazy stuff with it). Thus the order in BBPATH might |
| 188 | # not be exactly the order present in bblayers.conf either. | 153 | # not be exactly the order present in bblayers.conf either. |
| 189 | bbpath = str(self.config_data.getVar('BBPATH', True)) | 154 | bbpath = str(self.bbhandler.config_data.getVar('BBPATH', True)) |
| 190 | overlayed_class_found = False | 155 | overlayed_class_found = False |
| 191 | for (classfile, classdirs) in classes.items(): | 156 | for (classfile, classdirs) in classes.items(): |
| 192 | if len(classdirs) > 1: | 157 | if len(classdirs) > 1: |
| @@ -237,7 +202,7 @@ Options: | |||
| 237 | -m only list where multiple recipes (in the same layer or different | 202 | -m only list where multiple recipes (in the same layer or different |
| 238 | layers) exist for the same recipe name | 203 | layers) exist for the same recipe name |
| 239 | """ | 204 | """ |
| 240 | self.check_prepare_cooker() | 205 | self.bbhandler.prepare() |
| 241 | 206 | ||
| 242 | show_filenames = False | 207 | show_filenames = False |
| 243 | show_multi_provider_only = False | 208 | show_multi_provider_only = False |
| @@ -259,15 +224,15 @@ Options: | |||
| 259 | 224 | ||
| 260 | 225 | ||
| 261 | def list_recipes(self, title, pnspec, show_overlayed_only, show_same_ver_only, show_filenames, show_multi_provider_only): | 226 | def list_recipes(self, title, pnspec, show_overlayed_only, show_same_ver_only, show_filenames, show_multi_provider_only): |
| 262 | pkg_pn = self.cooker.status.pkg_pn | 227 | pkg_pn = self.bbhandler.cooker.status.pkg_pn |
| 263 | (latest_versions, preferred_versions) = bb.providers.findProviders(self.cooker.configuration.data, self.cooker.status, pkg_pn) | 228 | (latest_versions, preferred_versions) = bb.providers.findProviders(self.bbhandler.cooker.configuration.data, self.bbhandler.cooker.status, pkg_pn) |
| 264 | allproviders = bb.providers.allProviders(self.cooker.status) | 229 | allproviders = bb.providers.allProviders(self.bbhandler.cooker.status) |
| 265 | 230 | ||
| 266 | # Ensure we list skipped recipes | 231 | # Ensure we list skipped recipes |
| 267 | # We are largely guessing about PN, PV and the preferred version here, | 232 | # We are largely guessing about PN, PV and the preferred version here, |
| 268 | # but we have no choice since skipped recipes are not fully parsed | 233 | # but we have no choice since skipped recipes are not fully parsed |
| 269 | skiplist = self.cooker.skiplist.keys() | 234 | skiplist = self.bbhandler.cooker.skiplist.keys() |
| 270 | skiplist.sort( key=lambda fileitem: self.cooker.calc_bbfile_priority(fileitem) ) | 235 | skiplist.sort( key=lambda fileitem: self.bbhandler.cooker.calc_bbfile_priority(fileitem) ) |
| 271 | skiplist.reverse() | 236 | skiplist.reverse() |
| 272 | for fn in skiplist: | 237 | for fn in skiplist: |
| 273 | recipe_parts = os.path.splitext(os.path.basename(fn))[0].split('_') | 238 | recipe_parts = os.path.splitext(os.path.basename(fn))[0].split('_') |
| @@ -375,7 +340,7 @@ build results (as the layer priority order has effectively changed). | |||
| 375 | logger.error('Directory %s exists and is non-empty, please clear it out first' % outputdir) | 340 | logger.error('Directory %s exists and is non-empty, please clear it out first' % outputdir) |
| 376 | return | 341 | return |
| 377 | 342 | ||
| 378 | self.check_prepare_cooker() | 343 | self.bbhandler.prepare() |
| 379 | layers = self.bblayers | 344 | layers = self.bblayers |
| 380 | if len(arglist) > 2: | 345 | if len(arglist) > 2: |
| 381 | layernames = arglist[:-1] | 346 | layernames = arglist[:-1] |
| @@ -405,8 +370,8 @@ build results (as the layer priority order has effectively changed). | |||
| 405 | appended_recipes = [] | 370 | appended_recipes = [] |
| 406 | for layer in layers: | 371 | for layer in layers: |
| 407 | overlayed = [] | 372 | overlayed = [] |
| 408 | for f in self.cooker.overlayed.iterkeys(): | 373 | for f in self.bbhandler.cooker.overlayed.iterkeys(): |
| 409 | for of in self.cooker.overlayed[f]: | 374 | for of in self.bbhandler.cooker.overlayed[f]: |
| 410 | if of.startswith(layer): | 375 | if of.startswith(layer): |
| 411 | overlayed.append(of) | 376 | overlayed.append(of) |
| 412 | 377 | ||
| @@ -430,8 +395,8 @@ build results (as the layer priority order has effectively changed). | |||
| 430 | logger.warn('Overwriting file %s', fdest) | 395 | logger.warn('Overwriting file %s', fdest) |
| 431 | bb.utils.copyfile(f1full, fdest) | 396 | bb.utils.copyfile(f1full, fdest) |
| 432 | if ext == '.bb': | 397 | if ext == '.bb': |
| 433 | if f1 in self.cooker_data.appends: | 398 | if f1 in self.bbhandler.cooker.appendlist: |
| 434 | appends = self.cooker_data.appends[f1] | 399 | appends = self.bbhandler.cooker.appendlist[f1] |
| 435 | if appends: | 400 | if appends: |
| 436 | logger.plain(' Applying appends to %s' % fdest ) | 401 | logger.plain(' Applying appends to %s' % fdest ) |
| 437 | for appendname in appends: | 402 | for appendname in appends: |
| @@ -440,9 +405,9 @@ build results (as the layer priority order has effectively changed). | |||
| 440 | appended_recipes.append(f1) | 405 | appended_recipes.append(f1) |
| 441 | 406 | ||
| 442 | # Take care of when some layers are excluded and yet we have included bbappends for those recipes | 407 | # Take care of when some layers are excluded and yet we have included bbappends for those recipes |
| 443 | for recipename in self.cooker_data.appends.iterkeys(): | 408 | for recipename in self.bbhandler.cooker.appendlist.iterkeys(): |
| 444 | if recipename not in appended_recipes: | 409 | if recipename not in appended_recipes: |
| 445 | appends = self.cooker_data.appends[recipename] | 410 | appends = self.bbhandler.cooker.appendlist[recipename] |
| 446 | first_append = None | 411 | first_append = None |
| 447 | for appendname in appends: | 412 | for appendname in appends: |
| 448 | layer = layer_path_match(appendname) | 413 | layer = layer_path_match(appendname) |
| @@ -460,14 +425,14 @@ build results (as the layer priority order has effectively changed). | |||
| 460 | # have come from) | 425 | # have come from) |
| 461 | first_regex = None | 426 | first_regex = None |
| 462 | layerdir = layers[0] | 427 | layerdir = layers[0] |
| 463 | for layername, pattern, regex, _ in self.cooker.status.bbfile_config_priorities: | 428 | for layername, pattern, regex, _ in self.bbhandler.cooker.status.bbfile_config_priorities: |
| 464 | if regex.match(os.path.join(layerdir, 'test')): | 429 | if regex.match(os.path.join(layerdir, 'test')): |
| 465 | first_regex = regex | 430 | first_regex = regex |
| 466 | break | 431 | break |
| 467 | 432 | ||
| 468 | if first_regex: | 433 | if first_regex: |
| 469 | # Find the BBFILES entries that match (which will have come from this conf/layer.conf file) | 434 | # Find the BBFILES entries that match (which will have come from this conf/layer.conf file) |
| 470 | bbfiles = str(self.config_data.getVar('BBFILES', True)).split() | 435 | bbfiles = str(self.bbhandler.config_data.getVar('BBFILES', True)).split() |
| 471 | bbfiles_layer = [] | 436 | bbfiles_layer = [] |
| 472 | for item in bbfiles: | 437 | for item in bbfiles: |
| 473 | if first_regex.match(item): | 438 | if first_regex.match(item): |
| @@ -490,7 +455,7 @@ build results (as the layer priority order has effectively changed). | |||
| 490 | logger.warning("File %s does not match the flattened layer's BBFILES setting, you may need to edit conf/layer.conf or move the file elsewhere" % f1full) | 455 | logger.warning("File %s does not match the flattened layer's BBFILES setting, you may need to edit conf/layer.conf or move the file elsewhere" % f1full) |
| 491 | 456 | ||
| 492 | def get_file_layer(self, filename): | 457 | def get_file_layer(self, filename): |
| 493 | for layer, _, regex, _ in self.cooker.status.bbfile_config_priorities: | 458 | for layer, _, regex, _ in self.bbhandler.cooker.status.bbfile_config_priorities: |
| 494 | if regex.match(filename): | 459 | if regex.match(filename): |
| 495 | for layerdir in self.bblayers: | 460 | for layerdir in self.bblayers: |
| 496 | if regex.match(os.path.join(layerdir, 'test')): | 461 | if regex.match(os.path.join(layerdir, 'test')): |
| @@ -516,14 +481,14 @@ usage: show-appends | |||
| 516 | 481 | ||
| 517 | Recipes are listed with the bbappends that apply to them as subitems. | 482 | Recipes are listed with the bbappends that apply to them as subitems. |
| 518 | """ | 483 | """ |
| 519 | self.check_prepare_cooker() | 484 | self.bbhandler.prepare() |
| 520 | if not self.cooker_data.appends: | 485 | if not self.bbhandler.cooker.appendlist: |
| 521 | logger.plain('No append files found') | 486 | logger.plain('No append files found') |
| 522 | return | 487 | return |
| 523 | 488 | ||
| 524 | logger.plain('=== Appended recipes ===') | 489 | logger.plain('=== Appended recipes ===') |
| 525 | 490 | ||
| 526 | pnlist = list(self.cooker_data.pkg_pn.keys()) | 491 | pnlist = list(self.bbhandler.cooker_data.pkg_pn.keys()) |
| 527 | pnlist.sort() | 492 | pnlist.sort() |
| 528 | for pn in pnlist: | 493 | for pn in pnlist: |
| 529 | self.show_appends_for_pn(pn) | 494 | self.show_appends_for_pn(pn) |
| @@ -531,19 +496,19 @@ Recipes are listed with the bbappends that apply to them as subitems. | |||
| 531 | self.show_appends_for_skipped() | 496 | self.show_appends_for_skipped() |
| 532 | 497 | ||
| 533 | def show_appends_for_pn(self, pn): | 498 | def show_appends_for_pn(self, pn): |
| 534 | filenames = self.cooker_data.pkg_pn[pn] | 499 | filenames = self.bbhandler.cooker_data.pkg_pn[pn] |
| 535 | 500 | ||
| 536 | best = bb.providers.findBestProvider(pn, | 501 | best = bb.providers.findBestProvider(pn, |
| 537 | self.cooker.configuration.data, | 502 | self.bbhandler.cooker.configuration.data, |
| 538 | self.cooker_data, | 503 | self.bbhandler.cooker_data, |
| 539 | self.cooker_data.pkg_pn) | 504 | self.bbhandler.cooker_data.pkg_pn) |
| 540 | best_filename = os.path.basename(best[3]) | 505 | best_filename = os.path.basename(best[3]) |
| 541 | 506 | ||
| 542 | self.show_appends_output(filenames, best_filename) | 507 | self.show_appends_output(filenames, best_filename) |
| 543 | 508 | ||
| 544 | def show_appends_for_skipped(self): | 509 | def show_appends_for_skipped(self): |
| 545 | filenames = [os.path.basename(f) | 510 | filenames = [os.path.basename(f) |
| 546 | for f in self.cooker.skiplist.iterkeys()] | 511 | for f in self.bbhandler.cooker.skiplist.iterkeys()] |
| 547 | self.show_appends_output(filenames, None, " (skipped)") | 512 | self.show_appends_output(filenames, None, " (skipped)") |
| 548 | 513 | ||
| 549 | def show_appends_output(self, filenames, best_filename, name_suffix = ''): | 514 | def show_appends_output(self, filenames, best_filename, name_suffix = ''): |
| @@ -569,7 +534,7 @@ Recipes are listed with the bbappends that apply to them as subitems. | |||
| 569 | continue | 534 | continue |
| 570 | 535 | ||
| 571 | basename = os.path.basename(filename) | 536 | basename = os.path.basename(filename) |
| 572 | appends = self.cooker_data.appends.get(basename) | 537 | appends = self.bbhandler.cooker.appendlist.get(basename) |
| 573 | if appends: | 538 | if appends: |
| 574 | appended.append((basename, list(appends))) | 539 | appended.append((basename, list(appends))) |
| 575 | else: | 540 | else: |
| @@ -577,22 +542,5 @@ Recipes are listed with the bbappends that apply to them as subitems. | |||
| 577 | return appended, notappended | 542 | return appended, notappended |
| 578 | 543 | ||
| 579 | 544 | ||
| 580 | class Config(object): | ||
| 581 | def __init__(self, **options): | ||
| 582 | self.pkgs_to_build = [] | ||
| 583 | self.debug_domains = [] | ||
| 584 | self.extra_assume_provided = [] | ||
| 585 | self.prefile = [] | ||
| 586 | self.postfile = [] | ||
| 587 | self.debug = 0 | ||
| 588 | self.__dict__.update(options) | ||
| 589 | |||
| 590 | def __getattr__(self, attribute): | ||
| 591 | try: | ||
| 592 | return super(Config, self).__getattribute__(attribute) | ||
| 593 | except AttributeError: | ||
| 594 | return None | ||
| 595 | |||
| 596 | |||
| 597 | if __name__ == '__main__': | 545 | if __name__ == '__main__': |
| 598 | sys.exit(main(sys.argv[1:]) or 0) | 546 | sys.exit(main(sys.argv[1:]) or 0) |
