summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@suse.com>2013-03-05 18:31:18 +0000
committerMichael Meeks <michael.meeks@suse.com>2013-03-05 18:32:11 +0000
commit956c8eed2ca24285d1a19cda2f5f878b3e455ca8 (patch)
treea58d5a41b93244d6cdb5ef40d6dc1b53c9461a55 /bin
parent0e838cead94a0e4627e12fb55b4b8c29e9905d4c (diff)
world's lamest code for generating graphviz from module deps.
Diffstat (limited to 'bin')
-rwxr-xr-xbin/module-deps.pl103
1 files changed, 96 insertions, 7 deletions
diff --git a/bin/module-deps.pl b/bin/module-deps.pl
index 453570a5a9c5..7263862a200a 100755
--- a/bin/module-deps.pl
+++ b/bin/module-deps.pl
@@ -11,8 +11,8 @@ sub read_deps()
my $invalid_tolerance = 100;
my $line_count = 0;
my %deps;
- open ($p, "ENABLE_PRINT_DEPS=1 $gnumake -n -f $makefile_build all|") || die "can't launch make: $!";
-# open ($p, "/tmp/deps") || die "can't read deps: $!";
+# open ($p, "ENABLE_PRINT_DEPS=1 $gnumake -n -f $makefile_build all|") || die "can't launch make: $!";
+ open ($p, "/tmp/deps") || die "can't read deps: $!";
$|=1;
print STDERR "reading deps ";
while (<$p>) {
@@ -43,10 +43,19 @@ sub read_deps()
return \%deps;
}
+# graphviz etc. don't like some names
+sub clean_name($)
+{
+ my $name = shift;
+ $name =~ s/[\-\/\.]/_/g;
+ return $name;
+}
+
# first create nodes for each entry
-sub build_tree($)
+sub clean_tree($)
{
my $deps = shift;
+ my %tree;
for my $name (sort keys %{$deps}) {
my $need_str = $deps->{$name};
$need_str =~ s/^\s+//g;
@@ -54,15 +63,94 @@ sub build_tree($)
my @needs = split /\s+/, $need_str;
$name =~ m/^([^_]+)_(\S+)$/ || die "invalid target name: '$name'";
my $type = $1;
- my $target = $2;
+ my $target = clean_name ($2);
$type eq 'Executable' || $type eq 'Library' ||
$type eq 'CppunitTest' || die "Unknown type '$type'";
- print "$target ($type): " . join (',', @needs) . "\n";
+
+ my %result;
+ $result{type} = $type;
+ $result{target} = $target;
+ $result{generation} = 0;
+ my @clean_needs;
+ for my $need (@needs) {
+ push @clean_needs, clean_name($need);
+ }
+ $result{deps} = \@clean_needs;
+ if (defined $tree{$target}) {
+ print STDERR "warning -duplicate target: '$target'\n";
+ }
+ $tree{$target} = \%result;
+
+# print "$target ($type): " . join (',', @clean_needs) . "\n";
}
+ return \%tree;
}
+sub is_existing_child($$$$);
+sub is_existing_child($$$$)
+{
+ my ($tree,$search,$name,$generation) = @_;
+
+ my $node = $tree->{$name};
+
+# print STDERR "\tis $search a child of $name ?\n";
+
+ # cyclic check ...
+ if ($node->{generation} == $generation) {
+# print STDERR "probable cyclic dependency graph hunting for $search in $name\n";
+ }
+ $node->{generation} = $generation;
+
+ for my $child (@{$node->{deps}}) {
+ if ($child eq $search) {
+ return 1;
+ }
+ return 1 if (is_existing_child($tree,$search,$child, $generation));
+ }
+ return 0;
+}
+
+sub dump_graphviz($)
+{
+ my $tree = shift;
+ my $generation = 1;
+ print "digraph LibreOffice {\n";
+ for my $name (sort keys %{$tree}) {
+ my $result = $tree->{$name};
+ if ($result->{type} eq 'CppunitTest' ||
+ ($result->{type} eq 'Executable' && $result->{target} ne 'soffice_bin')) {
+ next; # de-bloat the tree
+ }
+
+# print STDERR "minimising deps for $result->{target}\n";
+ my @newdeps;
+ for my $dep (@{$result->{deps}}) {
+ my $print = 1;
+ # is this implied by any other child ?
+# print STDERR "checking if '$dep' is redundant\n";
+ for my $other_dep (@{$result->{deps}}) {
+ $generation++;
+ next if ($other_dep eq $dep);
+ if (is_existing_child($tree,$dep,$other_dep,$generation)) {
+ $print = 0;
+# print STDERR "$dep is implied by $other_dep - ignoring\n";
+ }
+ }
+ print "$name -> $dep;\n" if ($print);
+ push @newdeps, $dep;
+ }
+ # re-write the shrunk set to accelerate things
+ $result->{deps} = \@newdeps;
+ }
+ print "}\n";
+}
+
+my $graphviz = 1;
+
while (my $arg = shift @ARGV) {
- if (!defined $gnumake) {
+ if ($arg eq '--graph' || $arg eq '-g') {
+ $graphviz = 1;
+ } elsif (!defined $gnumake) {
$gnumake = $arg;
} elsif (!defined $makefile_build) {
$makefile_build = $arg;
@@ -75,5 +163,6 @@ $gnumake = 'make' if (!defined $gnumake);
$makefile_build = 'Makefile.gbuild' if (!defined $makefile_build);
my $deps = read_deps();
-my $tree = build_tree($deps);
+my $tree = clean_tree($deps);
+dump_graphviz($tree);