]> jfr.im git - irc/quakenet/newserv.git/blame - depmod.pl
CHANSERV: fix issue where chanserv_relay doesn't wait for db to be loaded before...
[irc/quakenet/newserv.git] / depmod.pl
CommitLineData
3fa581ac 1#!/usr/bin/perl -w
2
3use strict;
4
f8847966 5my $verbose=0;
6
3fa581ac 7my %definers;
8my %reqsyms;
9my %reqmods;
10my %printed;
11
12my @arglist = <*.so>;
13#push @arglist, "../newserv";
14my @realarglist;
15
16open DEPENDS,">modules.dep";
17open GRAPH,">modgraph.dot";
18
f8847966 19if (@ARGV) {
20 if ($ARGV[0] eq "--verbose" or $ARGV[0] eq "-v") {
21 $verbose=1;
22 }
23}
24
3fa581ac 25for (@arglist) {
26 my $modname=$_;
27 open NM,"nm $modname |";
28
29 $modname =~ s/.so$//;
30
31 push @realarglist, $modname;
32
33 $reqsyms{$modname} = [];
34
35 while (<NM>) {
36 chomp;
37 next unless (/([URTB]) (\S+)/);
38
39 my ($type,$sym) = ($1, $2);
40
41 next if ($sym eq "_init");
42 next if ($sym eq "_fini");
43 next if ($sym eq "_version");
44
45 if ($type eq "U") {
46 push @{$reqsyms{$modname}}, $sym;
47 } else {
48 if (defined $definers{$sym}) {
7bbde104 49 print "WARNING: Multiple modules export $sym, at least $modname and $definers{$sym}\n";
3fa581ac 50 } else {
51 $definers{$sym}=$modname;
52 }
53 }
54 }
55
56 close NM;
57}
58
59print GRAPH "digraph g { \n";
60
61for (@realarglist) {
62 my $modname=$_;
63
64 $reqmods{$modname} = {};
65
66 for (@{$reqsyms{$modname}}) {
67 my $provider = $definers{$_};
68
69 if (defined $provider) {
70 ${reqmods{$modname}}{$provider}=1;
f8847966 71 if ($verbose) {
72 print "Module $modname importing $_ from $provider\n";
73 }
3fa581ac 74 }
75 }
76}
77
78for (@realarglist) {
79 printdep($_);
80}
81
82print GRAPH "}\n";
83
84close GRAPH;
85close DEPENDS;
86
87sub printdep {
88 my ($modname) = @_;
89
90 if (!(defined $printed{$modname})) {
91 $printed{$modname}=1;
92
93 for (keys %{$reqmods{$modname}}) {
94 printdep($_);
95 }
96
97 print DEPENDS "$modname";
98 for (keys %{$reqmods{$modname}}) {
f8847966 99 if (defined ${$reqmods{$_}}{$modname}) {
100 print "ERROR: circular dependency between $modname and $_\n";
101 }
3fa581ac 102 print DEPENDS " $_";
103 print GRAPH "\t\"$modname\" -> \"$_\";\n";
104 }
105 print DEPENDS "\n";
106 }
107}