6 use File::Compare qw( compare );
7 use File::Copy qw( copy );
8 use File::Basename qw( dirname );
10 use feature 'signatures';
11 no warnings 'experimental::signatures';
13 my $rootdir = dirname($0);
15 unshift @INC, File::Spec->catdir($rootdir, qw(cpan ExtUtils-MakeMaker t lib));
17 eval q{ use MakeMaker::Test::Utils qw( which_perl ) };
21 list => File::Spec->catfile($rootdir, 'mkppport.lst'),
25 unless ( GetOptions(\%opt, qw( clean list=s )) ) {
27 Pod::Usage::pod2usage(2);
30 my $absroot = File::Spec->rel2abs($rootdir);
31 my @destdirs = readlist($opt{list});
35 print "no destination directories found in $opt{list}\n";
39 # Remove all installed ppport.h files
41 iterdirs( sub ($dir, $fulldir) {
42 my $dest = File::Spec->catfile($fulldir, 'ppport.h');
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
52 # Determine full perl location
53 my $perl = which_perl();
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');
59 # Change to Devel::PPPort directory, as it needs the stuff
60 # from the parts/ directory
61 chdir File::Spec->catdir($rootdir, 'dist', 'Devel-PPPort');
63 # Capture and remove temporary files
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
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') {
79 push @unlink, 'PPPort.pm';
82 push @unlink, 'ppport.h';
85 # Now install the created ppport.h into extension directories
86 iterdirs( sub ($dir, $fulldir) {
87 my $dest = File::Spec->catfile($fulldir, 'ppport.h');
88 if (compare('ppport.h', $dest)) {
89 print "installing ppport.h for $dir\n";
90 copy('ppport.h', $dest) or die "copying ppport.h to $dest failed: $!\n";
93 print "ppport.h in $dir is up-to-date\n";
99 #---------------------------------------
100 # Iterate through extension directories
101 #---------------------------------------
104 for my $dir (@destdirs) {
105 my $fulldir = File::Spec->catdir($absroot, $dir);
107 $code->($dir, $fulldir);
110 warn "WARNING: no such directory: $fulldir\n";
115 #----------------------------------------
116 # Read the list of extension directories
117 #----------------------------------------
121 open LIST, $list or die "$list: $!\n";
124 /^\s*(?:$|#)/ or push @dirs, $_;
130 #----------------------------------------------
131 # Runs a script in the Devel::PPPort directory
132 #----------------------------------------------
135 my @args = ("-I" . File::Spec->catdir((File::Spec->updir) x 2, 'lib'), @_);
136 my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
138 $_ = qq("$_") if $^O eq 'VMS' && /^[^"]/;
141 print "running $run\n";
142 system $run and die "$run failed: $?\n";
149 mkppport - distribute ppport.h among extensions
153 mkppport [B<--list>=I<file>] [B<--clean>]
157 B<mkppport> generates a I<ppport.h> file using Devel::PPPort
158 and distributes it to the various extension directories that
159 need it to build. On certain Win32 builds, this script is not
160 used and an alternative mechanism is used to create I<ppport.h>.
166 =item B<--list>=I<file>
168 Name of the file that holds the list of extension directories
169 that I<ppport.h> should be distributed to.
170 This defaults to I<mkppport.lst> in the same directory as this
175 Run with this option to clean out all distributed I<ppport.h> files.
181 Copyright 2006 by Marcus Holland-Moritz <mhx@cpan.org>.
183 This program is free software; you may redistribute it
184 and/or modify it under the same terms as Perl itself.