All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/1] bitbake-layers: change the behaviour of show-cross-depends
@ 2015-04-02  8:11 ` Chen Qi
  0 siblings, 0 replies; 5+ messages in thread
From: Chen Qi @ 2015-04-02  8:10 UTC (permalink / raw)
  To: openembedded-core

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

-- 
1.9.1



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/1] bitbake-layers: change the behaviour of show-cross-depends
  2015-04-02  8:11 ` Chen Qi
@ 2015-04-02  8:11   ` Chen Qi
  -1 siblings, 0 replies; 5+ messages in thread
From: Chen Qi @ 2015-04-02  8:10 UTC (permalink / raw)
  To: openembedded-core

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.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
---
 bitbake/bin/bitbake-layers | 60 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 50 insertions(+), 10 deletions(-)

diff --git a/bitbake/bin/bitbake-layers b/bitbake/bin/bitbake-layers
index c1c65aa..d6cec38 100755
--- a/bitbake/bin/bitbake-layers
+++ b/bitbake/bin/bitbake-layers
@@ -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')
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 0/1] bitbake-layers: change the behaviour of show-cross-depends
@ 2015-04-02  8:11 ` Chen Qi
  0 siblings, 0 replies; 5+ messages in thread
From: Chen Qi @ 2015-04-02  8:11 UTC (permalink / raw)
  To: bitbake-devel

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

-- 
1.9.1



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/1] bitbake-layers: change the behaviour of show-cross-depends
@ 2015-04-02  8:11   ` Chen Qi
  0 siblings, 0 replies; 5+ messages in thread
From: Chen Qi @ 2015-04-02  8:11 UTC (permalink / raw)
  To: bitbake-devel

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.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
---
 bitbake/bin/bitbake-layers | 60 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 50 insertions(+), 10 deletions(-)

diff --git a/bitbake/bin/bitbake-layers b/bitbake/bin/bitbake-layers
index c1c65aa..d6cec38 100755
--- a/bitbake/bin/bitbake-layers
+++ b/bitbake/bin/bitbake-layers
@@ -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')
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/1] bitbake-layers: change the behaviour of show-cross-depends
  2015-04-02  8:11 ` Chen Qi
  (?)
  (?)
@ 2015-04-14  2:17 ` ChenQi
  -1 siblings, 0 replies; 5+ messages in thread
From: ChenQi @ 2015-04-14  2:17 UTC (permalink / raw)
  To: bitbake-devel

Ping

Any comment on this one?

Best Regards,
Chen Qi

On 04/02/2015 04:11 PM, Chen Qi wrote:
> 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(-)
>



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-04-14  2:17 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-02  8:10 [PATCH 0/1] bitbake-layers: change the behaviour of show-cross-depends Chen Qi
2015-04-02  8:11 ` Chen Qi
2015-04-02  8:10 ` [PATCH 1/1] " Chen Qi
2015-04-02  8:11   ` Chen Qi
2015-04-14  2:17 ` [PATCH 0/1] " ChenQi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.