]> jfr.im git - irc/quakenet/newserv.git/blob - depmod.pl
Merged.
[irc/quakenet/newserv.git] / depmod.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my %definers;
6 my %reqsyms;
7 my %reqmods;
8 my %printed;
9
10 my @arglist = <*.so>;
11 #push @arglist, "../newserv";
12 my @realarglist;
13
14 open DEPENDS,">modules.dep";
15 open GRAPH,">modgraph.dot";
16
17 for (@arglist) {
18 my $modname=$_;
19 open NM,"nm $modname |";
20
21 $modname =~ s/.so$//;
22
23 push @realarglist, $modname;
24
25 $reqsyms{$modname} = [];
26
27 while (<NM>) {
28 chomp;
29 next unless (/([URTB]) (\S+)/);
30
31 my ($type,$sym) = ($1, $2);
32
33 next if ($sym eq "_init");
34 next if ($sym eq "_fini");
35 next if ($sym eq "_version");
36
37 if ($type eq "U") {
38 push @{$reqsyms{$modname}}, $sym;
39 } else {
40 if (defined $definers{$sym}) {
41 print "Error: Multiple modules are providing $sym, at least $modname and $definers{$sym}\n";
42 } else {
43 $definers{$sym}=$modname;
44 }
45 }
46 }
47
48 close NM;
49 }
50
51 print GRAPH "digraph g { \n";
52
53 for (@realarglist) {
54 my $modname=$_;
55
56 $reqmods{$modname} = {};
57
58 for (@{$reqsyms{$modname}}) {
59 my $provider = $definers{$_};
60
61 if (defined $provider) {
62 ${reqmods{$modname}}{$provider}=1;
63 }
64 }
65 }
66
67 for (@realarglist) {
68 printdep($_);
69 }
70
71 print GRAPH "}\n";
72
73 close GRAPH;
74 close DEPENDS;
75
76 sub printdep {
77 my ($modname) = @_;
78
79 if (!(defined $printed{$modname})) {
80 $printed{$modname}=1;
81
82 for (keys %{$reqmods{$modname}}) {
83 printdep($_);
84 }
85
86 print DEPENDS "$modname";
87 for (keys %{$reqmods{$modname}}) {
88 print DEPENDS " $_";
89 print GRAPH "\t\"$modname\" -> \"$_\";\n";
90 }
91 print DEPENDS "\n";
92 }
93 }