oops, typo
[oweals/openssl.git] / util / src-dep.pl
1 #!/usr/local/bin/perl
2
3 # we make up an array of
4 # $file{function_name}=filename;
5 # $unres{filename}="func1 func2 ...."
6 $debug=1;
7 #$nm_func="parse_linux";
8 $nm_func="parse_solaris";
9
10 foreach (@ARGV)
11         {
12         &$nm_func($_);
13         }
14
15 foreach $file (sort keys %unres)
16         {
17         @a=split(/\s+/,$unres{$file});
18         %ff=();
19         foreach $func (@a)
20                 {
21                 $f=$file{$func};
22                 $ff{$f}=1 if $f ne "";
23                 }
24
25         foreach $a (keys %ff)
26                 { $we_need{$file}.="$a "; }
27         }
28
29 foreach $file (sort keys %we_need)
30         {
31 #       print " $file $we_need{$file}\n";
32         foreach $bit (split(/\s+/,$we_need{$file}))
33                 { push(@final,&walk($bit)); }
34
35         foreach (@final) { $fin{$_}=1; }
36         @final="";
37         foreach (sort keys %fin)
38                 { push(@final,$_); }
39
40         print "$file: @final\n";
41         }
42
43 sub walk
44         {
45         local($f)=@_;
46         local(@a,%seen,@ret,$r);
47
48         @ret="";
49         $f =~ s/^\s+//;
50         $f =~ s/\s+$//;
51         return "" if ($f =~ "^\s*$");
52
53         return(split(/\s/,$done{$f})) if defined ($done{$f});
54
55         return if $in{$f} > 0;
56         $in{$f}++;
57         push(@ret,$f);
58         foreach $r (split(/\s+/,$we_need{$f}))
59                 {
60                 push(@ret,&walk($r));
61                 }
62         $in{$f}--;
63         $done{$f}=join(" ",@ret);
64         return(@ret);
65         }
66
67 sub parse_linux
68         {
69         local($name)=@_;
70
71         open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n";
72         while (<IN>)
73                 {
74                 chop;
75                 next if /^\s*$/;
76                 if (/^[^[](.*):$/)
77                         {
78                         $file=$1;
79                         $file="$1.c" if /\[(.*).o\]/;
80                         print STDERR "$file\n";
81                         $we_need{$file}=" ";
82                         next;
83                         }
84
85                 @a=split(/\s*\|\s*/);
86                 next unless $#a == 7;
87                 next unless $a[4] eq "GLOB";
88                 if ($a[6] eq "UNDEF")
89                         {
90                         $unres{$file}.=$a[7]." ";
91                         }
92                 else
93                         {
94                         if ($file{$a[7]} ne "")
95                                 {
96                                 print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n";
97                                 }
98                         else
99                                 {
100                                 $file{$a[7]}=$file;
101                                 }
102                         }
103                 }
104         close(IN);
105         }
106
107 sub parse_solaris
108         {
109         local($name)=@_;
110
111         open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n";
112         while (<IN>)
113                 {
114                 chop;
115                 next if /^\s*$/;
116                 if (/^(\S+):$/)
117                         {
118                         $file=$1;
119                         #$file="$1.c" if $file =~ /^(.*).o$/;
120                         print STDERR "$file\n";
121                         $we_need{$file}=" ";
122                         next;
123                         }
124                 @a=split(/\s*\|\s*/);
125                 next unless $#a == 7;
126                 next unless $a[4] eq "GLOB";
127                 if ($a[6] eq "UNDEF")
128                         {
129                         $unres{$file}.=$a[7]." ";
130                         print STDERR "$file needs $a[7]\n" if $debug;
131                         }
132                 else
133                         {
134                         if ($file{$a[7]} ne "")
135                                 {
136                                 print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n";
137                                 }
138                         else
139                                 {
140                                 $file{$a[7]}=$file;
141                                 print STDERR "$file has $a[7]\n" if $debug;
142                                 }
143                         }
144                 }
145         close(IN);
146         }
147