home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / lib / rpm / perl.req < prev    next >
Text File  |  2006-11-29  |  7KB  |  236 lines

  1. #!/usr/bin/perl
  2.  
  3. # RPM (and it's source code) is covered under two separate licenses. 
  4.  
  5. # The entire code base may be distributed under the terms of the GNU
  6. # General Public License (GPL), which appears immediately below.
  7. # Alternatively, all of the source code in the lib subdirectory of the
  8. # RPM source code distribution as well as any code derived from that
  9. # code may instead be distributed under the GNU Library General Public
  10. # License (LGPL), at the choice of the distributor. The complete text
  11. # of the LGPL appears at the bottom of this file.
  12.  
  13. # This alternatively is allowed to enable applications to be linked
  14. # against the RPM library (commonly called librpm) without forcing
  15. # such applications to be distributed under the GPL.
  16.  
  17. # Any questions regarding the licensing of RPM should be addressed to
  18. # Erik Troan <ewt@redhat.com>.
  19.  
  20. # a simple makedepends like script for perl.
  21.  
  22. # To save development time I do not parse the perl grammmar but
  23. # instead just lex it looking for what I want.  I take special care to
  24. # ignore comments and pod's.
  25.  
  26. # It would be much better if perl could tell us the dependencies of a
  27. # given script.
  28.  
  29. # The filenames to scan are either passed on the command line or if
  30. # that is empty they are passed via stdin.
  31.  
  32. # If there are strings in the file which match the pattern
  33. #     m/^\s*\$RPM_Requires\s*=\s*["'](.*)['"]/i
  34. # then these are treated as additional names which are required by the
  35. # file and are printed as well.
  36.  
  37. # I plan to rewrite this in C so that perl is not required by RPM at
  38. # build time.
  39.  
  40. # by Ken Estes Mail.com kestes@staff.mail.com
  41.  
  42. if ("@ARGV") {
  43.   foreach (@ARGV) {
  44.     process_file($_);
  45.   }
  46. } else {
  47.   
  48.   # notice we are passed a list of filenames NOT as common in unix the
  49.   # contents of the file.
  50.   
  51.   foreach (<>) {
  52.     process_file($_);
  53.   }
  54. }
  55.  
  56.  
  57. foreach $module (sort keys %require) {
  58.   if (length($require{$module}) == 0) {
  59.     print "perl($module)\n";
  60.   } else {
  61.  
  62.     # I am not using rpm3.0 so I do not want spaces arround my
  63.     # operators. Also I will need to change the processing of the
  64.     # $RPM_* vairable when I upgrage.
  65.  
  66.     print "perl($module) >= $require{$module}\n";
  67.   }
  68. }
  69.  
  70. exit 0;
  71.  
  72.  
  73.  
  74. sub process_file {
  75.   
  76.   my ($file) = @_;
  77.   chomp $file;
  78.   
  79.   open(FILE, "<$file") || return;
  80.   
  81.   while (<FILE>) {
  82.     
  83.     # skip the "= <<" block
  84.  
  85.     if ( ( m/^\s*\$(.*)\s*=\s*<<\s*["'](.*)['"]/i) ||
  86.          ( m/^\s*\$(.*)\s*=\s*<<\s*(.*);/i) ) {
  87.       $tag = $2;
  88.       while (<FILE>) {
  89.         ( $_ =~ /^$tag/) && last;
  90.       }
  91.     }
  92.  
  93.     # skip the documentation
  94.  
  95.     # we should not need to have item in this if statement (it
  96.     # properly belongs in the over/back section) but people do not
  97.     # read the perldoc.
  98.  
  99.     if ( (m/^=(head[1-4]|pod|item)/) .. (m/^=(cut)/) ) {
  100.       next;
  101.     }
  102.  
  103.     if ( (m/^=(over)/) .. (m/^=(back)/) ) {
  104.       next;
  105.     }
  106.     
  107.     # skip the data section
  108.     if (m/^__(DATA|END)__$/) {
  109.       last;
  110.     }
  111.  
  112.     # Each keyword can appear multiple times.  Don't
  113.     #  bother with datastructures to store these strings,
  114.     #  if we need to print it print it now.
  115.     #
  116.     # Again allow for "our".
  117.     if ( m/^\s*(our\s+)?\$RPM_Requires\s*=\s*["'](.*)['"]/i) {
  118.       foreach $_ (split(/\s+/, $2)) {
  119.     print "$_\n";
  120.       }
  121.     }
  122.  
  123.     if ( 
  124.  
  125. # ouch could be in a eval, perhaps we do not want these since we catch
  126. # an exception they must not be required
  127.  
  128. #   eval { require Term::ReadLine } or die $@;
  129. #   eval "require Term::Rendezvous;" or die $@;
  130. #   eval { require Carp } if defined $^S; # If error/warning during compilation,
  131.  
  132.  
  133.     (m/^(\s*)         # we hope the inclusion starts the line
  134.      (require|use)\s+(?!\{)     # do not want 'do {' loops
  135.      # quotes around name are always legal
  136.      [\'\"]?([^\;\ \'\"\t]*)[\'\"]?[\t\;\ ]
  137.      # the syntax for 'use' allows version requirements
  138.      \s*([.0-9]*)
  139.      /x)
  140.        ) {
  141.       my ($whitespace, $statement, $module, $version) = ($1, $2, $3,$4);
  142.  
  143.       # we only consider require statements that are flush against
  144.       # the left edge. any other require statements give too many
  145.       # false positives, as they are usually inside of an if statement
  146.       # as a fallback module or a rarely used option
  147.  
  148.       ($whitespace ne "" && $statement eq "require") && next;
  149.  
  150.       # if there is some interpolation of variables just skip this
  151.       # dependency, we do not want
  152.       #        do "$ENV{LOGDIR}/$rcfile";
  153.    
  154.       ($module =~ m/\$/) && next;
  155.  
  156.       # skip if the phrase was "use of" -- shows up in gimp-perl, et al
  157.       next if $module eq 'of';
  158.  
  159.       # if the module ends in a comma we probaly caught some
  160.       # documentation of the form 'check stuff,\n do stuff, clean
  161.       # stuff.' there are several of these in the perl distribution
  162.  
  163.       ($module  =~ m/[,>]$/) && next;
  164.  
  165.       # if the module name starts in a dot it is not a module name.
  166.       # Is this necessary?  Please give me an example if you turn this
  167.       # back on.
  168.  
  169.       #      ($module =~ m/^\./) && next;
  170.  
  171.       # if the module ends with .pm strip it to leave only basename.
  172.       # starts with /, which means its an absolute path to a file
  173.       if ($module =~ m(^/)) {
  174.         print "$module\n";
  175.         next;
  176.       }
  177.  
  178.       # sometimes people do use POSIX qw(foo), or use POSIX(qw(foo)) etc
  179.       # we can strip qw.*$, as well as (.*$:
  180.       $module =~ s/qw.*$//;
  181.       $module =~ s/\(.*$//;
  182.  
  183.       $module =~ s/\.pm$//;
  184.  
  185.       # some perl programmers write 'require URI/URL;' when 
  186.       # they mean 'require URI::URL;'
  187.  
  188.       $module =~ s/\//::/;
  189.  
  190.       # trim off trailing parenthesis if any.  Sometimes people pass
  191.       # the module an empty list.
  192.  
  193.       $module =~ s/\(\s*\)$//;
  194.  
  195.       if ( $module =~ m/^[0-9._]+$/ ) {
  196.       # if module is a number then both require and use interpret that
  197.       # to mean that a particular version of perl is specified
  198.  
  199.       if ($module =~ /5.00/) {
  200.         print "perl >= 0:$module\n";
  201.         next;
  202.       }
  203.       else {
  204.         print "perl >= 1:$module\n";
  205.         next;
  206.       }
  207.  
  208.       };
  209.  
  210.       # ph files do not use the package name inside the file.
  211.       # perlmodlib  documentation says:
  212.       
  213.       #       the .ph files made by h2ph will probably end up as
  214.       #       extension modules made by h2xs.
  215.       
  216.       # so do not expend much effort on these.
  217.  
  218.  
  219.       # there is no easy way to find out if a file named systeminfo.ph
  220.       # will be included with the name sys/systeminfo.ph so only use the
  221.       # basename of *.ph files
  222.  
  223.       ($module  =~ m/\.ph$/) && next;
  224.  
  225.       $require{$module}=$version;
  226.       $line{$module}=$_;
  227.     }
  228.     
  229.   }
  230.  
  231.   close(FILE) ||
  232.     die("$0: Could not close file: '$file' : $!\n");
  233.   
  234.   return ; 
  235. }
  236.