[Buildroot] [PATCH 3/6] support/graph-depends: add option to limit the depth of the graph

Samuel Martin s.martin49 at gmail.com
Mon Apr 14 19:29:09 UTC 2014


Hi Yann,

Same comments as for patch 2/6 ;)

On Sun, Apr 13, 2014 at 10:42 PM, Yann E. MORIN <yann.morin.1998 at free.fr> wrote:
> From: "Yann E. MORIN" <yann.morin.1998 at free.fr>
>
> Currently, the complete dependency chain of a package is used to
> generate the dependency graph. When this dependency chain is long,
> the generated graph becomes almost unreadable.
>
> However, it is often sufficient to get the first few levels of
> dependency of a package.
>
> Add a new variable BR2_GRAPH_DEPTH, that the user can set to limit
> the depth of the dependency list.
>
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
> Cc: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> ---
>  Makefile                      |  3 ++-
>  package/pkg-generic.mk        |  2 +-
>  support/scripts/graph-depends | 49 ++++++++++++++++++++++++++++++++-----------
>  3 files changed, 40 insertions(+), 14 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index b0eec7f..467e21c 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -150,6 +150,7 @@ endif
>  # 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
> @@ -672,7 +673,7 @@ graph-build: $(O)/build/build-time.log
>  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)
> diff --git a/package/pkg-generic.mk b/package/pkg-generic.mk
> index 080ee56..c162902 100644
> --- a/package/pkg-generic.mk
> +++ b/package/pkg-generic.mk
> @@ -495,7 +495,7 @@ $(1)-show-depends:
>  $(1)-graph-depends:
>                         @$(INSTALL) -d $(O)/graphs
>                         @cd "$(CONFIG_DIR)"; \
> -                       $(TOPDIR)/support/scripts/graph-depends -p $(1) \
> +                       $(TOPDIR)/support/scripts/graph-depends -p $(1) -d $(BR_GRAPH_DEPTH) \
>                         |dot -T$(BR_GRAPH_OUT) -o $(O)/graphs/$$(@).$(BR_GRAPH_OUT)
>
>  $(1)-dirclean:         $$($(2)_TARGET_DIRCLEAN)
> diff --git a/support/scripts/graph-depends b/support/scripts/graph-depends
> index fc3cadd..ebf511b 100755
> --- a/support/scripts/graph-depends
> +++ b/support/scripts/graph-depends
> @@ -8,6 +8,8 @@
>  # 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
>  #
> @@ -31,10 +33,13 @@ FULL_MODE = 1
>  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",

Mixed quote style.

> +                    help="Limit the dependency graph to DEPTH levels")
>  args = parser.parse_args()
>
>  if args.package == None:
> @@ -43,6 +48,9 @@ else:
>      mode = PKG_MODE
>      rootpkg = args.package
>
> +if args.depth != None:

s/!=/is not/

> +    max_depth = int(args.depth)
> +
>  allpkgs = []
>
>  # Execute the "make show-targets" command to get the list of the main
> @@ -193,6 +201,7 @@ if mode == FULL_MODE:
>      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
> @@ -201,26 +210,42 @@ elif mode == PKG_MODE:
>
>  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 "}"
> --
> 1.8.3.2
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

Regards,

-- 
Samuel



More information about the buildroot mailing list