bitbake-layers: change the behaviour of show-cross-depends
cover bitbake-layers: change the behaviour of show-cross-depends
The following changes since commit 9e4adec98db325112ca7a8b9dd95722d4d0ab642:
distro_alias.inc: update/sort alias information. (2015-03-31 22:54:54 +0100)
are available in the git repository at:
git://git.pokylinux.org/poky-contrib ChenQi/bitbake-layers-show-cross-depends
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=ChenQi/bitbake-layers-show-cross-depends
Chen Qi (1):
bitbake-layers: change the behaviour of show-cross-depends
bitbake/bin/bitbake-layers | 60 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 10 deletions(-)
Signature · 1 line
1.9.1
PATCH 1/1 bitbake-layers: change the behaviour of show-cross-depends
Make `bitbake-layers show-cross-depends' only output dependencies that may potentially cause problems. In other words, if a dependency is in a required layer of the layer where the target recipe resides, the dependency is not printed.
Add a new option '-a' (or '--alldeps') to 'show-cross-depends' to maintain the previous behaviour. In other words, bitbake-layers show-cross-depends -a' behaves the same way as the previous bitbake-layers show-cross-depends'.
The purpose is to make `bitbake-layers show-cross-depends' more useful. Before this change, with several meta-xxx layers added to bblayer.conf, this command would output more then 10000 lines of dependencies. Even with 'meta' layer ignored, the output is still about 100 lines.
After this change, this command only shows less than 20 lines of dependencies, all of which indicate potential errors.
--- bitbake/bin/bitbake-layers | 60 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 10 deletions(-)
bitbake/bin/bitbake-layers +50 -10
@@ -59,6 +59,8 @@ class Commands(): def __init__(self): self.bbhandler = None self.bblayers = [] + self.dict_layername_collection = {} + self.dict_collection_layername = {} def init_bbhandler(self, config_only = False): if not self.bbhandler:
@@ -233,6 +235,25 @@ Removes the specified layer from bblayers.conf ldict[lname] = lurl, lsubdir return None, ldict + def get_required_layers(self, layername): + self.init_bbhandler(config_only=True) + required_layers = [] + + if not self.dict_layername_collection and not self.dict_collection_layername: + bbcollections = self.bbhandler.config_data.getVar('BBFILE_COLLECTIONS', True).split() + for collection in bbcollections: + bbfile_pattern = self.bbhandler.config_data.getVar('BBFILE_PATTERN_%s' % collection, True) + layerdir = bbfile_pattern.strip('^').rstrip('/') + layer_basename = self.get_layer_name(layerdir) + self.dict_collection_layername[collection] = layer_basename + self.dict_layername_collection[layer_basename] = collection + + required_collection_names = self.bbhandler.config_data.getVar('LAYERDEPENDS_%s' % self.dict_layername_collection[layername], True) + if required_collection_names: + for collection in required_collection_names.split(): + required_layers.append(self.dict_collection_layername[collection]) + + return required_layers def get_fetch_layer(self, fetchdir, url, subdir, fetch_layer): layername = self.get_layer_name(url)
@@ -794,12 +815,22 @@ NOTE: .bbappend files can impact the dependencies. global_inherit = (self.bbhandler.config_data.getVar('INHERIT', True) or "").split() + dict_layer_required = {} + # The bb's DEPENDS and RDEPENDS for f in pkg_fn: f = bb.cache.Cache.virtualfn2realfn(f)[0] # Get the layername that the file is in layername = self.get_file_layer(f) + required_layers = [] + if not args.alldeps: + if layername in dict_layer_required: + required_layers = dict_layer_required[layername] + else: + required_layers = self.get_required_layers(layername) + dict_layer_required[layername] = required_layers + # The DEPENDS deps = self.bbhandler.cooker_data.deps[f] for pn in deps:
@@ -808,7 +839,7 @@ NOTE: .bbappend files can impact the dependencies. self.bbhandler.config_data, self.bbhandler.cooker_data, self.bbhandler.cooker_data.pkg_pn) - self.check_cross_depends("DEPENDS", layername, f, best[3], args.filenames, ignore_layers) + self.check_cross_depends("DEPENDS", layername, f, best[3], args.filenames, ignore_layers, required_layers) # The RDPENDS all_rdeps = self.bbhandler.cooker_data.rundeps[f].values()
@@ -828,7 +859,7 @@ NOTE: .bbappend files can impact the dependencies. best = bb.providers.filterProvidersRunTime(all_p, rdep, self.bbhandler.config_data, self.bbhandler.cooker_data)[0][0] - self.check_cross_depends("RDEPENDS", layername, f, best, args.filenames, ignore_layers) + self.check_cross_depends("RDEPENDS", layername, f, best, args.filenames, ignore_layers, required_layers) # The RRECOMMENDS all_rrecs = self.bbhandler.cooker_data.runrecs[f].values()
@@ -848,7 +879,7 @@ NOTE: .bbappend files can impact the dependencies. best = bb.providers.filterProvidersRunTime(all_p, rrec, self.bbhandler.config_data, self.bbhandler.cooker_data)[0][0] - self.check_cross_depends("RRECOMMENDS", layername, f, best, args.filenames, ignore_layers) + self.check_cross_depends("RRECOMMENDS", layername, f, best, args.filenames, ignore_layers, required_layers) # The inherit class cls_re = re.compile('classes/')
@@ -862,7 +893,7 @@ NOTE: .bbappend files can impact the dependencies. if classname in global_inherit: continue inherit_layername = self.get_file_layer(cls) - if inherit_layername != layername and not inherit_layername in ignore_layers: + if inherit_layername != layername and not inherit_layername in ignore_layers and not inherit_layername in required_layers: if not args.filenames: f_short = self.remove_layer_prefix(f) cls = self.remove_layer_prefix(cls)
@@ -883,7 +914,7 @@ NOTE: .bbappend files can impact the dependencies. if pv_re.search(needed_file) and f in self.bbhandler.cooker_data.pkg_pepvpr: pv = self.bbhandler.cooker_data.pkg_pepvpr[f][1] needed_file = re.sub(r"\${PV}", pv, needed_file) - self.print_cross_files(bbpath, keyword, layername, f, needed_file, args.filenames, ignore_layers) + self.print_cross_files(bbpath, keyword, layername, f, needed_file, args.filenames, ignore_layers, required_layers) line = fnfile.readline() fnfile.close()
@@ -894,6 +925,14 @@ NOTE: .bbappend files can impact the dependencies. bbclass_re = re.compile(".*\.bbclass$") for layerdir in self.bblayers: layername = self.get_layer_name(layerdir) + required_layers = [] + if not args.alldeps: + if layername in dict_layer_required: + required_layers = dict_layer_required[layername] + else: + required_layers = self.get_required_layers(layername) + dict_layer_required[layername] = required_layers + for dirpath, dirnames, filenames in os.walk(layerdir): for name in filenames: f = os.path.join(dirpath, name)
@@ -910,17 +949,17 @@ NOTE: .bbappend files can impact the dependencies. bbclass=".bbclass" # Find a 'require/include xxxx' if m: - self.print_cross_files(bbpath, keyword, layername, f, m.group(1) + bbclass, args.filenames, ignore_layers) + self.print_cross_files(bbpath, keyword, layername, f, m.group(1) + bbclass, args.filenames, ignore_layers, required_layers) line = ffile.readline() ffile.close() - def print_cross_files(self, bbpath, keyword, layername, f, needed_filename, show_filenames, ignore_layers): + def print_cross_files(self, bbpath, keyword, layername, f, needed_filename, show_filenames, ignore_layers, required_layers): """Print the depends that crosses a layer boundary""" needed_file = bb.utils.which(bbpath, needed_filename) if needed_file: # Which layer is this file from needed_layername = self.get_file_layer(needed_file) - if needed_layername != layername and not needed_layername in ignore_layers: + if needed_layername != layername and not needed_layername in ignore_layers and not needed_layername in required_layers: if not show_filenames: f = self.remove_layer_prefix(f) needed_file = self.remove_layer_prefix(needed_file)
@@ -939,11 +978,11 @@ NOTE: .bbappend files can impact the dependencies. keyword = "includes" return (m, keyword) - def check_cross_depends(self, keyword, layername, f, needed_file, show_filenames, ignore_layers): + def check_cross_depends(self, keyword, layername, f, needed_file, show_filenames, ignore_layers, required_layers): """Print the DEPENDS/RDEPENDS file that crosses a layer boundary""" best_realfn = bb.cache.Cache.virtualfn2realfn(needed_file)[0] needed_layername = self.get_file_layer(best_realfn) - if needed_layername != layername and not needed_layername in ignore_layers: + if needed_layername != layername and not needed_layername in ignore_layers and not needed_layername in required_layers: if not show_filenames: f = self.remove_layer_prefix(f) best_realfn = self.remove_layer_prefix(best_realfn)
@@ -1000,6 +1039,7 @@ def main(): parser_show_cross_depends = add_command('show-cross-depends', cmds.do_show_cross_depends) parser_show_cross_depends.add_argument('-f', '--filenames', help='show full file path', action='store_true') parser_show_cross_depends.add_argument('-i', '--ignore', help='ignore dependencies on items in the specified layer(s) (split multiple layer names with commas, no spaces)', metavar='LAYERNAME') + parser_show_cross_depends.add_argument('-a', '--alldeps', help='show all cross dependencies including those in required layers', action='store_true') parser_layerindex_fetch = add_command('layerindex-fetch', cmds.do_layerindex_fetch) parser_layerindex_fetch.add_argument('-n', '--show-only', help='show dependencies and do nothing else', action='store_true')
Signature · 1 line
1.9.1
Ping
Any comment on this one?
Best Regards,
Chen Qi
Quoted 15 lines · Chen Qi
The following changes since commit
9e4adec98db325112ca7a8b9dd95722d4d0ab642:distro_alias.inc: update/sort alias information. (2015-03-31 22:54:54 +0100)are available in the git repository at:
git://git.pokylinux.org/poky-contribChenQi/bitbake-layers-show-cross-depends
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=ChenQi/bitbake-layers-show-cross-dependsChen Qi (1):
bitbake-layers: change the behaviour of show-cross-dependsbitbake/bin/bitbake-layers | 60 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 10 deletions(-)