diff options
Diffstat (limited to 'tools/build_perl_modules')
-rwxr-xr-x | tools/build_perl_modules | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/tools/build_perl_modules b/tools/build_perl_modules new file mode 100755 index 00000000..fb471459 --- /dev/null +++ b/tools/build_perl_modules @@ -0,0 +1,86 @@ +#!/usr/bin/perl +# SYNTAX: +# build_perl_modules -d dest_dir [-c] [-m] [-t] [-i] tarball_dir +# +# DESCRIPTION: +# Installs perl modules found in tarball_dir +# Expects a file called install_order, containing one line per distribution name +# Will take action against each distribution in turn +# -d is a necessary destination directory for the perl mods +# If -c is set, will remove the module build directories and exit +# If -m is set, will run perl Makefile.PL and make +# If -t is set, will run make test +# If -i is set, will run make install +# Options are discrete. This is because an overall ./configure, make, make test, make install +# are run in different invocations. Obviously, you can't run a -t without a -m, but there's no +# checking here for that + +# Can only use base modules +use warnings; +use strict; +use Config; +use Getopt::Std; +use Cwd; +use File::Path; + +my $opts = {}; +getopts('d:cmti', $opts) || die "Invalid options"; +my $moddir = shift @ARGV or die "Must specify a directory where tarballs exist"; + +my $destdir = $opts->{d}; +die "Must set a destination directory" unless $destdir; + +chdir $moddir or die "Cannot change to $moddir"; +open F, "install_order" or die "Cannot open install_order file"; +my @files = grep { ! /^#/ && chop } <F>; +close F; + +my @tarballs; +foreach my $f (@files) { + # Needs to be better. Also, what if there are two with same name? + my $tarball; + eval '$tarball = <'."$f".'*.tar.gz>'; + die unless ($tarball); + print "Got $f, with file: $tarball",$/; + push @tarballs, $tarball; + (my $dir = $tarball) =~ s/\.tar.gz//; + # Need to do cleaning before doing each module in turn + if ($opts->{c}) { + print "Cleaning $dir",$/; + rmtree($dir); + } +} + +if ($opts->{c}) { + print "Finished cleaning",$/; + exit; +} + +my $topdir = cwd(); +foreach my $tarball (@tarballs) { + (my $dir = $tarball) =~ s/\.tar.gz//; + if ($opts->{m}) { + # Don't compile if already done - this is because of invocating this + # script at different stages + unless (-e $dir) { + system("gunzip -c $tarball | tar -xf -") == 0 or die "Cannot extract $tarball"; + chdir $dir or die "Can't chdir into $dir"; + system("perl Makefile.PL PREFIX=$destdir INSTALLDIRS=site LIB=$destdir/lib") == 0 or die "Can't run perl Makefile.PL"; + system("make") == 0 or die "Can't run make"; + chdir $topdir or die "Can't chdir to top";; + } + } + + chdir $dir or die "Can't chdir into $dir"; + + # Need to add this so this module is found for subsequent ones + $ENV{PERL5LIB}="$topdir/$dir/blib/lib:$ENV{PERL5LIB}"; + + if ($opts->{t}) { + system("make test") == 0 or die "Can't run make test failed"; + } + if ($opts->{i}) { + system("make install SITEPREFIX=$destdir") == 0 or die "Can't run make install"; + } + chdir $topdir or die "Can't go back to $topdir"; +} |