summaryrefslogtreecommitdiff
path: root/rpm/build/enrpm
diff options
context:
space:
mode:
Diffstat (limited to 'rpm/build/enrpm')
-rwxr-xr-xrpm/build/enrpm178
1 files changed, 178 insertions, 0 deletions
diff --git a/rpm/build/enrpm b/rpm/build/enrpm
new file mode 100755
index 0000000..3e674bc
--- /dev/null
+++ b/rpm/build/enrpm
@@ -0,0 +1,178 @@
+#!/usr/bin/perl -w
+#
+# Attempt to build RPMs for Freeside from a tarball or module
+#
+# Contains portions of "cpanspec" http://cpanspec.sourceforge.net/
+
+=head1 NAME
+
+enrpm - Attempt to build RPMs for Freeside from a tarball or a module
+
+=head1 SYNOPSIS
+
+enrpm [options] [tarball|module-name [...]]
+
+ Options:
+ --help -h Help message
+
+=head1 DESCRIPTION
+
+B<enrpm> will generate a spec file to build a rpm from a CPAN-style
+Perl module distribution, then try to build RPMs from that spec file
+under mock, and update the repositories if successful.
+
+B<enrpm> uses the file extension of the tarball or module-name specified
+on the command line to determine if the argument is a tarball or a module name.
+
+Modules are downloaded from the CPAN. You must have initialized CPAN on the machine
+for B<enrpm> to be able to do this.
+
+For tarballs B<enrpm> attempts to build a usable .spec file using cpanflute2, and then builds
+an SRPM from the .spec file and the tarball.
+
+Once an SRPM has been built, B<enrpm> uses an external script to build binary RPMs under "mock".
+It then uses a second script to update the repositories.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--help>
+
+Print a brief help message and exit.
+
+=item B<--packager>
+
+Specify the name and e-mail address of the packager. This winds up in auto-generated .spec files.
+
+=item B<--server>
+
+Specify the host name or IP address of the server on which the SRPM will be built. This server must be
+set up for SRPM building, which means it must have both B<ovid> and B<cpanflute2> installed on it.
+
+=item B<--dry-run>
+
+Just print out commands, don't actually run them.
+
+=back
+
+=head1 BUGS
+
+Currently has little in the way of error detection and diagnostics.
+
+The back-end should be replaced with an existing build system such as koji.
+
+=head1 AUTHOR
+
+Richard Siddall <richard.siddall@elirion.net>
+
+=head1 SEE ALSO
+
+L<perl(1)>, L<cpan2rpm(1)>, L<cpanflute2(1)>
+
+=cut
+
+use strict;
+use Getopt::Long;
+use Cwd qw/getcwd abs_path/;
+use File::Basename;
+use Sys::Hostname; # False laziness to get around a real config file...
+
+my %opts;
+
+GetOptions(\%opts, 'packager=s', 'release=s', 'server=s', 'dryrun');
+
+$ENV{PATH} = "/bin:/usr/bin";
+
+sub usage {
+ print STDERR "usage: enrpm --packager <Your Name <you\@example.com>> [--release=<rpm-release-string>] --server <server-name> [--dryrun] tarball|module-name\n";
+ print STDERR "where:\n\t--packager is the name and e-mail address of the packager for the .spec file\n\t--release is the rpm release number for the .spec file\n\t--server is the server to build the SRPM on\n\t--dryrun means do not actually run the commands\n\n";
+ print STDERR "\ttarball is the name of a tarball containing the Perl module to be packaged\n";
+ print STDERR "\tmodule-name is the name of a CPAN Perl module to be packaged\n";
+ exit;
+}
+
+# Feeble excuse for not having a real configuration file
+my $user = 'ivan';
+my $buildsys = "/home/$user/buildsys";
+#my $rembuild = '/home/rsiddall/buildsys/ref';
+my $remdeps = '/home/ivan';
+my $rpmtopdir = "/home/$user/redhat";
+my $packager = 'Ivan Kohler <ivan@freeside.biz>';
+my $server = '10.5.4.5';
+
+$server = $opts{server} if defined($opts{server});
+$user = $1 if $server =~ /(\w+)\@[\w\d\.]+/;
+
+$packager = $opts{packager} if defined($opts{packager});
+
+# Go ahead and build an SRPM...
+
+my $ovidignore = '--ignore ' . join ('--ignore ', qw/libwww/);
+
+
+for my $file (@ARGV) {
+ my ($name,$version,$type);
+
+ if ($file =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)\.(tar)\.(?:gz|bz2)$/) {
+ $name = $1;
+ $version = $2;
+ $type = $3;
+ } elsif ($file =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)\.tgz$/) {
+ $name = $1;
+ $version = $2;
+ $type = 'tar';
+ } elsif ($file =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)\.(zip)$/) {
+ $name = $1;
+ $version = $2;
+ $type = $3;
+ } else {
+ # keep things happy if we get "Foo-Bar" instead of "Foo::Bar"
+ $file =~ s/-/::/g;
+ $name = $file;
+ $version = undef;
+ $type = 'module';
+ }
+
+ if ($type eq 'module') {
+ my $fluteopts = '';
+ $fluteopts .= "--packager='$packager' " if defined($packager);
+ $fluteopts .= "--release='$opts{release}' " if defined($opts{release});
+ do_cmd("ssh $user\@$server \"ovid --deps $ovidignore $name | tail -1 | $remdeps/ovid2flute $fluteopts | /bin/sh\"");
+ } else {
+ my $absfile = abs_path($file);
+ my $fname = basename($file);
+ die "Packager name and e-mail required" if !defined($packager);
+ die "RPM release string required" if !defined($opts{release});
+ do_cmd("scp $absfile $user\@$server:/home/$user/$fname");
+# do_cmd("ssh $user\@$server 'cpanflute2 --just-spec --noperlreqs --email=\\\"$packager\\\" --release=$opts{release} /home/$user/$fname > /home/$user/work/redhat/SPECS/$name.spec;'");
+# do_cmd("ssh $user\@$server 'perl -pi -e \\\"s/perl\(perl\)/perl/g\\\" /home/$user/work/redhat/SPECS/$name.spec;'");
+# do_cmd("ssh $user\@$server 'rpmbuild -bs --nodeps --define \\\"_sourcedir /home/$user/\\\" --define \\\"_srcrpmdir /home/$user/work/redhat/SRPMS\\\" /home/$user/work/redhat/SPECS/$name.spec'");
+ open SCRIPT, ">/home/$user/makesrpm" or die "Can't create SRPM construction script: ", $!;
+ print SCRIPT "#!/bin/sh\n\n";
+ print SCRIPT "cpanflute2 --just-spec --noperlreqs --email='$packager' --release=$opts{release} /home/$user/$fname > $rpmtopdir/SPECS/$name.spec;\n";
+ print SCRIPT "perl -pi -e 's/perl(perl)/perl/g' $rpmtopdir/SPECS/$name.spec\n";
+ print SCRIPT "rpmbuild -bs --nodeps --define '_sourcedir /home/$user/' --define '_srcrpmdir $rpmtopdir/SRPMS' $rpmtopdir/SPECS/$name.spec\n";
+ close SCRIPT or die "Can't close SRPM construction script: ", $!;
+ chmod(0711, "/home/$user/makesrpm");
+ do_cmd("scp /home/$user/makesrpm $user\@$server:/home/$user/makesrpm");
+ do_cmd("ssh $user\@$server /home/$user/makesrpm");
+ }
+ my $olddir = getcwd();
+ do_cmd("$buildsys/build-freeside");
+# if (-x "$buildsys/refresh-repo") {
+ do_cmd("$buildsys/refresh-repo");
+# } else {
+# do_cmd("ssh $user\@$server $rembuild/refresh-repo");
+# }
+}
+
+sub do_cmd {
+ my $cmd = shift;
+
+ print "$cmd\n";
+ `$cmd` if !exists($opts{dryrun});
+}
+
+1;
+