[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]

help please with perl module automatic installer



I'm still working with my attempt to automate building and installing perl
modules under Red Hat. I seriously want to be able to get this very, very
automated.

I've made progress. The current iteration seems to work correctly for at least
a few modules on at least Red Hat 6.0 with the (stock) 5.005_03 and with Red
Hat 6.1 with 5.005_63.

I really think I must be taking the wrong approach to attempting to compute
all the variables I need to set, and the values I need to set them to. I
wasn't able to find any way to compute both INSTALLSITELIB and INSTALLSITEARCH
correctly that worked for both settings; I ended up giving up and using the
last match in grep /site_perl/ @INC for both, which must be wrong, but seems
to work.

Is there any hash I can lay my hands on that has the desired values for these
variables?

My current version is attached. When one layer of quoting has been stripped
out by the here-doc interpolation, what's left (in the icky bit) looks
something like:

  d=$RPM_BUILD_ROOT`perl -le 'print ((sort grep{m#/site_perl/#} @INC)[-1])'`
  mkdir -p $d
  make PREFIX=$RPM_BUILD_ROOT/usr \
       INSTALLSITELIB=$d \
       INSTALLSITEARCH=$d \
       INSTALLMAN1DIR=$RPM_BUILD_ROOT/usr/man/man1 \
       INSTALLMAN3DIR=$RPM_BUILD_ROOT/usr/man/man3 \
       install

  find $RPM_BUILD_ROOT -name perllocal.pod | perl -lne unlink

-Bennett
#!/usr/bin/perl -w
# perlmod2rpm 1.1 Bennett Todd <bet@mordor.net> Freely Redistributable
# 1.1 Worked with RH6.1+perl5.005_63 and RH6.0+perl5.005_03
# 1.0 Worked with RH6.1+perl5.005_63, had the latter wired in

=head1 NAME

    perlmod2rpm --- wrap, or re-wrap, a perl module in RPM clothing

=head1 SYNOPSIS

    perlmod2rpm [-n] [-d] tarball-or-rpm [tarball-or-rpm ...]

=head1 DESCRIPTION

B<perlmod2rpm> takes one or more perl modules and wraps them with rpm
dressing. It can be fed either the tar.gz file as downloaded from CPAN, or a
previously-wrapped rpm. It will ask the answers to any questions it can't
deduce, then write a spec file. Then it runs "rpm -ba" on the spec file unless
B<-n> is specified.

B<-d> enables a debugging dump of the variables right before it writes the
spec file.

=head1 PATHS

You _must_ place the tarballs, if any, in /usr/src/redhat/SOURCES/. The spec
files will be written in /usr/src/redhat/SPECS/.

=cut

use strict;
use IO::File;
use Term::ReadLine;
use File::Basename;
use Data::Dumper;
use Getopt::Std;
use Cwd;
use Fatal qw(IO::File::new close);
$0 = basename $0;

use vars qw($opt_n $opt_d);
$opt_n = $opt_d = 0;
die "syntax: $0 [-n] [-d] filename [...]\n" unless getopts('nd') and @ARGV;

my $oldcwd = cwd;
chdir '/usr/src/redhat/SOURCES/' or die;

my ($mday,$mon,$year,$wday) = (localtime(time))[3..6];
my @M = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my @D = qw(Sun Mon Tue Wed Thu Fri Sat);
$mon = $M[$mon];
$wday = $D[$wday];
$year += 1900;

my $th;

for (@ARGV) {
	$_ = "$oldcwd/$_" unless m#^/#;
	die "no such file $_" unless -f;
	my %d;
	if (/\.src\.rpm$/) {
		my $old = $_;
		($_) = grep { /\.tar\.gz$/ }
			`rpm2cpio $old|cpio -iuv \\*.tar.gz 2>&1`;
		die "cannot find src in $old" if $?;
		chomp;
		$d{summ} = `rpm -qp --queryformat '%{SUMMARY}' $old`;
		$d{desc} = `rpm -qp --queryformat '%{DESCRIPTION}' $old`;
		$d{rels} = `rpm -qp --queryformat '%{RELEASE}' $old`;
		$d{vers} = `rpm -qp --queryformat '%{VERSION}' $old`;
		$d{name} = `rpm -qp --queryformat '%{NAME}' $old`;
	}
	die "$_: only feed me src rpms or tarballs" unless /\.tar\.gz$/;
	$d{vers} = $1 if s/-([^-]+)\.tar\.gz$// and !defined $d{vers};
	$d{name} = $_ unless defined $d{vers};
	($d{cpan}) = /^([^-]+)/;
	$d{summ} = "perl module $d{name}" unless defined $d{summ};
	$d{desc} = "perl module $d{name}" unless defined $d{desc};
	$d{rels} = 0 unless defined $d{rels};
	$d{rels}++;
	for (@d{qw(summ desc)}) { s/^\s+//; s/\s+$//; s/\s+/ /g; }
	print Data::Dumper->Dump([\%d], [qw(%d)]) if $opt_d;
	for (qw(name vers cpan)) {
		if (!defined($d{$_})) {
			$th = Term::ReadLine->new($0) unless defined $th;
			$d{$_} = $th->readline("$_: ");
		}
	}
	IO::File->new(">/usr/src/redhat/SPECS/$d{name}.spec")->print(<<Eof);
Summary: $d{summ}
Name: $d{name}
Version: $d{vers}
Release: $d{rels}
Copyright: Freely Redistributable
Packager: Bennett Todd <bet\@mordor.net>
Group: Utilities/Text
Source: http://www.cpan.org/modules/by-module/$d{cpan}/$d{name}-$d{vers}.tar.gz
Requires: perl >= 5.004
BuildRoot: /var/tmp/$d{name}-rpmroot

%description

$d{desc}

%prep
%setup

%build
perl Makefile.PL PREFIX=\$RPM_BUILD_ROOT/usr && make

%install
d=\$RPM_BUILD_ROOT`perl -le 'print ((sort grep{m#/site_perl/#} \@INC)[-1])'`
mkdir -p \$d
make PREFIX=\$RPM_BUILD_ROOT/usr \\
     INSTALLSITELIB=\$d \\
     INSTALLSITEARCH=\$d \\
     INSTALLMAN1DIR=\$RPM_BUILD_ROOT/usr/man/man1 \\
     INSTALLMAN3DIR=\$RPM_BUILD_ROOT/usr/man/man3 \\
     install

find \$RPM_BUILD_ROOT -name perllocal.pod | perl -lne unlink

%files
/usr/*

%changelog
* $wday $mon $mday $year <bet\@mordor.net>
  - Initial Wrap
Eof
	system "rpm -ba /usr/src/redhat/SPECS/$d{name}.spec" and die unless $opt_n;
}

PGP signature


Follow-Ups from:
Andy Dougherty <doughera@lafayette.edu>

[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]