From 956c8eed2ca24285d1a19cda2f5f878b3e455ca8 Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Tue, 5 Mar 2013 18:31:18 +0000 Subject: world's lamest code for generating graphviz from module deps. --- bin/module-deps.pl | 103 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 7 deletions(-) (limited to 'bin/module-deps.pl') 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); -- cgit