summaryrefslogtreecommitdiff
path: root/mkppport
diff options
context:
space:
mode:
Diffstat (limited to 'mkppport')
-rw-r--r--mkppport181
1 files changed, 181 insertions, 0 deletions
diff --git a/mkppport b/mkppport
new file mode 100644
index 0000000000..00462f95c9
--- /dev/null
+++ b/mkppport
@@ -0,0 +1,181 @@
+use strict;
+use warnings;
+
+use Getopt::Long;
+use Pod::Usage;
+use File::Spec;
+use File::Copy qw( copy );
+use File::Basename qw( dirname );
+
+sub iterdirs(&);
+
+my $rootdir = dirname($0);
+
+unshift @INC, File::Spec->catfile($rootdir, 't', 'lib');
+
+eval q{ use MakeMaker::Test::Utils qw( which_perl ) };
+$@ and die $@;
+
+my %opt = (
+ list => File::Spec->catfile($rootdir, 'mkppport.lst'),
+ clean => 0,
+);
+
+GetOptions(\%opt, qw( clean list=s )) or pod2usage(2);
+
+my $absroot = File::Spec->rel2abs($rootdir);
+my @destdirs = readlist($opt{list});
+
+# Nothing to do...
+unless (@destdirs) {
+ print "no destination directories found in $opt{list}\n";
+ exit 0;
+}
+
+# Remove all installed ppport.h files
+if ($opt{clean}) {
+ iterdirs {
+ my($dir, $fulldir) = @_;
+ my $dest = File::Spec->catfile($fulldir, 'ppport.h');
+ if (-f $dest) {
+ print "removing ppport.h for $dir\n";
+ unlink $dest or warn "WARNING: could not remove $dest: $!\n";
+ 1 while unlink $dest; # remove any remaining versions
+ }
+ };
+ exit 0;
+}
+
+# Determine full perl location
+my $perl = which_perl();
+
+# We're now changing the directory, which confuses the deferred
+# loading in Config.pm, so we better use an absolute @INC path
+unshift @INC, File::Spec->catdir($absroot, 'lib');
+
+# Change to Devel::PPPort directory, as it needs the stuff
+# from the parts/ directory
+chdir File::Spec->catdir($rootdir, 'ext', 'Devel', 'PPPort');
+
+# Capture and remove temporary files
+my @unlink;
+
+END {
+ for my $file (@unlink) {
+ print "removing temporary file $file\n";
+ unlink $file or warn "WARNING: could not remove $file: $!\n";
+ 1 while unlink $file; # remove any remaining versions
+ }
+}
+
+# Try to create a ppport.h if it doesn't exist yet, and
+# remember all files that need to be removed later.
+unless (-e 'ppport.h') {
+ unless (-e 'PPPort.pm') {
+ run('PPPort_pm.PL');
+ push @unlink, 'PPPort.pm';
+ }
+ run('ppport_h.PL');
+ push @unlink, 'ppport.h';
+}
+
+# Now install the created ppport.h into extension directories
+iterdirs {
+ my($dir, $fulldir) = @_;
+ print "installing ppport.h for $dir\n";
+ my $dest = File::Spec->catfile($fulldir, 'ppport.h');
+ copy('ppport.h', $dest) or die "copying ppport.h to $dest failed: $!\n";
+};
+
+exit 0;
+
+#---------------------------------------
+# Iterate through extension directories
+#---------------------------------------
+sub iterdirs(&)
+{
+ my $code = shift;
+
+ for my $dir (@destdirs) {
+ my $fulldir = File::Spec->catdir($absroot, $dir);
+ if (-d $fulldir) {
+ $code->($dir, $fulldir);
+ }
+ else {
+ warn "WARNING: no such directory: $fulldir\n";
+ }
+ }
+}
+
+#----------------------------------------
+# Read the list of extension directories
+#----------------------------------------
+sub readlist
+{
+ my $list = shift;
+ my @dirs;
+ open LIST, $list or die "$list: $!\n";
+ while (<LIST>) {
+ chomp;
+ /^\s*(?:$|#)/ or push @dirs, $_;
+ }
+ close LIST;
+ return @dirs;
+}
+
+#----------------------------------------------
+# Runs a script in the Devel::PPPort directory
+#----------------------------------------------
+sub run
+{
+ my @args = ("-I" . File::Spec->catdir((File::Spec->updir) x 3, 'lib'), @_);
+ my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
+ for (@args) {
+ $_ = qq("$_") if $^O eq 'VMS' && /^[^"]/;
+ $run .= " $_";
+ }
+ print "running $run\n";
+ system $run and die "$run failed: $?\n";
+}
+
+__END__
+
+=head1 NAME
+
+mkppport - distribute ppport.h among extensions
+
+=head1 SYNOPSIS
+
+mkppport [B<--list>=I<file>] [B<--clean>]
+
+=head1 DESCRIPTION
+
+B<mkppport> generates a I<ppport.h> file using Devel::PPPort
+and distributes it to the various extension directories that
+need it to build.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--list>=I<file>
+
+Name of the file that holds the list of extension directories
+that I<ppport.h> should be distributed to.
+This defaults to I<mkppport.lst> in the same directory as this
+script.
+
+=item B<--clean>
+
+Run with this option to clean out all distributed I<ppport.h> files.
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2006 by Marcus Holland-Moritz <mhx@cpan.org>.
+
+This program is free software; you may redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=cut