1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#!/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";
if (-e "Makefile.PL") {
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";
} else {
system("perl Build.PL --prefix $destdir --installdirs site --install_path lib=$destdir/lib") == 0
or die "Can't run perl Build.PL";
system("./Build") == 0 or die "Can't run ./Build";
}
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
my @dirs = split(":", $ENV{PERL5LIB} || "");
unshift @dirs, "$topdir/$dir/blib/lib";
$ENV{PERL5LIB}=join(":", @dirs);
if ($opts->{t}) {
if (-e "Makefile") {
system("make test") == 0 or die "Can't run make test failed";
} else {
system("./Build test") == 0 or die "./Build test failed";
}
}
if ($opts->{i}) {
if (-e "Makefile") {
system("make install SITEPREFIX=$destdir") == 0 or die "Can't run make install";
} else {
system("./Build install") == 0 or die "Can't run ./Build install";
}
}
chdir $topdir or die "Can't go back to $topdir";
}
|