diff options
author | Ralf S. Engelschall <rse@openssl.org> | 1998-12-21 10:52:47 +0000 |
---|---|---|
committer | Ralf S. Engelschall <rse@openssl.org> | 1998-12-21 10:52:47 +0000 |
commit | d02b48c63a58ea4367a0e905979f140b7d090f86 (patch) | |
tree | 504f62ed3d84799f785b9cd9fab255a21b0e1b0e /util/src-dep.pl |
Import of old SSLeay release: SSLeay 0.8.1b
Diffstat (limited to 'util/src-dep.pl')
-rwxr-xr-x | util/src-dep.pl | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/util/src-dep.pl b/util/src-dep.pl new file mode 100755 index 0000000000..ad997e4746 --- /dev/null +++ b/util/src-dep.pl @@ -0,0 +1,147 @@ +#!/usr/local/bin/perl + +# we make up an array of +# $file{function_name}=filename; +# $unres{filename}="func1 func2 ...." +$debug=1; +#$nm_func="parse_linux"; +$nm_func="parse_solaris"; + +foreach (@ARGV) + { + &$nm_func($_); + } + +foreach $file (sort keys %unres) + { + @a=split(/\s+/,$unres{$file}); + %ff=(); + foreach $func (@a) + { + $f=$file{$func}; + $ff{$f}=1 if $f ne ""; + } + + foreach $a (keys %ff) + { $we_need{$file}.="$a "; } + } + +foreach $file (sort keys %we_need) + { +# print " $file $we_need{$file}\n"; + foreach $bit (split(/\s+/,$we_need{$file})) + { push(@final,&walk($bit)); } + + foreach (@final) { $fin{$_}=1; } + @final=""; + foreach (sort keys %fin) + { push(@final,$_); } + + print "$file: @final\n"; + } + +sub walk + { + local($f)=@_; + local(@a,%seen,@ret,$r); + + @ret=""; + $f =~ s/^\s+//; + $f =~ s/\s+$//; + return "" if ($f =~ "^\s*$"); + + return(split(/\s/,$done{$f})) if defined ($done{$f}); + + return if $in{$f} > 0; + $in{$f}++; + push(@ret,$f); + foreach $r (split(/\s+/,$we_need{$f})) + { + push(@ret,&walk($r)); + } + $in{$f}--; + $done{$f}=join(" ",@ret); + return(@ret); + } + +sub parse_linux + { + local($name)=@_; + + open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n"; + while (<IN>) + { + chop; + next if /^\s*$/; + if (/^[^[](.*):$/) + { + $file=$1; + $file="$1.c" if /\[(.*).o\]/; + print STDERR "$file\n"; + $we_need{$file}=" "; + next; + } + + @a=split(/\s*\|\s*/); + next unless $#a == 7; + next unless $a[4] eq "GLOB"; + if ($a[6] eq "UNDEF") + { + $unres{$file}.=$a[7]." "; + } + else + { + if ($file{$a[7]} ne "") + { + print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n"; + } + else + { + $file{$a[7]}=$file; + } + } + } + close(IN); + } + +sub parse_solaris + { + local($name)=@_; + + open(IN,"nm $name|") || die "unable to run 'nn $name':$!\n"; + while (<IN>) + { + chop; + next if /^\s*$/; + if (/^(\S+):$/) + { + $file=$1; + #$file="$1.c" if $file =~ /^(.*).o$/; + print STDERR "$file\n"; + $we_need{$file}=" "; + next; + } + @a=split(/\s*\|\s*/); + next unless $#a == 7; + next unless $a[4] eq "GLOB"; + if ($a[6] eq "UNDEF") + { + $unres{$file}.=$a[7]." "; + print STDERR "$file needs $a[7]\n" if $debug; + } + else + { + if ($file{$a[7]} ne "") + { + print STDERR "duplicate definition of $a[7],\n$file{$a[7]} and $file \n"; + } + else + { + $file{$a[7]}=$file; + print STDERR "$file has $a[7]\n" if $debug; + } + } + } + close(IN); + } + |