]> jfr.im git - irc/quakenet/newserv.git/blob - depmod.pl
BUILD: add require-all build mode
[irc/quakenet/newserv.git] / depmod.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my $verbose=0;
6
7 my %definers;
8 my %reqsyms;
9 my %reqmods;
10 my %printed;
11
12 my @arglist = <*.so>;
13 #push @arglist, "../newserv";
14 my @realarglist;
15
16 open DEPENDS,">modules.dep";
17 open GRAPH,">modgraph.dot";
18
19 if (@ARGV) {
20 if ($ARGV[0] eq "--verbose" or $ARGV[0] eq "-v") {
21 $verbose=1;
22 }
23 }
24
25 for (@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 next if ($sym eq "__bss_start");
45 next if ($sym eq "_end");
46
47 if ($type eq "U") {
48 push @{$reqsyms{$modname}}, $sym;
49 } else {
50 if (defined $definers{$sym}) {
51 print "WARNING: Multiple modules export $sym, at least $modname and $definers{$sym}\n";
52 } else {
53 $definers{$sym}=$modname;
54 }
55 }
56 }
57
58 close NM;
59 }
60
61 print GRAPH "digraph g { \n";
62
63 for (@realarglist) {
64 my $modname=$_;
65
66 $reqmods{$modname} = {};
67
68 for (@{$reqsyms{$modname}}) {
69 my $provider = $definers{$_};
70
71 if (defined $provider) {
72 ${reqmods{$modname}}{$provider}=1;
73 if ($verbose) {
74 print "Module $modname importing $_ from $provider\n";
75 }
76 }
77 }
78 }
79
80 for (@realarglist) {
81 printdep($_);
82 }
83
84 print GRAPH "}\n";
85
86 close GRAPH;
87 close DEPENDS;
88
89 sub printdep {
90 my ($modname) = @_;
91
92 if (!(defined $printed{$modname})) {
93 $printed{$modname}=1;
94
95 for (keys %{$reqmods{$modname}}) {
96 printdep($_);
97 }
98
99 print DEPENDS "$modname";
100 for (keys %{$reqmods{$modname}}) {
101 if (defined ${$reqmods{$_}}{$modname}) {
102 print "ERROR: circular dependency between $modname and $_\n";
103 }
104 print DEPENDS " $_";
105 print GRAPH "\t\"$modname\" -> \"$_\";\n";
106 }
107 print DEPENDS "\n";
108 }
109 }