1.1.3
by Brendan O'Dea
Import upstream version 5.10.0 |
1 |
use strict; |
2 |
use warnings; |
|
3 |
||
4 |
use Getopt::Long; |
|
5 |
use File::Spec; |
|
6 |
use File::Compare qw( compare ); |
|
7 |
use File::Copy qw( copy ); |
|
8 |
use File::Basename qw( dirname ); |
|
9 |
||
10 |
sub iterdirs(&); |
|
11 |
||
12 |
my $rootdir = dirname($0);
|
|
13 |
||
1.1.5
by Niko Tyni
Import upstream version 5.12.0~rc3 |
14 |
unshift @INC, File::Spec->catdir($rootdir, qw(cpan ExtUtils-MakeMaker t lib));
|
1.1.3
by Brendan O'Dea
Import upstream version 5.10.0 |
15 |
|
16 |
eval q{ use MakeMaker::Test::Utils qw( which_perl ) }; |
|
17 |
$@ and die $@; |
|
18 |
||
19 |
my %opt = ( |
|
20 |
list => File::Spec->catfile($rootdir, 'mkppport.lst'), |
|
21 |
clean => 0, |
|
22 |
);
|
|
23 |
||
1.2.1
by Dominic Hargreaves
Import upstream version 5.14.0 |
24 |
unless ( GetOptions(\%opt, qw( clean list=s )) ) { |
25 |
require Pod::Usage; |
|
26 |
Pod::Usage::pod2usage(2); |
|
27 |
}
|
|
1.1.3
by Brendan O'Dea
Import upstream version 5.10.0 |
28 |
|
29 |
my $absroot = File::Spec->rel2abs($rootdir); |
|
30 |
my @destdirs = readlist($opt{list}); |
|
31 |
||
32 |
# Nothing to do...
|
|
33 |
unless (@destdirs) { |
|
34 |
print "no destination directories found in $opt{list}\n"; |
|
35 |
exit 0; |
|
36 |
}
|
|
37 |
||
38 |
# Remove all installed ppport.h files
|
|
39 |
if ($opt{clean}) { |
|
40 |
iterdirs { |
|
41 |
my($dir, $fulldir) = @_; |
|
42 |
my $dest = File::Spec->catfile($fulldir, 'ppport.h'); |
|
43 |
if (-f $dest) { |
|
44 |
print "removing ppport.h for $dir\n"; |
|
45 |
unlink $dest or warn "WARNING: could not remove $dest: $!\n"; |
|
46 |
1 while unlink $dest; # remove any remaining versions |
|
47 |
}
|
|
48 |
};
|
|
49 |
exit 0; |
|
50 |
}
|
|
51 |
||
52 |
# Determine full perl location
|
|
53 |
my $perl = which_perl(); |
|
54 |
||
55 |
# We're now changing the directory, which confuses the deferred
|
|
56 |
# loading in Config.pm, so we better use an absolute @INC path
|
|
57 |
unshift @INC, File::Spec->catdir($absroot, 'lib'); |
|
58 |
||
59 |
# Change to Devel::PPPort directory, as it needs the stuff
|
|
60 |
# from the parts/ directory
|
|
1.1.5
by Niko Tyni
Import upstream version 5.12.0~rc3 |
61 |
chdir File::Spec->catdir($rootdir, 'cpan', 'Devel-PPPort'); |
1.1.3
by Brendan O'Dea
Import upstream version 5.10.0 |
62 |
|
63 |
# Capture and remove temporary files
|
|
64 |
my @unlink; |
|
65 |
||
66 |
END { |
|
67 |
for my $file (@unlink) { |
|
68 |
print "removing temporary file $file\n"; |
|
69 |
unlink $file or warn "WARNING: could not remove $file: $!\n"; |
|
70 |
1 while unlink $file; # remove any remaining versions |
|
71 |
}
|
|
72 |
}
|
|
73 |
||
74 |
# Try to create a ppport.h if it doesn't exist yet, and
|
|
75 |
# remember all files that need to be removed later.
|
|
76 |
unless (-e 'ppport.h') { |
|
77 |
unless (-e 'PPPort.pm') { |
|
78 |
run('PPPort_pm.PL'); |
|
79 |
push @unlink, 'PPPort.pm'; |
|
80 |
}
|
|
81 |
run('ppport_h.PL'); |
|
82 |
push @unlink, 'ppport.h'; |
|
83 |
}
|
|
84 |
||
85 |
# Now install the created ppport.h into extension directories
|
|
86 |
iterdirs { |
|
87 |
my($dir, $fulldir) = @_; |
|
88 |
my $dest = File::Spec->catfile($fulldir, 'ppport.h'); |
|
89 |
if (compare('ppport.h', $dest)) { |
|
90 |
print "installing ppport.h for $dir\n"; |
|
91 |
copy('ppport.h', $dest) or die "copying ppport.h to $dest failed: $!\n"; |
|
92 |
}
|
|
93 |
else { |
|
94 |
print "ppport.h in $dir is up-to-date\n"; |
|
95 |
}
|
|
96 |
};
|
|
97 |
||
98 |
exit 0; |
|
99 |
||
100 |
#---------------------------------------
|
|
101 |
# Iterate through extension directories
|
|
102 |
#---------------------------------------
|
|
103 |
sub iterdirs(&) |
|
104 |
{
|
|
105 |
my $code = shift; |
|
106 |
||
107 |
for my $dir (@destdirs) { |
|
108 |
my $fulldir = File::Spec->catdir($absroot, $dir); |
|
109 |
if (-d $fulldir) { |
|
110 |
$code->($dir, $fulldir); |
|
111 |
}
|
|
112 |
else { |
|
113 |
warn "WARNING: no such directory: $fulldir\n"; |
|
114 |
}
|
|
115 |
}
|
|
116 |
}
|
|
117 |
||
118 |
#----------------------------------------
|
|
119 |
# Read the list of extension directories
|
|
120 |
#----------------------------------------
|
|
121 |
sub readlist |
|
122 |
{
|
|
123 |
my $list = shift; |
|
124 |
my @dirs; |
|
125 |
open LIST, $list or die "$list: $!\n"; |
|
126 |
while (<LIST>) { |
|
127 |
chomp; |
|
128 |
/^\s*(?:$|#)/ or push @dirs, $_; |
|
129 |
}
|
|
130 |
close LIST; |
|
131 |
return @dirs; |
|
132 |
}
|
|
133 |
||
134 |
#----------------------------------------------
|
|
135 |
# Runs a script in the Devel::PPPort directory
|
|
136 |
#----------------------------------------------
|
|
137 |
sub run |
|
138 |
{
|
|
1.1.4
by Niko Tyni
Import upstream version 5.10.1 |
139 |
my @args = ("-I" . File::Spec->catdir((File::Spec->updir) x 2, 'lib'), @_); |
1.1.3
by Brendan O'Dea
Import upstream version 5.10.0 |
140 |
my $run = $perl =~ m/\s/ ? qq("$perl") : $perl; |
141 |
for (@args) { |
|
142 |
$_ = qq("$_") if $^O eq 'VMS' && /^[^"]/; |
|
143 |
$run .= " $_"; |
|
144 |
}
|
|
145 |
print "running $run\n"; |
|
146 |
system $run and die "$run failed: $?\n"; |
|
147 |
}
|
|
148 |
||
149 |
__END__
|
|
150 |
||
151 |
=head1 NAME
|
|
152 |
||
153 |
mkppport - distribute ppport.h among extensions
|
|
154 |
||
155 |
=head1 SYNOPSIS
|
|
156 |
||
157 |
mkppport [B<--list>=I<file>] [B<--clean>]
|
|
158 |
||
159 |
=head1 DESCRIPTION
|
|
160 |
||
161 |
B<mkppport> generates a I<ppport.h> file using Devel::PPPort
|
|
162 |
and distributes it to the various extension directories that
|
|
163 |
need it to build.
|
|
164 |
||
165 |
=head1 OPTIONS
|
|
166 |
||
167 |
=over 4
|
|
168 |
||
169 |
=item B<--list>=I<file>
|
|
170 |
||
171 |
Name of the file that holds the list of extension directories
|
|
172 |
that I<ppport.h> should be distributed to.
|
|
173 |
This defaults to I<mkppport.lst> in the same directory as this
|
|
174 |
script.
|
|
175 |
||
176 |
=item B<--clean>
|
|
177 |
||
178 |
Run with this option to clean out all distributed I<ppport.h> files.
|
|
179 |
||
180 |
=back
|
|
181 |
||
182 |
=head1 COPYRIGHT
|
|
183 |
||
184 |
Copyright 2006 by Marcus Holland-Moritz <mhx@cpan.org>.
|
|
185 |
||
186 |
This program is free software; you may redistribute it
|
|
187 |
and/or modify it under the same terms as Perl itself.
|
|
188 |
||
189 |
=cut
|