]> jfr.im git - irc/quakenet/newserv.git/blame - depmod.pl
BUILD: add require-all build mode
[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");
19311273
CP
44 next if ($sym eq "__bss_start");
45 next if ($sym eq "_end");
3fa581ac 46
47 if ($type eq "U") {
48 push @{$reqsyms{$modname}}, $sym;
49 } else {
50 if (defined $definers{$sym}) {
7bbde104 51 print "WARNING: Multiple modules export $sym, at least $modname and $definers{$sym}\n";
3fa581ac 52 } else {
53 $definers{$sym}=$modname;
54 }
55 }
56 }
57
58 close NM;
59}
60
61print GRAPH "digraph g { \n";
62
63for (@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;
f8847966 73 if ($verbose) {
74 print "Module $modname importing $_ from $provider\n";
75 }
3fa581ac 76 }
77 }
78}
79
80for (@realarglist) {
81 printdep($_);
82}
83
84print GRAPH "}\n";
85
86close GRAPH;
87close DEPENDS;
88
89sub 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}}) {
f8847966 101 if (defined ${$reqmods{$_}}{$modname}) {
102 print "ERROR: circular dependency between $modname and $_\n";
103 }
3fa581ac 104 print DEPENDS " $_";
105 print GRAPH "\t\"$modname\" -> \"$_\";\n";
106 }
107 print DEPENDS "\n";
108 }
109}