[Libreoffice-commits] core.git: bin/module-deps.pl Makefile.in

Michael Meeks michael.meeks at suse.com
Tue Mar 5 10:32:42 PST 2013


 Makefile.in        |    2 -
 bin/module-deps.pl |  103 +++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 97 insertions(+), 8 deletions(-)

New commits:
commit 956c8eed2ca24285d1a19cda2f5f878b3e455ca8
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Tue Mar 5 18:31:18 2013 +0000

    world's lamest code for generating graphviz from module deps.

diff --git a/Makefile.in b/Makefile.in
index a7803ca..633fed1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -405,7 +405,7 @@ findunusedcode:
 check: dev-install subsequentcheck
 
 dump-deps:
-	$(SRCDIR)/bin/module-deps.pl $(GNUMAKE) $(SRCDIR)/Makefile.gbuild
+	@$(SRCDIR)/bin/module-deps.pl $(GNUMAKE) $(SRCDIR)/Makefile.gbuild
 
 subsequentcheck :| $(if $(filter-out subsequentcheck,$(MAKECMDGOALS)),dev-install)
 	$(GNUMAKE) -j $(CHECK_PARALLELISM) $(GMAKE_OPTIONS) -f $(SRCDIR)/Makefile.gbuild $@
diff --git a/bin/module-deps.pl b/bin/module-deps.pl
index 453570a..7263862 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);


More information about the Libreoffice-commits mailing list