1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/perl -w 2*9880d681SAndroid Build Coastguard Worker# 3*9880d681SAndroid Build Coastguard Worker# Program: GenLibDeps.pl 4*9880d681SAndroid Build Coastguard Worker# 5*9880d681SAndroid Build Coastguard Worker# Synopsis: Generate HTML output that shows the dependencies between a set of 6*9880d681SAndroid Build Coastguard Worker# libraries. The output of this script should periodically replace 7*9880d681SAndroid Build Coastguard Worker# the similar content in the UsingLibraries.html document. 8*9880d681SAndroid Build Coastguard Worker# 9*9880d681SAndroid Build Coastguard Worker# Syntax: GenLibDeps.pl [-flat] <directory_with_libraries_in_it> [path_to_nm_binary] 10*9880d681SAndroid Build Coastguard Worker# 11*9880d681SAndroid Build Coastguard Workeruse strict; 12*9880d681SAndroid Build Coastguard Workeruse warnings; 13*9880d681SAndroid Build Coastguard Worker# Parse arguments... 14*9880d681SAndroid Build Coastguard Workermy $FLAT = 0; 15*9880d681SAndroid Build Coastguard Workermy $WHY = 0; 16*9880d681SAndroid Build Coastguard Workermy $PEROBJ = 0; 17*9880d681SAndroid Build Coastguard Workermy $PEROBJINCL = 0; 18*9880d681SAndroid Build Coastguard Workerwhile (scalar(@ARGV) and ($_ = $ARGV[0], /^[-+]/)) { 19*9880d681SAndroid Build Coastguard Worker shift; 20*9880d681SAndroid Build Coastguard Worker last if /^--$/; # Stop processing arguments on -- 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker # List command line options here... 23*9880d681SAndroid Build Coastguard Worker if (/^-flat$/) { $FLAT = 1; next; } 24*9880d681SAndroid Build Coastguard Worker if (/^-why/) { $WHY = 1; $FLAT = 1; next; } 25*9880d681SAndroid Build Coastguard Worker if (/^-perobj$/) { $PEROBJ = 1; next; } 26*9880d681SAndroid Build Coastguard Worker if (/^-perobjincl/) { $PEROBJINCL = 1; next;} 27*9880d681SAndroid Build Coastguard Worker print "Unknown option: $_ : ignoring!\n"; 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker# Give first option a name. 31*9880d681SAndroid Build Coastguard Workermy $Directory = $ARGV[0]; 32*9880d681SAndroid Build Coastguard Workerif (!defined($Directory) || ! -d "$Directory") { 33*9880d681SAndroid Build Coastguard Worker die "First argument must specify the directory containing LLVM libs\n"; 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workermy $nmPath = $ARGV[1]; 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker# Find the "dot" program 39*9880d681SAndroid Build Coastguard Workermy $DotPath=""; 40*9880d681SAndroid Build Coastguard Workerif (!$FLAT) { 41*9880d681SAndroid Build Coastguard Worker chomp($DotPath = `which dot`); 42*9880d681SAndroid Build Coastguard Worker die "Can't find 'dot'" if (! -x "$DotPath"); 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerif (defined($ENV{NM})) { 46*9880d681SAndroid Build Coastguard Worker chomp($nmPath=$ENV{NM}); 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerif (!defined($nmPath) || $nmPath eq "") { 50*9880d681SAndroid Build Coastguard Worker chomp($nmPath=`which nm`); 51*9880d681SAndroid Build Coastguard Worker die "Can't find 'nm'" if (! -x "$nmPath"); 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workermy $ranlibPath; 55*9880d681SAndroid Build Coastguard Workerif ($PEROBJ) { 56*9880d681SAndroid Build Coastguard Worker $ranlibPath = $ARGV[2]; 57*9880d681SAndroid Build Coastguard Worker if (defined($ENV{RANLIB})) { 58*9880d681SAndroid Build Coastguard Worker chomp($ranlibPath=$ENV{RANLIB}); 59*9880d681SAndroid Build Coastguard Worker } 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker if (!defined($ranlibPath) || $ranlibPath eq "") { 62*9880d681SAndroid Build Coastguard Worker chomp($ranlibPath=`which ranlib`); 63*9880d681SAndroid Build Coastguard Worker die "Can't find 'ranlib'" if (! -x "$ranlibPath"); 64*9880d681SAndroid Build Coastguard Worker } 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker# Open the directory and read its contents, sorting by name and differentiating 68*9880d681SAndroid Build Coastguard Worker# by whether its a library (.a) or an object file (.o) 69*9880d681SAndroid Build Coastguard Workeropendir DIR,$Directory; 70*9880d681SAndroid Build Coastguard Workermy @files = readdir DIR; 71*9880d681SAndroid Build Coastguard Workerclosedir DIR; 72*9880d681SAndroid Build Coastguard Workermy @libs = grep(/libLLVM.*\.(dylib|so|a)$/,sort(@files)); 73*9880d681SAndroid Build Coastguard Worker# Omit the all-of-llvm shared library. 74*9880d681SAndroid Build Coastguard Worker@libs = grep(!/libLLVM-\d\.\d(svn)?\.(dylib|so)/, @libs); 75*9880d681SAndroid Build Coastguard Workermy @objs = grep(/LLVM.*\.o$/,sort(@files)); 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker# Declare the hashes we will use to keep track of the library and object file 78*9880d681SAndroid Build Coastguard Worker# symbol definitions. 79*9880d681SAndroid Build Coastguard Workermy %libdefs; 80*9880d681SAndroid Build Coastguard Workermy %objdefs; 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workermy %libobjs; 83*9880d681SAndroid Build Coastguard Workermy %objdeps=(); 84*9880d681SAndroid Build Coastguard Worker# Gather library definitions at object file granularity (optional) 85*9880d681SAndroid Build Coastguard Workerif ($PEROBJ) { 86*9880d681SAndroid Build Coastguard Worker foreach my $lib (@libs ) { 87*9880d681SAndroid Build Coastguard Worker `$ranlibPath $Directory/$lib`; 88*9880d681SAndroid Build Coastguard Worker my $libpath = $lib; 89*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^libLLVM(.*)\.a/$1/; 90*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)CodeGen$/Target\/$1/; 91*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)AsmPrinter$/Target\/$1\/AsmPrinter/; 92*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)AsmParser$/Target\/$1\/AsmParser/; 93*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)Info$/Target\/$1\/TargetInfo/; 94*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)Disassembler$/Target\/$1\/Disassembler/; 95*9880d681SAndroid Build Coastguard Worker $libpath =~ s/SelectionDAG/CodeGen\/SelectionDAG/; 96*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^AsmPrinter/CodeGen\/AsmPrinter/; 97*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^BitReader/Bitcode\/Reader/; 98*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^BitWriter/Bitcode\/Writer/; 99*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^MSIL/Target\/MSIL/; 100*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^Core/IR/; 101*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^Instrumentation/Transforms\/Instrumentation/; 102*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^Interpreter/ExecutionEngine\/Interpreter/; 103*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^JIT/ExecutionEngine\/JIT/; 104*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^ScalarOpts/Transforms\/Scalar/; 105*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^TransformUtils/Transforms\/Utils/; 106*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^ipa/Analysis\/IPA/; 107*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^ipo/Transforms\/IPO/; 108*9880d681SAndroid Build Coastguard Worker $libpath = "lib/".$libpath."/"; 109*9880d681SAndroid Build Coastguard Worker open DEFS, "$nmPath -sg $Directory/$lib|"; 110*9880d681SAndroid Build Coastguard Worker while (<DEFS>) { 111*9880d681SAndroid Build Coastguard Worker chomp; 112*9880d681SAndroid Build Coastguard Worker if (/^([^ ]*) in ([^ ]*)/) { 113*9880d681SAndroid Build Coastguard Worker my $objfile = $libpath.$2; 114*9880d681SAndroid Build Coastguard Worker $objdefs{$1} = $objfile; 115*9880d681SAndroid Build Coastguard Worker $objdeps{$objfile} = {}; 116*9880d681SAndroid Build Coastguard Worker $libobjs{$lib}{$objfile}=1; 117*9880d681SAndroid Build Coastguard Worker# my $p = "../llvm/".$objfile; 118*9880d681SAndroid Build Coastguard Worker# $p =~ s/Support\/reg(.*).o/Support\/reg$1.c/; 119*9880d681SAndroid Build Coastguard Worker# $p =~ s/.o$/.cpp/; 120*9880d681SAndroid Build Coastguard Worker# unless (-e $p) { 121*9880d681SAndroid Build Coastguard Worker# die "$p\n" 122*9880d681SAndroid Build Coastguard Worker# } 123*9880d681SAndroid Build Coastguard Worker } 124*9880d681SAndroid Build Coastguard Worker } 125*9880d681SAndroid Build Coastguard Worker close DEFS or die "nm failed"; 126*9880d681SAndroid Build Coastguard Worker } 127*9880d681SAndroid Build Coastguard Worker foreach my $lib (@libs ) { 128*9880d681SAndroid Build Coastguard Worker my $libpath = $lib; 129*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^libLLVM(.*)\.a/$1/; 130*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)CodeGen$/Target\/$1/; 131*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)AsmPrinter$/Target\/$1\/AsmPrinter/; 132*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)AsmParser$/Target\/$1\/AsmParser/; 133*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)Info$/Target\/$1\/TargetInfo/; 134*9880d681SAndroid Build Coastguard Worker $libpath =~ s/(.+)Disassembler$/Target\/$1\/Disassembler/; 135*9880d681SAndroid Build Coastguard Worker $libpath =~ s/SelectionDAG/CodeGen\/SelectionDAG/; 136*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^AsmPrinter/CodeGen\/AsmPrinter/; 137*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^BitReader/Bitcode\/Reader/; 138*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^BitWriter/Bitcode\/Writer/; 139*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^MSIL/Target\/MSIL/; 140*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^Core/VMCore/; 141*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^Instrumentation/Transforms\/Instrumentation/; 142*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^Interpreter/ExecutionEngine\/Interpreter/; 143*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^JIT/ExecutionEngine\/JIT/; 144*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^ScalarOpts/Transforms\/Scalar/; 145*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^TransformUtils/Transforms\/Utils/; 146*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^ipa/Analysis\/IPA/; 147*9880d681SAndroid Build Coastguard Worker $libpath =~ s/^ipo/Transforms\/IPO/; 148*9880d681SAndroid Build Coastguard Worker $libpath = "lib/".$libpath."/"; 149*9880d681SAndroid Build Coastguard Worker open UDEFS, "$nmPath -Aup $Directory/$lib|"; 150*9880d681SAndroid Build Coastguard Worker while (<UDEFS>) { 151*9880d681SAndroid Build Coastguard Worker chomp; 152*9880d681SAndroid Build Coastguard Worker if (/:([^:]+):/) { 153*9880d681SAndroid Build Coastguard Worker my $obj = $libpath.$1; 154*9880d681SAndroid Build Coastguard Worker s/[^ ]+: *U //; 155*9880d681SAndroid Build Coastguard Worker if (defined($objdefs{$_})) { 156*9880d681SAndroid Build Coastguard Worker $objdeps{$obj}{$objdefs{$_}}=1; 157*9880d681SAndroid Build Coastguard Worker } 158*9880d681SAndroid Build Coastguard Worker } 159*9880d681SAndroid Build Coastguard Worker } 160*9880d681SAndroid Build Coastguard Worker close UDEFS or die "nm failed" 161*9880d681SAndroid Build Coastguard Worker } 162*9880d681SAndroid Build Coastguard Worker} else { 163*9880d681SAndroid Build Coastguard Worker# Gather definitions from the libraries 164*9880d681SAndroid Build Coastguard Workerforeach my $lib (@libs ) { 165*9880d681SAndroid Build Coastguard Worker open DEFS, "$nmPath -g $Directory/$lib|"; 166*9880d681SAndroid Build Coastguard Worker while (<DEFS>) { 167*9880d681SAndroid Build Coastguard Worker next if (! / [ABCDGRST] /); 168*9880d681SAndroid Build Coastguard Worker s/^[^ ]* [ABCDGRST] //; 169*9880d681SAndroid Build Coastguard Worker s/\015?\012//; # not sure if <DEFS> is in binmode and uses LF or CRLF. 170*9880d681SAndroid Build Coastguard Worker # this strips both LF and CRLF. 171*9880d681SAndroid Build Coastguard Worker $libdefs{$_} = $lib; 172*9880d681SAndroid Build Coastguard Worker } 173*9880d681SAndroid Build Coastguard Worker close DEFS or die "nm failed"; 174*9880d681SAndroid Build Coastguard Worker} 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker# Gather definitions from the object files. 178*9880d681SAndroid Build Coastguard Workerforeach my $obj (@objs ) { 179*9880d681SAndroid Build Coastguard Worker open DEFS, "$nmPath -g $Directory/$obj |"; 180*9880d681SAndroid Build Coastguard Worker while (<DEFS>) { 181*9880d681SAndroid Build Coastguard Worker next if (! / [ABCDGRST] /); 182*9880d681SAndroid Build Coastguard Worker s/^[^ ]* [ABCDGRST] //; 183*9880d681SAndroid Build Coastguard Worker s/\015?\012//; # not sure if <DEFS> is in binmode and uses LF or CRLF. 184*9880d681SAndroid Build Coastguard Worker # this strips both LF and CRLF. 185*9880d681SAndroid Build Coastguard Worker $objdefs{$_} = $obj; 186*9880d681SAndroid Build Coastguard Worker } 187*9880d681SAndroid Build Coastguard Worker close DEFS or die "nm failed"; 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker# Generate one entry in the <dl> list. This generates the <dt> and <dd> elements 191*9880d681SAndroid Build Coastguard Worker# for one library or object file. The <dt> provides the name of the library or 192*9880d681SAndroid Build Coastguard Worker# object. The <dd> provides a list of the libraries/objects it depends on. 193*9880d681SAndroid Build Coastguard Workersub gen_one_entry { 194*9880d681SAndroid Build Coastguard Worker my $lib = $_[0]; 195*9880d681SAndroid Build Coastguard Worker my $lib_ns = $lib; 196*9880d681SAndroid Build Coastguard Worker $lib_ns =~ s/(.*)\.[oa]/$1/; 197*9880d681SAndroid Build Coastguard Worker if ($FLAT) { 198*9880d681SAndroid Build Coastguard Worker print "$lib:"; 199*9880d681SAndroid Build Coastguard Worker if ($WHY) { print "\n"; } 200*9880d681SAndroid Build Coastguard Worker } else { 201*9880d681SAndroid Build Coastguard Worker print " <dt><b>$lib</b></dt><dd><ul>\n"; 202*9880d681SAndroid Build Coastguard Worker } 203*9880d681SAndroid Build Coastguard Worker open UNDEFS, 204*9880d681SAndroid Build Coastguard Worker "$nmPath -u $Directory/$lib | sed -e 's/^[ 0]* U //' | sort | uniq |"; 205*9880d681SAndroid Build Coastguard Worker my %DepLibs; 206*9880d681SAndroid Build Coastguard Worker while (<UNDEFS>) { 207*9880d681SAndroid Build Coastguard Worker chomp; 208*9880d681SAndroid Build Coastguard Worker my $lib_printed = 0; 209*9880d681SAndroid Build Coastguard Worker if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) { 210*9880d681SAndroid Build Coastguard Worker $DepLibs{$libdefs{$_}} = [] unless exists $DepLibs{$libdefs{$_}}; 211*9880d681SAndroid Build Coastguard Worker push(@{$DepLibs{$libdefs{$_}}}, $_); 212*9880d681SAndroid Build Coastguard Worker } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) { 213*9880d681SAndroid Build Coastguard Worker if ($PEROBJ && !$PEROBJINCL) { 214*9880d681SAndroid Build Coastguard Worker # -perobjincl makes .a files depend on .o files they contain themselves 215*9880d681SAndroid Build Coastguard Worker # default is don't depend on these. 216*9880d681SAndroid Build Coastguard Worker next if defined $libobjs{$lib}{$objdefs{$_}}; 217*9880d681SAndroid Build Coastguard Worker } 218*9880d681SAndroid Build Coastguard Worker my $libroot = $lib; 219*9880d681SAndroid Build Coastguard Worker $libroot =~ s/lib(.*).a/$1/; 220*9880d681SAndroid Build Coastguard Worker if ($objdefs{$_} ne "$libroot.o") { 221*9880d681SAndroid Build Coastguard Worker $DepLibs{$objdefs{$_}} = [] unless exists $DepLibs{$objdefs{$_}}; 222*9880d681SAndroid Build Coastguard Worker push(@{$DepLibs{$objdefs{$_}}}, $_); 223*9880d681SAndroid Build Coastguard Worker } 224*9880d681SAndroid Build Coastguard Worker } 225*9880d681SAndroid Build Coastguard Worker } 226*9880d681SAndroid Build Coastguard Worker close UNDEFS or die "nm failed"; 227*9880d681SAndroid Build Coastguard Worker unless(keys %DepLibs) { 228*9880d681SAndroid Build Coastguard Worker # above failed 229*9880d681SAndroid Build Coastguard Worker open UNDEFS, "$nmPath -u $Directory/$lib |"; 230*9880d681SAndroid Build Coastguard Worker while (<UNDEFS>) { 231*9880d681SAndroid Build Coastguard Worker # to bypass non-working sed 232*9880d681SAndroid Build Coastguard Worker if (' ' eq substr($_,0,2) and index($_,'U ')) { 233*9880d681SAndroid Build Coastguard Worker $_ = substr($_,index($_,'U ')+2) 234*9880d681SAndroid Build Coastguard Worker }; 235*9880d681SAndroid Build Coastguard Worker $_ = substr($_,index($_,' *U ')+5) if -1!=index($_,' *U '); 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker chomp; 238*9880d681SAndroid Build Coastguard Worker my $lib_printed = 0; 239*9880d681SAndroid Build Coastguard Worker if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) { 240*9880d681SAndroid Build Coastguard Worker $DepLibs{$libdefs{$_}} = [] unless exists $DepLibs{$libdefs{$_}}; 241*9880d681SAndroid Build Coastguard Worker push(@{$DepLibs{$libdefs{$_}}}, $_); 242*9880d681SAndroid Build Coastguard Worker } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) { 243*9880d681SAndroid Build Coastguard Worker my $libroot = $lib; 244*9880d681SAndroid Build Coastguard Worker $libroot =~ s/lib(.*).a/$1/; 245*9880d681SAndroid Build Coastguard Worker if ($objdefs{$_} ne "$libroot.o") { 246*9880d681SAndroid Build Coastguard Worker $DepLibs{$objdefs{$_}} = [] unless exists $DepLibs{$objdefs{$_}}; 247*9880d681SAndroid Build Coastguard Worker push(@{$DepLibs{$objdefs{$_}}}, $_); 248*9880d681SAndroid Build Coastguard Worker } 249*9880d681SAndroid Build Coastguard Worker } 250*9880d681SAndroid Build Coastguard Worker } 251*9880d681SAndroid Build Coastguard Worker close UNDEFS or die "nm failed"; 252*9880d681SAndroid Build Coastguard Worker } 253*9880d681SAndroid Build Coastguard Worker if ($PEROBJINCL) { 254*9880d681SAndroid Build Coastguard Worker # include the .a's objects 255*9880d681SAndroid Build Coastguard Worker for my $obj (keys %{$libobjs{$lib}}) { 256*9880d681SAndroid Build Coastguard Worker $DepLibs{$obj} = ["<.a object>"] unless exists $DepLibs{$obj}; 257*9880d681SAndroid Build Coastguard Worker } 258*9880d681SAndroid Build Coastguard Worker my $madechange = 1; 259*9880d681SAndroid Build Coastguard Worker while($madechange) { 260*9880d681SAndroid Build Coastguard Worker $madechange = 0; 261*9880d681SAndroid Build Coastguard Worker my %temp = %DepLibs; 262*9880d681SAndroid Build Coastguard Worker foreach my $obj (keys %DepLibs) { 263*9880d681SAndroid Build Coastguard Worker foreach my $objdeps (keys %{$objdeps{$obj}}) { 264*9880d681SAndroid Build Coastguard Worker next if defined $temp{$objdeps}; 265*9880d681SAndroid Build Coastguard Worker push(@{$temp{$objdeps}}, $obj); 266*9880d681SAndroid Build Coastguard Worker $madechange = 1; 267*9880d681SAndroid Build Coastguard Worker } 268*9880d681SAndroid Build Coastguard Worker } 269*9880d681SAndroid Build Coastguard Worker %DepLibs = %temp; 270*9880d681SAndroid Build Coastguard Worker } 271*9880d681SAndroid Build Coastguard Worker } 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker for my $key (sort keys %DepLibs) { 274*9880d681SAndroid Build Coastguard Worker if ($FLAT) { 275*9880d681SAndroid Build Coastguard Worker print " $key"; 276*9880d681SAndroid Build Coastguard Worker if ($WHY) { 277*9880d681SAndroid Build Coastguard Worker print "\n"; 278*9880d681SAndroid Build Coastguard Worker my @syms = @{$DepLibs{$key}}; 279*9880d681SAndroid Build Coastguard Worker foreach my $sym (@syms) { 280*9880d681SAndroid Build Coastguard Worker print " $sym\n"; 281*9880d681SAndroid Build Coastguard Worker } 282*9880d681SAndroid Build Coastguard Worker } 283*9880d681SAndroid Build Coastguard Worker } else { 284*9880d681SAndroid Build Coastguard Worker print " <li>$key</li>\n"; 285*9880d681SAndroid Build Coastguard Worker } 286*9880d681SAndroid Build Coastguard Worker my $suffix = substr($key,length($key)-1,1); 287*9880d681SAndroid Build Coastguard Worker $key =~ s/(.*)\.[oa]/$1/; 288*9880d681SAndroid Build Coastguard Worker if ($suffix eq "a") { 289*9880d681SAndroid Build Coastguard Worker if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=0 ];\n" }; 290*9880d681SAndroid Build Coastguard Worker } else { 291*9880d681SAndroid Build Coastguard Worker if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=10];\n" }; 292*9880d681SAndroid Build Coastguard Worker } 293*9880d681SAndroid Build Coastguard Worker } 294*9880d681SAndroid Build Coastguard Worker if ($FLAT) { 295*9880d681SAndroid Build Coastguard Worker if (!$WHY) { 296*9880d681SAndroid Build Coastguard Worker print "\n"; 297*9880d681SAndroid Build Coastguard Worker } 298*9880d681SAndroid Build Coastguard Worker } else { 299*9880d681SAndroid Build Coastguard Worker print " </ul></dd>\n"; 300*9880d681SAndroid Build Coastguard Worker } 301*9880d681SAndroid Build Coastguard Worker} 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker# Make sure we flush on write. This is slower but correct based on the way we 304*9880d681SAndroid Build Coastguard Worker# write I/O in gen_one_entry. 305*9880d681SAndroid Build Coastguard Worker$| = 1; 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker# Print the definition list tag 308*9880d681SAndroid Build Coastguard Workerif (!$FLAT) { 309*9880d681SAndroid Build Coastguard Worker print "<dl>\n"; 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker open DOT, "| $DotPath -Tgif > libdeps.gif"; 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker print DOT "digraph LibDeps {\n"; 314*9880d681SAndroid Build Coastguard Worker print DOT " size=\"40,15\"; \n"; 315*9880d681SAndroid Build Coastguard Worker print DOT " ratio=\"1.33333\"; \n"; 316*9880d681SAndroid Build Coastguard Worker print DOT " margin=\"0.25\"; \n"; 317*9880d681SAndroid Build Coastguard Worker print DOT " rankdir=\"LR\"; \n"; 318*9880d681SAndroid Build Coastguard Worker print DOT " mclimit=\"50.0\"; \n"; 319*9880d681SAndroid Build Coastguard Worker print DOT " ordering=\"out\"; \n"; 320*9880d681SAndroid Build Coastguard Worker print DOT " center=\"1\";\n"; 321*9880d681SAndroid Build Coastguard Worker print DOT "node [shape=\"box\",\n"; 322*9880d681SAndroid Build Coastguard Worker print DOT " color=\"#000088\",\n"; 323*9880d681SAndroid Build Coastguard Worker print DOT " fillcolor=\"#FFFACD\",\n"; 324*9880d681SAndroid Build Coastguard Worker print DOT " fontcolor=\"#3355BB\",\n"; 325*9880d681SAndroid Build Coastguard Worker print DOT " style=\"filled\",\n"; 326*9880d681SAndroid Build Coastguard Worker print DOT " fontname=\"sans\",\n"; 327*9880d681SAndroid Build Coastguard Worker print DOT " fontsize=\"24\"\n"; 328*9880d681SAndroid Build Coastguard Worker print DOT "];\n"; 329*9880d681SAndroid Build Coastguard Worker print DOT "edge [dir=\"forward\",style=\"solid\",color=\"#000088\"];\n"; 330*9880d681SAndroid Build Coastguard Worker} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker# Print libraries first 333*9880d681SAndroid Build Coastguard Workerforeach my $lib (@libs) { 334*9880d681SAndroid Build Coastguard Worker gen_one_entry($lib); 335*9880d681SAndroid Build Coastguard Worker} 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Workerif ($PEROBJ) { 338*9880d681SAndroid Build Coastguard Worker foreach my $obj (keys %objdeps) { 339*9880d681SAndroid Build Coastguard Worker print "$obj:"; 340*9880d681SAndroid Build Coastguard Worker if (!$PEROBJINCL) { 341*9880d681SAndroid Build Coastguard Worker foreach my $dep (keys %{$objdeps{$obj}}) { 342*9880d681SAndroid Build Coastguard Worker print " $dep"; 343*9880d681SAndroid Build Coastguard Worker } 344*9880d681SAndroid Build Coastguard Worker } 345*9880d681SAndroid Build Coastguard Worker print "\n"; 346*9880d681SAndroid Build Coastguard Worker } 347*9880d681SAndroid Build Coastguard Worker} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workerif (!$FLAT) { 350*9880d681SAndroid Build Coastguard Worker print DOT "}\n"; 351*9880d681SAndroid Build Coastguard Worker close DOT; 352*9880d681SAndroid Build Coastguard Worker open DOT, "| $DotPath -Tgif > objdeps.gif"; 353*9880d681SAndroid Build Coastguard Worker print DOT "digraph ObjDeps {\n"; 354*9880d681SAndroid Build Coastguard Worker print DOT " size=\"8,10\";\n"; 355*9880d681SAndroid Build Coastguard Worker print DOT " margin=\"0.25\";\n"; 356*9880d681SAndroid Build Coastguard Worker print DOT " rankdir=\"LR\";\n"; 357*9880d681SAndroid Build Coastguard Worker print DOT " mclimit=\"50.0\";\n"; 358*9880d681SAndroid Build Coastguard Worker print DOT " ordering=\"out\";\n"; 359*9880d681SAndroid Build Coastguard Worker print DOT " center=\"1\";\n"; 360*9880d681SAndroid Build Coastguard Worker print DOT "node [shape=\"box\",\n"; 361*9880d681SAndroid Build Coastguard Worker print DOT " color=\"#000088\",\n"; 362*9880d681SAndroid Build Coastguard Worker print DOT " fillcolor=\"#FFFACD\",\n"; 363*9880d681SAndroid Build Coastguard Worker print DOT " fontcolor=\"#3355BB\",\n"; 364*9880d681SAndroid Build Coastguard Worker print DOT " fontname=\"sans\",\n"; 365*9880d681SAndroid Build Coastguard Worker print DOT " style=\"filled\",\n"; 366*9880d681SAndroid Build Coastguard Worker print DOT " fontsize=\"24\"\n"; 367*9880d681SAndroid Build Coastguard Worker print DOT "];\n"; 368*9880d681SAndroid Build Coastguard Worker print DOT "edge [dir=\"forward\",style=\"solid\",color=\"#000088\"];\n"; 369*9880d681SAndroid Build Coastguard Worker} 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Worker# Print objects second 372*9880d681SAndroid Build Coastguard Workerforeach my $obj (@objs) { 373*9880d681SAndroid Build Coastguard Worker gen_one_entry($obj); 374*9880d681SAndroid Build Coastguard Worker} 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Workerif (!$FLAT) { 377*9880d681SAndroid Build Coastguard Worker print DOT "}\n"; 378*9880d681SAndroid Build Coastguard Worker close DOT; 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Worker# Print end tag of definition list element 381*9880d681SAndroid Build Coastguard Worker print "</dl>\n"; 382*9880d681SAndroid Build Coastguard Worker} 383