In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/e3f631a2ef048ba2143d89876faec9463d40382b?hp=64932d37c5a8b9005067c98f8618708778bb005e>

- Log -----------------------------------------------------------------
commit e3f631a2ef048ba2143d89876faec9463d40382b
Merge: 64932d3 7afc975
Author: Nicholas Clark <[email protected]>
Date:   Wed Jul 24 09:36:18 2013 +0200

    Merge work automating generation of lib/.gitignore and lib/ subdir cleanup.
    
    This makes no changes to any installed code.

commit 7afc975352a5b293c8c80f132f1e3d80fb349dd4
Author: Nicholas Clark <[email protected]>
Date:   Tue Jul 23 10:16:08 2013 +0200

    Generate the lib/ cleanup rules in the Win32 Makefiles from MANIFEST.

M       regen/lib_cleanup.pl
M       t/porting/regen.t
M       win32/Makefile
M       win32/makefile.mk

commit 727d4ce653261272b0d555f474cf1c25d9eda827
Author: Nicholas Clark <[email protected]>
Date:   Mon Jul 22 22:10:09 2013 +0200

    Generate the lib/ cleanup rules in Makefile.SH automatically from MANIFEST.

M       Makefile.SH
M       regen/lib_cleanup.pl
M       t/porting/regen.t

commit 5daeb5b0949c8927e159000017a70c6fc5545030
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 21:18:05 2013 +0200

    Re-order clean-up rules to give a line for regen/lib_cleanup.pl to key off.
    
    The Win32 line C<-del /f *.def *.map> and the start of the Unix line
    C<rm -f so_locations> are unlikely to change.

M       Makefile.SH
M       win32/Makefile
M       win32/makefile.mk

commit f31bacf34c8f49647bd051b0e1b3b0a9eb6e18e5
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 21:04:16 2013 +0200

    Remove the EXTUTILSDIR macro from the Win32 makefiles.
    
    It hasn't been used since commit e3160748789c8366 in Sept 2009 eliminated
    the XSUBPP macro.

M       win32/Makefile
M       win32/makefile.mk

commit 6c5f38cbe28485127c852caf26b14f275ed0435a
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 21:02:56 2013 +0200

    Delete obsolete clean rules from Makefile.SH
    
    Rules to clean lib/ExtUtils/CBuilder/t and lib/ExtUtils/ParseXS/t haven't
    been needed since the modules were moved to cpan/ and dist/

M       Makefile.SH

commit 244a7751704d2650c851a1e8b2c9e417b13ac388
Author: Nicholas Clark <[email protected]>
Date:   Mon Jul 22 21:23:11 2013 +0200

    Move process() from Porting/pod_rules.pl to Porting/pod_lib.pl
    
    And document it.

M       Porting/pod_lib.pl
M       Porting/pod_rules.pl

commit 236456498cbab73aa2d8ff6729448443f8c8d978
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 22:46:34 2013 +0200

    Some tidying of Porting/pod_rules.pl
    
    Iterate over the files in sorted order, instead of hash iteration order.
    This means that in TAP mode test failures will have consistent numbers.
    Provide a description for the first test when outputting TAP.
    Use clearer variable names in process(), and avoid using // as this code 
will
    soon be exposed to pre-5.10

M       Porting/pod_rules.pl

commit a2b7b21f41ac0887a480d1c81ce6e1ecc2176156
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 22:08:37 2013 +0200

    Extract the main processing loop of Porting/pod_rules/pl into process().

M       Porting/pod_rules.pl

commit 93b1bf68f495436d6f0326f484506f7df36213a9
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 16:55:37 2013 +0200

    Move verify_contiguous() from Porting/pod_rules.pl to Porting/pod_lib.pl
    
    And document it.

M       Porting/pod_lib.pl
M       Porting/pod_rules.pl

commit 8f55fd2157412bc3ed0766fb2883c8ee581595b0
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 16:46:02 2013 +0200

    Refactor the use of verify_contiguous() in pod_rules.pl
    
    Move the substitution from the callers in into verify_contiguous().
    Pass in a regex object for the substitution.
    Return the modified file contents from verify_contiguous().
    Load Carp when verify_contiguous() is called, instead of at compile time.

M       Porting/pod_rules.pl

commit 4d12fcfe86ee09995fda6faeedc7ef28f04a368f
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 14:08:41 2013 +0200

    Remove 3 redundant lines from .gitignore
    
    These test files are no longer generated in directories beneath lib/

M       .gitignore

commit e275ec0ef0d02006b4a792a1b346696f49808284
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 12:50:21 2013 +0200

    Generate lib/.gitignore from MANIFEST.
    
    It's possible to programmatically determine almost all the files and
    directories which will be created in lib/ by building the extensions.
    Hence add a new script regen/lib_cleanup.pl to do this.
    
    This saves having to manually update lib/.gitignore to reflect changes in
    the build products of extensions, which has become a small but reoccurring
    instance of scut-work.

M       MANIFEST
M       lib/.gitignore
A       regen/lib_cleanup.pl

commit e206599ac5717a273d976ec79a65f25cf6246226
Author: Nicholas Clark <[email protected]>
Date:   Mon Jul 22 09:26:24 2013 +0200

    On failure, regen_lib.pl now generates diagnostics, not just "not ok".
    
    We have to stop using File::Compare's compare(), as it doesn't return
    diagnostics about what went wrong.

M       regen/regen_lib.pl

commit 020a5f5fd939288c1ef0a8336a233d1aa5c1254d
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 11:08:53 2013 +0200

    Move all the "special case" build products from lib/.gitignore to .gitignore
    
    These are all the build products that we can't programmatically infer will 
be
    generated from extensions in ext, dist and cpan.

M       .gitignore
M       lib/.gitignore

commit f8a1725b2c30a67a3aa1346fd339bd635b6f900f
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 10:33:00 2013 +0200

    Make .gitignore and lib/.gitignore more consistent.
    
    Move the ignore of lib/App/, lib/mro.pm, lib/TAP/, lib/Test/Harness.pm,
    lib/File/DosGlob.pm, lib/inc/, Win32.pm, Win32API/ and Win32Core.pm from
    .gitignore to lib/.gitignore, where they more logically belong.
    Consistently use trailing / for ignored directories.
    Add a leading / to the ignore of unicore/TestProp.pl
    (The line was added by commit 3df51b85ce4a5664 in Nov 2009, and it's not
    clear why it did not have a leading / from the start.)
    
    Re-sort lib/.gitignore lexically.

M       .gitignore
M       lib/.gitignore

commit f2b380a8e0ec5a3f7be425aaff2316ebeb102c94
Author: Nicholas Clark <[email protected]>
Date:   Sat Jul 20 10:10:12 2013 +0200

    Prune some .gitignore files.
    
    Class::ISA was removed by 3df51b85ce4a5664 in April 2010.
    Module::Pluggable was removed by commit 482cac4d574f8c6c in May 2013.
    Module/Build/ConfigData.pm was moved from lib/ to cpan/ by commit
    0b93a7997e668a67 in Nov 2009.
    Pod::Plainer was removed by commit afbe215fcafe7a92 in April 2010.
    Shell was removed by commit a1e75797c204ade8 in June 2011.
    Switch was removed by commit 75108aefc8b50fcf in April 2010.

M       .gitignore
M       lib/.gitignore
-----------------------------------------------------------------------

Summary of changes:
 .gitignore           |  39 ++++---
 MANIFEST             |   1 +
 Makefile.SH          |  74 ++++++------
 Porting/pod_lib.pl   | 114 +++++++++++++++++++
 Porting/pod_rules.pl |  61 +++-------
 lib/.gitignore       | 310 ++++++++++++++-------------------------------------
 regen/lib_cleanup.pl | 180 ++++++++++++++++++++++++++++++
 regen/regen_lib.pl   |  35 +++++-
 t/porting/regen.t    |   2 +-
 win32/Makefile       |  28 +++--
 win32/makefile.mk    |  28 +++--
 11 files changed, 520 insertions(+), 352 deletions(-)
 create mode 100644 regen/lib_cleanup.pl

diff --git a/.gitignore b/.gitignore
index 06a5f51..7356473 100644
--- a/.gitignore
+++ b/.gitignore
@@ -93,22 +93,32 @@ MYMETA.*
 /bitcount.h
 /mg_data.h
 
