161 lines
4.2 KiB
Perl
Executable File
161 lines
4.2 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
use strict;
|
|
|
|
use Getopt::Long;
|
|
use File::Basename;
|
|
use File::Copy;
|
|
use Archive::Tar;
|
|
|
|
use lib '/usr/lib/rpm';
|
|
use Specfile;
|
|
|
|
my %options;
|
|
|
|
GetOptions(\%options, "outdir=s", "tmpdir=s", "email=s", "name=s", "create", "test", "epoch=n", "version=s", "release=s", "perlver=s", "patch=s", "noarch=s") or die_usage();
|
|
|
|
my $fullname = shift;
|
|
|
|
die_usage() unless $fullname;
|
|
|
|
my $tarball = basename($fullname);
|
|
my $create = $options{create} || '';
|
|
my $email = $options{email} || (getpwuid($<))[0] . '@altlinux.com';
|
|
my $outdir = $options{outdir} || './';
|
|
my $tmpdir = $options{tmpdir} || '/tmp';
|
|
my $noarch = $options{noarch};
|
|
|
|
$tarball =~ /^(.+)\-([^-]+)\.tar\.gz$/;
|
|
my $name = $options{name} || $1;
|
|
my $ver = $options{version} || $2;
|
|
|
|
die "Module name/version not parsable from $tarball" unless $name and $ver;
|
|
|
|
$name =~ s/::/-/g;
|
|
|
|
copy($fullname, $tmpdir)
|
|
or die "copy: $!";
|
|
|
|
$noarch = $options{noarch};
|
|
|
|
my $patchfile = '';
|
|
if ($options{patch}) {
|
|
copy($options{patch}, $tmpdir);
|
|
$patchfile = $options{patch};
|
|
}
|
|
|
|
my $spec = new RPM::Specfile;
|
|
|
|
my $perlver = "0:5.00503";
|
|
if ($options{perlver} and $options{perlver} eq '5.6.1') {
|
|
$perlver = "1:5.6.1";
|
|
}
|
|
|
|
# some basic spec fields
|
|
$spec->name("perl-$name");
|
|
$spec->version($ver);
|
|
$spec->release($options{release} || "8");
|
|
$spec->epoch($options{epoch});
|
|
$spec->summary("$name Perl module");
|
|
$spec->description($spec->summary);
|
|
$spec->group("Development/Libraries");
|
|
$spec->license("distributable");
|
|
$spec->buildrequires("perl >= $perlver");
|
|
$spec->packager($email);
|
|
$spec->add_changelog_entry($email, 'Specfile autogenerated');
|
|
|
|
$spec->buildarch('noarch') if $noarch;
|
|
|
|
# $spec->push_require(q|%(perl -MConfig -le 'if (defined $Config{useithreads}) { print "perl(:WITH_ITHREADS)" } else { print "perl(:WITHOUT_ITHREADS)" }')|);
|
|
# $spec->push_require(q|%(perl -MConfig -le 'if (defined $Config{usethreads}) { print "perl(:WITH_THREADS)" } else { print "perl(:WITHOUT_THREADS)" }')|);
|
|
# $spec->push_require(q|%(perl -MConfig -le 'if (defined $Config{uselargefiles}) { print "perl(:WITH_LARGEFILES)" } else { print "perl(:WITHOUT_LARGEFILES)" }')|);
|
|
|
|
$spec->push_source($tarball);
|
|
$spec->push_patch(basename($patchfile))
|
|
if $patchfile;
|
|
|
|
# make a URL that can actually possibly take you to the right place
|
|
my $url_name = $name;
|
|
$url_name =~ s/-/::/g;
|
|
$url_name =~ s/([^a-zA-Z0-9])/sprintf "%%%x", ord $1/ge;
|
|
$spec->url("http://search.cpan.org/search?mode=module&query=$url_name");
|
|
|
|
# now we get into the multiline tags. stolen mostly verbatim from
|
|
# cpanflute1
|
|
|
|
my $patch = '';
|
|
if ($patchfile) {
|
|
$patch = "%patch0 -p1\n";
|
|
}
|
|
|
|
$spec->prep("%setup -q -n $name-%{version} $create\n$patch");
|
|
$spec->file_param("-f $name-$ver-filelist");
|
|
$spec->push_file("%defattr(-,root,root)");
|
|
|
|
my $test_clause = '';
|
|
$test_clause = "make test" if $options{test};
|
|
|
|
$spec->build(<<EOB);
|
|
CFLAGS="\$RPM_OPT_FLAGS" perl Makefile.PL
|
|
make
|
|
$test_clause
|
|
EOB
|
|
|
|
$spec->clean('rm -rf $RPM_BUILD_ROOT');
|
|
my $inst = q{
|
|
rm -rf $RPM_BUILD_ROOT
|
|
eval `perl '-V:installarchlib'`
|
|
mkdir -p $RPM_BUILD_ROOT/$installarchlib
|
|
make PREFIX=$RPM_BUILD_ROOT/usr install
|
|
|
|
[ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress
|
|
|
|
find $RPM_BUILD_ROOT/usr -type f -print | \
|
|
sed "s@^$RPM_BUILD_ROOT@@g" | \
|
|
grep -v perllocal.pod | \
|
|
grep -v "\.packlist" > $name-$ver-filelist
|
|
if [ "$(cat $name-$ver-filelist)X" = "X" ] ; then
|
|
echo "ERROR: EMPTY FILE LIST"
|
|
exit -1
|
|
fi
|
|
};
|
|
|
|
$inst =~ s/\$name/$name/g;
|
|
$inst =~ s/\$ver/$ver/g;
|
|
|
|
$spec->install($inst);
|
|
|
|
# write the spec file. create some macros.
|
|
$spec->write_specfile("$tmpdir/perl-$name.spec");
|
|
|
|
open FH, ">$tmpdir/macros"
|
|
or die "Can't create $tmpdir/macros: $!";
|
|
|
|
print FH qq{
|
|
%_topdir $tmpdir
|
|
%_builddir %{_topdir}
|
|
%_rpmdir %{_topdir}
|
|
%_sourcedir %{_topdir}
|
|
%_specdir %{_topdir}
|
|
%_srcrpmdir $outdir
|
|
};
|
|
|
|
close FH;
|
|
|
|
open FH, ">$tmpdir/rpmrc"
|
|
or die "Can't create $tmpdir/rpmrc: $!";
|
|
|
|
print FH qq{
|
|
include: /usr/lib/rpm/rpmrc
|
|
macrofiles: /usr/lib/rpm/macros:$tmpdir/macros
|
|
};
|
|
close FH;
|
|
|
|
# perform the build, die on error
|
|
my $retval = system "rpm --rcfile $tmpdir/rpmrc -bs --rmsource --rmspec --clean $tmpdir/perl-$name.spec";
|
|
$retval = $? >> 8;
|
|
if ($retval != 0) {
|
|
die "RPM building failed!\n";
|
|
}
|
|
|
|
unlink "$tmpdir/rpmrc", "$tmpdir/macros";
|