]> WPIA git - cassiopeia.git/blobdiff - lib/openssl/util/src-dep.pl
add: execute openssl fetcher to fetch openssl 1.0.1j
[cassiopeia.git] / lib / openssl / util / src-dep.pl
diff --git a/lib/openssl/util/src-dep.pl b/lib/openssl/util/src-dep.pl
new file mode 100755 (executable)
index 0000000..ad997e4
--- /dev/null
@@ -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);
+       }
+