# Give first option a name.
my $Directory = $ARGV[0];
+# Find the "dot" program
+chomp(my $DotPath = `which dot`);
+die "Can't find 'dot'" if (! -x "$DotPath");
+
# Open the directory and read its contents, sorting by name and differentiating
# by whether its a library (.a) or an object file (.o)
opendir DIR,$Directory;
# Gather definitions from the libraries
foreach $lib (@libs ) {
open DEFS,
- "nm -g --defined-only $lib | grep ' [ABCDGRSTVW] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRSTVW] //' | sort | uniq |";
+ "nm -g --defined-only $Directory/$lib | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |";
while (<DEFS>) {
chomp($_);
$libdefs{$_} = $lib;
# Gather definitions from the object files.
foreach $obj (@objs ) {
open DEFS,
- "nm -g --defined-only $obj | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |";
+ "nm -g --defined-only $Directory/$obj | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |";
while (<DEFS>) {
chomp($_);
$objdefs{$_} = $obj;
# object. The <dd> provides a list of the libraries/objects it depends on.
sub gen_one_entry {
my $lib = $_[0];
- print " <dt><b>$lib</b</dt><dd>\n";
+ my $lib_ns = $lib;
+ $lib_ns =~ s/(.*)\.[oa]/$1/;
+ print " <dt><b>$lib</b</dt><dd><ul>\n";
open UNDEFS,
- "nm -u $lib | grep ' U ' | sed -e 's/ U //' | sort | uniq |";
+ "nm -u $Directory/$lib | grep ' U ' | sed -e 's/ U //' | sort | uniq |";
open DEPENDS,
"| sort | uniq > GenLibDeps.out";
while (<UNDEFS>) {
open DF, "<GenLibDeps.out";
while (<DF>) {
chomp;
- print " $_\n";
+ print " <li>$_</li>\n";
+ $suffix = substr($_,length($_)-1,1);
+ $_ =~ s/(.*)\.[oa]/$1/;
+ if ($suffix eq "a") {
+ print DOT "$lib_ns -> $_ [ weight=0 ];\n";
+ } else {
+ print DOT "$lib_ns -> $_ [ weight=10];\n";
+ }
}
close DF;
- print " </dd>\n";
+ print " </ul></dd>\n";
}
# Make sure we flush on write. This is slower but correct based on the way we
# Print the definition list tag
print "<dl>\n";
+open DOT, "| $DotPath -Tgif > libdeps.gif";
+
+print DOT "digraph LibDeps {size=\"40,15\"; ratio=\"1.33333\"; margin=\"0.25\"; rankdir=\"LR\"; mclimit=\"50.0\"; ordering=\"out\"; center=\"1\";\n";
+print DOT "node [shape=\"box\",color=\"#000088\",fillcolor=\"#FFFACD\",fontcolor=\"#5577DD\",style=\"filled\",fontsize=\"24\"];\n";
+print DOT "edge [style=\"solid\",color=\"#000088\"];\n";
# Print libraries first
foreach $lib (@libs) {
gen_one_entry($lib);
}
+print DOT "}\n";
+close DOT;
+open DOT, "| $DotPath -Tgif > objdeps.gif";
+print DOT "digraph ObjDeps {size=\"40,15\"; ratio=\"1.33333\"; margin=\"0.25\"; rankdir=\"LR\"; mclimit=\"50.0\"; ordering=\"out\"; center=\"1\";\n";
+print DOT "node [shape=\"box\",color=\"#000088\",fillcolor=\"#FFFACD\",fontcolor=\"#5577DD\",style=\"filled\",fontsize=\"24\"];\n";
+print DOT "edge [style=\"solid\",color=\"#000088\"];\n";
# Print objects second
foreach $obj (@objs) {
gen_one_entry($obj);
}
+print DOT "}\n";
+close DOT;
+
# Print end tag of definition list element
print "</dl>\n";