GenLibDeps.pl revision b7e65b8a6abb6c3bc41336aec4ff11ee5dd560ac
1d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#!/usr/bin/perl -w 2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# 3aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann# Program: GenLibDeps.pl 4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# 5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# Synopsis: Generate HTML output that shows the dependencies between a set of 6fa3dc8fee8b3525e53b8b2513b57abfc8bf93927Marcel Holtmann# libraries. The output of this script should periodically replace 7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# the similar content in the UsingLibraries.html document. 8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# 9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# Syntax: GenLibDeps.pl <directory_with_libraries_in_it> 10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# 11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# Give first option a name. 13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmannmy $Directory = $ARGV[0]; 14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# Open the directory and read its contents, sorting by name and differentiating 16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann# by whether its a library (.a) or an object file (.o) 17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmannopendir DIR,$Directory; 18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmannmy @files = readdir DIR; 19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmannclosedir DIR; 20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann@libs = grep(/libLLVM.*\.a$/,sort(@files)); 21aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann@objs = grep(/LLVM.*\.o$/,sort(@files)); 22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 23d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky# Declare the hashes we will use to keep track of the library and object file 24d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky# symbol definitions. 25aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmannmy %libdefs; 26aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmannmy %objdefs; 27aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann 28aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann# Gather definitions from the libraries 29d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskyforeach $lib (@libs ) { 30e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann open DEFS, 31e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann "nm -g --defined-only $lib | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; 32d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (<DEFS>) { 33aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann chomp($_); 34d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky $libdefs{$_} = $lib; 35d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 36d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky close DEFS; 37d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 38d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 39d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky# Gather definitions from the object files. 40d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskyforeach $obj (@objs ) { 41d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky open DEFS, 4257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann "nm -g --defined-only $obj | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; 4357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann while (<DEFS>) { 4457795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann chomp($_); 4557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann $objdefs{$_} = $obj; 4657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann } 4757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann close DEFS; 4857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann} 4957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 5057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann# Generate one entry in the <dl> list. This generates the <dt> and <dd> elements 5157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann# for one library or object file. The <dt> provides the name of the library or 5257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann# object. The <dd> provides a list of the libraries/objects it depends on. 5357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmannsub gen_one_entry { 5457795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann my $lib = $_[0]; 5557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann print " <dt><b>$lib</b</dt><dd><ul>\n"; 5657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann open UNDEFS, 5757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann "nm -u $lib | grep ' U ' | sed -e 's/ U //' | sort | uniq |"; 5857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann open DEPENDS, 5957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann "| sort | uniq > GenLibDeps.out"; 6057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann while (<UNDEFS>) { 6157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann chomp; 6257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) { 6357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann print DEPENDS "$libdefs{$_}\n"; 6457795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) { 6557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann $libroot = $lib; 6657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann $libroot =~ s/lib(.*).a/$1/; 6757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann if ($objdefs{$_} ne "$libroot.o") { 6857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann print DEPENDS "$objdefs{$_}\n"; 6957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann } 7057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann } 7157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann } 7257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann close UNDEFS; 7357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann close DEPENDS; 74bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann open DF, "<GenLibDeps.out"; 75d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (<DF>) { 76d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky chomp; 77d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print " <li>$_</li>\n"; 78d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 79d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky close DF; 80d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print " </ul></dd>\n"; 81d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 82d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 83d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky# Make sure we flush on write. This is slower but correct based on the way we 84d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky# write I/O in gen_one_entry. 8557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann$| = 1; 8657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 8757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann# Print the definition list tag 8857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmannprint "<dl>\n"; 8957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 9057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann# Print libraries first 91bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmannforeach $lib (@libs) { 92d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky gen_one_entry($lib); 93d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 94d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 95d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky# Print objects second 96d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskyforeach $obj (@objs) { 97d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky gen_one_entry($obj); 98d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 99d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 100d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky# Print end tag of definition list element 101d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskyprint "</dl>\n"; 102d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky