Skip to contentSkip to conversation

bitbake-layers: change the behaviour of show-cross-depends

PATCH Superseded Chen Qi 1 participant 3 messages Apr 2, 2015 – Apr 14, 2015

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Chen Qi

author
#0 lore raw

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
author
#1 lore raw

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
index c1c65aa..d6cec38 100755
@@ -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
author
#2 lore raw
In reply to Chen Qi

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-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(-)