-lib/inc/
-lib/Win32.pm
-lib/Win32API/
-lib/Win32CORE.pm
+# Build products that we can't infer are generated by conventional extensions
+# (ie all the special cases that would take more code than just adding them
+# here):
 lib/CORE/
+lib/Config_git.pl
+lib/Config_heavy.pl
+lib/Config.pm
+lib/Config.pod
+lib/Cross.pm
+lib/ExtUtils/MANIFEST.SKIP
+lib/ExtUtils/xsubpp
+lib/auto/
+lib/buildcustomize.pl
+lib/unicore/CombiningClass.pl
+lib/unicore/Decomposition.pl
+lib/unicore/Heavy.pl
+lib/unicore/Name.pl
+lib/unicore/Name.pm
+lib/unicore/TestProp.pl
+lib/unicore/To/
+lib/unicore/UCD.pl
+lib/unicore/lib/
+lib/unicore/mktables.lst
 
 # test byproducts
 ext/Test-Harness/t/ext/
-lib/App/
-lib/Archive/Tar/t/src/long/foo.tbz
-lib/Archive/Tar/t/src/short/foo.tbz
-lib/IPC/Cmd/t/src/x.tgz
-lib/mro.pm
-lib/TAP/
-lib/Test/Harness.pm
-lib/File/DosGlob.pm
 t/rantests
 t/tmp*
 t/perl
@@ -156,8 +166,3 @@ MANIFEST.new
 
 # generated by the top level install.html target. XXX Why does it need this?
 /vms/README_vms.pod
-
-#stuff to ignore from Module::Pluggable:
-cpan/Module-Pluggable/t/lib/EditorJunk/Plugin/#Bar.pm#
-cpan/Module-Pluggable/t/lib/OddTest/Plugin/-Dodgy.pm
-
diff --git a/MANIFEST b/MANIFEST
index a128a43..e7e153c 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -4763,6 +4763,7 @@ regen/embed.pl                    Produces 
{embed,embedvar,proto}.h
 regen/feature.pl               Generates feature.pm
 regen/genpacksizetables.pl     Generate the size tables for pack/unpack
 regen/keywords.pl              Program to write keywords.h
+regen/lib_cleanup.pl           Generate lib/.gitignore from MANIFEST
 regen/mg_vtable.pl             generate mg_vtable.h
 regen/miniperlmain.pl          generate miniperlmain.c
 regen/mk_invlists.pl           Generates charclass_invlists.h
