aboutsummaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2006-05-25 17:51:33 +0000
committerHolger Hans Peter Freyther <zecke@selfish.org>2006-05-25 17:51:33 +0000
commit56d3fb063fc91c8ca3dd4a212c790ac121ba0bfe (patch)
tree0311b73de2449b4f8a95d89d8e6417504c40a13e /bin
parent32abd610ea1661766a9f53b42de98f9ffba145f6 (diff)
downloadbitbake-56d3fb063fc91c8ca3dd4a212c790ac121ba0bfe.tar.gz
bitbake/bin/bitbake: Generate DOT depedency start
Add option -g to generate graphs for DEPENDS and RDEPENDS. Currently these are emitted in two different files for now. For the future: -Add option to stop at level X -Emit both DEPENDS and RDEPENDS into the same graph...
Diffstat (limited to 'bin')
-rwxr-xr-xbin/bitbake87
1 files changed, 87 insertions, 0 deletions
diff --git a/bin/bitbake b/bin/bitbake
index ec6296caa..67322b012 100755
--- a/bin/bitbake
+++ b/bin/bitbake
@@ -449,6 +449,84 @@ class BBCooker:
if data.getVarFlag( e, 'python', self.configuration.data ):
sys.__stdout__.write("\npython %s () {\n%s}\n" % (e, data.getVar(e, self.configuration.data, 1)))
+ def generateDotGraph( self, pkgs_to_build ):
+ """
+ Generate two graphs one for the DEPENDS and RDEPENDS. The current
+ implementation creates crappy graphs ;)
+ """
+
+ rdepends_file = file('rdepends.dot', 'w' )
+ depends_file = file('depends.dot', 'w' )
+
+
+ # setup the graphs
+ print >> depends_file, "digraph depends {"
+ print >> rdepends_file, "digraph rdepends {"
+
+
+ # try to avoid adding the same rdepends over an over again
+ seen_depends = {}
+ seen_rdepends = {}
+
+ added_depends_error = False
+
+ def add_depends(package_list):
+ """
+ Add all depends of all packages from this list
+ """
+ for package in package_list:
+ if package in seen_depends:
+ continue
+ else:
+ seen_depends[package] = 1
+
+ if not package in self.status.providers:
+ """
+ We have not seen this name -> error in
+ dependency handling
+ """
+ print >> depends_file, '"%(package)s" -> ERROR' % vars()
+ continue
+
+ # get all providers for this package
+ providers = self.status.providers[package]
+
+ # now let us find the bestProvider for it
+ elligible = self.filterProviders(providers, package)
+ prefervar = bb.data.getVar('PREFERRED_PROVIDER_%s' % package, self.configuration.data, 1)
+
+ # try the preferred provider first
+ if prefervar:
+ for p in elligible:
+ if prefervar == self.status.pkg_fn[p]:
+ bb.note("Selecting PREFERRED_PROVIDER %s" % prefervar)
+ elligible.remove(p)
+ elligible = [p] + elligible
+
+ fn = elligible[0]
+ depends = bb.utils.explode_deps(self.bb_cache.getVar('DEPENDS', fn, True) or "")
+ rdepends = bb.utils.explode_deps(self.bb_cache.getVar('RDEPENDS', fn, True) or "")
+ add_depends( depends )
+ add_rdepends( rdepends )
+
+ for depend in depends:
+ print >> depends_file, '"%(package)s" -> "%(depend)s"' % vars()
+
+ def add_rdepends(package_list):
+ """
+ for each package of the package_list
+ we will see if we have handled it already
+ """
+ pass
+
+ # start with the initial list
+ add_depends( pkgs_to_build )
+ add_rdepends( pkgs_to_build )
+
+ # finish it up
+ print >> depends_file, "}"
+ print >> rdepends_file, "}"
+
def filterProviders(self, providers, item):
"""
Take a list of providers and filter/reorder according to the
@@ -921,6 +999,7 @@ class BBCooker:
print "Requested parsing .bb files only. Exiting."
return
+
self.buildDepgraph()
if self.configuration.show_versions:
@@ -931,6 +1010,11 @@ class BBCooker:
pkgs_to_build.remove('world')
for t in self.status.world_target:
pkgs_to_build.append(t)
+
+ if self.configuration.dot_graph:
+ self.generateDotGraph( pkgs_to_build )
+ sys.exit( 0 )
+
bb.event.fire(bb.event.BuildStarted(buildname, pkgs_to_build, self.configuration.event_data))
@@ -1112,6 +1196,9 @@ Default BBFILES are the .bb files in the current directory.""" )
parser.add_option( "-e", "--environment", help = "show the global or per-package environment (this is what used to be bbread)",
action = "store_true", dest = "show_environment", default = False )
+ parser.add_option( "-g", "--graphviz", help = "emit the dependency trees of the specified packages in the dot syntax",
+ action = "store_true", dest = "dot_graph", default = False )
+
options, args = parser.parse_args( sys.argv )
cooker = BBCooker()