App-CPANtoRPM
view release on metacpan or search on metacpan
internal/perl.req view on Meta::CPAN
# then these are treated as additional names which are required by the
# file and are printed as well.
# 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
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 {
# I am not using rpm3.0 so I do not want spaces around my
# operators. Also I will need to change the processing of the
# $RPM_* variable when I upgrade.
print "perl($module) >= $require{$module}\n";
}
}
exit 0;
sub process_file {
my ($file) = @_;
chomp $file;
open(FILE, "<$file") || return;
while (<FILE>) {
# skip the "= <<" block
if ( ( m/^\s*\$(.*)\s*=\s*<<\s*["'](.*)['"]/) ||
( m/^\s*\$(.*)\s*=\s*<<\s*(.*);/) ) {
$tag = $2;
while (<FILE>) {
( $_ =~ /^$tag/) && last;
}
}
# skip q{} quoted sections - just hope we don't have curly brackets
# within the quote, nor an escaped hash mark that isn't a comment
# marker, such as occurs right here. Draw the line somewhere.
if ( m/^.*\Wq[qxwr]?\s*([\{\(\[#|\/])[^})\]#|\/]*$/ && ! m/^\s*(require|use)\s/ ) {
$tag = $1;
$tag =~ tr/{\(\[\#|\//})]#|\//;
while (<FILE>) {
( $_ =~ m/\}/ ) && last;
}
}
# skip the documentation
# we should not need to have item in this if statement (it
# properly belongs in the over/back section) but people do not
# read the perldoc.
if ( (m/^=(head[1-4]|pod|item)/) .. (m/^=(cut)/) ) {
next;
}
if ( (m/^=(over)/) .. (m/^=(back)/) ) {
next;
}
# skip the data section
if (m/^__(DATA|END)__$/) {
last;
}
# Each keyword can appear multiple times. Don't
# bother with datastructures to store these strings,
# if we need to print it print it now.
#
# Again allow for "our".
if ( m/^\s*(our\s+)?\$RPM_Requires\s*=\s*["'](.*)['"]/i) {
foreach $_ (split(/\s+/, $2)) {
print "$_\n";
}
}
if (
# ouch could be in a eval, perhaps we do not want these since we catch
# an exception they must not be required
# eval { require Term::ReadLine } or die $@;
# eval "require Term::Rendezvous;" or die $@;
# eval { require Carp } if defined $^S; # If error/warning during compilation,
(m/^(\s*) # we hope the inclusion starts the line
(require|use)\s+(?!\{) # do not want 'do {' loops
# quotes around name are always legal
[\'\"]?([^\;\ \'\"\t]*)[\'\"]?[\t\;\ ]
# the syntax for 'use' allows version requirements
\s*([.0-9]*)
/x)
) {
my ($whitespace, $statement, $module, $version) = ($1, $2, $3,$4);
# we only consider require statements that are flush against
( run in 2.285 seconds using v1.01-cache-2.11-cpan-0d23b851a93 )