main: add --digraph option to generate a representation of the depgraph in graphviz dot format

feature/tap-sh
William Pitcock 2011-07-26 20:37:19 -05:00
parent b0c16941ce
commit 3c8bac678d
1 changed files with 29 additions and 0 deletions

29
main.c
View File

@ -36,6 +36,7 @@ static int want_modversion = 0;
static int want_static = 0;
static int want_requires = 0;
static int want_variables = 0;
static int want_digraph = 0;
static int maximum_traverse_depth = 2;
static char *required_pkgconfig_version = NULL;
@ -98,6 +99,19 @@ print_requires(pkg_t *pkg, void *unused)
}
}
static void
print_digraph_node(pkg_t *pkg, void *unused)
{
pkg_dependency_t *node;
printf("\"%s\" [fontname=Sans fontsize=8]\n", pkg->id);
foreach_list_entry(pkg->requires, node)
{
printf("\"%s\" -- \"%s\" [fontname=Sans fontsize=8]\n", node->package, pkg->id);
}
}
typedef struct pkg_queue_ {
struct pkg_queue_ *prev, *next;
const char *package;
@ -122,6 +136,7 @@ pkg_queue_walk(pkg_queue_t *head)
int wanted_something = 0;
pkg_queue_t *pkgq;
pkg_t world = (pkg_t){
.id = "world",
.realname = "virtual"
};
@ -144,6 +159,19 @@ pkg_queue_walk(pkg_queue_t *head)
/* we should verify that the graph is complete before attempting to compute cflags etc. */
pkg_verify_graph(&world, maximum_traverse_depth);
if (want_digraph)
{
printf("graph deptree {\n");
printf("edge [color=blue len=7.5 fontname=Sans fontsize=8]\n");
printf("node [fontname=Sans fontsize=8]\n");
pkg_traverse(&world, print_digraph_node, NULL, maximum_traverse_depth);
printf("}\n");
return EXIT_SUCCESS;
}
if (want_modversion)
{
wanted_something = 0;
@ -232,6 +260,7 @@ main(int argc, const char *argv[])
{ "static", 0, POPT_ARG_NONE, &want_static, 0, "be more aggressive when walking the dependency graph (for intermediary static linking deps)" },
{ "print-requires", 0, POPT_ARG_NONE, &want_requires, 0, "print required dependencies of the computed dependency graph" },
{ "print-variables", 0, POPT_ARG_NONE, &want_variables, 0, "print variables provided by a package" },
{ "digraph", 0, POPT_ARG_NONE, &want_digraph, 0, "build a graphviz digraph (dot) graph of the computed dependency graph" },
POPT_AUTOHELP
{ NULL, 0, 0, NULL, 0 }
};