#!/usr/bin/perl # a simple script to print the proper name for perl libraries. # I plan to rewrite this in C so that perl is not required by RPM at # build time. # by Ken Estes Mail.com kestes@staff.mail.com # it would be much better if perl could tell us the proper name of a # given script. if ("@ARGV") { foreach (@ARGV) { process_file($_); } } else { # notice we are passed a list of filenames NOT as common in unix the # contents of the file. foreach (<>) { process_file($_); } } foreach $module (sort keys %require) { if (length($require{$module}) == 0) { print "perl($module)\n"; } else { print "perl($module)=$require{$module}\n"; # we need to print it without the version number until the # requires syntax accepts version numbers correctly. print "perl($module)\n"; } } exit 0; sub process_file { my ($file) = @_; chomp $file; open(FILE, "<$file")|| die("Could not open file: '$file' : $!\n"); my ($package, $version) = (); while () { # skip the documentation if ( (m/^=(head1|head2|pod)/) .. (m/^=(cut)/) ) { next; } # skip the data section if (m/^__(DATA|END)__$/) { last; } # not everyone puts the package name of the file as the first # package name so we report all namespaces as if they were # provided packages (really ugly). if (m/^\s*package\s+([_:a-zA-Z0-9]+)\s*;/) { $package=$1; undef $version; $require{$package}=undef; } # after we found the package name take the first assignment to # $VERSION as the version number. Exporter requires that the # variable be called VERSION so we are safe. # here are examples of VERSION lines from the perl distribution #FindBin.pm:$VERSION = $VERSION = sprintf("%d.%02d", q$Revision: 1.1 $ =~ /(\d+)\.(\d+)/); #ExtUtils/Install.pm:$VERSION = substr q$Revision: 1.1 $, 10; #CGI/Apache.pm:$VERSION = (qw$Revision: 1.1 $)[1]; #DynaLoader.pm:$VERSION = $VERSION = "1.03"; # avoid typo warning if ( ($package) && (m/^\s*\$VERSION\s+=\s+/) ) { # first see if the version string contains the string # '$Revision' this often causes bizzare strings and is the most # common method of non static numbering. if (m/(\$Revision: (\d+[.0-9]+))/) { $version= $2; } elsif (m/[\'\"]?(\d+[.0-9]+)[\'\"]?/) { # look for a static number hard coded in the script $version= $1; } $require{$package}=$version; } } return ; }