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

pull/1/merge
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_static = 0;
static int want_requires = 0; static int want_requires = 0;
static int want_variables = 0; static int want_variables = 0;
static int want_digraph = 0;
static int maximum_traverse_depth = 2; static int maximum_traverse_depth = 2;
static char *required_pkgconfig_version = NULL; 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_ { typedef struct pkg_queue_ {
struct pkg_queue_ *prev, *next; struct pkg_queue_ *prev, *next;
const char *package; const char *package;
@ -122,6 +136,7 @@ pkg_queue_walk(pkg_queue_t *head)
int wanted_something = 0; int wanted_something = 0;
pkg_queue_t *pkgq; pkg_queue_t *pkgq;
pkg_t world = (pkg_t){ pkg_t world = (pkg_t){
.id = "world",
.realname = "virtual" .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. */ /* we should verify that the graph is complete before attempting to compute cflags etc. */
pkg_verify_graph(&world, maximum_traverse_depth); 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) if (want_modversion)
{ {
wanted_something = 0; 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)" }, { "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-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" }, { "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 POPT_AUTOHELP
{ NULL, 0, 0, NULL, 0 } { NULL, 0, 0, NULL, 0 }
}; };