# Need that early, before we scan packages
# Avoids doing the $(or...) everytime
BR_GRAPH_OUT := $(or $(BR2_GRAPH_OUT),pdf)
+BR_GRAPH_DEPTH := $(or $(BR2_GRAPH_DEPTH),0)
BUILD_DIR:=$(BASE_DIR)/build
BINARIES_DIR:=$(BASE_DIR)/images
graph-depends:
@$(INSTALL) -d $(O)/graphs
@cd "$(CONFIG_DIR)"; \
- $(TOPDIR)/support/scripts/graph-depends \
+ $(TOPDIR)/support/scripts/graph-depends -d $(BR_GRAPH_DEPTH) \
|dot -T$(BR_GRAPH_OUT) -o $(O)/graphs/$(@).$(BR_GRAPH_OUT)
else # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
# dependencies for the current configuration.
# If '-p <package-name>' is specified, graph-depends will draw a graph
# of dependencies for the given package name.
+# If '-d <depth>' is specified, graph-depends will limit the depth of
+# the dependency graph to 'depth' levels.
#
# Limitations
#
PKG_MODE = 2
mode = 0
+max_depth = 0
parser = argparse.ArgumentParser(description="Graph pacakges dependencies")
parser.add_argument("--package", '-p', metavar="PACKAGE",
help="Graph the dependencies of PACKAGE")
+parser.add_argument("--depth", '-d', metavar="DEPTH",
+ help="Limit the dependency graph to DEPTH levels")
args = parser.parse_args()
if args.package == None:
mode = PKG_MODE
rootpkg = args.package
+if args.depth != None:
+ max_depth = int(args.depth)
+
allpkgs = []
# Execute the "make show-targets" command to get the list of the main
deps = get_all_depends(filtered_targets)
if deps != None:
dependencies += deps
+ rootpkg = 'all'
# In pkg mode, start directly with get_all_depends() on the requested
# package
dependencies = remove_redundant_deps(dependencies)
-# Start printing the graph data
-print "digraph G {"
-
-# First, the dependencies. Usage of set allows to remove duplicated
-# dependencies in the graph
-for dep in set(dependencies):
- print "%s -> %s" % (pkg_node_name(dep[0]), pkg_node_name(dep[1]))
+# Make the dependencies a dictionnary { 'pkg':[dep1, dep2, ...] }
+dict_deps = {}
+for dep in dependencies:
+ if not dict_deps.has_key(dep[0]):
+ dict_deps[dep[0]] = []
+ dict_deps[dep[0]].append(dep[1])
-# Then, the node attributes: color, style and label.
-for pkg in allpkgs:
+# Print the attributes of a node: label and fill-color
+def print_attrs(pkg):
if pkg == 'all':
print "all [label = \"ALL\"]"
print "all [color=lightblue,style=filled]"
- continue
-
+ return
print "%s [label = \"%s\"]" % (pkg_node_name(pkg), pkg)
-
if mode == PKG_MODE and pkg == rootpkg:
print "%s [color=lightblue,style=filled]" % pkg_node_name(rootpkg)
else:
print "%s [color=grey,style=filled]" % pkg_node_name(pkg)
+# Print the dependency graph of a package
+def print_pkg_deps(depth, pkg):
+ if pkg in done_deps:
+ return
+ done_deps.append(pkg)
+ print_attrs(pkg)
+ if not dict_deps.has_key(pkg):
+ return
+ if max_depth == 0 or depth < max_depth:
+ for d in dict_deps[pkg]:
+ print "%s -> %s" % (pkg_node_name(pkg), pkg_node_name(d))
+ print_pkg_deps(depth+1, d)
+
+# Start printing the graph data
+print "digraph G {"
+
+done_deps = []
+print_pkg_deps(0, rootpkg)
+
print "}"