diff --git a/Makefile.SH b/Makefile.SH
index d661c92..15b32fd 100755
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -1227,7 +1227,6 @@ _cleaner2:
        rm -f core *perl.core t/core t/*perl.core core.* t/core.*
        rm -f t/$(PERL_EXE) t/rantests
        rm -rf t/tmp*
-       rm -f so_locations $(LIBPERL_NONSHR) $(MINIPERL_NONSHR)
        rm -rf $(addedbyconf)
        rm -f $(FIRSTMAKEFILE) $(FIRSTMAKEFILE).old makefile.old utils/Makefile
        rm -f $(private)
@@ -1237,45 +1236,46 @@ _cleaner2:
        rm -f h2ph.man pstruct
        rm -rf .config
        rm -f preload
-       rm -rf lib/Encode lib/Compress lib/Hash lib/re
-       rm -rf lib/TAP lib/Module/Pluggable lib/App
-       rm -rf lib/mro
-       rm -rf lib/IO/Compress lib/IO/Uncompress
-       rm -f lib/ExtUtils/ParseXS/t/XSTest.c
-       rm -f lib/ExtUtils/ParseXS/t/XSTest$(OBJ_EXT)
-       rm -f lib/ExtUtils/ParseXS/t/XSTest$(DLSUFFIX)
-       rm -fr lib/B
-       rm -fr lib/CPAN
-       rm -fr lib/ExtUtils/CBuilder
        rm -f pod2htmd.tmp
        rm -rf pod/perlfunc pod/perlipc
        -rmdir ext/B/lib
-       -rmdir lib/Archive/Tar lib/Archive lib/Attribute
-       -rmdir lib/CGI lib/Carp
-       -rmdir lib/Data lib/Devel lib/Digest
-       -rmdir lib/ExtUtils/Command lib/ExtUtils/Constant lib/ExtUtils/Liblist 
lib/ExtUtils/MakeMaker
-       -rmdir lib/File/Spec lib/Filter/Util lib/Filter
-       -rmdir lib/I18N/LangTags lib/IO/Socket lib/IO lib/IPC
-       -rmdir lib/List/Util lib/List
-       -rmdir lib/Locale/Maketext lib/Locale
-       -rmdir lib/Log/Message lib/Log
-       -rmdir lib/Math/Big* lib/Math
-       -rmdir lib/Memoize lib/MIME
-       -rmdir lib/Module/Build/Platform lib/Module/Build lib/Module/Load 
lib/Module
-       -rmdir lib/Net/FTP lib/Object
-       -rmdir lib/Parse/CPAN lib/Parse
-       -rmdir lib/PerlIO/via lib/PerlIO
-       -rmdir lib/Package lib/Params
-       -rmdir lib/Pod/Perldoc lib/Pod/Simple lib/Pod/Text
-       -rmdir lib/Sys lib/Scalar/Util lib/Scalar
-       -rmdir lib/Term/UI lib/Thread lib/Tie/Hash
-       -rmdir lib/Test/Builder/Tester lib/Test/Builder lib/Test
-       -rmdir lib/Unicode/Collate lib/version
-       -rmdir lib/XS/APItest lib/XS
-       -rmdir lib/inc/latest lib/inc
-       -rmdir lib/autodie/exception lib/autodie lib/encoding lib/threads
-       -rm -f lib/ExtUtils/CBuilder/t/libcompilet.dll.a
-       -rm -f lib/ExtUtils/ParseXS/t/libXSTest.dll.a
+       rm -f so_locations $(LIBPERL_NONSHR) $(MINIPERL_NONSHR)
+       -rmdir lib/version lib/threads lib/inc/latest lib/inc lib/encoding
+       -rmdir lib/autodie/exception lib/autodie lib/XS lib/Win32API lib/VMS
+       -rmdir lib/Unicode/Collate/Locale lib/Unicode/Collate/CJK
+       -rmdir lib/Unicode/Collate lib/Tie/Hash lib/Thread lib/Text
+       -rmdir lib/Test/Builder/Tester lib/Test/Builder lib/Test lib/Term
+       -rmdir lib/TAP/Parser/YAMLish lib/TAP/Parser/SourceHandler
+       -rmdir lib/TAP/Parser/Scheduler lib/TAP/Parser/Result
+       -rmdir lib/TAP/Parser/Iterator lib/TAP/Parser lib/TAP/Harness
+       -rmdir lib/TAP/Formatter/File lib/TAP/Formatter/Console
+       -rmdir lib/TAP/Formatter lib/TAP lib/Sys/Syslog lib/Sys lib/Search
+       -rmdir lib/Scalar lib/Pod/Text lib/Pod/Simple lib/Pod/Perldoc
+       -rmdir lib/PerlIO/via lib/PerlIO lib/Perl lib/Parse/CPAN lib/Parse
+       -rmdir lib/Params lib/Package lib/Net/FTP lib/Module/Load
+       -rmdir lib/Module/CoreList lib/Module/Build/Platform lib/Module/Build
+       -rmdir lib/Module lib/Memoize lib/Math/BigInt lib/Math/BigFloat
+       -rmdir lib/Math lib/MIME lib/Locale/Maketext lib/Locale/Codes
+       -rmdir lib/Locale lib/List/Util lib/List lib/JSON/PP lib/JSON lib/IPC
+       -rmdir lib/IO/Uncompress/Adapter lib/IO/Uncompress lib/IO/Socket
+       -rmdir lib/IO/Compress/Zlib lib/IO/Compress/Zip lib/IO/Compress/Gzip
+       -rmdir lib/IO/Compress/Base lib/IO/Compress/Adapter lib/IO/Compress
+       -rmdir lib/IO lib/I18N/LangTags lib/I18N lib/Hash/Util lib/Hash
+       -rmdir lib/HTTP lib/Filter/Util lib/Filter lib/File/Spec
+       -rmdir lib/ExtUtils/Typemaps lib/ExtUtils/ParseXS
+       -rmdir lib/ExtUtils/MakeMaker lib/ExtUtils/Liblist
+       -rmdir lib/ExtUtils/Constant lib/ExtUtils/Command
+       -rmdir lib/ExtUtils/CBuilder/Platform/Windows
+       -rmdir lib/ExtUtils/CBuilder/Platform lib/ExtUtils/CBuilder
+       -rmdir lib/Exporter lib/Encode/Unicode lib/Encode/MIME/Header
+       -rmdir lib/Encode/MIME lib/Encode/KR lib/Encode/JP lib/Encode/CN
+       -rmdir lib/Encode lib/Digest lib/Devel lib/Data lib/Config/Perl
+       -rmdir lib/Compress/Raw lib/Compress lib/Carp lib/CPAN/Meta
+       -rmdir lib/CPAN/LWP lib/CPAN/Kwalify lib/CPAN/HTTP lib/CPAN/FTP
+       -rmdir lib/CPAN/Exception lib/CPAN/API lib/CPAN lib/CGI lib/B
+       -rmdir lib/Attribute lib/Archive/Tar lib/Archive
+       -rmdir lib/App/Prove/State/Result lib/App/Prove/State lib/App/Prove
+       -rmdir lib/App
 
 _realcleaner:
        @$(LDLIBPTH) $(MAKE) _cleaner1 CLEAN=distclean
diff --git a/Porting/pod_lib.pl b/Porting/pod_lib.pl
index 8c5ac21..06c3294 100644
--- a/Porting/pod_lib.pl
+++ b/Porting/pod_lib.pl
@@ -160,6 +160,120 @@ sub write_or_die {
     close $fh or die "Can't close $filename: $!";
 }
 
+=head2 C<verify_contiguous()>
+
+=over 4
+
+=item * Purpose
+
+Verify that a file contains exactly one contiguous run of lines which matches
+the passed in pattern. C<croak()>s if the pattern is not found, or found in
+more than one place.
+
+=item * Arguments
+
+=over 4
+
+=item * Name of file
+
+=item * Contents of file
+
+=item * Pattern of interest
+
+=item * Name to report on error
+
+=back
+
+=item * Return Value
+
+The contents of the file, with C<qr/\0+/> substituted for the pattern.
+
+=back
+
+=cut
+
+sub verify_contiguous {
+    my ($name, $content, $re, $what) = @_;
+    require Carp;
+    $content =~ s/$re/\0/g;
+    my $sections = () = $content =~ m/\0+/g;
+    Carp::croak("$0: $name contains no $what") if $sections < 1;
+    Carp::croak("$0: $name contains discontiguous $what") if $sections > 1;
+    return $content;
+}
+
+=head2 C<process()>
+
+=over 4
+
+=item * Purpose
+
+Read a file from disk, pass the contents to the callback, and either update
+the file on disk (if changed) or generate TAP output to confirm that the
+version on disk is up to date. C<die>s if the file contains any C<NUL> bytes.
+This permits the callback routine to use C<NUL> bytes as placeholders while
+manipulating the file's contents.
+
+=item * Arguments
+
+=over 4
+
+=item * Description for use in error messages
+
+=item * Name of file
+
+=item * Callback
+
+Passed description and file contents, should return updated file contents.
+
+=item * Test number
+
+If defined, generate TAP output to C<STDOUT>. If defined and false, generate
+an unnumbered test. Otherwise this is the test number in the I<ok> line.
+
+=item * Verbose flag
+
+If true, generate verbose output.
+
+=back
+
+=item * Return Value
+
+Does not return anything.
+
+=back
+
+=cut
+
+sub process {
+    my ($desc, $filename, $callback, $test, $verbose) = @_;
+
+    print "Now processing $filename\n" if $verbose;
+    my $orig = slurp_or_die($filename);
+    my_die "$filename contains NUL bytes" if $orig =~ /\0/;
+
+    my $new = $callback->($desc, $orig);
+
+    if (defined $test) {
+        printf "%s%s # $filename is up to date\n",
+            ($new eq $orig ? 'ok' : 'not ok'), ($test ? " $test" : '');
+        return;
+    } elsif ($new eq $orig) {
+        print "Was not modified\n"
+            if $verbose;
+        return;
+    }
+
+    my $mode = (stat $filename)[2];
+    my_die "Can't stat $filename: $!"
+        unless defined $mode;
+    rename $filename, "$filename.old"
+        or my_die "Can't rename $filename to $filename.old: $!";
+
+    write_or_die($filename, $new);
+    chmod $mode & 0777, $filename or my_die "can't chmod $mode $filename: $!";
+}
+
 =head2 C<pods_to_install()>
 
 =over 4
diff --git a/Porting/pod_rules.pl b/Porting/pod_rules.pl
index f0b72ed..18abe87 100644
--- a/Porting/pod_rules.pl
+++ b/Porting/pod_rules.pl
@@ -5,7 +5,6 @@ use vars qw(%Build %Targets $Verbose $Test);
 use Text::Tabs;
 use Text::Wrap;
 use Getopt::Long;
-use Carp;
 
 # Generate the sections of files listed in %Targets from pod/perl.pod
 # Mostly these are rules in Makefiles
@@ -58,7 +57,7 @@ sub my_die;
 }
 
 if ($Verbose) {
-    print "I will be building $_\n" foreach keys %Build;
+    print "I will be building $_\n" foreach sort keys %Build;
 }
 
 my $test = 1;
@@ -69,10 +68,10 @@ my $state = $Test
     ? get_pod_metadata(0, sub {
                            printf "1..%d\n", 1 + scalar keys %Build;
                            if (@_) {
-                               print "not ok $test\n";
+                               print "not ok $test # got Pod metadata\n";
                                die @_;
                            }
-                           print "ok $test\n";
+                           print "ok $test # got Pod metadata\n";
                        })
     : get_pod_metadata(1, sub { warn @_ if @_ }, values %Build);
 
@@ -130,13 +129,6 @@ sub generate_pod_mak {
     $line;
 }
 
-sub verify_contiguous {
-    my ($name, $content, $what) = @_;
-    my $sections = () = $content =~ m/\0+/g;
-    croak("$0: $name contains no $what") if $sections < 1;
-    croak("$0: $name contains discontiguous $what") if $sections > 1;
-}
-
 sub do_manifest {
     my ($name, $prev) = @_;
     my @manifest =
@@ -154,8 +146,8 @@ sub do_manifest {
 
 sub do_nmake {
     my ($name, $makefile) = @_;
-    $makefile =~ s/^\tcopy \.\.\\README.*\n/\0/gm;
-    verify_contiguous($name, $makefile, 'README copies');
+    my $re = qr/^\tcopy \.\.\\README[^\n]*\n/sm;
+    $makefile = verify_contiguous($name, $makefile, $re, 'README copies');
     # Now remove the other copies that follow
     1 while $makefile =~ s/\0\tcopy .*\n/\0/gm;
     $makefile =~ s/\0+/join ("", &generate_nmake_1)/se;
@@ -184,9 +176,9 @@ sub do_vms {
     # Looking for the macro defining the current perldelta:
     #PERLDELTA_CURRENT = [.pod]perl5139delta.pod
 
-    $makefile =~ s{\nPERLDELTA_CURRENT\s+=\s+\Q[.pod]perl\E\d+delta\.pod\n}
-                  {\0}sx;
-    verify_contiguous($name, $makefile, 'current perldelta macro');
+    my $re = qr{\nPERLDELTA_CURRENT\s+=\s+\Q[.pod]perl\E\d+delta\.pod\n}smx;
+    $makefile
+        = verify_contiguous($name, $makefile, $re, 'current perldelta macro');
     $makefile =~ s/\0+/join "\n", '', "PERLDELTA_CURRENT = 
[.pod]$state->{delta_target}", ''/se;
 
     $makefile;
@@ -207,13 +199,12 @@ sub do_unix {
     # although it seems that HP-UX make gets confused, always tried to
     # regenerate the symlink, and then the ln -s fails, as the target exists.
 
-    $makefile_SH =~ s!(
+    my $re = qr{(
 pod/perl[a-z0-9_]+\.pod: pod/perl[a-z0-9_]+\.pod
        \$\(RMS\) pod/perl[a-z0-9_]+\.pod
        \$\(LNS\) perl[a-z0-9_]+\.pod pod/perl[a-z0-9_]+\.pod
-)+!\0!gm;
-
-    verify_contiguous($name, $makefile_SH, 'copy rules');
+)+}sm;
+    $makefile_SH = verify_contiguous($name, $makefile_SH, $re, 'copy rules');
 
     my @copy_rules = map "
 pod/$_: pod/$state->{copies}{$_}
@@ -226,34 +217,8 @@ pod/$_: pod/$state->{copies}{$_}
 }
 
 # Do stuff
-while (my ($target, $name) = each %Build) {
-    print "Now processing $name\n" if $Verbose;
-
-    my $orig = slurp_or_die($name);
-    my_die "$name contains NUL bytes" if $orig =~ /\0/;
-
-    my $new = do {
-        no strict 'refs';
-        &{"do_$target"}($target, $orig);
-    };
-
-    if ($Test) {
-        printf "%s %d # $name is up to date\n",
-            $new eq $orig ? 'ok' : 'not ok',
-                ++$test;
-        next;
-    } elsif ($new eq $orig) {
-        print "Was not modified\n"
-            if $Verbose;
-        next;
-    }
-
-    my $mode = (stat $name)[2] // my_die "Can't stat $name: $!";
-    rename $name, "$name.old" or my_die "Can't rename $name to $name.old: $!";
-
-    write_or_die($name, $new);
-    chmod $mode & 0777, $name or my_die "can't chmod $mode $name: $!";
-}
+process($_, $Build{$_}, main->can("do_$_"), $Test && ++$test, $Verbose)
+    foreach sort keys %Build;
 
 # Local variables:
 # cperl-indent-level: 4
diff --git a/lib/.gitignore b/lib/.gitignore
index 138f495..8337da0 100644
--- a/lib/.gitignore
+++ b/lib/.gitignore
@@ -1,102 +1,52 @@
-/Archive/Tar.pm
-/Archive/Tar/Constant.pm
-/Archive/Tar/File.pm
-/Attribute
+# -*- buffer-read-only: t -*-
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+# This file is built by regen/lib_cleanup.pl from MANIFEST and parsing files
+# in cpan/ dist/ and ext/.
+# Any changes made here will be lost!
+
+# If this generated file has problems, it may be simpler to add more special
+# cases to the top level .gitignore than to code one-off logic into the
+# generation script regen/lib_cleanup.pl
+
+/App/
+/Archive/
+/Attribute/
 /AutoLoader.pm
 /AutoSplit.pm
-/B
 /B.pm
-/CGI
+/B/
 /CGI.pm
-/CPAN
+/CGI/
 /CPAN.pm
-/CPAN/API
-/CPAN/API/HOWTO.pod
-/CPAN/Author.pm
-/CPAN/Bundle.pm
-/CPAN/CacheMgr.pm
-/CPAN/Complete.pm
-/CPAN/Debug.pm
-/CPAN/DeferredCode.pm
-/CPAN/Distribution.pm
-/CPAN/Distroprefs.pm
-/CPAN/Distrostatus.pm
-/CPAN/Exception
-/CPAN/Exception/RecursiveDependency.pm
-/CPAN/Exception/blocked_urllist.pm
-/CPAN/Exception/yaml_not_installed.pm
-/CPAN/FTP
-/CPAN/FTP.pm
-/CPAN/FTP/netrc.pm
-/CPAN/FirstTime.pm
-/CPAN/HandleConfig.pm
-/CPAN/Index.pm
-/CPAN/InfoObj.pm
-/CPAN/Kwalify
-/CPAN/Kwalify.pm
-/CPAN/Kwalify/distroprefs.dd
-/CPAN/Kwalify/distroprefs.yml
-/CPAN/LWP
-/CPAN/LWP/UserAgent.pm
-/CPAN/Meta
-/CPAN/Meta.pm
-/CPAN/Module.pm
-/CPAN/Nox.pm
-/CPAN/PAUSE2003.pub
-/CPAN/PAUSE2005.pub
-/CPAN/PAUSE2007.pub
-/CPAN/PAUSE2009.pub
-/CPAN/Prompt.pm
-/CPAN/Queue.pm
-/CPAN/SIGNATURE
-/CPAN/Shell.pm
-/CPAN/Tarzip.pm
-/CPAN/URL.pm
-/CPAN/Version.pm
+/CPAN/
 /Carp.pm
-/Carp/Heavy.pm
-/Class/ISA.pm
-/Compress
-/Config.pm
-/Config.pod
-/Config/Perl
-/Config/Perl/V.pm
-/Config_git.pl
-/Config_heavy.pl
-/Cross.pm
+/Carp/
+/Compress/
+/Config/Perl/
 /Cwd.pm
 /DB_File.pm
-/Data
-/Devel/DProf.pm
-/Devel/DProf/
-/Devel/InnerPackage.pm
-/Devel/PPPort.pm
-/Devel/Peek.pm
-/Devel/SelfStubber.pm
+/Data/
+/Devel/
 /Digest.pm
-/Digest/MD5.pm
-/Digest/SHA.pm
-/Digest/base.pm
-/Digest/file.pm
+/Digest/
 /Dumpvalue.pm
 /DynaLoader.pm
-/Encode
 /Encode.pm
+/Encode/
 /Env.pm
 /Errno.pm
 /Exporter.pm
-/Exporter/Heavy.pm
+/Exporter/
 /ExtUtils/CBuilder.pm
 /ExtUtils/CBuilder/
 /ExtUtils/Command.pm
-/ExtUtils/Command/MM.pm
-/ExtUtils/Constant
+/ExtUtils/Command/
 /ExtUtils/Constant.pm
+/ExtUtils/Constant/
 /ExtUtils/Install.pm
 /ExtUtils/Installed.pm
 /ExtUtils/Liblist.pm
-/ExtUtils/Liblist/Kid.pm
-/ExtUtils/MANIFEST.SKIP
+/ExtUtils/Liblist/
 /ExtUtils/MM.pm
 /ExtUtils/MM_AIX.pm
 /ExtUtils/MM_Any.pm
@@ -116,14 +66,12 @@
 /ExtUtils/MM_Win95.pm
 /ExtUtils/MY.pm
 /ExtUtils/MakeMaker.pm
-/ExtUtils/MakeMaker/Config.pm
-/ExtUtils/MakeMaker/FAQ.pod
-/ExtUtils/MakeMaker/YAML.pm
-/ExtUtils/MakeMaker/Tutorial.pod
+/ExtUtils/MakeMaker/
 /ExtUtils/Manifest.pm
 /ExtUtils/Miniperl.pm
 /ExtUtils/Mkbootstrap.pm
 /ExtUtils/Mksymlists.pm
+/ExtUtils/Myconst2perl.pm
 /ExtUtils/Packlist.pm
 /ExtUtils/ParseXS.pm
 /ExtUtils/ParseXS.pod
@@ -131,116 +79,42 @@
 /ExtUtils/Typemaps.pm
 /ExtUtils/Typemaps/
 /ExtUtils/testlib.pm
-/ExtUtils/xsubpp
 /Fatal.pm
 /Fcntl.pm
-/File/CheckTree.pm
+/File/DosGlob.pm
 /File/Fetch.pm
 /File/Find.pm
 /File/Glob.pm
 /File/GlobMapper.pm
 /File/Path.pm
-/File/Spec/
 /File/Spec.pm
+/File/Spec/
 /File/Temp.pm
 /FileCache.pm
-/Filter/Simple.pm
-/Filter/Util
+/Filter/
 /GDBM_File.pm
-/Hash
-/I18N/Collate.pm
-/I18N/LangTags
-/I18N/LangTags.pm
-/I18N/Langinfo.pm
-/IO.pm
-/IO/Compress
-/IO/Dir.pm
-/IO/File.pm
-/IO/Handle.pm
-/IO/Pipe.pm
-/IO/Poll.pm
-/IO/Seekable.pm
-/IO/Select.pm
-/IO/Socket
-/IO/Socket.pm
-/IO/Uncompress
-/IO/Zlib.pm
-/IPC/Cmd.pm
-/IPC/Msg.pm
-/IPC/Open2.pm
-/IPC/Open3.pm
-/IPC/Semaphore.pm
-/IPC/SharedMem.pm
-/IPC/SysV.pm
-/HTTP/Tiny.pm
-/JSON/PP.pm
-/JSON/PP/Boolean.pm
 /Getopt/Long.pm
-/List
-/Locale
-/Locale/Constants.pm
-/Locale/Constants.pod
-/Locale/Country.pm
-/Locale/Country.pod
-/Locale/Currency.pm
-/Locale/Currency.pod
-/Locale/Language.pm
-/Locale/Language.pod
-/Locale/Maketext
-/Locale/Maketext.pm
-/Locale/Maketext.pod
-/Locale/Maketext/Guts.pm
-/Locale/Maketext/GutsLoader.pm
-/Locale/Maketext/Simple.pm
-/Locale/Maketext/TPJ13.pod
-/Locale/Script.pm
-/Locale/Script.pod
-/MIME
-/Math
-/Math/BigFloat
-/Math/BigFloat.pm
-/Math/BigFloat/Trace.pm
-/Math/BigInt
-/Math/BigInt.pm
-/Math/BigInt/Calc.pm
-/Math/BigInt/CalcEmu.pm
-/Math/BigInt/FastCalc.pm
-/Math/BigInt/Trace.pm
-/Math/BigRat.pm
-/Math/Complex.pm
-/Math/Trig.pm
-/Memoize
+/HTTP/
+/Hash/
+/I18N/
+/IO.pm
+/IO/
+/IPC/
+/JSON/
+/List/
+/Locale/
+/MIME/
+/Math/
 /Memoize.pm
-/Memoize/AnyDBM_File.pm
-/Memoize/Expire.pm
-/Memoize/ExpireFile.pm
-/Memoize/ExpireTest.pm
-/Memoize/NDBM_File.pm
-/Memoize/SDBM_File.pm
-/Memoize/Storable.pm
-/Module/Build
-/Module/Build.pm
-!/Module/Build/ConfigData.pm
-/Module/CoreList
-/Module/CoreList.pm
-/Module/CoreList.pod
-/Module/CoreList/TieHashDelta.pm
-/Module/Load.pm
-/Module/Load/Conditional.pm
-/Module/Loaded.pm
-/Module/Metadata.pm
+/Memoize/
+/Module/
 /NDBM_File.pm
 /NEXT.pm
 /Net/Cmd.pm
 /Net/Config.pm
 /Net/Domain.pm
-/Net/FTP
 /Net/FTP.pm
-/Net/FTP/A.pm
-/Net/FTP/E.pm
-/Net/FTP/I.pm
-/Net/FTP/L.pm
-/Net/FTP/dataconn.pm
+/Net/FTP/
 /Net/NNTP.pm
 /Net/Netrc.pm
 /Net/POP3.pm
@@ -253,68 +127,48 @@
 /Opcode.pm
 /POSIX.pm
 /POSIX.pod
-/Package/Constants.pm
-/Params/Check.pm
-/Parse/CPAN/
-/Perl/OSType.pm
-/PerlIO/encoding.pm
-/PerlIO/mmap.pm
-/PerlIO/scalar.pm
-/PerlIO/via.pm
-/PerlIO/via/QuotedPrint.pm
+/Package/
+/Params/
+/Parse/
+/Perl/
+/PerlIO/
 /Pod/Checker.pm
 /Pod/Escapes.pm
-/Pod/Functions.pm
 /Pod/Find.pm
+/Pod/Functions.pm
 /Pod/Html.pm
 /Pod/InputObjects.pm
 /Pod/Man.pm
 /Pod/ParseLink.pm
 /Pod/ParseUtils.pm
 /Pod/Parser.pm
-/Pod/Perldoc
 /Pod/Perldoc.pm
+/Pod/Perldoc/
 /Pod/PlainText.pm
-/Pod/Plainer.pm
 /Pod/Select.pm
-/Pod/Simple
 /Pod/Simple.pm
 /Pod/Simple.pod
-/Pod/Simple/t/corpus/2202jp.txt
-/Pod/Simple/t/corpus/2202jpx.txt
-/Pod/Simple/t/corpus/2202jpy.txt
-/Pod/Simple/t/corpus2/polish_utf16be_bom.txt
-/Pod/Simple/t/corpus2/polish_utf16le_bom.txt
+/Pod/Simple/
 /Pod/Text.pm
 /Pod/Text/
 /Pod/Usage.pm
 /Pod/perldoc.pod
 /SDBM_File.pm
 /Safe.pm
-/Scalar
+/Scalar/
 /Search/
 /SelfLoader.pm
-/Shell.pm
 /Socket.pm
 /Storable.pm
-/Switch.pm
-/Sys
-/Term
+/Sys/
+/TAP/
+/Term/
 /Test.pm
-/Test/Builder
-/Test/Builder.pm
-/Test/More.pm
-/Test/Simple.pm
-/Test/Tutorial.pod
-/Text/Balanced.pm
-/Text/ParseWords.pm
-/Text/Soundex.pm
-/Text/Tabs.pm
-/Text/Wrap.pm
-/Text/Abbrev.pm
-/Thread
+/Test/
+/Text/
+/Thread/
 /Tie/File.pm
-/Tie/Hash/NamedCapture.pm
+/Tie/Hash/
 /Tie/Memoize.pm
 /Tie/RefHash.pm
 /Time/HiRes.pm
@@ -324,45 +178,51 @@
 /Unicode/Collate.pm
 /Unicode/Collate/
 /Unicode/Normalize.pm
-/XS
+/VMS/
+/Win32.pm
+/Win32API/
+/Win32CORE.pm
+/XS/
 /XSLoader.pm
 /arybase.pm
 /attributes.pm
-/auto
-/autodie
 /autodie.pm
+/autodie/
 /autouse.pm
 /base.pm
 /bigint.pm
 /bignum.pm
 /bigrat.pm
-/buildcustomize.pl
 /constant.pm
-/encoding
 /encoding.pm
+/encoding/
 /fields.pm
 /if.pm
+/inc/
 /lib.pm
+/mro.pm
 /ops.pm
 /parent.pm
-/perlfaq*
+/perlfaq.pm
+/perlfaq.pod
+/perlfaq1.pod
+/perlfaq2.pod
+/perlfaq3.pod
+/perlfaq4.pod
+/perlfaq5.pod
+/perlfaq6.pod
+/perlfaq7.pod
+/perlfaq8.pod
+/perlfaq9.pod
 /perlglossary.pod
 /perlxs.pod
 /perlxstut.pod
 /perlxstypemap.pod
 /re.pm
-/threads
 /threads.pm
-/unicore/CombiningClass.pl
-/unicore/Decomposition.pl
-/unicore/Heavy.pl
-/unicore/mktables.lst
-/unicore/Name.pl
-/unicore/Name.pm
-unicore/TestProp.pl
-/unicore/To
-/unicore/UCD.pl
-/unicore/lib
+/threads/
 /version.pm
 /version.pod
 /version/
+
+# ex: set ro:
diff --git a/regen/lib_cleanup.pl b/regen/lib_cleanup.pl
new file mode 100644
index 0000000..c9d6e43
--- /dev/null
+++ b/regen/lib_cleanup.pl
@@ -0,0 +1,180 @@
+#!perl -w
+use strict;
+require 'regen/regen_lib.pl';
+require 'Porting/pod_lib.pl';
+use vars qw($TAP $Verbose);
+
+# For processing later
+my @ext;
+# Lookup hash of all directories in lib/ in a clean distribution
+my %libdirs;
+
+open my $fh, '<', 'MANIFEST'
+    or die "Can't open MANIFEST: $!";
+
+while (<$fh>) {
+    if (m<^((?:cpan|dist|ext)/[^/]+/              # In an extension directory
+           (?!t/|private/|corpus/|demo/|testdir/) # but not a test or similar
+           \S+                                    # filename characters
+           (?:\.pm|\.pod|_pm\.PL|_pod\.PL|\.yml)) # useful ending
+           (?:\s|$)                               # whitespace or end of line
+          >x) {
+        push @ext, $1;
+    } elsif (m!^lib/([^ \t\n]+)/[^/ \t\n]+!) {
+        # All we are interested in are shipped directories in lib/
+        # leafnames (and package names) are actually irrelevant.
+        my $dirs = $1;
+        do {
+            # lib/Pod/t is in MANIFEST, but lib/Pod is not. Rather than
+            # special-casing this, generalise the code to ensure that all
+            # parent directories of anything add are also added:
+            ++$libdirs{$dirs}
+        } while ($dirs =~ s!/.*!!);
+    }
+}
+
+close $fh
+    or die "Can't close MANIFEST: $!";
+
+# Lines we need in lib/.gitignore
+my %ignore;
+# Directories that the Makfiles should remove
+# With a special case already :-(
+my %rmdir_s = my %rmdir = ('Unicode/Collate/Locale' => 1);
+
+FILE:
+foreach my $file (@ext) {
+    my ($extname, $path) = $file =~ m!^(?:cpan|dist|ext)/([^/]+)/(.*)!
+        or die "Can't parse '$file'";
+
+    if ($path =~ /\.yml$/) {
+       next unless $path =~ s!^lib/!!;
+    } elsif ($path =~ /\.pod$/) {
+        unless ($path =~ s!^lib/!!) {
+            # ExtUtils::MakeMaker will install it to a path based on the
+            # extension name:
+            if ($extname =~ s!-[^-]+$!!) {
+                $extname =~ tr!-!/!;
+                $path = "$extname/$path";
+            }
+        }
+    } elsif ($extname eq 'Unicode-Collate'  # Trust the package lines
+             || $extname eq 'Encode'        # Trust the package lines
+             || $path eq 'win32/Win32.pm'   # Trust the package line
+             || ($path !~ tr!/!!            # No path
+                 && $path ne 'DB_File.pm'   # ... but has multiple package 
lines
+                )) {
+        # Too many special cases to encode, so just open the file and figure it
+        # out:
+        my $package;
+        open my $fh, '<', $file
+            or die "Can't open $file: $!";
+        while (<$fh>) {
+            if (/^\s*package\s+([A-Za-z0-9_:]+)/) {
+                $package = $1;
+                last;
+            }
+        }
+        close $fh
+            or die "Can't close $file: $!";
+        die "Can't locate package statement in $file"
+            unless defined $package;
+        $package =~ s!::!/!g;
+        $path = "$package.pm";
+    } else {
+        if ($path =~ s/\.PL$//) {
+            # .PL files generate other files. By convention the output filename
+            # has the .PL stripped, and any preceding _ changed to ., to comply
+            # with historical VMS filename rules that only permit one .
+            $path =~ s!_([^_/]+)$!.$1!;
+        }
+        $path =~ s!^lib/!!;
+    }
+    my @parts = split '/', $path;
+    my $prefix = shift @parts;
+    while (@parts) {
+        if (!$libdirs{$prefix}) {
+            # It is a directory that we will create. Ignore everything in it:
+            ++$ignore{"/$prefix/"};
+            ++$rmdir{$prefix};
+            ++$rmdir_s{$prefix};
+            pop @parts;
+            while (@parts) {
+                $prefix .= '/' . shift @parts;
+                ++$rmdir{$prefix};
+            }
+            next FILE;
+        }
+        $prefix .= '/' . shift @parts;
+        # If we've just shifted the leafname back onto $prefix, then @parts is
+        # empty, so we should terminate this loop.
+    }
+    # We are creating a file in an existing directory. We must ignore the file
+    # explicitly:
+    ++$ignore{"/$path"};
+}
+
+sub edit_makefile_SH {
+    my ($desc, $contents) = @_;
+    my $start_re = qr/(\trm -f so_locations[^\n]+)/;
+    my ($start) = $contents =~ $start_re;
+    $contents = verify_contiguous($desc, $contents,
+                                  qr/$start_re\n(?:\t-rmdir [^\n]+\n)+/sm,
+                                  'lib directory rmdir rules');
+    # Reverse sort ensures that any subdirectories are deleted first.
+    # The extensions themselves delete files with the MakeMaker generated clean
+    # targets.
+    $contents =~ s{\0}
+                  {"$start\n"
+                   . wrap(79, "\t-rmdir ", "\t-rmdir ",
+                          map {"lib/$_"} reverse sort keys %rmdir)
+                   . "\n"}e;
+    $contents;
+}
+
+sub edit_win32_makefile {
+    my ($desc, $contents) = @_;
+    my $start = "\t-del /f *.def *.map";
+    my $start_re = quotemeta($start);
+    $contents = verify_contiguous($desc, $contents,
+                                  qr!$start_re\n(?:\t-if exist 
(\$\(LIBDIR\)\\\S+) rmdir /s /q \1\n)+!sm,
+                                  'Win32 lib directory rmdir rules');
+    # Win32 is (currently) using rmdir /s /q which deletes recursively
+    # (seems to be analogous to rm -r) so we don't explicitly list
+    # subdirectories to delete, and don't need to ensure that subdirectories 
are
+    # deleted before their parents.
+    # Might be able to rely on MakeMaker generated clean targets to clean
+    # everything, but not in a position to test this.
+    my $lines = join '', map {
+        tr!/!\\!;
+        "\t-if exist \$(LIBDIR)\\$_ rmdir /s /q \$(LIBDIR)\\$_\n"
+    } sort {lc $a cmp lc $b} keys %rmdir_s;
+    $contents =~ s/\0/$start\n$lines/;
+    $contents;
+}
+
+process('Makefile.SH', 'Makefile.SH', \&edit_makefile_SH, $TAP && '', 
$Verbose);
+foreach ('win32/Makefile', 'win32/makefile.mk') {
+    process($_, $_, \&edit_win32_makefile, $TAP && '', $Verbose);
+}
+
+# This must come last as it can exit early:
+if ($TAP && !-d '.git' && !-f 'lib/.gitignore') {
+    print "ok # skip not being run from a git checkout, hence no 
lib/.gitignore\n";
+    exit 0;
+}
+
+$fh = open_new('lib/.gitignore', '>',
+               { by => $0,
+                 from => 'MANIFEST and parsing files in cpan/ dist/ and 
ext/'});
+
+print $fh <<"EOT";
+# If this generated file has problems, it may be simpler to add more special
+# cases to the top level .gitignore than to code one-off logic into the
+# generation script $0
+
+EOT
+
+print $fh "$_\n" foreach sort keys %ignore;
+
+read_only_bottom_close_and_rename($fh);
diff --git a/regen/regen_lib.pl b/regen/regen_lib.pl
index 9e79f69..b64e0b0 100644
--- a/regen/regen_lib.pl
+++ b/regen/regen_lib.pl
@@ -67,8 +67,39 @@ sub close_and_rename {
     close $fh or die "Error closing $name: $!";
 
     if ($TAP) {
-       my $not = compare($name, $final_name) ? 'not ' : '';
-       print STDOUT $not . "ok - $0 $final_name\n";
+        # Don't use compare beacuse if there are errors it doesn't give any
+        # way to generate diagnostics about what went wrong.
+        # These files are small enough to read into memory.
+        local $/;
+        # This is the file we just closed, so it should open cleanly:
+        open $fh, '<', $name
+            or die "Can't open '$name': $!";
+        my $want = <$fh>;
+        die "Can't read '$name': $!"
+            unless defined $want;
+        close $fh
+            or die "Can't close '$name': $!";
+
+        my $fail;
+        if (!open $fh, '<', $final_name) {
+            $fail = "Can't open '$final_name': $!";
+        } else {
+            my $have = <$fh>;
+            if (!defined $have) {
+                $fail = "Can't read '$final_name': $!";
+                close $fh;
+            } elsif (!close $fh) {
+                $fail = "Can't close '$final_name': $!";
+            } elsif ($want ne $have) {
+                $fail = "'$name' and '$final_name' differ";
+            }
+        }
+        if ($fail) {
+            print STDOUT "not ok - $0 $final_name\n";
+            print STDERR "$fail\n";
+        } else {
+            print STDOUT "ok - $0 $final_name\n";
+        }
        safer_unlink($name);
        return;
     }
diff --git a/t/porting/regen.t b/t/porting/regen.t
index f7ec411..7450613 100644
--- a/t/porting/regen.t
+++ b/t/porting/regen.t
@@ -16,7 +16,7 @@ if ( $^O eq "VMS" ) {
   skip_all( "- regen.pl needs porting." );
 }
 
-my $tests = 23; # I can't see a clean way to calculate this automatically.
+my $tests = 26; # I can't see a clean way to calculate this automatically.
 
 my %skip = ("regen_perly.pl"    => [qw(perly.act perly.h perly.tab)],
             "regen/keywords.pl" => [qw(keywords.c keywords.h)],
diff --git a/win32/Makefile b/win32/Makefile
index 36968e3..0583c81 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -391,7 +391,6 @@ EXTDIR              = ..\ext
 DISTDIR                = ..\dist
 CPANDIR                = ..\cpan
 PODDIR         = ..\pod
-EXTUTILSDIR    = $(LIBDIR)\ExtUtils
 HTMLDIR                = .\html
 
 #
@@ -1163,7 +1162,6 @@ utils: $(PERLEXE) $(X2P) ..\utils\Makefile
 distclean: realclean
        -del /f $(MINIPERL) $(PERLEXE) $(PERLDLL) $(GLOBEXE) \
                $(PERLIMPLIB) ..\miniperl.lib $(PERLEXESTATIC) $(PERLSTATICLIB)
-       -del /f *.def *.map
        -del /f $(LIBDIR)\Encode.pm $(LIBDIR)\encoding.pm $(LIBDIR)\Errno.pm
        -del /f $(LIBDIR)\Config.pod $(LIBDIR)\POSIX.pod $(LIBDIR)\threads.pm
        -del /f $(LIBDIR)\.exists $(LIBDIR)\attributes.pm 
$(LIBDIR)\DynaLoader.pm
@@ -1183,62 +1181,70 @@ distclean: realclean
        -del /f $(LIBDIR)\Win32API\File\cFile.pc
        -del /f $(LIBDIR)\buildcustomize.pl
        -del /f $(DISTDIR)\XSLoader\XSLoader.pm
+       -del /f *.def *.map
        -if exist $(LIBDIR)\App rmdir /s /q $(LIBDIR)\App
        -if exist $(LIBDIR)\Archive rmdir /s /q $(LIBDIR)\Archive
        -if exist $(LIBDIR)\Attribute rmdir /s /q $(LIBDIR)\Attribute
        -if exist $(LIBDIR)\autodie rmdir /s /q $(LIBDIR)\autodie
        -if exist $(LIBDIR)\B rmdir /s /q $(LIBDIR)\B
+       -if exist $(LIBDIR)\Carp rmdir /s /q $(LIBDIR)\Carp
        -if exist $(LIBDIR)\CGI rmdir /s /q $(LIBDIR)\CGI
-       -if exist $(LIBDIR)\CPAN rmdir /s /q $(LIBDIR)\CPAN
        -if exist $(LIBDIR)\Compress rmdir /s /q $(LIBDIR)\Compress
+       -if exist $(LIBDIR)\Config\Perl rmdir /s /q $(LIBDIR)\Config\Perl
+       -if exist $(LIBDIR)\CPAN rmdir /s /q $(LIBDIR)\CPAN
        -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data
        -if exist $(LIBDIR)\Devel rmdir /s /q $(LIBDIR)\Devel
        -if exist $(LIBDIR)\Digest rmdir /s /q $(LIBDIR)\Digest
        -if exist $(LIBDIR)\Encode rmdir /s /q $(LIBDIR)\Encode
        -if exist $(LIBDIR)\encoding rmdir /s /q $(LIBDIR)\encoding
+       -if exist $(LIBDIR)\Exporter rmdir /s /q $(LIBDIR)\Exporter
        -if exist $(LIBDIR)\ExtUtils\CBuilder rmdir /s /q 
$(LIBDIR)\ExtUtils\CBuilder
        -if exist $(LIBDIR)\ExtUtils\Command rmdir /s /q 
$(LIBDIR)\ExtUtils\Command
        -if exist $(LIBDIR)\ExtUtils\Constant rmdir /s /q 
$(LIBDIR)\ExtUtils\Constant
        -if exist $(LIBDIR)\ExtUtils\Liblist rmdir /s /q 
$(LIBDIR)\ExtUtils\Liblist
        -if exist $(LIBDIR)\ExtUtils\MakeMaker rmdir /s /q 
$(LIBDIR)\ExtUtils\MakeMaker
+       -if exist $(LIBDIR)\ExtUtils\ParseXS rmdir /s /q 
$(LIBDIR)\ExtUtils\ParseXS
+       -if exist $(LIBDIR)\ExtUtils\Typemaps rmdir /s /q 
$(LIBDIR)\ExtUtils\Typemaps
        -if exist $(LIBDIR)\File\Spec rmdir /s /q $(LIBDIR)\File\Spec
        -if exist $(LIBDIR)\Filter rmdir /s /q $(LIBDIR)\Filter
        -if exist $(LIBDIR)\Hash rmdir /s /q $(LIBDIR)\Hash
-       -if exist $(LIBDIR)\I18N\LangTags rmdir /s /q $(LIBDIR)\I18N\LangTags
+       -if exist $(LIBDIR)\HTTP rmdir /s /q $(LIBDIR)\HTTP
+       -if exist $(LIBDIR)\I18N rmdir /s /q $(LIBDIR)\I18N
        -if exist $(LIBDIR)\inc rmdir /s /q $(LIBDIR)\inc
-       -if exist $(LIBDIR)\Module\Pluggable rmdir /s /q 
$(LIBDIR)\Module\Pluggable
        -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO
        -if exist $(LIBDIR)\IPC rmdir /s /q $(LIBDIR)\IPC
+       -if exist $(LIBDIR)\JSON rmdir /s /q $(LIBDIR)\JSON
        -if exist $(LIBDIR)\List rmdir /s /q $(LIBDIR)\List
        -if exist $(LIBDIR)\Locale rmdir /s /q $(LIBDIR)\Locale
-       -if exist $(LIBDIR)\Log rmdir /s /q $(LIBDIR)\Log
        -if exist $(LIBDIR)\Math rmdir /s /q $(LIBDIR)\Math
        -if exist $(LIBDIR)\Memoize rmdir /s /q $(LIBDIR)\Memoize
        -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
        -if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
-       -if exist $(LIBDIR)\mro rmdir /s /q $(LIBDIR)\mro
        -if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
-       -if exist $(LIBDIR)\Object rmdir /s /q $(LIBDIR)\Object
        -if exist $(LIBDIR)\Package rmdir /s /q $(LIBDIR)\Package
        -if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
        -if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
+       -if exist $(LIBDIR)\Perl rmdir /s /q $(LIBDIR)\Perl
        -if exist $(LIBDIR)\PerlIO rmdir /s /q $(LIBDIR)\PerlIO
        -if exist $(LIBDIR)\Pod\Perldoc rmdir /s /q $(LIBDIR)\Pod\Perldoc
        -if exist $(LIBDIR)\Pod\Simple rmdir /s /q $(LIBDIR)\Pod\Simple
        -if exist $(LIBDIR)\Pod\Text rmdir /s /q $(LIBDIR)\Pod\Text
-       -if exist $(LIBDIR)\re rmdir /s /q $(LIBDIR)\re
        -if exist $(LIBDIR)\Scalar rmdir /s /q $(LIBDIR)\Scalar
+       -if exist $(LIBDIR)\Search rmdir /s /q $(LIBDIR)\Search
        -if exist $(LIBDIR)\Sys rmdir /s /q $(LIBDIR)\Sys
        -if exist $(LIBDIR)\TAP rmdir /s /q $(LIBDIR)\TAP
-       -if exist $(LIBDIR)\Term\UI rmdir /s /q $(LIBDIR)\Term\UI
+       -if exist $(LIBDIR)\Term rmdir /s /q $(LIBDIR)\Term
        -if exist $(LIBDIR)\Test rmdir /s /q $(LIBDIR)\Test
+       -if exist $(LIBDIR)\Text rmdir /s /q $(LIBDIR)\Text
        -if exist $(LIBDIR)\Thread rmdir /s /q $(LIBDIR)\Thread
        -if exist $(LIBDIR)\threads rmdir /s /q $(LIBDIR)\threads
        -if exist $(LIBDIR)\Tie\Hash rmdir /s /q $(LIBDIR)\Tie\Hash
        -if exist $(LIBDIR)\Unicode\Collate rmdir /s /q 
$(LIBDIR)\Unicode\Collate
+       -if exist $(LIBDIR)\Unicode\Collate\Locale rmdir /s /q 
$(LIBDIR)\Unicode\Collate\Locale
        -if exist $(LIBDIR)\version rmdir /s /q $(LIBDIR)\version
-       -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
+       -if exist $(LIBDIR)\VMS rmdir /s /q $(LIBDIR)\VMS
        -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
+       -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat roffitall \
            perl5193delta.pod perlaix.pod perlamiga.pod perlapi.pod \
            perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod perldos.pod \
diff --git a/win32/makefile.mk b/win32/makefile.mk
index bdbf436..ce0a655 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -372,7 +372,6 @@ EXTDIR              = ..\ext
 DISTDIR                = ..\dist
 CPANDIR                = ..\cpan
 PODDIR         = ..\pod
-EXTUTILSDIR    = $(LIBDIR)\ExtUtils
 HTMLDIR                = .\html
 
 #
@@ -1341,7 +1340,6 @@ utils: $(PERLEXE) $(X2P) ..\utils\Makefile
 distclean: realclean
        -del /f $(MINIPERL) $(PERLEXE) $(PERLDLL) $(GLOBEXE) \
                $(PERLIMPLIB) ..\miniperl$(a) $(PERLEXESTATIC) $(PERLSTATICLIB)
-       -del /f *.def *.map
        -del /f $(LIBDIR)\Encode.pm $(LIBDIR)\encoding.pm $(LIBDIR)\Errno.pm
        -del /f $(LIBDIR)\Config.pod $(LIBDIR)\POSIX.pod $(LIBDIR)\threads.pm
        -del /f $(LIBDIR)\.exists $(LIBDIR)\attributes.pm 
$(LIBDIR)\DynaLoader.pm
@@ -1361,62 +1359,70 @@ distclean: realclean
        -del /f $(LIBDIR)\Win32API\File\cFile.pc
        -del /f $(LIBDIR)\buildcustomize.pl
        -del /f $(DISTDIR)\XSLoader\XSLoader.pm
+       -del /f *.def *.map
        -if exist $(LIBDIR)\App rmdir /s /q $(LIBDIR)\App
        -if exist $(LIBDIR)\Archive rmdir /s /q $(LIBDIR)\Archive
        -if exist $(LIBDIR)\Attribute rmdir /s /q $(LIBDIR)\Attribute
        -if exist $(LIBDIR)\autodie rmdir /s /q $(LIBDIR)\autodie
        -if exist $(LIBDIR)\B rmdir /s /q $(LIBDIR)\B
+       -if exist $(LIBDIR)\Carp rmdir /s /q $(LIBDIR)\Carp
        -if exist $(LIBDIR)\CGI rmdir /s /q $(LIBDIR)\CGI
-       -if exist $(LIBDIR)\CPAN rmdir /s /q $(LIBDIR)\CPAN
        -if exist $(LIBDIR)\Compress rmdir /s /q $(LIBDIR)\Compress
+       -if exist $(LIBDIR)\Config\Perl rmdir /s /q $(LIBDIR)\Config\Perl
+       -if exist $(LIBDIR)\CPAN rmdir /s /q $(LIBDIR)\CPAN
        -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data
        -if exist $(LIBDIR)\Devel rmdir /s /q $(LIBDIR)\Devel
        -if exist $(LIBDIR)\Digest rmdir /s /q $(LIBDIR)\Digest
        -if exist $(LIBDIR)\Encode rmdir /s /q $(LIBDIR)\Encode
        -if exist $(LIBDIR)\encoding rmdir /s /q $(LIBDIR)\encoding
+       -if exist $(LIBDIR)\Exporter rmdir /s /q $(LIBDIR)\Exporter
        -if exist $(LIBDIR)\ExtUtils\CBuilder rmdir /s /q 
$(LIBDIR)\ExtUtils\CBuilder
        -if exist $(LIBDIR)\ExtUtils\Command rmdir /s /q 
$(LIBDIR)\ExtUtils\Command
        -if exist $(LIBDIR)\ExtUtils\Constant rmdir /s /q 
$(LIBDIR)\ExtUtils\Constant
        -if exist $(LIBDIR)\ExtUtils\Liblist rmdir /s /q 
$(LIBDIR)\ExtUtils\Liblist
        -if exist $(LIBDIR)\ExtUtils\MakeMaker rmdir /s /q 
$(LIBDIR)\ExtUtils\MakeMaker
+       -if exist $(LIBDIR)\ExtUtils\ParseXS rmdir /s /q 
$(LIBDIR)\ExtUtils\ParseXS
+       -if exist $(LIBDIR)\ExtUtils\Typemaps rmdir /s /q 
$(LIBDIR)\ExtUtils\Typemaps
        -if exist $(LIBDIR)\File\Spec rmdir /s /q $(LIBDIR)\File\Spec
        -if exist $(LIBDIR)\Filter rmdir /s /q $(LIBDIR)\Filter
        -if exist $(LIBDIR)\Hash rmdir /s /q $(LIBDIR)\Hash
-       -if exist $(LIBDIR)\I18N\LangTags rmdir /s /q $(LIBDIR)\I18N\LangTags
+       -if exist $(LIBDIR)\HTTP rmdir /s /q $(LIBDIR)\HTTP
+       -if exist $(LIBDIR)\I18N rmdir /s /q $(LIBDIR)\I18N
        -if exist $(LIBDIR)\inc rmdir /s /q $(LIBDIR)\inc
-       -if exist $(LIBDIR)\Module\Pluggable rmdir /s /q 
$(LIBDIR)\Module\Pluggable
        -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO
        -if exist $(LIBDIR)\IPC rmdir /s /q $(LIBDIR)\IPC
+       -if exist $(LIBDIR)\JSON rmdir /s /q $(LIBDIR)\JSON
        -if exist $(LIBDIR)\List rmdir /s /q $(LIBDIR)\List
        -if exist $(LIBDIR)\Locale rmdir /s /q $(LIBDIR)\Locale
-       -if exist $(LIBDIR)\Log rmdir /s /q $(LIBDIR)\Log
        -if exist $(LIBDIR)\Math rmdir /s /q $(LIBDIR)\Math
        -if exist $(LIBDIR)\Memoize rmdir /s /q $(LIBDIR)\Memoize
        -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
        -if exist $(LIBDIR)\Module rmdir /s /q $(LIBDIR)\Module
-       -if exist $(LIBDIR)\mro rmdir /s /q $(LIBDIR)\mro
        -if exist $(LIBDIR)\Net\FTP rmdir /s /q $(LIBDIR)\Net\FTP
-       -if exist $(LIBDIR)\Object rmdir /s /q $(LIBDIR)\Object
        -if exist $(LIBDIR)\Package rmdir /s /q $(LIBDIR)\Package
        -if exist $(LIBDIR)\Params rmdir /s /q $(LIBDIR)\Params
        -if exist $(LIBDIR)\Parse rmdir /s /q $(LIBDIR)\Parse
+       -if exist $(LIBDIR)\Perl rmdir /s /q $(LIBDIR)\Perl
        -if exist $(LIBDIR)\PerlIO rmdir /s /q $(LIBDIR)\PerlIO
        -if exist $(LIBDIR)\Pod\Perldoc rmdir /s /q $(LIBDIR)\Pod\Perldoc
        -if exist $(LIBDIR)\Pod\Simple rmdir /s /q $(LIBDIR)\Pod\Simple
        -if exist $(LIBDIR)\Pod\Text rmdir /s /q $(LIBDIR)\Pod\Text
-       -if exist $(LIBDIR)\re rmdir /s /q $(LIBDIR)\re
        -if exist $(LIBDIR)\Scalar rmdir /s /q $(LIBDIR)\Scalar
+       -if exist $(LIBDIR)\Search rmdir /s /q $(LIBDIR)\Search
        -if exist $(LIBDIR)\Sys rmdir /s /q $(LIBDIR)\Sys
        -if exist $(LIBDIR)\TAP rmdir /s /q $(LIBDIR)\TAP
-       -if exist $(LIBDIR)\Term\UI rmdir /s /q $(LIBDIR)\Term\UI
+       -if exist $(LIBDIR)\Term rmdir /s /q $(LIBDIR)\Term
        -if exist $(LIBDIR)\Test rmdir /s /q $(LIBDIR)\Test
+       -if exist $(LIBDIR)\Text rmdir /s /q $(LIBDIR)\Text
        -if exist $(LIBDIR)\Thread rmdir /s /q $(LIBDIR)\Thread
        -if exist $(LIBDIR)\threads rmdir /s /q $(LIBDIR)\threads
        -if exist $(LIBDIR)\Tie\Hash rmdir /s /q $(LIBDIR)\Tie\Hash
        -if exist $(LIBDIR)\Unicode\Collate rmdir /s /q 
$(LIBDIR)\Unicode\Collate
+       -if exist $(LIBDIR)\Unicode\Collate\Locale rmdir /s /q 
$(LIBDIR)\Unicode\Collate\Locale
        -if exist $(LIBDIR)\version rmdir /s /q $(LIBDIR)\version
-       -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
+       -if exist $(LIBDIR)\VMS rmdir /s /q $(LIBDIR)\VMS
        -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
+       -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat roffitall \
            perl5193delta.pod perlaix.pod perlamiga.pod perlapi.pod \
            perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod perldos.pod \

--
Perl5 Master Repository

Reply via email to