# Copyright (C) 2011 Mentor Graphics Corporation
# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import cmd
import logging
-import warnings
import os
import sys
import fnmatch
import bb.cooker
import bb.providers
import bb.utils
-from bb.cooker import state
-import bb.fetch2
+import bb.tinfoil
logger = logging.getLogger('BitBake')
-warnings.filterwarnings("ignore", category=DeprecationWarning)
def main(args):
- # Set up logging
- console = logging.StreamHandler(sys.stdout)
- format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
- bb.msg.addDefaultlogFilter(console)
- console.setFormatter(format)
- logger.addHandler(console)
-
- initialenv = os.environ.copy()
- bb.utils.clean_environment()
-
- cmds = Commands(initialenv)
+ cmds = Commands()
if args:
# Allow user to specify e.g. show-layers instead of show_layers
args = [args[0].replace('-', '_')] + args[1:]
class Commands(cmd.Cmd):
- def __init__(self, initialenv):
+ def __init__(self):
cmd.Cmd.__init__(self)
+ self.bbhandler = bb.tinfoil.Tinfoil()
self.returncode = 0
- self.config = Config(parse_only=True)
- self.cooker = bb.cooker.BBCooker(self.config,
- self.register_idle_function,
- initialenv)
- self.config_data = self.cooker.configuration.data
- bb.providers.logger.setLevel(logging.ERROR)
- self.cooker_data = None
- self.bblayers = (self.config_data.getVar('BBLAYERS', True) or "").split()
-
- def register_idle_function(self, function, data):
- pass
-
- def prepare_cooker(self):
- sys.stderr.write("Parsing recipes..")
- logger.setLevel(logging.WARNING)
-
- try:
- while self.cooker.state in (state.initial, state.parsing):
- self.cooker.updateCache()
- except KeyboardInterrupt:
- self.cooker.shutdown()
- self.cooker.updateCache()
- sys.exit(2)
-
- logger.setLevel(logging.INFO)
- sys.stderr.write("done.\n")
-
- self.cooker_data = self.cooker.status
- self.cooker_data.appends = self.cooker.appendlist
-
- def check_prepare_cooker(self, config_only = False):
- if not self.cooker_data:
- if config_only:
- self.cooker.parseConfiguration()
- self.cooker_data = self.cooker.status
- else:
- self.prepare_cooker()
+ self.bblayers = (self.bbhandler.config_data.getVar('BBLAYERS', True) or "").split()
def default(self, line):
"""Handle unrecognised commands"""
def do_show_layers(self, args):
"""show current configured layers"""
- self.check_prepare_cooker(config_only = True)
+ self.bbhandler.prepare(config_only = True)
logger.plain("%s %s %s" % ("layer".ljust(20), "path".ljust(40), "priority"))
logger.plain('=' * 74)
for layerdir in self.bblayers:
layername = self.get_layer_name(layerdir)
layerpri = 0
- for layer, _, regex, pri in self.cooker.status.bbfile_config_priorities:
+ for layer, _, regex, pri in self.bbhandler.cooker.status.bbfile_config_priorities:
if regex.match(os.path.join(layerdir, 'test')):
layerpri = pri
break
recipes with the ones they overlay indented underneath
-s only list overlayed recipes where the version is the same
"""
- self.check_prepare_cooker()
+ self.bbhandler.prepare()
show_filenames = False
show_same_ver_only = False
# factor - however, each layer.conf is free to either prepend or append to
# BBPATH (or indeed do crazy stuff with it). Thus the order in BBPATH might
# not be exactly the order present in bblayers.conf either.
- bbpath = str(self.config_data.getVar('BBPATH', True))
+ bbpath = str(self.bbhandler.config_data.getVar('BBPATH', True))
overlayed_class_found = False
for (classfile, classdirs) in classes.items():
if len(classdirs) > 1:
-m only list where multiple recipes (in the same layer or different
layers) exist for the same recipe name
"""
- self.check_prepare_cooker()
+ self.bbhandler.prepare()
show_filenames = False
show_multi_provider_only = False
def list_recipes(self, title, pnspec, show_overlayed_only, show_same_ver_only, show_filenames, show_multi_provider_only):
- pkg_pn = self.cooker.status.pkg_pn
- (latest_versions, preferred_versions) = bb.providers.findProviders(self.cooker.configuration.data, self.cooker.status, pkg_pn)
- allproviders = bb.providers.allProviders(self.cooker.status)
+ pkg_pn = self.bbhandler.cooker.status.pkg_pn
+ (latest_versions, preferred_versions) = bb.providers.findProviders(self.bbhandler.cooker.configuration.data, self.bbhandler.cooker.status, pkg_pn)
+ allproviders = bb.providers.allProviders(self.bbhandler.cooker.status)
# Ensure we list skipped recipes
# We are largely guessing about PN, PV and the preferred version here,
# but we have no choice since skipped recipes are not fully parsed
- skiplist = self.cooker.skiplist.keys()
- skiplist.sort( key=lambda fileitem: self.cooker.calc_bbfile_priority(fileitem) )
+ skiplist = self.bbhandler.cooker.skiplist.keys()
+ skiplist.sort( key=lambda fileitem: self.bbhandler.cooker.calc_bbfile_priority(fileitem) )
skiplist.reverse()
for fn in skiplist:
recipe_parts = os.path.splitext(os.path.basename(fn))[0].split('_')
logger.error('Directory %s exists and is non-empty, please clear it out first' % outputdir)
return
- self.check_prepare_cooker()
+ self.bbhandler.prepare()
layers = self.bblayers
if len(arglist) > 2:
layernames = arglist[:-1]
appended_recipes = []
for layer in layers:
overlayed = []
- for f in self.cooker.overlayed.iterkeys():
- for of in self.cooker.overlayed[f]:
+ for f in self.bbhandler.cooker.overlayed.iterkeys():
+ for of in self.bbhandler.cooker.overlayed[f]:
if of.startswith(layer):
overlayed.append(of)
logger.warn('Overwriting file %s', fdest)
bb.utils.copyfile(f1full, fdest)
if ext == '.bb':
- if f1 in self.cooker_data.appends:
- appends = self.cooker_data.appends[f1]
+ if f1 in self.bbhandler.cooker.appendlist:
+ appends = self.bbhandler.cooker.appendlist[f1]
if appends:
logger.plain(' Applying appends to %s' % fdest )
for appendname in appends:
appended_recipes.append(f1)
# Take care of when some layers are excluded and yet we have included bbappends for those recipes
- for recipename in self.cooker_data.appends.iterkeys():
+ for recipename in self.bbhandler.cooker.appendlist.iterkeys():
if recipename not in appended_recipes:
- appends = self.cooker_data.appends[recipename]
+ appends = self.bbhandler.cooker.appendlist[recipename]
first_append = None
for appendname in appends:
layer = layer_path_match(appendname)
# have come from)
first_regex = None
layerdir = layers[0]
- for layername, pattern, regex, _ in self.cooker.status.bbfile_config_priorities:
+ for layername, pattern, regex, _ in self.bbhandler.cooker.status.bbfile_config_priorities:
if regex.match(os.path.join(layerdir, 'test')):
first_regex = regex
break
if first_regex:
# Find the BBFILES entries that match (which will have come from this conf/layer.conf file)
- bbfiles = str(self.config_data.getVar('BBFILES', True)).split()
+ bbfiles = str(self.bbhandler.config_data.getVar('BBFILES', True)).split()
bbfiles_layer = []
for item in bbfiles:
if first_regex.match(item):
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)
def get_file_layer(self, filename):
- for layer, _, regex, _ in self.cooker.status.bbfile_config_priorities:
+ for layer, _, regex, _ in self.bbhandler.cooker.status.bbfile_config_priorities:
if regex.match(filename):
for layerdir in self.bblayers:
if regex.match(os.path.join(layerdir, 'test')):
Recipes are listed with the bbappends that apply to them as subitems.
"""
- self.check_prepare_cooker()
- if not self.cooker_data.appends:
+ self.bbhandler.prepare()
+ if not self.bbhandler.cooker.appendlist:
logger.plain('No append files found')
return
logger.plain('=== Appended recipes ===')
- pnlist = list(self.cooker_data.pkg_pn.keys())
+ pnlist = list(self.bbhandler.cooker_data.pkg_pn.keys())
pnlist.sort()
for pn in pnlist:
self.show_appends_for_pn(pn)
self.show_appends_for_skipped()
def show_appends_for_pn(self, pn):
- filenames = self.cooker_data.pkg_pn[pn]
+ filenames = self.bbhandler.cooker_data.pkg_pn[pn]
best = bb.providers.findBestProvider(pn,
- self.cooker.configuration.data,
- self.cooker_data,
- self.cooker_data.pkg_pn)
+ self.bbhandler.cooker.configuration.data,
+ self.bbhandler.cooker_data,
+ self.bbhandler.cooker_data.pkg_pn)
best_filename = os.path.basename(best[3])
self.show_appends_output(filenames, best_filename)
def show_appends_for_skipped(self):
filenames = [os.path.basename(f)
- for f in self.cooker.skiplist.iterkeys()]
+ for f in self.bbhandler.cooker.skiplist.iterkeys()]
self.show_appends_output(filenames, None, " (skipped)")
def show_appends_output(self, filenames, best_filename, name_suffix = ''):
continue
basename = os.path.basename(filename)
- appends = self.cooker_data.appends.get(basename)
+ appends = self.bbhandler.cooker.appendlist.get(basename)
if appends:
appended.append((basename, list(appends)))
else:
return appended, notappended
-class Config(object):
- def __init__(self, **options):
- self.pkgs_to_build = []
- self.debug_domains = []
- self.extra_assume_provided = []
- self.prefile = []
- self.postfile = []
- self.debug = 0
- self.__dict__.update(options)
-
- def __getattr__(self, attribute):
- try:
- return super(Config, self).__getattribute__(attribute)
- except AttributeError:
- return None
-
-
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]) or 0)