Perl-based Test262 runner
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 Apr 2018 21:03:59 +0000 (21:03 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 16 Apr 2018 21:03:59 +0000 (21:03 +0000)
https://bugs.webkit.org/show_bug.cgi?id=183343

Patch by Leo Balter <leonardo.balter@gmail.com> on 2018-04-16
Reviewed by Michael Saboff.

* Scripts/test262-helpers/README.md: Added.
* Scripts/test262-helpers/agent.js: Added.
(262.getGlobal):
(262.setGlobal):
(262.destroy):
(262.IsHTMLDDA):
* Scripts/test262-helpers/cpanfile: Added.
* Scripts/test262-helpers/cpanfile.snapshot: Added.
* Scripts/test262-helpers/test262-runner.pl: Added.
(main):
(processFile):
(getScenarios):
(addScenario):
(compileTest):
(runTest):
(processResult):
(getTempFile):
(getContents):
(parseData):
(getHarness):
* Scripts/test262-helpers/tests.log: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230680 268f45cc-cd09-0410-ab3c-d52691b4dbfc

84 files changed:
Tools/ChangeLog
Tools/Scripts/test262-import [new file with mode: 0755]
Tools/Scripts/test262-runner [new file with mode: 0755]
Tools/Scripts/test262/Import.pm [new file with mode: 0755]
Tools/Scripts/test262/README.md [new file with mode: 0644]
Tools/Scripts/test262/Runner.pm [new file with mode: 0755]
Tools/Scripts/test262/agent.js [new file with mode: 0644]
Tools/Scripts/test262/cpanfile [new file with mode: 0644]
Tools/Scripts/test262/cpanfile.snapshot [new file with mode: 0644]
Tools/Scripts/test262/expectation.yaml [new file with mode: 0644]
Tools/Scripts/test262/local/bin/instmodsh [new file with mode: 0755]
Tools/Scripts/test262/local/cache/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz [new file with mode: 0644]
Tools/Scripts/test262/local/cache/authors/id/T/TI/TINITA/YAML-1.24.tar.gz [new file with mode: 0644]
Tools/Scripts/test262/local/cache/authors/id/Y/YA/YANICK/Parallel-ForkManager-1.19.tar.gz [new file with mode: 0644]
Tools/Scripts/test262/local/cache/modules/02packages.details.txt [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/Command.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/Command/MM.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/Liblist.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/Liblist/Kid.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_AIX.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Any.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_BeOS.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Cygwin.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_DOS.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Darwin.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_MacOS.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_NW5.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_OS2.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_QNX.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_UWIN.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Unix.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_VMS.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_VOS.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Win32.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Win95.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MY.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker/Config.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker/FAQ.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker/Locale.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker/Tutorial.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker/version.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker/version/regex.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/MakeMaker/version/vpp.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/Mkbootstrap.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/Mksymlists.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/ExtUtils/testlib.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/Parallel/ForkManager.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Any.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Any.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Dumper.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Dumper.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Dumper/Base.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Dumper/Base.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Error.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Error.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Loader.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Loader.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Loader/Base.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Loader/Base.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Marshall.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Marshall.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Mo.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Node.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Node.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Tag.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Tag.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Types.pm [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/YAML/Types.pod [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/.meta/ExtUtils-MakeMaker-7.32/MYMETA.json [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/.meta/ExtUtils-MakeMaker-7.32/install.json [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/.meta/Parallel-ForkManager-1.19/MYMETA.json [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/.meta/Parallel-ForkManager-1.19/install.json [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/.meta/YAML-1.24/MYMETA.json [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/.meta/YAML-1.24/install.json [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/auto/ExtUtils/MakeMaker/.packlist [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/auto/Parallel/ForkManager/.packlist [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/auto/YAML/.packlist [new file with mode: 0644]
Tools/Scripts/test262/local/lib/perl5/darwin-2level/perllocal.pod [new file with mode: 0644]
Tools/Scripts/test262/test262-config.yaml [new file with mode: 0644]
Tools/Scripts/test262/test262-expectations.yaml [new file with mode: 0644]

index 8a897b7..50a316e 100644 (file)
@@ -1,3 +1,32 @@
+2018-04-16  Leo Balter  <leonardo.balter@gmail.com>
+
+        Perl-based Test262 runner
+        https://bugs.webkit.org/show_bug.cgi?id=183343
+
+        Reviewed by Michael Saboff.
+
+        * Scripts/test262-helpers/README.md: Added.
+        * Scripts/test262-helpers/agent.js: Added.
+        (262.getGlobal):
+        (262.setGlobal):
+        (262.destroy):
+        (262.IsHTMLDDA):
+        * Scripts/test262-helpers/cpanfile: Added.
+        * Scripts/test262-helpers/cpanfile.snapshot: Added.
+        * Scripts/test262-helpers/test262-runner.pl: Added.
+        (main):
+        (processFile):
+        (getScenarios):
+        (addScenario):
+        (compileTest):
+        (runTest):
+        (processResult):
+        (getTempFile):
+        (getContents):
+        (parseData):
+        (getHarness):
+        * Scripts/test262-helpers/tests.log: Added.
+
 2018-04-15  Andy Estes  <aestes@apple.com>
 
         [iOS] Add API tests for PDF find-in-page
diff --git a/Tools/Scripts/test262-import b/Tools/Scripts/test262-import
new file mode 100755 (executable)
index 0000000..701b03d
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2018 Bocoup LLC. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer.
+# 2. Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials
+#    provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+use strict;
+use warnings;
+use 5.8.8;
+
+use FindBin;
+use Config;
+use Encode;
+
+BEGIN {
+    $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK} = 1;
+    $ENV{T262_EXEC_BIN} = "$FindBin::Bin/test262";
+
+    unshift @INC, "$FindBin::Bin/test262";
+
+    $ENV{LOAD_ROUTES} = 1;
+}
+
+use Import;
+
+exit 0;
diff --git a/Tools/Scripts/test262-runner b/Tools/Scripts/test262-runner
new file mode 100755 (executable)
index 0000000..8d3c8eb
--- /dev/null
@@ -0,0 +1,48 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2018 Bocoup LLC. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer.
+# 2. Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials
+#    provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+use strict;
+use warnings;
+use 5.8.8;
+
+use FindBin;
+use Config;
+use Encode;
+
+BEGIN {
+    $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK} = 1;
+    $ENV{T262_EXEC_BIN} = "$FindBin::Bin/test262";
+    unshift @INC, "$FindBin::Bin/test262";
+
+    $ENV{LOAD_ROUTES} = 1;
+}
+
+use Runner;
+
+exit 0;
diff --git a/Tools/Scripts/test262/Import.pm b/Tools/Scripts/test262/Import.pm
new file mode 100755 (executable)
index 0000000..46bd467
--- /dev/null
@@ -0,0 +1,275 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2018 Bocoup LLC. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer.
+# 2. Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials
+#    provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+use strict;
+use warnings;
+package Test262::Import;
+
+use Cwd qw/abs_path/;
+use File::Path qw/rmtree/;
+use File::Temp qw/tempdir/;
+use FindBin;
+use Getopt::Long qw/GetOptions/;
+use Pod::Usage;
+use Env qw(T262_EXEC_BIN);
+
+my $Bin = $T262_EXEC_BIN || $FindBin::Bin;
+
+my $test262Dir = abs_path("$Bin/../../../JSTests/test262");
+my $revisionFile = abs_path("$Bin/../../../JSTests/test262/test262-Revision.txt");
+my $summaryFile = abs_path("$Bin/../../../JSTests/test262/latest-changes-summary.txt");
+my $sourceDir;
+my $remoteUrl;
+my $branch;
+
+main();
+
+sub processCLI {
+    my $help = 0;
+
+    GetOptions(
+        's|src=s' => \$sourceDir,
+        'r|remote=s' => \$remoteUrl,
+        'b|branch=s' => \$branch,
+        'h|help' => \$help,
+    );
+
+    if ($help) {
+        pod2usage(-exitstatus => 0, -verbose => 1);
+    }
+
+    if ($sourceDir and $remoteUrl) {
+        print "Please specify only a single location for the Test262 repository.\n\n";
+        pod2usage(-exitstatus => 2, -verbose => 1);
+    };
+
+    if ($sourceDir) {
+        if (not -d $sourceDir
+            or not -d "$sourceDir/.git"
+            or not -d "$sourceDir/test"
+            or not -d "$sourceDir/harness") {
+            print "$sourceDir does not exist or is not a valid Test262 folder.\n\n";
+            pod2usage(-exitstatus => 3, -verbose => 1);
+        };
+
+        if (abs_path($sourceDir) eq $test262Dir) {
+            print "$sourceDir cannot be the same as the current Test262 folder.\n\n";
+            pod2usage(-exitstatus => 4, -verbose => 1);
+        }
+    } else {
+        $remoteUrl ||= 'git@github.com:tc39/test262.git';
+        $branch ||= 'master';
+    }
+
+    print "Settings:\n";
+    print "Source: $sourceDir\n" if $sourceDir;
+    print "Remote: $remoteUrl\n" if $remoteUrl;
+    print "Branch: $branch\n" if $remoteUrl;
+    print "--------------------------------------------------------\n\n";
+}
+
+sub main {
+    my $startTime = time();
+
+    processCLI();
+
+    if ($remoteUrl) {
+        processRemote();
+    }
+
+    # Get last imported revision
+    my $revision = getRevision();
+
+    if (!$remoteUrl) {
+        # Verify if the $sourceDir folder is clean
+        my $dirty = qx(git -C $sourceDir status --porcelain);
+        chomp $dirty;
+        if ($dirty) {
+            die "Test262 at $sourceDir has unstaged/uncommited changes.";
+        }
+    }
+
+    my ($newRevision, $newTracking) = getNewRevision();
+    if (defined $revision and $newRevision eq $revision) {
+        print 'Same revision, no need to import.';
+        exit 0;
+    }
+
+    my $summary = getSummary();
+
+    print "Summary of changes:\n$summary\n\n" if $summary;
+
+    transferFiles();
+
+    reportNewRevision($newRevision, $newTracking);
+    saveSummary($summary);
+
+    if ($remoteUrl) {
+        rmtree($sourceDir);
+    }
+
+    my $endTime = time();
+    my $totalTime = $endTime - $startTime;
+    print "\nDone in $totalTime seconds!\n";
+}
+
+sub printAndRun {
+    my ($command) = @_;
+
+    print "> $command\n\n";
+    return qx/$command/;
+}
+
+sub processRemote {
+    $sourceDir = tempdir( CLEANUP => 1 );
+    print "Importing Test262 from git\n";
+
+    printAndRun("git clone -b $branch --depth=1 $remoteUrl $sourceDir");
+}
+
+sub transferFiles {
+    # Remove previous Test262 folders
+    printAndRun("rm -rf $test262Dir\/harness") if -e "$test262Dir/harness";
+    printAndRun("rm -rf $test262Dir\/test") if -e "$test262Dir/test";
+
+    # Copy from source
+    printAndRun("cp -r $sourceDir\/harness $test262Dir");
+    printAndRun("cp -r $sourceDir\/test $test262Dir");
+}
+
+sub getRevision {
+    open(my $revfh, '<', $revisionFile) or die $!;
+
+    my $revision;
+    my $contents = join("\n", <$revfh>);
+
+    # Some cheap yaml parsing, the YAML module is a possible alternative
+    if ($contents =~ /test262 revision\: (\w*)/) {
+        $revision = $1;
+    }
+
+    close($revfh);
+
+    return $revision;
+}
+
+sub getNewRevision {
+    my $tracking = qx/git -C $sourceDir ls-remote --get-url/;
+    chomp $tracking;
+    my $branch = qx/git -C $sourceDir rev-parse --abbrev-ref HEAD/;
+    chomp $branch;
+    my $revision = qx/git -C $sourceDir rev-parse HEAD/;
+    chomp $revision;
+
+    print "New tracking: $tracking\n";
+    print "From branch: $branch\n";
+    print "New revision: $revision\n\n";
+
+    if (!$revision or !$tracking or !$branch) {
+        die 'Something is wrong in the source git.';
+    }
+
+    return $revision, $tracking;
+}
+
+sub getSummary {
+    my $summary = '';
+
+    $summary = qx(git diff --no-index --name-status --diff-filter=ADRM -- $test262Dir/harness $sourceDir/harness);
+    $summary .= qx(git diff --no-index --name-status --diff-filter=ADRM -- $test262Dir/test $sourceDir/test);
+    chomp $summary;
+
+    $summary =~ s/\s+$test262Dir\// /g;
+    $summary =~ s/\s+$sourceDir\// /g;
+
+    return $summary;
+}
+
+sub reportNewRevision {
+    my ($revision, $tracking) = @_;
+
+    open(my $fh, '>', $revisionFile) or die $!;
+
+    print $fh "test262 remote url: $tracking\n";
+    print $fh "test262 revision: $revision\n";
+
+    close $fh;
+}
+
+sub saveSummary {
+    my ($summary) = @_;
+
+    open(my $fh, '>', $summaryFile) or die $!;
+
+    print $fh $summary;
+
+    close $fh;
+}
+
+__END__
+
+=head1 DESCRIPTION
+
+This program will import Test262 tests from a repository folder.
+
+=head1 SYNOPSIS
+
+Run using native Perl:
+
+=over 8
+
+test262-import
+test262-import -s $source
+test262-import -r https://github.com/tc39/test262
+test262-import -r https://github.com/tc39/test262 -b es6
+
+=back
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help, -h>
+
+Print a brief help message.
+
+=item B<--src, -s>
+
+Specify the folder for Test262's repository.
+
+=item B<--remote, -r>
+
+Specify a remote Test262's repository. Defaults to 'git@github.com:tc39/test262.git'.
+
+=item B<--branch, -b>
+
+Specify a branch to be used for a remote Test262. Defaults to `master`.
+
+=back
+=cut
diff --git a/Tools/Scripts/test262/README.md b/Tools/Scripts/test262/README.md
new file mode 100644 (file)
index 0000000..e76bb2e
--- /dev/null
@@ -0,0 +1,142 @@
+# Test262 Tools
+
+## Runner script
+
+To execute the Test262 Runner script, just call it through your shell.
+
+```sh
+./Tools/Scripts/test262-runner
+```
+
+### Custom options
+
+If you need to customize the execution, check out `runner.pl --help` for extra commands.
+
+### test262-config.yaml
+
+This yaml file can be used to skip tests. An example file:
+```
+---
+skip:
+  paths:
+    - test/built-ins/Atomics
+  features:
+    - SharedArrayBuffer
+    - BigInt
+  files:
+    - test/built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-object.js
+    - test/built-ins/Array/prototype/unshift/length-near-integer-limit.js
+```
+
+### test262-expectation.yaml
+
+This file contains all exected failures. If JSC or Test262 is updated, this file should be updated with the new set of expected tests in order for developers to only see errors they introduce.
+
+To update this file, run:
+```
+runner.pl --save-expectations
+```
+
+### test262-results.yaml
+
+This file contains results for all tests. It is updated on every run.
+
+## Import Script
+
+To execute the Test262 Import script, just call it through your shell. The script will update the JSTests/test262 folder.
+
+```sh
+./Tools/Scripts/test262-import
+```
+
+### Custom options
+
+If you need to customize the execution, check out `import.pl --help` for extra commands.
+
+## Development
+
+The Test262 Runner script requires Perl 5.8.8, to install Perl 5.8.8, use [Perlbrew](https://perlbrew.pl/).
+
+It’s not necessary to install Perl 5.8.8 to execute the runner script if you have a more recent version of Perl 5.x.x installed.
+
+It's also not necessary to install or configure anything extra to execute the runner script. The script dependencies are also stored locally.
+
+### Installing Perlbrew
+
+#### Mac
+
+`\curl -L https://install.perlbrew.pl | bash`
+
+#### Linux (Debian derivative):
+
+```sh
+sudo apt-get install perlbrew
+perlbrew init
+```
+
+### Loading Perlbrew
+
+Append the following piece of code to the end of your ~/.bash_profile and start a
+new shell, perlbrew should be up and fully functional from there:
+
+`source ~/perl5/perlbrew/etc/bashrc`
+
+### Installing Perl 5.8.8 through Perlbrew
+
+#### Mac
+
+`perlbrew install perl-5.8.8`
+
+#### Linux
+
+`perlbrew --notest install perl-5.8.8   # Perl 5.8.8 has some known compilation errors`
+
+### Switching to Perl versions
+
+```sh
+perlbrew switch perl-5.8.8
+perlbrew switch perl-5.27.6
+# ...
+```
+
+### Install cpanminus and Carton
+
+Install cpanminus and Carton to set and manage dependencies.
+
+```sh
+perlbrew install-cpanm
+cpanm install Carton
+```
+
+### Installing dependencies through Carton
+
+From the `Tools/Scripts/test262-helpes/` folder, run `carton install` to install dependencies from the `cpanfile`.
+
+More documentation on the cpanfile [here](https://metacpan.org/pod/distribution/Module-CPANfile/lib/cpanfile.pod).
+
+### Executing the script using Carton:
+
+```sh
+carton exec runner.pl
+```
+
+### Loading dependencies without Carton
+
+To run the script without Carton, prepend your script file with the following code:
+
+```perl
+use FindBin;
+use Config;
+use Encode;
+
+BEGIN {
+    $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK} = 1;
+
+    unshift @INC, ".";
+    unshift @INC, "$FindBin::Bin/lib";
+    unshift @INC, "$FindBin::Bin/local/lib/perl5";
+    unshift @INC, "$FindBin::Bin/local/lib/perl5/$Config{archname}";
+
+    $ENV{LOAD_ROUTES} = 1;
+}
+```
diff --git a/Tools/Scripts/test262/Runner.pm b/Tools/Scripts/test262/Runner.pm
new file mode 100755 (executable)
index 0000000..df6b506
--- /dev/null
@@ -0,0 +1,836 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2018 Bocoup LLC. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer.
+# 2. Redistributions in binary form must reproduce the above
+#    copyright notice, this list of conditions and the following
+#    disclaimer in the documentation and/or other materials
+#    provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+use strict;
+use warnings;
+use 5.8.8;
+package Test262::Runner;
+
+use File::Find;
+use File::Temp qw(tempfile tempdir);
+use File::Spec::Functions qw(abs2rel);
+use File::Basename qw(dirname);
+use Cwd qw(abs_path);
+use FindBin;
+use Env qw(DYLD_FRAMEWORK_PATH);
+my $Bin;
+
+use Config;
+use Encode;
+
+BEGIN {
+    $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK} = 1;
+
+    $Bin = $ENV{T262_EXEC_BIN} || $FindBin::Bin;
+
+    unshift @INC, "$Bin";
+    unshift @INC, "$Bin/lib";
+    unshift @INC, "$Bin/local/lib/perl5";
+    unshift @INC, "$Bin/local/lib/perl5/$Config{archname}";
+
+    $ENV{LOAD_ROUTES} = 1;
+}
+
+use YAML qw(Load LoadFile Dump DumpFile Bless);
+use Parallel::ForkManager;
+use Getopt::Long qw(GetOptions);
+use Pod::Usage;
+use Term::ANSIColor;
+
+# Commandline args
+my $cliProcesses;
+my @cliTestDirs;
+my $verbose;
+my $JSC;
+my $test262Dir;
+my $harnessDir;
+my %filterFeatures;
+my $ignoreConfig;
+my $config;
+my %configSkipHash;
+my $expect;
+my $saveCurrentResults;
+my $failingOnly;
+my $latestImport;
+
+my $expectationsFile = abs_path("$Bin/test262-expectations.yaml");
+my $configFile = abs_path("$Bin/test262-config.yaml");
+my $resultsFile = abs_path("$Bin/test262-results.yaml");
+
+processCLI();
+
+my $tempdir = tempdir();
+
+my @default_harnesses = (
+    "$harnessDir/sta.js",
+    "$harnessDir/assert.js",
+    "$harnessDir/doneprintHandle.js",
+    "$Bin/agent.js"
+);
+
+my @files;
+my ($resfh, $resfilename) = getTempFile();
+
+my ($deffh, $deffile) = getTempFile();
+print $deffh getHarness(<@default_harnesses>);
+
+my $startTime = time();
+
+main();
+
+sub processCLI {
+    my $help = 0;
+    my $debug;
+    my $ignoreExpectations;
+    my @features;
+    my $stats;
+
+    # If adding a new commandline argument, you must update the POD
+    # documentation at the end of the file.
+    GetOptions(
+        'j|jsc=s' => \$JSC,
+        't|t262=s' => \$test262Dir,
+        'o|test-only=s@' => \@cliTestDirs,
+        'p|child-processes=i' => \$cliProcesses,
+        'h|help' => \$help,
+        'd|debug' => \$debug,
+        'v|verbose' => \$verbose,
+        'f|features=s@' => \@features,
+        'c|config=s' => \$configFile,
+        'i|ignore-config' => \$ignoreConfig,
+        's|save' => \$saveCurrentResults,
+        'x|ignore-expectations' => \$ignoreExpectations,
+        'failing-files' => \$failingOnly,
+        'l|latest-import' => \$latestImport,
+        'stats' => \$stats,
+    );
+
+    if ($help) {
+        pod2usage(-exitstatus => 0, -verbose => 2, -input => __FILE__);
+    }
+
+    if ($stats) {
+        print "Summarizing results...\n\n";
+        summarizeResults();
+        exit;
+    }
+
+    if ($JSC) {
+        $JSC = abs_path($JSC);
+        # Make sure the path and file jsc exist
+        if (! ($JSC && -e $JSC)) {
+            die "Error: --jsc path does not exist.";
+        }
+
+        # For custom JSC paths, Sets only if not yet defined
+        if (not defined $DYLD_FRAMEWORK_PATH) {
+            $DYLD_FRAMEWORK_PATH = dirname($JSC);
+        }
+    } else {
+        $JSC = getBuildPath($debug);
+
+        print("Using the following jsc path: $JSC\n");
+    }
+
+    if ($latestImport) {
+        # Does not allow custom $test262Dir
+        $test262Dir = '';
+    }
+
+    if (! $test262Dir) {
+        $test262Dir = abs_path("$Bin/../../../JSTests/test262");
+    } else {
+        $test262Dir = abs_path($test262Dir);
+    }
+    $harnessDir = "$test262Dir/harness";
+
+    if (! $ignoreConfig) {
+        if ($configFile and not -e $configFile) {
+            die "Config file $configFile does not exist!";
+        }
+
+        $config = LoadFile($configFile) or die $!;
+        if ($config->{skip} && $config->{skip}->{files}) {
+            %configSkipHash = map { $_ => 1 } @{$config->{skip}->{files}};
+        }
+    }
+
+    if (! $ignoreExpectations) {
+        # If expectations file doesn't exist yet, just run tests, UNLESS
+        # --failures-only option supplied.
+        if ( $failingOnly && ! -e $expectationsFile ) {
+            print "Error: Cannot run failing tests if test262-expectation.yaml file does not exist.\n";
+            die;
+        } elsif (-e $expectationsFile) {
+            $expect = LoadFile($expectationsFile) or die $!;
+        }
+    }
+
+    if (@features) {
+        %filterFeatures = map { $_ => 1 } @features;
+    }
+
+    $cliProcesses ||= getProcesses();
+
+    print "\n-------------------------Settings------------------------\n"
+        . "Test262 Dir: $test262Dir\n"
+        . "JSC: $JSC\n"
+        . "DYLD_FRAMEWORK_PATH: $DYLD_FRAMEWORK_PATH\n"
+        . "Child Processes: $cliProcesses\n";
+
+    print "Features to include: " . join(', ', @features) . "\n" if @features;
+    print "Paths:  " . join(', ', @cliTestDirs) . "\n" if @cliTestDirs;
+    print "Config file: $configFile\n" if $config;
+    print "Expectations file: $expectationsFile\n" if $expect;
+
+    print "Running only the latest imported files\n" if $latestImport;
+
+    print "Verbose mode\n" if $verbose;
+
+    print "--------------------------------------------------------\n\n";
+}
+
+sub main {
+    push(@cliTestDirs, 'test') if not @cliTestDirs;
+
+    my $max_process = $cliProcesses;
+    my $pm = Parallel::ForkManager->new($max_process);
+
+    if ($latestImport) {
+        @files = loadImportFile();
+    } elsif ($failingOnly) {
+        # If we only want to re-run failure, only run tests in expectation file
+        @files = map { qq($test262Dir/$_) } keys %{$expect};
+    } else {
+        # Otherwise, get all files from directory
+        foreach my $testsDir (@cliTestDirs) {
+            find(
+                { wanted => \&wanted, bydepth => 1 },
+                qq($test262Dir/$testsDir)
+                );
+            sub wanted {
+                /(?<!_FIXTURE)\.[jJ][sS]$/s && push(@files, $File::Find::name);
+            }
+        }
+    }
+
+    FILES:
+    foreach my $file (@files) {
+        $pm->start and next FILES; # do the fork
+        srand(time ^ $$); # Creates a new seed for each fork
+        processFile($file);
+
+        $pm->finish; # do the exit in the child process
+    };
+
+    $pm->wait_all_children;
+
+    close $deffh;
+
+    seek($resfh, 0, 0);
+    my @res = LoadFile($resfh);
+    close $resfh;
+
+    @res = sort { "$a->{path} . $a->{mode}" cmp "$b->{path} . $b->{mode}" } @res;
+
+    my %failed;
+    my $failcount = 0;
+    my $newfailcount = 0;
+    my $newpasscount = 0;
+    my $skipfilecount = 0;
+
+    # Create expectation file and calculate results
+    foreach my $test (@res) {
+
+        my $expectedFailure = 0;
+        if ($expect && $expect->{$test->{path}}) {
+            $expectedFailure = $expect->{$test->{path}}->{$test->{mode}}
+        }
+
+        if ($test->{result} eq 'FAIL') {
+            $failcount++;
+
+            # Record this round of failures
+            if ( $failed{$test->{path}} ) {
+                $failed{$test->{path}}->{$test->{mode}} =  $test->{error};
+            }
+            else {
+                $failed{$test->{path}} = {
+                    $test->{mode} => $test->{error}
+                };
+            }
+
+            # If an unexpected failure
+            $newfailcount++ if !$expectedFailure || ($expectedFailure ne $test->{error});
+
+        }
+        elsif ($test->{result} eq 'PASS') {
+            # If this is an newly passing test
+            $newpasscount++ if $expectedFailure;
+        }
+        elsif ($test->{result} eq 'SKIP') {
+            $skipfilecount++;
+        }
+    }
+
+    if ($saveCurrentResults) {
+        DumpFile($resultsFile, \@res);
+        DumpFile($expectationsFile, \%failed);
+    }
+
+    my $endTime = time();
+    my $totalTime = $endTime - $startTime;
+    my $total = scalar @res - $skipfilecount;
+    print "\n" . $total . " tests ran\n";
+
+    if ( !$expect ) {
+        print $failcount . " tests failed\n";
+    }
+    else {
+        print $failcount . " expected tests failed\n";
+        print $newfailcount . " tests newly fail\n";
+        print $newpasscount . " tests newly pass\n";
+    }
+
+    print $skipfilecount . " test files skipped\n";
+    print "Done in $totalTime seconds!\n";
+    if ($saveCurrentResults) {
+        print "\nSaved results in:\n$expectationsFile\n$resultsFile\n";
+    }
+    else {
+        print "\nRun with --save to saved new test262-expectation.yaml and test262-results.yaml files\n";
+    }
+}
+
+sub loadImportFile {
+    my $importFile = abs_path("$Bin/../../../JSTests/test262/latest-changes-summary.txt");
+    die "Import file not found at $importFile.\n" if ! -e $importFile;
+
+    open(my $fh, "<", $importFile) or die $!;
+
+    my @files = grep { $_ =~ /^[AM]\s*test\// } <$fh>;
+
+    return map { $_ =~ s/^\w\s(\w*)/$test262Dir\/$1/; chomp $_; $_ } @files;
+}
+
+sub getProcesses {
+    my $cores;
+    my $uname = qx(which uname >> /dev/null && uname);
+    chomp $uname;
+
+    if ($uname eq 'Darwin') {
+        # sysctl should be available
+        $cores = qx/sysctl -n hw.ncpu/;
+    } elsif ($uname eq 'Linux') {
+        $cores = qx(which getconf >> /dev/null && getconf _NPROCESSORS_ONLN);
+        if (!$cores) {
+            $cores = qx(which lscpu >> /dev/null && lscpu -p | egrep -v '^#' | wc -l);
+        }
+    }
+
+    chomp $cores;
+
+    if (!$cores) {
+        $cores = 1;
+    }
+
+    return $cores * 8;
+}
+
+sub parseError {
+    my $error = shift;
+
+    if ($error =~ /^Exception: ([\w\d]+: .*)/m) {
+        return $1;
+    }
+    else {
+        # Unusual error format. Save the first line instead.
+        my @errors = split("\n", $error);
+        return $errors[0];
+    }
+}
+
+sub getBuildPath {
+    my $debug = shift;
+
+    # Try to find JSC for user, if not supplied
+    my $cmd = abs_path("$Bin/../webkit-build-directory");
+    if (! -e $cmd) {
+        die 'Error: cannot find webkit-build-directory, specify with JSC with --jsc <path>.';
+    }
+
+    if ($debug) {
+        $cmd .= ' --debug';
+    } else {
+        $cmd .= ' --release';
+    }
+    $cmd .= ' --executablePath';
+    my $jscDir = qx($cmd);
+    chomp $jscDir;
+
+    my $jsc;
+    $jsc = $jscDir . '/jsc';
+
+    $jsc = $jscDir . '/JavaScriptCore.framework/Resources/jsc' if (! -e $jsc);
+    $jsc = $jscDir . '/bin/jsc' if (! -e $jsc);
+    if (! -e $jsc) {
+        die 'Error: cannot find jsc, specify with --jsc <path>.';
+    }
+
+    # Sets the Env DYLD_FRAMEWORK_PATH
+    $DYLD_FRAMEWORK_PATH = dirname($jsc);
+
+    return $jsc;
+}
+
+sub processFile {
+    my $filename = shift;
+    my $contents = getContents($filename);
+    my $data = parseData($contents, $filename);
+
+    # Check test against filters in config file
+    my $file = abs2rel( $filename, $test262Dir );
+    if (shouldSkip($file, $data)) {
+        processResult($filename, $data, "skip");
+        return;
+    }
+
+    my @scenarios = getScenarios(@{ $data->{flags} });
+
+    my $includes = $data->{includes};
+    my ($includesfh, $includesfile);
+
+    ($includesfh, $includesfile) = compileTest($includes) if defined $includes;
+
+    foreach my $scenario (@scenarios) {
+        my $result = runTest($includesfile, $filename, $scenario, $data);
+
+        processResult($filename, $data, $scenario, $result);
+    }
+
+    close $includesfh if defined $includesfh;
+}
+
+sub shouldSkip {
+    my ($filename, $data) = @_;
+
+    if (exists $config->{skip}) {
+        # Filter by file
+        if( $configSkipHash{$filename} ) {
+            return 1;
+        }
+
+        # Filter by paths
+        my @skipPaths;
+        @skipPaths = @{ $config->{skip}->{paths} } if defined $config->{skip}->{paths};
+        return 1 if (grep {$filename =~ $_} @skipPaths);
+
+        my @skipFeatures;
+        @skipFeatures = @{ $config->{skip}->{features} } if defined $config->{skip}->{features};
+
+        my $skip = 0;
+        my $keep = 0;
+        my @features = @{ $data->{features} } if $data->{features};
+        # Filter by features, loop over file features to for less iterations
+        foreach my $feature (@features) {
+            $skip = (grep {$_ eq $feature} @skipFeatures) ? 1 : 0;
+
+            # keep the test if the config skips the feature but it was also request
+            # through the CLI --features
+            return 1 if $skip && !$filterFeatures{$feature};
+
+            $keep = 1 if $filterFeatures{$feature};
+        }
+
+        # filter tests that do not contain the --features features
+        return 1 if (%filterFeatures and not $keep);
+    }
+
+    return 0;
+}
+
+sub getScenarios {
+    my @flags = @_;
+    my @scenarios;
+    my $nonStrict = 'default';
+    my $strictMode = 'strict mode';
+
+    if (grep $_ eq 'raw', @flags) {
+        push @scenarios, 'raw';
+    } elsif (grep $_ eq 'noStrict', @flags) {
+        push @scenarios, $nonStrict;
+    } elsif (grep $_ eq 'onlyStrict', @flags) {
+        push @scenarios, $strictMode;
+    } elsif (grep $_ eq 'module', @flags) {
+        push @scenarios, 'module';
+    } else {
+        # Add 2 default scenarios
+        push @scenarios, $strictMode;
+        push @scenarios, $nonStrict;
+    };
+
+    return @scenarios;
+}
+
+sub compileTest {
+    my $includes = shift;
+    my ($tfh, $tfname) = getTempFile();
+
+    my $includesContent = getHarness(map { "$harnessDir/$_" } @{ $includes });
+    print $tfh $includesContent;
+
+    return ($tfh, $tfname);
+}
+
+sub runTest {
+    my ($includesfile, $filename, $scenario, $data) = @_;
+    $includesfile ||= '';
+
+    my $args = '';
+
+    if (exists $data->{negative}) {
+        my $type = $data->{negative}->{type};
+        $args .=  " --exception=$type ";
+    }
+
+    if (exists $data->{flags}) {
+        my @flags = $data->{flags};
+        if (grep $_ eq 'async', @flags) {
+            $args .= ' --test262-async ';
+        }
+    }
+
+    my $prefixFile = '';
+
+    if ($scenario eq 'module') {
+        $prefixFile='--module-file=';
+    } elsif ($scenario eq 'strict mode') {
+        $prefixFile='--strict-file=';
+    }
+
+    # Raw tests should not include the default harness
+    my $defaultHarness = '';
+    $defaultHarness = $deffile if $scenario ne 'raw';
+
+    my $result = qx/$JSC $args $defaultHarness $includesfile $prefixFile$filename/;
+
+    chomp $result;
+
+    return $result if ($?);
+}
+
+sub processResult {
+    my ($path, $data, $scenario, $result) = @_;
+
+    # Report a relative path
+    my $file = abs2rel( $path, $test262Dir );
+    my %resultdata;
+    $resultdata{path} = $file;
+    $resultdata{mode} = $scenario;
+
+    my $currentfailure = parseError($result) if $result;
+    my $expectedfailure = $expect
+        && $expect->{$file}
+        && $expect->{$file}->{$scenario};
+
+    if ($scenario ne 'skip' && $currentfailure) {
+
+        # We have a new failure if we have loaded an expectation file
+        # AND (there is no expected failure OR the failure has changed).
+        my $isnewfailure = $expect
+            && (!$expectedfailure || $expectedfailure ne $currentfailure);
+
+        # Print the failure if we haven't loaded an expectation file
+        # or the failure is new.
+        my $printfailure = !$expect || $isnewfailure;
+
+        print "! NEW " if $isnewfailure;
+        print "FAIL $file ($scenario)\n" if $printfailure;
+        if ($verbose) {
+            print $result;
+            print "\nFeatures: " . join(', ', @{ $data->{features} }) if $data->{features};
+            print "\n\n";
+        }
+
+        $resultdata{result} = 'FAIL';
+        $resultdata{error} = $currentfailure;
+    }
+    elsif ($scenario ne 'skip' && !$currentfailure) {
+        if ($expectedfailure) {
+            print "NEW PASS $file ($scenario)\n";
+            print "\n" if $verbose;
+        }
+
+        $resultdata{result} = 'PASS';
+    }
+    else {
+        $resultdata{result} = 'SKIP';
+    }
+
+    $resultdata{features} = $data->{features} if $data->{features};
+
+    DumpFile($resfh, \%resultdata);
+}
+
+sub getTempFile {
+    my ($tfh, $tfname) = tempfile(DIR => $tempdir);
+
+    return ($tfh, $tfname);
+}
+
+sub getContents {
+    my $filename = shift;
+
+    open(my $fh, '<', $filename) or die $!;
+    my $contents = join('', <$fh>);
+    close $fh;
+
+    return $contents;
+}
+
+sub parseData {
+    my ($contents, $filename) = @_;
+
+    my $parsed;
+    my $found = '';
+    if ($contents =~ /\/\*(---\n[\S\s]*)\n---\*\//m) {
+        $found = $1;
+    };
+
+    eval {
+        $parsed = Load($found);
+    };
+    if ($@) {
+        print "\nError parsing YAML data on file $filename.\n";
+        print "$@\n";
+    };
+    return $parsed;
+}
+
+sub getHarness {
+    my @files = @_;
+    my $content;
+    for (@files) {
+        my $file = $_;
+
+        open(my $harness_file, '<', $file)
+            or die "$!, '$file'";
+
+        $content .= join('', <$harness_file>);
+
+        close $harness_file;
+    };
+
+    return $content;
+}
+
+
+sub summarizeResults {
+    my @rawresults = LoadFile($resultsFile) or die $!;
+
+    my %byfeature;
+    my %bypath;
+
+    foreach my $test (@{$rawresults[0]}) {
+
+        my $result = $test->{result};
+
+        if ($test->{features}) {
+            foreach my $feature (@{$test->{features}}) {
+
+                if (not exists $byfeature{$feature}) {
+                    $byfeature{$feature} = [0, 0, 0]
+                }
+
+                if ($result eq 'PASS') {
+                    $byfeature{$feature}->[0]++;
+                }
+                if ($result eq 'FAIL') {
+                    $byfeature{$feature}->[1]++;
+                }
+                if ($result eq 'SKIP') {
+                    $byfeature{$feature}->[2]++;
+                }
+            }
+        }
+        my @paths = split('/', $test->{path});
+        @paths = @paths[ 1 ... scalar @paths-2 ];
+        foreach my $i (0..scalar @paths-1) {
+            my $partialpath = join("/", @paths[0...$i]);
+
+            if (not exists $bypath{$partialpath}) {
+                $bypath{$partialpath} = [0, 0, 0];
+            }
+
+            if ($result eq 'PASS') {
+                $bypath{$partialpath}->[0]++;
+            }
+            if ($result eq 'FAIL') {
+                $bypath{$partialpath}->[1]++;
+            }
+            if ($result eq 'SKIP') {
+                $bypath{$partialpath}->[2]++;
+            }
+        }
+
+    }
+
+
+    print sprintf("%-6s %-6s %-6s %-6s %s\n", '% PASS', 'PASS', 'FAIL', 'SKIP', 'FOLDER');
+    foreach my $key (sort keys %bypath) {
+        my $c = 'black';
+        $c = 'red' if $bypath{$key}->[1];
+
+        my $per = ($bypath{$key}->[0] / (
+            $bypath{$key}->[0]
+            + $bypath{$key}->[1]
+            + $bypath{$key}->[2])) * 100;
+
+        $per = sprintf("%.0f", $per) . "%";
+
+        print colored([$c], sprintf("%-6s %-6d %-6d %-6d %s \n", $per,
+                      $bypath{$key}->[0],
+                      $bypath{$key}->[1],
+                      $bypath{$key}->[2], $key,));
+    }
+
+    print "\n\n";
+    print sprintf("%-6s %-6s %-6s %-6s %s\n", '% PASS', 'PASS', 'FAIL', 'SKIP', 'FEATURE');
+
+    foreach my $key (sort keys %byfeature) {
+        my $c = 'black';
+        $c = 'red' if $byfeature{$key}->[1];
+
+        my $per = ($byfeature{$key}->[0] / (
+            $byfeature{$key}->[0]
+            + $byfeature{$key}->[1]
+            + $byfeature{$key}->[2])) * 100;
+
+        $per = sprintf("%.0f", $per) . "%";
+
+        print colored([$c], sprintf("%-6s %-6d %-6d %-6d %s\n", $per,
+                      $byfeature{$key}->[0],
+                      $byfeature{$key}->[1],
+                      $byfeature{$key}->[2], $key));
+    }
+
+
+}
+
+__END__
+
+=head1 DESCRIPTION
+
+This program will run all Test262 tests. If you edit, make sure your changes are Perl 5.8.8 compatible.
+
+=head1 SYNOPSIS
+
+Run using native Perl:
+
+=over 8
+
+test262-runner -j $jsc-dir
+
+=back
+
+Run using carton (recommended for testing on Perl 5.8.8):
+
+=over 8
+
+carton exec 'test262-runner -j $jsc-dir'
+
+=back
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help, -h>
+
+Print a brief help message and exits.
+
+=item B<--child-processes, -p>
+
+Specify number of child processes.
+
+=item B<--t262, -t>
+
+Specify root test262 directory.
+
+=item B<--jsc, -j>
+
+Specify JSC location. If not provided, script will attempt to look up JSC.
+
+=item B<--debug, -d>
+
+Use debug build of JSC. Can only use if --jsc <path> is not provided. Release build of JSC is used by default.
+
+=item B<--verbose, -v>
+
+Verbose output for test results. Includes error message for test.
+
+=item B<--config, -c>
+
+Specify a config file. If not provided, script will load local test262-config.yaml
+
+=item B<--ignore-config, -i>
+
+Ignores config file if supplied or findable in directory. Will still filter based on commandline arguments.
+
+=item B<--features, -f>
+
+Filter test on list of features (only runs tests in feature list).
+
+=item B<--test-only, -o>
+
+Specify one or more specific test262 directory of test to run, relative to the root test262 directory. For example, --test-only 'test/built-ins/Number/prototype'
+
+=item B<--save, -s>
+
+Overwrites the test262-expectations.yaml and test262-results.yaml file with the current list of test262 files and test results.
+
+=item B<--ignore-expectations, -x>
+
+Ignores the test262-expectations.yaml file and outputs all failures, instead of only unexpected failures.
+
+=item B<--failing-files>
+
+Runs all test files that expect to fail according to the expectation file. This option will run the rests in both strict and non-strict modes, even if the test only fails in one of the two modes.
+
+=item B<--latest-import, -l>
+
+Runs the test files listed in the last import (./JSTests/test262/latest-changes-summary.txt).
+
+=item B<--stats>
+
+Calculate conformance statistics from test262-results.yaml file.
+
+=back
+
+=cut
diff --git a/Tools/Scripts/test262/agent.js b/Tools/Scripts/test262/agent.js
new file mode 100644 (file)
index 0000000..83634dd
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+From https://raw.githubusercontent.com/bterlson/eshost/master/runtimes/jsc.js
+
+Copyright 2018 Brian Terlson.
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/bterlson/eshost.
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+*/
+
+/* JavaScriptCore exposes a "$" object to its runtime */
+/* Using this["\x24"]; prevents overwrite by ConsoleAgent */
+var jsc = this["\x24"];
+var $262 = {
+  agent: jsc.agent,
+  global: jsc.global,
+  createRealm: jsc.createRealm,
+  detachArrayBuffer: jsc.detachArrayBuffer,
+  evalScript: jsc.evalScript,
+  getGlobal(name) {
+    return this.global[name];
+  },
+  setGlobal(name, value) {
+    this.global[name] = value;
+  },
+  destroy() { /* noop */ },
+  IsHTMLDDA() { return {}; },
+};
diff --git a/Tools/Scripts/test262/cpanfile b/Tools/Scripts/test262/cpanfile
new file mode 100644 (file)
index 0000000..c7cc2a5
--- /dev/null
@@ -0,0 +1,3 @@
+requires 'perl', '== 5.8.8';
+requires 'YAML', '1.24';
+requires 'Parallel::ForkManager', '1.19';
diff --git a/Tools/Scripts/test262/cpanfile.snapshot b/Tools/Scripts/test262/cpanfile.snapshot
new file mode 100644 (file)
index 0000000..5a46669
--- /dev/null
@@ -0,0 +1,89 @@
+# carton snapshot format: version 1.0
+DISTRIBUTIONS
+  ExtUtils-MakeMaker-7.32
+    pathname: B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+    provides:
+      ExtUtils::Command 7.32
+      ExtUtils::Command::MM 7.32
+      ExtUtils::Liblist 7.32
+      ExtUtils::Liblist::Kid 7.32
+      ExtUtils::MM 7.32
+      ExtUtils::MM_AIX 7.32
+      ExtUtils::MM_Any 7.32
+      ExtUtils::MM_BeOS 7.32
+      ExtUtils::MM_Cygwin 7.32
+      ExtUtils::MM_DOS 7.32
+      ExtUtils::MM_Darwin 7.32
+      ExtUtils::MM_MacOS 7.32
+      ExtUtils::MM_NW5 7.32
+      ExtUtils::MM_OS2 7.32
+      ExtUtils::MM_QNX 7.32
+      ExtUtils::MM_UWIN 7.32
+      ExtUtils::MM_Unix 7.32
+      ExtUtils::MM_VMS 7.32
+      ExtUtils::MM_VOS 7.32
+      ExtUtils::MM_Win32 7.32
+      ExtUtils::MM_Win95 7.32
+      ExtUtils::MY 7.32
+      ExtUtils::MakeMaker 7.32
+      ExtUtils::MakeMaker::Config 7.32
+      ExtUtils::MakeMaker::Locale 7.32
+      ExtUtils::MakeMaker::_version 7.32
+      ExtUtils::MakeMaker::charstar 7.32
+      ExtUtils::MakeMaker::version 7.32
+      ExtUtils::MakeMaker::version::regex 7.32
+      ExtUtils::MakeMaker::version::vpp 7.32
+      ExtUtils::Mkbootstrap 7.32
+      ExtUtils::Mksymlists 7.32
+      ExtUtils::testlib 7.32
+      MM 7.32
+      MY 7.32
+    requirements:
+      Data::Dumper 0
+      Encode 0
+      File::Basename 0
+      File::Spec 0.8
+      Pod::Man 0
+      perl 5.006
+  Parallel-ForkManager-1.19
+    pathname: Y/YA/YANICK/Parallel-ForkManager-1.19.tar.gz
+    provides:
+      Parallel::ForkManager 1.19
+    requirements:
+      Carp 0
+      ExtUtils::MakeMaker 0
+      File::Path 0
+      File::Spec 0
+      File::Temp 0
+      POSIX 0
+      Storable 0
+      perl 5.006
+      strict 0
+  YAML-1.24
+    pathname: T/TI/TINITA/YAML-1.24.tar.gz
+    provides:
+      YAML 1.24
+      YAML::Any 1.24
+      YAML::Dumper undef
+      YAML::Dumper::Base undef
+      YAML::Error undef
+      YAML::Loader undef
+      YAML::Loader::Base undef
+      YAML::Marshall undef
+      YAML::Mo undef
+      YAML::Node undef
+      YAML::Tag undef
+      YAML::Type::blessed undef
+      YAML::Type::code undef
+      YAML::Type::glob undef
+      YAML::Type::ref undef
+      YAML::Type::regexp undef
+      YAML::Type::undef undef
+      YAML::Types undef
+      YAML::Warning undef
+      yaml_mapping undef
+      yaml_scalar undef
+      yaml_sequence undef
+    requirements:
+      ExtUtils::MakeMaker 0
+      perl 5.008001
diff --git a/Tools/Scripts/test262/expectation.yaml b/Tools/Scripts/test262/expectation.yaml
new file mode 100644 (file)
index 0000000..1bd2c75
--- /dev/null
@@ -0,0 +1,21 @@
+---
+test/language/module-code/instn-resolve-order-depth.js:
+  module: "SyntaxError: 'break' is only valid inside a switch or loop statement."
+test/language/module-code/instn-resolve-order-src.js:
+  module: "SyntaxError: 'break' is only valid inside a switch or loop statement."
+test/language/module-code/namespace/internals/define-own-property.js:
+  module: 'Test262Error: Reflect.defineProperty: local1 Expected SameValue(«false», Â«true») to be true'
+test/language/module-code/namespace/internals/object-keys-binding-uninit.js:
+  module: 'Test262Error: Expected a ReferenceError to be thrown but no exception was thrown at all'
+test/language/module-code/namespace/internals/set.js:
+  module: 'Test262Error: Reflect.defineProperty: local1 Expected SameValue(«false», Â«true») to be true'
+test/language/module-code/parse-err-reference.js:
+  module: thewrongerror
+test/language/module-code/privatename-valid-no-earlyerr.js:
+  module: thewrongerror
+test/language/module-code/comment-single-line-html-open.js:
+  module:
+    error: blablabla
+test/language/module-code/comment-single-line-html-close.js:
+  module:
+    error: blablabla
diff --git a/Tools/Scripts/test262/local/bin/instmodsh b/Tools/Scripts/test262/local/bin/instmodsh
new file mode 100755 (executable)
index 0000000..53ff8a8
--- /dev/null
@@ -0,0 +1,193 @@
+#!/Users/leo/perl5/perlbrew/perls/perl-5.8.8/bin/perl -w
+
+BEGIN { pop @INC if $INC[-1] eq '.' }
+use strict;
+use IO::File;
+use ExtUtils::Packlist;
+use ExtUtils::Installed;
+
+use vars qw($Inst @Modules);
+
+
+=head1 NAME
+
+instmodsh - A shell to examine installed modules
+
+=head1 SYNOPSIS
+
+    instmodsh
+
+=head1 DESCRIPTION
+
+A little interface to ExtUtils::Installed to examine installed modules,
+validate your packlists and even create a tarball from an installed module.
+
+=head1 SEE ALSO
+
+ExtUtils::Installed
+
+=cut
+
+
+my $Module_Help = <<EOF;
+Available commands are:
+   f [all|prog|doc]   - List installed files of a given type
+   d [all|prog|doc]   - List the directories used by a module
+   v                  - Validate the .packlist - check for missing files
+   t <tarfile>        - Create a tar archive of the module
+   h                  - Display module help
+   q                  - Quit the module
+EOF
+
+my %Module_Commands = (
+                       f => \&list_installed,
+                       d => \&list_directories,
+                       v => \&validate_packlist,
+                       t => \&create_archive,
+                       h => \&module_help,
+                      );
+
+sub do_module($) {
+    my ($module) = @_;
+
+    print($Module_Help);
+    MODULE_CMD: while (1) {
+        print("$module cmd? ");
+
+        my $reply = <STDIN>; chomp($reply);
+        my($cmd) = $reply =~ /^(\w)\b/;
+
+        last if $cmd eq 'q';
+
+        if( $Module_Commands{$cmd} ) {
+            $Module_Commands{$cmd}->($reply, $module);
+        }
+        elsif( $cmd eq 'q' ) {
+            last MODULE_CMD;
+        }
+        else {
+            module_help();
+        }
+    }
+}
+
+
+sub list_installed {
+    my($reply, $module) = @_;
+
+    my $class = (split(' ', $reply))[1];
+    $class = 'all' unless $class;
+
+    my @files;
+    if (eval { @files = $Inst->files($module, $class); }) {
+        print("$class files in $module are:\n   ",
+              join("\n   ", @files), "\n");
+    }
+    else {
+        print($@);
+    }
+};
+
+
+sub list_directories {
+    my($reply, $module) = @_;
+
+    my $class = (split(' ', $reply))[1];
+    $class = 'all' unless $class;
+
+    my @dirs;
+    if (eval { @dirs = $Inst->directories($module, $class); }) {
+        print("$class directories in $module are:\n   ",
+              join("\n   ", @dirs), "\n");
+    }
+    else {
+        print($@);
+    }
+}
+
+
+sub create_archive {
+    my($reply, $module) = @_;
+
+    my $file = (split(' ', $reply))[1];
+
+    if( !(defined $file and length $file) ) {
+        print "No tar file specified\n";
+    }
+    elsif( eval { require Archive::Tar } ) {
+        Archive::Tar->create_archive($file, 0, $Inst->files($module));
+    }
+    else {
+        my($first, @rest) = $Inst->files($module);
+        system('tar', 'cvf', $file, $first);
+        for my $f (@rest) {
+            system('tar', 'rvf', $file, $f);
+        }
+        print "Can't use tar\n" if $?;
+    }
+}
+
+
+sub validate_packlist {
+    my($reply, $module) = @_;
+
+    if (my @missing = $Inst->validate($module)) {
+        print("Files missing from $module are:\n   ",
+              join("\n   ", @missing), "\n");
+    }
+    else {
+        print("$module has no missing files\n");
+    }
+}
+
+sub module_help {
+    print $Module_Help;
+}
+
+
+
+##############################################################################
+
+sub toplevel()
+{
+my $help = <<EOF;
+Available commands are:
+   l            - List all installed modules
+   m <module>   - Select a module
+   q            - Quit the program
+EOF
+print($help);
+while (1)
+   {
+   print("cmd? ");
+   my $reply = <STDIN>; chomp($reply);
+   CASE:
+      {
+      $reply eq 'l' and do
+         {
+         print("Installed modules are:\n   ", join("\n   ", @Modules), "\n");
+         last CASE;
+         };
+      $reply =~ /^m\s+/ and do
+         {
+         do_module((split(' ', $reply))[1]);
+         last CASE;
+         };
+      $reply eq 'q' and do
+         {
+         exit(0);
+         };
+      # Default
+         print($help);
+      }
+   }
+}
+
+
+###############################################################################
+
+$Inst = ExtUtils::Installed->new();
+@Modules = $Inst->modules();
+toplevel();
+
+###############################################################################
diff --git a/Tools/Scripts/test262/local/cache/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz b/Tools/Scripts/test262/local/cache/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
new file mode 100644 (file)
index 0000000..ffba3df
Binary files /dev/null and b/Tools/Scripts/test262/local/cache/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz differ
diff --git a/Tools/Scripts/test262/local/cache/authors/id/T/TI/TINITA/YAML-1.24.tar.gz b/Tools/Scripts/test262/local/cache/authors/id/T/TI/TINITA/YAML-1.24.tar.gz
new file mode 100644 (file)
index 0000000..8da7047
Binary files /dev/null and b/Tools/Scripts/test262/local/cache/authors/id/T/TI/TINITA/YAML-1.24.tar.gz differ
diff --git a/Tools/Scripts/test262/local/cache/authors/id/Y/YA/YANICK/Parallel-ForkManager-1.19.tar.gz b/Tools/Scripts/test262/local/cache/authors/id/Y/YA/YANICK/Parallel-ForkManager-1.19.tar.gz
new file mode 100644 (file)
index 0000000..6823cc5
Binary files /dev/null and b/Tools/Scripts/test262/local/cache/authors/id/Y/YA/YANICK/Parallel-ForkManager-1.19.tar.gz differ
diff --git a/Tools/Scripts/test262/local/cache/modules/02packages.details.txt b/Tools/Scripts/test262/local/cache/modules/02packages.details.txt
new file mode 100644 (file)
index 0000000..0625965
--- /dev/null
@@ -0,0 +1,347 @@
+File:         02packages.details.txt
+URL:          http://www.perl.com/CPAN/modules/02packages.details.txt
+Description:  Package names found in cpanfile.snapshot
+Columns:      package name, version, path
+Intended-For: Automated fetch routines, namespace documentation.
+Written-By:   Carton v1.0.28
+Line-Count:   338
+Last-Updated: Mon Mar 26 15:35:18 2018
+
+Algorithm::C3                      0.10  H/HA/HAARG/Algorithm-C3-0.10.tar.gz
+App::Prove                         3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+App::Prove::State                  3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+App::Prove::State::Result          3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+App::Prove::State::Result::Test    3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+Class::C3                          0.33  H/HA/HAARG/Class-C3-0.33.tar.gz
+Class::C3::XS                      0.14  E/ET/ETHER/Class-C3-XS-0.14.tar.gz
+Clone::PP                          1.07  N/NE/NEILB/Clone-PP-1.07.tar.gz
+CPAN::Meta                     2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::Converter          2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::Feature            2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::History            2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::Merge              2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::Prereqs            2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::Requirements          2.140  D/DA/DAGOLDEN/CPAN-Meta-Requirements-2.140.tar.gz
+CPAN::Meta::Spec               2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::Validator          2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+CPAN::Meta::YAML                  0.018  D/DA/DAGOLDEN/CPAN-Meta-YAML-0.018.tar.gz
+Cwd                                3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+Data::Printer                      0.40  G/GA/GARU/Data-Printer-0.40.tar.gz
+Data::Printer::Filter             undef  G/GA/GARU/Data-Printer-0.40.tar.gz
+Data::Printer::Filter::DateTime   undef  G/GA/GARU/Data-Printer-0.40.tar.gz
+Data::Printer::Filter::DB         undef  G/GA/GARU/Data-Printer-0.40.tar.gz
+Data::Printer::Filter::Digest     undef  G/GA/GARU/Data-Printer-0.40.tar.gz
+DDP                               undef  G/GA/GARU/Data-Printer-0.40.tar.gz
+Dist::CheckConflicts               0.11  D/DO/DOY/Dist-CheckConflicts-0.11.tar.gz
+ExtUtils::CBuilder             0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Base       0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::aix 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::android 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::cygwin 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::darwin 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::dec_osf 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::os2 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::Unix 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::VMS 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::Windows 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::Windows::BCC 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::Windows::GCC 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::CBuilder::Platform::Windows::MSVC 0.280230  A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz
+ExtUtils::Command                  7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::Command::MM              7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::Install                  2.14  B/BI/BINGOS/ExtUtils-Install-2.14.tar.gz
+ExtUtils::Install::Warn            2.14  B/BI/BINGOS/ExtUtils-Install-2.14.tar.gz
+ExtUtils::Installed                2.14  B/BI/BINGOS/ExtUtils-Install-2.14.tar.gz
+ExtUtils::Liblist                  7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::Liblist::Kid             7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker                7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker::_version      7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker::charstar      7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker::Config        7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker::Locale        7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker::version       7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker::version::regex 7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MakeMaker::version::vpp  7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::Mkbootstrap              7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::Mksymlists               7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM                       7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_AIX                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_Any                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_BeOS                  7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_Cygwin                7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_Darwin                7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_DOS                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_MacOS                 7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_NW5                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_OS2                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_QNX                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_Unix                  7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_UWIN                  7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_VMS                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_VOS                   7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_Win32                 7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MM_Win95                 7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::MY                       7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::Packlist                 2.14  B/BI/BINGOS/ExtUtils-Install-2.14.tar.gz
+ExtUtils::ParseXS                  3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::ParseXS::Constants       3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::ParseXS::CountLines      3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::ParseXS::Eval            3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::ParseXS::Utilities       3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::testlib                  7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ExtUtils::Typemaps                 3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::Typemaps::Cmd            3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::Typemaps::InputMap       3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::Typemaps::OutputMap      3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+ExtUtils::Typemaps::Type           3.35  S/SM/SMUELLER/ExtUtils-ParseXS-3.35.tar.gz
+File::HomeDir                     1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::Darwin             1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::Darwin::Carbon     1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::Darwin::Cocoa      1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::Driver             1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::FreeDesktop        1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::MacOS9             1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::Test               1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::TIE                1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::Unix               1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::HomeDir::Windows            1.002  R/RE/REHSACK/File-HomeDir-1.002.tar.gz
+File::Path                         2.15  J/JK/JKEENAN/File-Path-2.15.tar.gz
+File::Spec                         3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::AmigaOS                3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::Cygwin                 3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::Epoc                   3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::Functions              3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::Mac                    3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::OS2                    3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::Unix                   3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::VMS                    3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Spec::Win32                  3.74  X/XS/XSAWYERX/PathTools-3.74.tar.gz
+File::Temp                       0.2304  D/DA/DAGOLDEN/File-Temp-0.2304.tar.gz
+File::Temp::Dir                  0.2304  D/DA/DAGOLDEN/File-Temp-0.2304.tar.gz
+File::Which                        1.22  P/PL/PLICEASE/File-Which-1.22.tar.gz
+Harness::Hook                     undef  L/LE/LEONT/Test-Harness-3.41.tar.gz
+Hash::Util::FieldHash::Compat      0.11  E/ET/ETHER/Hash-Util-FieldHash-Compat-0.11.tar.gz
+Hash::Util::FieldHash::Compat::Heavy 0.11  E/ET/ETHER/Hash-Util-FieldHash-Compat-0.11.tar.gz
+IPC::Cmd                           1.00  B/BI/BINGOS/IPC-Cmd-1.00.tar.gz
+JSON::PP                        2.97001  I/IS/ISHIGAKI/JSON-PP-2.97001.tar.gz
+JSON::PP::Boolean               2.97001  I/IS/ISHIGAKI/JSON-PP-2.97001.tar.gz
+JSON::PP::IncrParser            2.97001  I/IS/ISHIGAKI/JSON-PP-2.97001.tar.gz
+Locale::Maketext::Simple           0.21  J/JE/JESSE/Locale-Maketext-Simple-0.21.tar.gz
+Mac::SystemDirectory               0.10  E/ET/ETHER/Mac-SystemDirectory-0.10.tar.gz
+MM                                 7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+Module::Build                    0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Base              0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Compat            0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Config            0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Cookbook          0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Dumper            0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Notes             0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::aix     0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::cygwin  0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::darwin  0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::Default 0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::MacOS   0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::os2     0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::Unix    0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::VMS     0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::VOS     0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::Platform::Windows 0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::PodParser         0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::Build::PPMMaker          0.4224  L/LE/LEONT/Module-Build-0.4224.tar.gz
+Module::CoreList               5.20180220  B/BI/BINGOS/Module-CoreList-5.20180220.tar.gz
+Module::CoreList::Utils        5.20180220  B/BI/BINGOS/Module-CoreList-5.20180220.tar.gz
+Module::Implementation             0.09  D/DR/DROLSKY/Module-Implementation-0.09.tar.gz
+Module::Load                       0.32  B/BI/BINGOS/Module-Load-0.32.tar.gz
+Module::Load::Conditional          0.68  B/BI/BINGOS/Module-Load-Conditional-0.68.tar.gz
+Module::Metadata               1.000033  E/ET/ETHER/Module-Metadata-1.000033.tar.gz
+Module::Runtime                   0.016  Z/ZE/ZEFRAM/Module-Runtime-0.016.tar.gz
+MRO::Compat                        0.13  H/HA/HAARG/MRO-Compat-0.13.tar.gz
+MY                                 7.32  B/BI/BINGOS/ExtUtils-MakeMaker-7.32.tar.gz
+ok                             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Package::Stash                     0.37  D/DO/DOY/Package-Stash-0.37.tar.gz
+Package::Stash::PP                 0.37  D/DO/DOY/Package-Stash-0.37.tar.gz
+Package::Stash::XS                 0.28  D/DO/DOY/Package-Stash-XS-0.28.tar.gz
+Parallel::ForkManager              1.19  Y/YA/YANICK/Parallel-ForkManager-1.19.tar.gz
+Params::Check                      0.38  B/BI/BINGOS/Params-Check-0.38.tar.gz
+parent                            0.236  C/CO/CORION/parent-0.236.tar.gz
+Parse::CPAN::Meta              2.150010  D/DA/DAGOLDEN/CPAN-Meta-2.150010.tar.gz
+Perl::OSType                      1.010  D/DA/DAGOLDEN/Perl-OSType-1.010.tar.gz
+Pod                               undef  R/RR/RRA/podlators-4.10.tar.gz
+Pod::Escapes                       1.07  N/NE/NEILB/Pod-Escapes-1.07.tar.gz
+Pod::Man                           4.10  R/RR/RRA/podlators-4.10.tar.gz
+Pod::ParseLink                     4.10  R/RR/RRA/podlators-4.10.tar.gz
+Pod::Simple                        3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::BlackBox              3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::Checker               3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::Debug                 3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::DumpAsText            3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::DumpAsXML             3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::HTML                  3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::HTMLBatch             3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::HTMLLegacy            5.01  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::LinkSection           3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::Methody               3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::Progress              3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::PullParser            3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::PullParserEndToken    3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::PullParserStartToken  3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::PullParserTextToken   3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::PullParserToken       3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::RTF                   3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::Search                3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::SimpleTree            3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::Text                  3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::TextContent           3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::TiedOutFH             3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::Transcode             3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::TranscodeDumb         3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::TranscodeSmart        3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::XHTML                 3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Simple::XMLOutStream          3.35  K/KH/KHW/Pod-Simple-3.35.tar.gz
+Pod::Text                          4.10  R/RR/RRA/podlators-4.10.tar.gz
+Pod::Text::Color                   4.10  R/RR/RRA/podlators-4.10.tar.gz
+Pod::Text::Overstrike              4.10  R/RR/RRA/podlators-4.10.tar.gz
+Pod::Text::Termcap                 4.10  R/RR/RRA/podlators-4.10.tar.gz
+Sort::Naturally                    1.03  B/BI/BINGOS/Sort-Naturally-1.03.tar.gz
+TAP::Base                          3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::Base               3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::Color              3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::Console            3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::Console::ParallelSession 3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::Console::Session   3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::File               3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::File::Session      3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Formatter::Session            3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Harness                       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Harness::Env                  3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Object                        3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser                        3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Aggregator            3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Grammar               3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Iterator              3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Iterator::Array       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Iterator::Process     3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Iterator::Stream      3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::IteratorFactory       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Multiplexer           3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result                3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::Bailout       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::Comment       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::Plan          3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::Pragma        3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::Test          3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::Unknown       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::Version       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Result::YAML          3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::ResultFactory         3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Scheduler             3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Scheduler::Job        3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Scheduler::Spinner    3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::Source                3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::SourceHandler         3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::SourceHandler::Executable 3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::SourceHandler::File   3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::SourceHandler::Handle 3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::SourceHandler::Perl   3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::SourceHandler::RawTAP 3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::YAMLish::Reader       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+TAP::Parser::YAMLish::Writer       3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+Task::Weaken                       1.05  E/ET/ETHER/Task-Weaken-1.05.tar.gz
+Term::ANSIColor                    4.06  R/RR/RRA/Term-ANSIColor-4.06.tar.gz
+Test2                          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::API                     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::API::Breakage           1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::API::Context            1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::API::Instance           1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::API::Stack              1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event                   1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Bail             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Diag             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Encoding         1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Exception        1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Fail             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Generic          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Note             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Ok               1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Pass             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Plan             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Skip             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Subtest          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::TAP::Version     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::V2               1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Event::Waiting          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet              1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::About       1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Amnesty     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Assert      1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Control     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Error       1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Hub         1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Info        1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Meta        1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Parent      1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Plan        1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Render      1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::EventFacet::Trace       1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Formatter               1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Formatter::TAP          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Hub                     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Hub::Interceptor        1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Hub::Interceptor::Terminator 1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Hub::Subtest            1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::IPC                     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::IPC::Driver             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::IPC::Driver::Files      1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Tools::Tiny             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Util                    1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Util::ExternalMeta      1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Util::Facets2Legacy     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Util::HashBase          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test2::Util::Trace             1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder                  1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder::Formatter       1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder::IO::Scalar         2.114  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder::Module          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder::Tester          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder::Tester::Color   1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder::Tester::Tie     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Builder::TodoDiag        1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Harness                      3.41  L/LE/LEONT/Test-Harness-3.41.tar.gz
+Test::More                     1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Simple                   1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Tester                   1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Tester::Capture          1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Tester::CaptureRunner    1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::Tester::Delegate         1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Test::use::ok                  1.302133  E/EX/EXODIST/Test-Simple-1.302133.tar.gz
+Tie::RefHash                       1.39  F/FL/FLORA/Tie-RefHash-1.39.tar.gz
+Tie::RefHash::Nestable             1.39  F/FL/FLORA/Tie-RefHash-1.39.tar.gz
+Tie::RefHash::Weak                 0.09  N/NU/NUFFIN/Tie-RefHash-Weak-0.09.tar.gz
+Try::Tiny                          0.30  E/ET/ETHER/Try-Tiny-0.30.tar.gz
+Variable::Magic                    0.62  V/VP/VPIT/Variable-Magic-0.62.tar.gz
+version                          0.9918  J/JP/JPEACOCK/version-0.9918.tar.gz
+version::regex                   0.9918  J/JP/JPEACOCK/version-0.9918.tar.gz
+version::vpp                     0.9918  J/JP/JPEACOCK/version-0.9918.tar.gz
+version::vxs                     0.9918  J/JP/JPEACOCK/version-0.9918.tar.gz
+YAML                               1.24  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Any                          1.24  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Dumper                      undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Dumper::Base                undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Error                       undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Loader                      undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Loader::Base                undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Marshall                    undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Mo                          undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Node                        undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Tag                         undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Type::blessed               undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Type::code                  undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Type::glob                  undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Type::ref                   undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Type::regexp                undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Type::undef                 undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Types                       undef  T/TI/TINITA/YAML-1.24.tar.gz
+YAML::Warning                     undef  T/TI/TINITA/YAML-1.24.tar.gz
+yaml_mapping                      undef  T/TI/TINITA/YAML-1.24.tar.gz
+yaml_scalar                       undef  T/TI/TINITA/YAML-1.24.tar.gz
+yaml_sequence                     undef  T/TI/TINITA/YAML-1.24.tar.gz
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Command.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Command.pm
new file mode 100644 (file)
index 0000000..fc46f2a
--- /dev/null
@@ -0,0 +1,381 @@
+package ExtUtils::Command;
+
+use 5.00503;
+use strict;
+require Exporter;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+@ISA       = qw(Exporter);
+@EXPORT    = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod
+                dos2unix);
+$VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+my $Is_VMS   = $^O eq 'VMS';
+my $Is_VMS_mode = $Is_VMS;
+my $Is_VMS_noefs = $Is_VMS;
+my $Is_Win32 = $^O eq 'MSWin32';
+
+if( $Is_VMS ) {
+    my $vms_unix_rpt;
+    my $vms_efs;
+    my $vms_case;
+
+    if (eval { local $SIG{__DIE__};
+               local @INC = @INC;
+               pop @INC if $INC[-1] eq '.';
+               require VMS::Feature; }) {
+        $vms_unix_rpt = VMS::Feature::current("filename_unix_report");
+        $vms_efs = VMS::Feature::current("efs_charset");
+        $vms_case = VMS::Feature::current("efs_case_preserve");
+    } else {
+        my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+        my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || '';
+        my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
+        $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i;
+        $vms_efs = $efs_charset =~ /^[ET1]/i;
+        $vms_case = $efs_case =~ /^[ET1]/i;
+    }
+    $Is_VMS_mode = 0 if $vms_unix_rpt;
+    $Is_VMS_noefs = 0 if ($vms_efs);
+}
+
+
+=head1 NAME
+
+ExtUtils::Command - utilities to replace common UNIX commands in Makefiles etc.
+
+=head1 SYNOPSIS
+
+  perl -MExtUtils::Command -e cat files... > destination
+  perl -MExtUtils::Command -e mv source... destination
+  perl -MExtUtils::Command -e cp source... destination
+  perl -MExtUtils::Command -e touch files...
+  perl -MExtUtils::Command -e rm_f files...
+  perl -MExtUtils::Command -e rm_rf directories...
+  perl -MExtUtils::Command -e mkpath directories...
+  perl -MExtUtils::Command -e eqtime source destination
+  perl -MExtUtils::Command -e test_f file
+  perl -MExtUtils::Command -e test_d directory
+  perl -MExtUtils::Command -e chmod mode files...
+  ...
+
+=head1 DESCRIPTION
+
+The module is used to replace common UNIX commands.  In all cases the
+functions work from @ARGV rather than taking arguments.  This makes
+them easier to deal with in Makefiles.  Call them like this:
+
+  perl -MExtUtils::Command -e some_command some files to work on
+
+and I<NOT> like this:
+
+  perl -MExtUtils::Command -e 'some_command qw(some files to work on)'
+
+For that use L<Shell::Command>.
+
+Filenames with * and ? will be glob expanded.
+
+
+=head2 FUNCTIONS
+
+=over 4
+
+=cut
+
+# VMS uses % instead of ? to mean "one character"
+my $wild_regex = $Is_VMS ? '*%' : '*?';
+sub expand_wildcards
+{
+ @ARGV = map(/[$wild_regex]/o ? glob($_) : $_,@ARGV);
+}
+
+
+=item cat
+
+    cat file ...
+
+Concatenates all files mentioned on command line to STDOUT.
+
+=cut
+
+sub cat ()
+{
+ expand_wildcards();
+ print while (<>);
+}
+
+=item eqtime
+
+    eqtime source destination
+
+Sets modified time of destination to that of source.
+
+=cut
+
+sub eqtime
+{
+ my ($src,$dst) = @ARGV;
+ local @ARGV = ($dst);  touch();  # in case $dst doesn't exist
+ utime((stat($src))[8,9],$dst);
+}
+
+=item rm_rf
+
+    rm_rf files or directories ...
+
+Removes files and directories - recursively (even if readonly)
+
+=cut
+
+sub rm_rf
+{
+ expand_wildcards();
+ require File::Path;
+ File::Path::rmtree([grep -e $_,@ARGV],0,0);
+}
+
+=item rm_f
+
+    rm_f file ...
+
+Removes files (even if readonly)
+
+=cut
+
+sub rm_f {
+    expand_wildcards();
+
+    foreach my $file (@ARGV) {
+        next unless -f $file;
+
+        next if _unlink($file);
+
+        chmod(0777, $file);
+
+        next if _unlink($file);
+
+        require Carp;
+        Carp::carp("Cannot delete $file: $!");
+    }
+}
+
+sub _unlink {
+    my $files_unlinked = 0;
+    foreach my $file (@_) {
+        my $delete_count = 0;
+        $delete_count++ while unlink $file;
+        $files_unlinked++ if $delete_count;
+    }
+    return $files_unlinked;
+}
+
+
+=item touch
+
+    touch file ...
+
+Makes files exist, with current timestamp
+
+=cut
+
+sub touch {
+    my $t    = time;
+    expand_wildcards();
+    foreach my $file (@ARGV) {
+        open(FILE,">>$file") || die "Cannot write $file:$!";
+        close(FILE);
+        utime($t,$t,$file);
+    }
+}
+
+=item mv
+
+    mv source_file destination_file
+    mv source_file source_file destination_dir
+
+Moves source to destination.  Multiple sources are allowed if
+destination is an existing directory.
+
+Returns true if all moves succeeded, false otherwise.
+
+=cut
+
+sub mv {
+    expand_wildcards();
+    my @src = @ARGV;
+    my $dst = pop @src;
+
+    if (@src > 1 && ! -d $dst) {
+        require Carp;
+        Carp::croak("Too many arguments");
+    }
+
+    require File::Copy;
+    my $nok = 0;
+    foreach my $src (@src) {
+        $nok ||= !File::Copy::move($src,$dst);
+    }
+    return !$nok;
+}
+
+=item cp
+
+    cp source_file destination_file
+    cp source_file source_file destination_dir
+
+Copies sources to the destination.  Multiple sources are allowed if
+destination is an existing directory.
+
+Returns true if all copies succeeded, false otherwise.
+
+=cut
+
+sub cp {
+    expand_wildcards();
+    my @src = @ARGV;
+    my $dst = pop @src;
+
+    if (@src > 1 && ! -d $dst) {
+        require Carp;
+        Carp::croak("Too many arguments");
+    }
+
+    require File::Copy;
+    my $nok = 0;
+    foreach my $src (@src) {
+        $nok ||= !File::Copy::copy($src,$dst);
+
+        # Win32 does not update the mod time of a copied file, just the
+        # created time which make does not look at.
+        utime(time, time, $dst) if $Is_Win32;
+    }
+    return $nok;
+}
+
+=item chmod
+
+    chmod mode files ...
+
+Sets UNIX like permissions 'mode' on all the files.  e.g. 0666
+
+=cut
+
+sub chmod {
+    local @ARGV = @ARGV;
+    my $mode = shift(@ARGV);
+    expand_wildcards();
+
+    if( $Is_VMS_mode && $Is_VMS_noefs) {
+        require File::Spec;
+        foreach my $idx (0..$#ARGV) {
+            my $path = $ARGV[$idx];
+            next unless -d $path;
+
+            # chmod 0777, [.foo.bar] doesn't work on VMS, you have to do
+            # chmod 0777, [.foo]bar.dir
+            my @dirs = File::Spec->splitdir( $path );
+            $dirs[-1] .= '.dir';
+            $path = File::Spec->catfile(@dirs);
+
+            $ARGV[$idx] = $path;
+        }
+    }
+
+    chmod(oct $mode,@ARGV) || die "Cannot chmod ".join(' ',$mode,@ARGV).":$!";
+}
+
+=item mkpath
+
+    mkpath directory ...
+
+Creates directories, including any parent directories.
+
+=cut
+
+sub mkpath
+{
+ expand_wildcards();
+ require File::Path;
+ File::Path::mkpath([@ARGV],0,0777);
+}
+
+=item test_f
+
+    test_f file
+
+Tests if a file exists.  I<Exits> with 0 if it does, 1 if it does not (ie.
+shell's idea of true and false).
+
+=cut
+
+sub test_f
+{
+ exit(-f $ARGV[0] ? 0 : 1);
+}
+
+=item test_d
+
+    test_d directory
+
+Tests if a directory exists.  I<Exits> with 0 if it does, 1 if it does
+not (ie. shell's idea of true and false).
+
+=cut
+
+sub test_d
+{
+ exit(-d $ARGV[0] ? 0 : 1);
+}
+
+=item dos2unix
+
+    dos2unix files or dirs ...
+
+Converts DOS and OS/2 linefeeds to Unix style recursively.
+
+=cut
+
+sub dos2unix {
+    require File::Find;
+    File::Find::find(sub {
+        return if -d;
+        return unless -w _;
+        return unless -r _;
+        return if -B _;
+
+        local $\;
+
+    my $orig = $_;
+    my $temp = '.dos2unix_tmp';
+    open ORIG, $_ or do { warn "dos2unix can't open $_: $!"; return };
+    open TEMP, ">$temp" or
+        do { warn "dos2unix can't create .dos2unix_tmp: $!"; return };
+        binmode ORIG; binmode TEMP;
+        while (my $line = <ORIG>) {
+            $line =~ s/\015\012/\012/g;
+            print TEMP $line;
+        }
+    close ORIG;
+    close TEMP;
+    rename $temp, $orig;
+
+    }, @ARGV);
+}
+
+=back
+
+=head1 SEE ALSO
+
+Shell::Command which is these same functions but take arguments normally.
+
+
+=head1 AUTHOR
+
+Nick Ing-Simmons C<ni-s@cpan.org>
+
+Maintained by Michael G Schwern C<schwern@pobox.com> within the
+ExtUtils-MakeMaker package and, as a separate CPAN package, by
+Randy Kobes C<r.kobes@uwinnipeg.ca>.
+
+=cut
+
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Command/MM.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Command/MM.pm
new file mode 100644 (file)
index 0000000..6463d99
--- /dev/null
@@ -0,0 +1,323 @@
+package ExtUtils::Command::MM;
+
+require 5.006;
+
+use strict;
+use warnings;
+
+require Exporter;
+our @ISA = qw(Exporter);
+
+our @EXPORT  = qw(test_harness pod2man perllocal_install uninstall
+                  warn_if_old_packlist test_s cp_nonempty);
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+my $Is_VMS = $^O eq 'VMS';
+
+sub mtime {
+  no warnings 'redefine';
+  local $@;
+  *mtime = (eval { require Time::HiRes } && defined &Time::HiRes::stat)
+    ? sub { (Time::HiRes::stat($_[0]))[9] }
+    : sub { (             stat($_[0]))[9] }
+  ;
+  goto &mtime;
+}
+
+=head1 NAME
+
+ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
+
+=head1 SYNOPSIS
+
+  perl "-MExtUtils::Command::MM" -e "function" "--" arguments...
+
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY!>  The interface is not stable.
+
+ExtUtils::Command::MM encapsulates code which would otherwise have to
+be done with large "one" liners.
+
+Any $(FOO) used in the examples are make variables, not Perl.
+
+=over 4
+
+=item B<test_harness>
+
+  test_harness($verbose, @test_libs);
+
+Runs the tests on @ARGV via Test::Harness passing through the $verbose
+flag.  Any @test_libs will be unshifted onto the test's @INC.
+
+@test_libs are run in alphabetical order.
+
+=cut
+
+sub test_harness {
+    require Test::Harness;
+    require File::Spec;
+
+    $Test::Harness::verbose = shift;
+
+    # Because Windows doesn't do this for us and listing all the *.t files
+    # out on the command line can blow over its exec limit.
+    require ExtUtils::Command;
+    my @argv = ExtUtils::Command::expand_wildcards(@ARGV);
+
+    local @INC = @INC;
+    unshift @INC, map { File::Spec->rel2abs($_) } @_;
+    Test::Harness::runtests(sort { lc $a cmp lc $b } @argv);
+}
+
+
+
+=item B<pod2man>
+
+  pod2man( '--option=value',
+           $podfile1 => $manpage1,
+           $podfile2 => $manpage2,
+           ...
+         );
+
+  # or args on @ARGV
+
+pod2man() is a function performing most of the duties of the pod2man
+program.  Its arguments are exactly the same as pod2man as of 5.8.0
+with the addition of:
+
+    --perm_rw   octal permission to set the resulting manpage to
+
+And the removal of:
+
+    --verbose/-v
+    --help/-h
+
+If no arguments are given to pod2man it will read from @ARGV.
+
+If Pod::Man is unavailable, this function will warn and return undef.
+
+=cut
+
+sub pod2man {
+    local @ARGV = @_ ? @_ : @ARGV;
+
+    {
+        local $@;
+        if( !eval { require Pod::Man } ) {
+            warn "Pod::Man is not available: $@".
+                 "Man pages will not be generated during this install.\n";
+            return 0;
+        }
+    }
+    require Getopt::Long;
+
+    # We will cheat and just use Getopt::Long.  We fool it by putting
+    # our arguments into @ARGV.  Should be safe.
+    my %options = ();
+    Getopt::Long::config ('bundling_override');
+    Getopt::Long::GetOptions (\%options,
+                'section|s=s', 'release|r=s', 'center|c=s',
+                'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
+                'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l',
+                'name|n=s', 'perm_rw=i', 'utf8|u'
+    );
+    delete $options{utf8} unless $Pod::Man::VERSION >= 2.17;
+
+    # If there's no files, don't bother going further.
+    return 0 unless @ARGV;
+
+    # Official sets --center, but don't override things explicitly set.
+    if ($options{official} && !defined $options{center}) {
+        $options{center} = q[Perl Programmer's Reference Guide];
+    }
+
+    # This isn't a valid Pod::Man option and is only accepted for backwards
+    # compatibility.
+    delete $options{lax};
+    my $count = scalar @ARGV / 2;
+    my $plural = $count == 1 ? 'document' : 'documents';
+    print "Manifying $count pod $plural\n";
+
+    do {{  # so 'next' works
+        my ($pod, $man) = splice(@ARGV, 0, 2);
+
+        next if ((-e $man) &&
+                 (mtime($man) > mtime($pod)) &&
+                 (mtime($man) > mtime("Makefile")));
+
+        my $parser = Pod::Man->new(%options);
+        $parser->parse_from_file($pod, $man)
+          or do { warn("Could not install $man\n");  next };
+
+        if (exists $options{perm_rw}) {
+            chmod(oct($options{perm_rw}), $man)
+              or do { warn("chmod $options{perm_rw} $man: $!\n"); next };
+        }
+    }} while @ARGV;
+
+    return 1;
+}
+
+
+=item B<warn_if_old_packlist>
+
+  perl "-MExtUtils::Command::MM" -e warn_if_old_packlist <somefile>
+
+Displays a warning that an old packlist file was found.  Reads the
+filename from @ARGV.
+
+=cut
+
+sub warn_if_old_packlist {
+    my $packlist = $ARGV[0];
+
+    return unless -f $packlist;
+    print <<"PACKLIST_WARNING";
+WARNING: I have found an old package in
+    $packlist.
+Please make sure the two installations are not conflicting
+PACKLIST_WARNING
+
+}
+
+
+=item B<perllocal_install>
+
+    perl "-MExtUtils::Command::MM" -e perllocal_install
+        <type> <module name> <key> <value> ...
+
+    # VMS only, key|value pairs come on STDIN
+    perl "-MExtUtils::Command::MM" -e perllocal_install
+        <type> <module name> < <key>|<value> ...
+
+Prints a fragment of POD suitable for appending to perllocal.pod.
+Arguments are read from @ARGV.
+
+'type' is the type of what you're installing.  Usually 'Module'.
+
+'module name' is simply the name of your module.  (Foo::Bar)
+
+Key/value pairs are extra information about the module.  Fields include:
+
+    installed into      which directory your module was out into
+    LINKTYPE            dynamic or static linking
+    VERSION             module version number
+    EXE_FILES           any executables installed in a space separated
+                        list
+
+=cut
+
+sub perllocal_install {
+    my($type, $name) = splice(@ARGV, 0, 2);
+
+    # VMS feeds args as a piped file on STDIN since it usually can't
+    # fit all the args on a single command line.
+    my @mod_info = $Is_VMS ? split /\|/, <STDIN>
+                           : @ARGV;
+
+    my $pod;
+    my $time = gmtime($ENV{SOURCE_DATE_EPOCH} || time);
+    $pod = sprintf <<'POD', scalar($time), $type, $name, $name;
+ =head2 %s: C<%s> L<%s|%s>
+
+ =over 4
+
+POD
+
+    do {
+        my($key, $val) = splice(@mod_info, 0, 2);
+
+        $pod .= <<POD
+ =item *
+
+ C<$key: $val>
+
+POD
+
+    } while(@mod_info);
+
+    $pod .= "=back\n\n";
+    $pod =~ s/^ //mg;
+    print $pod;
+
+    return 1;
+}
+
+=item B<uninstall>
+
+    perl "-MExtUtils::Command::MM" -e uninstall <packlist>
+
+A wrapper around ExtUtils::Install::uninstall().  Warns that
+uninstallation is deprecated and doesn't actually perform the
+uninstallation.
+
+=cut
+
+sub uninstall {
+    my($packlist) = shift @ARGV;
+
+    require ExtUtils::Install;
+
+    print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+We will show what would have been done.
+
+WARNING
+
+    ExtUtils::Install::uninstall($packlist, 1, 1);
+
+    print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+Please check the list above carefully, there may be errors.
+Remove the appropriate files manually.
+Sorry for the inconvenience.
+
+WARNING
+
+}
+
+=item B<test_s>
+
+   perl "-MExtUtils::Command::MM" -e test_s <file>
+
+Tests if a file exists and is not empty (size > 0).
+I<Exits> with 0 if it does, 1 if it does not.
+
+=cut
+
+sub test_s {
+  exit(-s $ARGV[0] ? 0 : 1);
+}
+
+=item B<cp_nonempty>
+
+  perl "-MExtUtils::Command::MM" -e cp_nonempty <srcfile> <dstfile> <perm>
+
+Tests if the source file exists and is not empty (size > 0). If it is not empty
+it copies it to the given destination with the given permissions.
+
+=back
+
+=cut
+
+sub cp_nonempty {
+  my @args = @ARGV;
+  return 0 unless -s $args[0];
+  require ExtUtils::Command;
+  {
+    local @ARGV = @args[0,1];
+    ExtUtils::Command::cp(@ARGV);
+  }
+  {
+    local @ARGV = @args[2,1];
+    ExtUtils::Command::chmod(@ARGV);
+  }
+}
+
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Liblist.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Liblist.pm
new file mode 100644 (file)
index 0000000..41d9795
--- /dev/null
@@ -0,0 +1,287 @@
+package ExtUtils::Liblist;
+
+use strict;
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+use File::Spec;
+require ExtUtils::Liblist::Kid;
+our @ISA = qw(ExtUtils::Liblist::Kid File::Spec);
+
+# Backwards compatibility with old interface.
+sub ext {
+    goto &ExtUtils::Liblist::Kid::ext;
+}
+
+sub lsdir {
+  shift;
+  my $rex = qr/$_[1]/;
+  opendir my $dir_fh, $_[0];
+  my @out = grep /$rex/, readdir $dir_fh;
+  closedir $dir_fh;
+  return @out;
+}
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Liblist - determine libraries to use and how to use them
+
+=head1 SYNOPSIS
+
+  require ExtUtils::Liblist;
+
+  $MM->ext($potential_libs, $verbose, $need_names);
+
+  # Usually you can get away with:
+  ExtUtils::Liblist->ext($potential_libs, $verbose, $need_names)
+
+=head1 DESCRIPTION
+
+This utility takes a list of libraries in the form C<-llib1 -llib2
+-llib3> and returns lines suitable for inclusion in an extension
+Makefile.  Extra library paths may be included with the form
+C<-L/another/path> this will affect the searches for all subsequent
+libraries.
+
+It returns an array of four or five scalar values: EXTRALIBS,
+BSLOADLIBS, LDLOADLIBS, LD_RUN_PATH, and, optionally, a reference to
+the array of the filenames of actual libraries.  Some of these don't
+mean anything unless on Unix.  See the details about those platform
+specifics below.  The list of the filenames is returned only if
+$need_names argument is true.
+
+Dependent libraries can be linked in one of three ways:
+
+=over 2
+
+=item * For static extensions
+
+by the ld command when the perl binary is linked with the extension
+library. See EXTRALIBS below.
+
+=item * For dynamic extensions at build/link time
+
+by the ld command when the shared object is built/linked. See
+LDLOADLIBS below.
+
+=item * For dynamic extensions at load time
+
+by the DynaLoader when the shared object is loaded. See BSLOADLIBS
+below.
+
+=back
+
+=head2 EXTRALIBS
+
+List of libraries that need to be linked with when linking a perl
+binary which includes this extension. Only those libraries that
+actually exist are included.  These are written to a file and used
+when linking perl.
+
+=head2 LDLOADLIBS and LD_RUN_PATH
+
+List of those libraries which can or must be linked into the shared
+library when created using ld. These may be static or dynamic
+libraries.  LD_RUN_PATH is a colon separated list of the directories
+in LDLOADLIBS. It is passed as an environment variable to the process
+that links the shared library.
+
+=head2 BSLOADLIBS
+
+List of those libraries that are needed but can be linked in
+dynamically at run time on this platform.  SunOS/Solaris does not need
+this because ld records the information (from LDLOADLIBS) into the
+object file.  This list is used to create a .bs (bootstrap) file.
+
+=head1 PORTABILITY
+
+This module deals with a lot of system dependencies and has quite a
+few architecture specific C<if>s in the code.
+
+=head2 VMS implementation
+
+The version of ext() which is executed under VMS differs from the
+Unix-OS/2 version in several respects:
+
+=over 2
+
+=item *
+
+Input library and path specifications are accepted with or without the
+C<-l> and C<-L> prefixes used by Unix linkers.  If neither prefix is
+present, a token is considered a directory to search if it is in fact
+a directory, and a library to search for otherwise.  Authors who wish
+their extensions to be portable to Unix or OS/2 should use the Unix
+prefixes, since the Unix-OS/2 version of ext() requires them.
+
+=item *
+
+Wherever possible, shareable images are preferred to object libraries,
+and object libraries to plain object files.  In accordance with VMS
+naming conventions, ext() looks for files named I<lib>shr and I<lib>rtl;
+it also looks for I<lib>lib and libI<lib> to accommodate Unix conventions
+used in some ported software.
+
+=item *
+
+For each library that is found, an appropriate directive for a linker options
+file is generated.  The return values are space-separated strings of
+these directives, rather than elements used on the linker command line.
+
+=item *
+
+LDLOADLIBS contains both the libraries found based on C<$potential_libs> and
+the CRTLs, if any, specified in Config.pm.  EXTRALIBS contains just those
+libraries found based on C<$potential_libs>.  BSLOADLIBS and LD_RUN_PATH
+are always empty.
+
+=back
+
+In addition, an attempt is made to recognize several common Unix library
+names, and filter them out or convert them to their VMS equivalents, as
+appropriate.
+
+In general, the VMS version of ext() should properly handle input from
+extensions originally designed for a Unix or VMS environment.  If you
+encounter problems, or discover cases where the search could be improved,
+please let us know.
+
+=head2 Win32 implementation
+
+The version of ext() which is executed under Win32 differs from the
+Unix-OS/2 version in several respects:
+
+=over 2
+
+=item *
+
+If C<$potential_libs> is empty, the return value will be empty.
+Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm)
+will be appended to the list of C<$potential_libs>.  The libraries
+will be searched for in the directories specified in C<$potential_libs>,
+C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>.
+For each library that is found,  a space-separated list of fully qualified
+library pathnames is generated.
+
+=item *
+
+Input library and path specifications are accepted with or without the
+C<-l> and C<-L> prefixes used by Unix linkers.
+
+An entry of the form C<-La:\foo> specifies the C<a:\foo> directory to look
+for the libraries that follow.
+
+An entry of the form C<-lfoo> specifies the library C<foo>, which may be
+spelled differently depending on what kind of compiler you are using.  If
+you are using GCC, it gets translated to C<libfoo.a>, but for other win32
+compilers, it becomes C<foo.lib>.  If no files are found by those translated
+names, one more attempt is made to find them using either C<foo.a> or
+C<libfoo.lib>, depending on whether GCC or some other win32 compiler is
+being used, respectively.
+
+If neither the C<-L> or C<-l> prefix is present in an entry, the entry is
+considered a directory to search if it is in fact a directory, and a
+library to search for otherwise.  The C<$Config{lib_ext}> suffix will
+be appended to any entries that are not directories and don't already have
+the suffix.
+
+Note that the C<-L> and C<-l> prefixes are B<not required>, but authors
+who wish their extensions to be portable to Unix or OS/2 should use the
+prefixes, since the Unix-OS/2 version of ext() requires them.
+
+=item *
+
+Entries cannot be plain object files, as many Win32 compilers will
+not handle object files in the place of libraries.
+
+=item *
+
+Entries in C<$potential_libs> beginning with a colon and followed by
+alphanumeric characters are treated as flags.  Unknown flags will be ignored.
+
+An entry that matches C</:nodefault/i> disables the appending of default
+libraries found in C<$Config{perllibs}> (this should be only needed very rarely).
+
+An entry that matches C</:nosearch/i> disables all searching for
+the libraries specified after it.  Translation of C<-Lfoo> and
+C<-lfoo> still happens as appropriate (depending on compiler being used,
+as reflected by C<$Config{cc}>), but the entries are not verified to be
+valid files or directories.
+
+An entry that matches C</:search/i> reenables searching for
+the libraries specified after it.  You can put it at the end to
+enable searching for default libraries specified by C<$Config{perllibs}>.
+
+=item *
+
+The libraries specified may be a mixture of static libraries and
+import libraries (to link with DLLs).  Since both kinds are used
+pretty transparently on the Win32 platform, we do not attempt to
+distinguish between them.
+
+=item *
+
+LDLOADLIBS and EXTRALIBS are always identical under Win32, and BSLOADLIBS
+and LD_RUN_PATH are always empty (this may change in future).
+
+=item *
+
+You must make sure that any paths and path components are properly
+surrounded with double-quotes if they contain spaces. For example,
+C<$potential_libs> could be (literally):
+
+    "-Lc:\Program Files\vc\lib" msvcrt.lib "la test\foo bar.lib"
+
+Note how the first and last entries are protected by quotes in order
+to protect the spaces.
+
+=item *
+
+Since this module is most often used only indirectly from extension
+C<Makefile.PL> files, here is an example C<Makefile.PL> entry to add
+a library to the build process for an extension:
+
+        LIBS => ['-lgl']
+
+When using GCC, that entry specifies that MakeMaker should first look
+for C<libgl.a> (followed by C<gl.a>) in all the locations specified by
+C<$Config{libpth}>.
+
+When using a compiler other than GCC, the above entry will search for
+C<gl.lib> (followed by C<libgl.lib>).
+
+If the library happens to be in a location not in C<$Config{libpth}>,
+you need:
+
+        LIBS => ['-Lc:\gllibs -lgl']
+
+Here is a less often used example:
+
+        LIBS => ['-lgl', ':nosearch -Ld:\mesalibs -lmesa -luser32']
+
+This specifies a search for library C<gl> as before.  If that search
+fails to find the library, it looks at the next item in the list. The
+C<:nosearch> flag will prevent searching for the libraries that follow,
+so it simply returns the value as C<-Ld:\mesalibs -lmesa -luser32>,
+since GCC can use that value as is with its linker.
+
+When using the Visual C compiler, the second item is returned as
+C<-libpath:d:\mesalibs mesa.lib user32.lib>.
+
+When using the Borland compiler, the second item is returned as
+C<-Ld:\mesalibs mesa.lib user32.lib>, and MakeMaker takes care of
+moving the C<-Ld:\mesalibs> to the correct place in the linker
+command line.
+
+=back
+
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Liblist/Kid.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/Liblist/Kid.pm
new file mode 100644 (file)
index 0000000..92e73ed
--- /dev/null
@@ -0,0 +1,650 @@
+package ExtUtils::Liblist::Kid;
+
+# XXX Splitting this out into its own .pm is a temporary solution.
+
+# This kid package is to be used by MakeMaker.  It will not work if
+# $self is not a Makemaker.
+
+use 5.006;
+
+# Broken out of MakeMaker from version 4.11
+
+use strict;
+use warnings;
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+use ExtUtils::MakeMaker::Config;
+use Cwd 'cwd';
+use File::Basename;
+use File::Spec;
+
+sub ext {
+    if    ( $^O eq 'VMS' )     { return &_vms_ext; }
+    elsif ( $^O eq 'MSWin32' ) { return &_win32_ext; }
+    else                       { return &_unix_os2_ext; }
+}
+
+sub _unix_os2_ext {
+    my ( $self, $potential_libs, $verbose, $give_libs ) = @_;
+    $verbose ||= 0;
+
+    if ( $^O =~ /os2|android/ and $Config{perllibs} ) {
+
+        # Dynamic libraries are not transitive, so we may need including
+        # the libraries linked against perl.dll/libperl.so again.
+
+        $potential_libs .= " " if $potential_libs;
+        $potential_libs .= $Config{perllibs};
+    }
+    return ( "", "", "", "", ( $give_libs ? [] : () ) ) unless $potential_libs;
+    warn "Potential libraries are '$potential_libs':\n" if $verbose;
+
+    my ( $so ) = $Config{so};
+    my ( $libs ) = defined $Config{perllibs} ? $Config{perllibs} : $Config{libs};
+    my $Config_libext = $Config{lib_ext} || ".a";
+    my $Config_dlext = $Config{dlext};
+
+    # compute $extralibs, $bsloadlibs and $ldloadlibs from
+    # $potential_libs
+    # this is a rewrite of Andy Dougherty's extliblist in perl
+
+    my ( @searchpath );    # from "-L/path" entries in $potential_libs
+    my ( @libpath ) = split " ", $Config{'libpth'} || '';
+    my ( @ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen );
+    my ( @libs,       %libs_seen );
+    my ( $fullname,   @fullname );
+    my ( $pwd )   = cwd();    # from Cwd.pm
+    my ( $found ) = 0;
+
+    if ( $^O eq 'darwin' or $^O eq 'next' )  {
+        # 'escape' Mach-O ld -framework flags, so they aren't dropped later on
+        $potential_libs =~ s/(^|\s)(-(?:weak_|reexport_|lazy_)?framework)\s+(\S+)/$1-Wl,$2 -Wl,$3/g;
+    }
+
+    foreach my $thislib ( split ' ', $potential_libs ) {
+        my ( $custom_name ) = '';
+
+        # Handle possible linker path arguments.
+        if ( $thislib =~ s/^(-[LR]|-Wl,-R|-Wl,-rpath,)// ) {    # save path flag type
+            my ( $ptype ) = $1;
+            unless ( -d $thislib ) {
+                warn "$ptype$thislib ignored, directory does not exist\n"
+                  if $verbose;
+                next;
+            }
+            my ( $rtype ) = $ptype;
+            if ( ( $ptype eq '-R' ) or ( $ptype =~ m!^-Wl,-[Rr]! ) ) {
+                if ( $Config{'lddlflags'} =~ /-Wl,-[Rr]/ ) {
+                    $rtype = '-Wl,-R';
+                }
+                elsif ( $Config{'lddlflags'} =~ /-R/ ) {
+                    $rtype = '-R';
+                }
+            }
+            unless ( File::Spec->file_name_is_absolute( $thislib ) ) {
+                warn "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
+                $thislib = $self->catdir( $pwd, $thislib );
+            }
+            push( @searchpath, $thislib );
+            push( @extralibs,  "$ptype$thislib" );
+            push( @ldloadlibs, "$rtype$thislib" );
+            next;
+        }
+
+        if ( $thislib =~ m!^-Wl,! ) {
+            push( @extralibs,  $thislib );
+            push( @ldloadlibs, $thislib );
+            next;
+        }
+
+        # Handle possible library arguments.
+        if ( $thislib =~ s/^-l(:)?// ) {
+            # Handle -l:foo.so, which means that the library will
+            # actually be called foo.so, not libfoo.so.  This
+            # is used in Android by ExtUtils::Depends to allow one XS
+            # module to link to another.
+            $custom_name = $1 || '';
+        }
+        else {
+            warn "Unrecognized argument in LIBS ignored: '$thislib'\n";
+            next;
+        }
+
+        my ( $found_lib ) = 0;
+        foreach my $thispth ( @searchpath, @libpath ) {
+
+            # Try to find the full name of the library.  We need this to
+            # determine whether it's a dynamically-loadable library or not.
+            # This tends to be subject to various os-specific quirks.
+            # For gcc-2.6.2 on linux (March 1995), DLD can not load
+            # .sa libraries, with the exception of libm.sa, so we
+            # deliberately skip them.
+            if ((@fullname =
+                 $self->lsdir($thispth, "^\Qlib$thislib.$so.\E[0-9]+")) ||
+                (@fullname =
+                 $self->lsdir($thispth, "^\Qlib$thislib.\E[0-9]+\Q\.$so"))) {
+                # Take care that libfoo.so.10 wins against libfoo.so.9.
+                # Compare two libraries to find the most recent version
+                # number.  E.g.  if you have libfoo.so.9.0.7 and
+                # libfoo.so.10.1, first convert all digits into two
+                # decimal places.  Then we'll add ".00" to the shorter
+                # strings so that we're comparing strings of equal length
+                # Thus we'll compare libfoo.so.09.07.00 with
+                # libfoo.so.10.01.00.  Some libraries might have letters
+                # in the version.  We don't know what they mean, but will
+                # try to skip them gracefully -- we'll set any letter to
+                # '0'.  Finally, sort in reverse so we can take the
+                # first element.
+
+                #TODO: iterate through the directory instead of sorting
+
+                $fullname = "$thispth/" . (
+                    sort {
+                        my ( $ma ) = $a;
+                        my ( $mb ) = $b;
+                        $ma =~ tr/A-Za-z/0/s;
+                        $ma =~ s/\b(\d)\b/0$1/g;
+                        $mb =~ tr/A-Za-z/0/s;
+                        $mb =~ s/\b(\d)\b/0$1/g;
+                        while ( length( $ma ) < length( $mb ) ) { $ma .= ".00"; }
+                        while ( length( $mb ) < length( $ma ) ) { $mb .= ".00"; }
+
+                        # Comparison deliberately backwards
+                        $mb cmp $ma;
+                      } @fullname
+                )[0];
+            }
+            elsif ( -f ( $fullname = "$thispth/lib$thislib.$so" )
+                && ( ( $Config{'dlsrc'} ne "dl_dld.xs" ) || ( $thislib eq "m" ) ) )
+            {
+            }
+            elsif (-f ( $fullname = "$thispth/lib${thislib}_s$Config_libext" )
+                && ( $Config{'archname'} !~ /RM\d\d\d-svr4/ )
+                && ( $thislib .= "_s" ) )
+            {    # we must explicitly use _s version
+            }
+            elsif ( -f ( $fullname = "$thispth/lib$thislib$Config_libext" ) ) {
+            }
+            elsif ( defined( $Config_dlext )
+                && -f ( $fullname = "$thispth/lib$thislib.$Config_dlext" ) )
+            {
+            }
+            elsif ( -f ( $fullname = "$thispth/$thislib$Config_libext" ) ) {
+            }
+            elsif ( -f ( $fullname = "$thispth/lib$thislib.dll$Config_libext" ) ) {
+            }
+            elsif ( $^O eq 'cygwin' && -f ( $fullname = "$thispth/$thislib.dll" ) ) {
+            }
+            elsif ( -f ( $fullname = "$thispth/Slib$thislib$Config_libext" ) ) {
+            }
+            elsif ($^O eq 'dgux'
+                && -l ( $fullname = "$thispth/lib$thislib$Config_libext" )
+                && readlink( $fullname ) =~ /^elink:/s )
+            {
+
+                # Some of DG's libraries look like misconnected symbolic
+                # links, but development tools can follow them.  (They
+                # look like this:
+                #
+                #    libm.a -> elink:${SDE_PATH:-/usr}/sde/\
+                #    ${TARGET_BINARY_INTERFACE:-m88kdgux}/usr/lib/libm.a
+                #
+                # , the compilation tools expand the environment variables.)
+            }
+            elsif ( $custom_name && -f ( $fullname = "$thispth/$thislib" ) ) {
+            }
+            else {
+                warn "$thislib not found in $thispth\n" if $verbose;
+                next;
+            }
+            warn "'-l$thislib' found at $fullname\n" if $verbose;
+            push @libs, $fullname unless $libs_seen{$fullname}++;
+            $found++;
+            $found_lib++;
+
+            # Now update library lists
+
+            # what do we know about this library...
+            my $is_dyna = ( $fullname !~ /\Q$Config_libext\E\z/ );
+            my $in_perl = ( $libs =~ /\B-l:?\Q${thislib}\E\b/s );
+
+            # include the path to the lib once in the dynamic linker path
+            # but only if it is a dynamic lib and not in Perl itself
+            my ( $fullnamedir ) = dirname( $fullname );
+            push @ld_run_path, $fullnamedir
+              if $is_dyna
+                  && !$in_perl
+                  && !$ld_run_path_seen{$fullnamedir}++;
+
+            # Do not add it into the list if it is already linked in
+            # with the main perl executable.
+            # We have to special-case the NeXT, because math and ndbm
+            # are both in libsys_s
+            unless (
+                $in_perl
+                || ( $Config{'osname'} eq 'next'
+                    && ( $thislib eq 'm' || $thislib eq 'ndbm' ) )
+              )
+            {
+                push( @extralibs, "-l$custom_name$thislib" );
+            }
+
+            # We might be able to load this archive file dynamically
+            if (   ( $Config{'dlsrc'} =~ /dl_next/ && $Config{'osvers'} lt '4_0' )
+                || ( $Config{'dlsrc'} =~ /dl_dld/ ) )
+            {
+
+                # We push -l$thislib instead of $fullname because
+                # it avoids hardwiring a fixed path into the .bs file.
+                # Mkbootstrap will automatically add dl_findfile() to
+                # the .bs file if it sees a name in the -l format.
+                # USE THIS, when dl_findfile() is fixed:
+                # push(@bsloadlibs, "-l$thislib");
+                # OLD USE WAS while checking results against old_extliblist
+                push( @bsloadlibs, "$fullname" );
+            }
+            else {
+                if ( $is_dyna ) {
+
+                    # For SunOS4, do not add in this shared library if
+                    # it is already linked in the main perl executable
+                    push( @ldloadlibs, "-l$custom_name$thislib" )
+                      unless ( $in_perl and $^O eq 'sunos' );
+                }
+                else {
+                    push( @ldloadlibs, "-l$custom_name$thislib" );
+                }
+            }
+            last;    # found one here so don't bother looking further
+        }
+        warn "Warning (mostly harmless): " . "No library found for -l$thislib\n"
+          unless $found_lib > 0;
+    }
+
+    unless ( $found ) {
+        return ( '', '', '', '', ( $give_libs ? \@libs : () ) );
+    }
+    else {
+        return ( "@extralibs", "@bsloadlibs", "@ldloadlibs", join( ":", @ld_run_path ), ( $give_libs ? \@libs : () ) );
+    }
+}
+
+sub _win32_ext {
+
+    require Text::ParseWords;
+
+    my ( $self, $potential_libs, $verbose, $give_libs ) = @_;
+    $verbose ||= 0;
+
+    # If user did not supply a list, we punt.
+    # (caller should probably use the list in $Config{libs})
+    return ( "", "", "", "", ( $give_libs ? [] : () ) ) unless $potential_libs;
+
+    # TODO: make this use MM_Win32.pm's compiler detection
+    my %libs_seen;
+    my @extralibs;
+    my $cc = $Config{cc} || '';
+    my $VC = $cc =~ /\bcl\b/i;
+    my $GC = $cc =~ /\bgcc\b/i;
+
+    my $libext     = _win32_lib_extensions();
+    my @searchpath = ( '' );                                    # from "-L/path" entries in $potential_libs
+    my @libpath    = _win32_default_search_paths( $VC, $GC );
+    my $pwd        = cwd();                                     # from Cwd.pm
+    my $search     = 1;
+
+    # compute @extralibs from $potential_libs
+    my @lib_search_list = _win32_make_lib_search_list( $potential_libs, $verbose );
+    for ( @lib_search_list ) {
+
+        my $thislib = $_;
+
+        # see if entry is a flag
+        if ( /^:\w+$/ ) {
+            $search = 0 if lc eq ':nosearch';
+            $search = 1 if lc eq ':search';
+            _debug( "Ignoring unknown flag '$thislib'\n", $verbose ) if !/^:(no)?(search|default)$/i;
+            next;
+        }
+
+        # if searching is disabled, do compiler-specific translations
+        unless ( $search ) {
+            s/^-l(.+)$/$1.lib/ unless $GC;
+            s/^-L/-libpath:/ if $VC;
+            push( @extralibs, $_ );
+            next;
+        }
+
+        # handle possible linker path arguments
+        if ( s/^-L// and not -d ) {
+            _debug( "$thislib ignored, directory does not exist\n", $verbose );
+            next;
+        }
+        elsif ( -d ) {
+            unless ( File::Spec->file_name_is_absolute( $_ ) ) {
+                warn "Warning: '$thislib' changed to '-L$pwd/$_'\n";
+                $_ = $self->catdir( $pwd, $_ );
+            }
+            push( @searchpath, $_ );
+            next;
+        }
+
+        my @paths = ( @searchpath, @libpath );
+        my ( $fullname, $path ) = _win32_search_file( $thislib, $libext, \@paths, $verbose, $GC );
+
+        if ( !$fullname ) {
+            warn "Warning (mostly harmless): No library found for $thislib\n";
+            next;
+        }
+
+        _debug( "'$thislib' found as '$fullname'\n", $verbose );
+        push( @extralibs, $fullname );
+        $libs_seen{$fullname} = 1 if $path;    # why is this a special case?
+    }
+
+    my @libs = sort keys %libs_seen;
+
+    return ( '', '', '', '', ( $give_libs ? \@libs : () ) ) unless @extralibs;
+
+    # make sure paths with spaces are properly quoted
+    @extralibs = map { qq["$_"] } @extralibs;
+    @libs      = map { qq["$_"] } @libs;
+
+    my $lib = join( ' ', @extralibs );
+
+    # normalize back to backward slashes (to help braindead tools)
+    # XXX this may break equally braindead GNU tools that don't understand
+    # backslashes, either.  Seems like one can't win here.  Cursed be CP/M.
+    $lib =~ s,/,\\,g;
+
+    _debug( "Result: $lib\n", $verbose );
+    wantarray ? ( $lib, '', $lib, '', ( $give_libs ? \@libs : () ) ) : $lib;
+}
+
+sub _win32_make_lib_search_list {
+    my ( $potential_libs, $verbose ) = @_;
+
+    # If Config.pm defines a set of default libs, we always
+    # tack them on to the user-supplied list, unless the user
+    # specified :nodefault
+    my $libs = $Config{'perllibs'};
+    $potential_libs = join( ' ', $potential_libs, $libs ) if $libs and $potential_libs !~ /:nodefault/i;
+    _debug( "Potential libraries are '$potential_libs':\n", $verbose );
+
+    $potential_libs =~ s,\\,/,g;    # normalize to forward slashes
+
+    my @list = Text::ParseWords::quotewords( '\s+', 0, $potential_libs );
+
+    return @list;
+}
+
+sub _win32_default_search_paths {
+    my ( $VC, $GC ) = @_;
+
+    my $libpth = $Config{'libpth'} || '';
+    $libpth =~ s,\\,/,g;            # normalize to forward slashes
+
+    my @libpath = Text::ParseWords::quotewords( '\s+', 0, $libpth );
+    push @libpath, "$Config{installarchlib}/CORE";    # add "$Config{installarchlib}/CORE" to default search path
+
+    push @libpath, split /;/, $ENV{LIB}          if $VC and $ENV{LIB};
+    push @libpath, split /;/, $ENV{LIBRARY_PATH} if $GC and $ENV{LIBRARY_PATH};
+
+    return @libpath;
+}
+
+sub _win32_search_file {
+    my ( $thislib, $libext, $paths, $verbose, $GC ) = @_;
+
+    my @file_list = _win32_build_file_list( $thislib, $GC, $libext );
+
+    for my $lib_file ( @file_list ) {
+        for my $path ( @{$paths} ) {
+            my $fullname = $lib_file;
+            $fullname = "$path\\$fullname" if $path;
+
+            return ( $fullname, $path ) if -f $fullname;
+
+            _debug( "'$thislib' not found as '$fullname'\n", $verbose );
+        }
+    }
+
+    return;
+}
+
+sub _win32_build_file_list {
+    my ( $lib, $GC, $extensions ) = @_;
+
+    my @pre_fixed = _win32_build_prefixed_list( $lib, $GC );
+    return map _win32_attach_extensions( $_, $extensions ), @pre_fixed;
+}
+
+sub _win32_build_prefixed_list {
+    my ( $lib, $GC ) = @_;
+
+    return $lib if $lib !~ s/^-l//;
+    return $lib if $lib =~ /^lib/ and !$GC;
+
+    ( my $no_prefix = $lib ) =~ s/^lib//i;
+    $lib = "lib$lib" if $no_prefix eq $lib;
+
+    return ( $lib, $no_prefix ) if $GC;
+    return ( $no_prefix, $lib );
+}
+
+sub _win32_attach_extensions {
+    my ( $lib, $extensions ) = @_;
+    return map _win32_try_attach_extension( $lib, $_ ), @{$extensions};
+}
+
+sub _win32_try_attach_extension {
+    my ( $lib, $extension ) = @_;
+
+    return $lib if $lib =~ /\Q$extension\E$/i;
+    return "$lib$extension";
+}
+
+sub _win32_lib_extensions {
+    my @extensions;
+    push @extensions, $Config{'lib_ext'} if $Config{'lib_ext'};
+    push @extensions, '.dll.a' if grep { m!^\.a$! } @extensions;
+    push @extensions, '.lib' unless grep { m!^\.lib$! } @extensions;
+    return \@extensions;
+}
+
+sub _debug {
+    my ( $message, $verbose ) = @_;
+    return if !$verbose;
+    warn $message;
+    return;
+}
+
+sub _vms_ext {
+    my ( $self, $potential_libs, $verbose, $give_libs ) = @_;
+    $verbose ||= 0;
+
+    my ( @crtls, $crtlstr );
+    @crtls = ( ( $Config{'ldflags'} =~ m-/Debug-i ? $Config{'dbgprefix'} : '' ) . 'PerlShr/Share' );
+    push( @crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'} );
+    push( @crtls, grep { not /\(/ } split /\s+/, $Config{'libc'} );
+
+    # In general, we pass through the basic libraries from %Config unchanged.
+    # The one exception is that if we're building in the Perl source tree, and
+    # a library spec could be resolved via a logical name, we go to some trouble
+    # to insure that the copy in the local tree is used, rather than one to
+    # which a system-wide logical may point.
+    if ( $self->{PERL_SRC} ) {
+        my ( $locspec, $type );
+        foreach my $lib ( @crtls ) {
+            if ( ( $locspec, $type ) = $lib =~ m{^([\w\$-]+)(/\w+)?} and $locspec =~ /perl/i ) {
+                if    ( lc $type eq '/share' )   { $locspec .= $Config{'exe_ext'}; }
+                elsif ( lc $type eq '/library' ) { $locspec .= $Config{'lib_ext'}; }
+                else                             { $locspec .= $Config{'obj_ext'}; }
+                $locspec = $self->catfile( $self->{PERL_SRC}, $locspec );
+                $lib = "$locspec$type" if -e $locspec;
+            }
+        }
+    }
+    $crtlstr = @crtls ? join( ' ', @crtls ) : '';
+
+    unless ( $potential_libs ) {
+        warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
+        return ( '', '', $crtlstr, '', ( $give_libs ? [] : () ) );
+    }
+
+    my ( %found, @fndlibs, $ldlib );
+    my $cwd = cwd();
+    my ( $so, $lib_ext, $obj_ext ) = @Config{ 'so', 'lib_ext', 'obj_ext' };
+
+    # List of common Unix library names and their VMS equivalents
+    # (VMS equivalent of '' indicates that the library is automatically
+    # searched by the linker, and should be skipped here.)
+    my ( @flibs, %libs_seen );
+    my %libmap = (
+        'm'      => '',
+        'f77'    => '',
+        'F77'    => '',
+        'V77'    => '',
+        'c'      => '',
+        'malloc' => '',
+        'crypt'  => '',
+        'resolv' => '',
+        'c_s'    => '',
+        'socket' => '',
+        'X11'    => 'DECW$XLIBSHR',
+        'Xt'     => 'DECW$XTSHR',
+        'Xm'     => 'DECW$XMLIBSHR',
+        'Xmu'    => 'DECW$XMULIBSHR'
+    );
+
+    warn "Potential libraries are '$potential_libs'\n" if $verbose;
+
+    # First, sort out directories and library names in the input
+    my ( @dirs, @libs );
+    foreach my $lib ( split ' ', $potential_libs ) {
+        push( @dirs, $1 ),   next if $lib =~ /^-L(.*)/;
+        push( @dirs, $lib ), next if $lib =~ /[:>\]]$/;
+        push( @dirs, $lib ), next if -d $lib;
+        push( @libs, $1 ),   next if $lib =~ /^-l(.*)/;
+        push( @libs, $lib );
+    }
+    push( @dirs, split( ' ', $Config{'libpth'} ) );
+
+    # Now make sure we've got VMS-syntax absolute directory specs
+    # (We don't, however, check whether someone's hidden a relative
+    # path in a logical name.)
+    foreach my $dir ( @dirs ) {
+        unless ( -d $dir ) {
+            warn "Skipping nonexistent Directory $dir\n" if $verbose > 1;
+            $dir = '';
+            next;
+        }
+        warn "Resolving directory $dir\n" if $verbose;
+        if ( File::Spec->file_name_is_absolute( $dir ) ) {
+            $dir = VMS::Filespec::vmspath( $dir );
+        }
+        else {
+            $dir = $self->catdir( $cwd, $dir );
+        }
+    }
+    @dirs = grep { length( $_ ) } @dirs;
+    unshift( @dirs, '' );    # Check each $lib without additions first
+
+  LIB: foreach my $lib ( @libs ) {
+        if ( exists $libmap{$lib} ) {
+            next unless length $libmap{$lib};
+            $lib = $libmap{$lib};
+        }
+
+        my ( @variants, $cand );
+        my ( $ctype ) = '';
+
+        # If we don't have a file type, consider it a possibly abbreviated name and
+        # check for common variants.  We try these first to grab libraries before
+        # a like-named executable image (e.g. -lperl resolves to perlshr.exe
+        # before perl.exe).
+        if ( $lib !~ /\.[^:>\]]*$/ ) {
+            push( @variants, "${lib}shr", "${lib}rtl", "${lib}lib" );
+            push( @variants, "lib$lib" ) if $lib !~ /[:>\]]/;
+        }
+        push( @variants, $lib );
+        warn "Looking for $lib\n" if $verbose;
+        foreach my $variant ( @variants ) {
+            my ( $fullname, $name );
+
+            foreach my $dir ( @dirs ) {
+                my ( $type );
+
+                $name = "$dir$variant";
+                warn "\tChecking $name\n" if $verbose > 2;
+                $fullname = VMS::Filespec::rmsexpand( $name );
+                if ( defined $fullname and -f $fullname ) {
+
+                    # It's got its own suffix, so we'll have to figure out the type
+                    if    ( $fullname =~ /(?:$so|exe)$/i )      { $type = 'SHR'; }
+                    elsif ( $fullname =~ /(?:$lib_ext|olb)$/i ) { $type = 'OLB'; }
+                    elsif ( $fullname =~ /(?:$obj_ext|obj)$/i ) {
+                        warn "Warning (mostly harmless): " . "Plain object file $fullname found in library list\n";
+                        $type = 'OBJ';
+                    }
+                    else {
+                        warn "Warning (mostly harmless): " . "Unknown library type for $fullname; assuming shared\n";
+                        $type = 'SHR';
+                    }
+                }
+                elsif (-f ( $fullname = VMS::Filespec::rmsexpand( $name, $so ) )
+                    or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.exe' ) ) )
+                {
+                    $type = 'SHR';
+                    $name = $fullname unless $fullname =~ /exe;?\d*$/i;
+                }
+                elsif (
+                    not length( $ctype ) and    # If we've got a lib already,
+                                                # don't bother
+                    ( -f ( $fullname = VMS::Filespec::rmsexpand( $name, $lib_ext ) ) or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.olb' ) ) )
+                  )
+                {
+                    $type = 'OLB';
+                    $name = $fullname unless $fullname =~ /olb;?\d*$/i;
+                }
+                elsif (
+                    not length( $ctype ) and    # If we've got a lib already,
+                                                # don't bother
+                    ( -f ( $fullname = VMS::Filespec::rmsexpand( $name, $obj_ext ) ) or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.obj' ) ) )
+                  )
+                {
+                    warn "Warning (mostly harmless): " . "Plain object file $fullname found in library list\n";
+                    $type = 'OBJ';
+                    $name = $fullname unless $fullname =~ /obj;?\d*$/i;
+                }
+                if ( defined $type ) {
+                    $ctype = $type;
+                    $cand  = $name;
+                    last if $ctype eq 'SHR';
+                }
+            }
+            if ( $ctype ) {
+
+                push @{ $found{$ctype} }, $cand;
+                warn "\tFound as $cand (really $fullname), type $ctype\n"
+                  if $verbose > 1;
+                push @flibs, $name unless $libs_seen{$fullname}++;
+                next LIB;
+            }
+        }
+        warn "Warning (mostly harmless): " . "No library found for $lib\n";
+    }
+
+    push @fndlibs, @{ $found{OBJ} } if exists $found{OBJ};
+    push @fndlibs, map { "$_/Library" } @{ $found{OLB} } if exists $found{OLB};
+    push @fndlibs, map { "$_/Share" } @{ $found{SHR} }   if exists $found{SHR};
+    my $lib = join( ' ', @fndlibs );
+
+    $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
+    $ldlib =~ s/^\s+|\s+$//g;
+    warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
+    wantarray ? ( $lib, '', $ldlib, '', ( $give_libs ? \@flibs : () ) ) : $lib;
+}
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM.pm
new file mode 100644 (file)
index 0000000..3a6d1d8
--- /dev/null
@@ -0,0 +1,91 @@
+package ExtUtils::MM;
+
+use strict;
+use ExtUtils::MakeMaker::Config;
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+require ExtUtils::Liblist;
+require ExtUtils::MakeMaker;
+our @ISA = qw(ExtUtils::Liblist ExtUtils::MakeMaker);
+
+=head1 NAME
+
+ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
+
+=head1 SYNOPSIS
+
+  require ExtUtils::MM;
+  my $mm = MM->new(...);
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY>
+
+ExtUtils::MM is a subclass of ExtUtils::MakeMaker which automatically
+chooses the appropriate OS specific subclass for you
+(ie. ExtUils::MM_Unix, etc...).
+
+It also provides a convenient alias via the MM class (I didn't want
+MakeMaker modules outside of ExtUtils/).
+
+This class might turn out to be a temporary solution, but MM won't go
+away.
+
+=cut
+
+{
+    # Convenient alias.
+    package MM;
+    our @ISA = qw(ExtUtils::MM);
+    sub DESTROY {}
+}
+
+sub _is_win95 {
+    # miniperl might not have the Win32 functions available and we need
+    # to run in miniperl.
+    my $have_win32 = eval { require Win32 };
+    return $have_win32 && defined &Win32::IsWin95 ? Win32::IsWin95()
+                                                  : ! defined $ENV{SYSTEMROOT};
+}
+
+my %Is = ();
+$Is{VMS}    = $^O eq 'VMS';
+$Is{OS2}    = $^O eq 'os2';
+$Is{MacOS}  = $^O eq 'MacOS';
+if( $^O eq 'MSWin32' ) {
+    _is_win95() ? $Is{Win95} = 1 : $Is{Win32} = 1;
+}
+$Is{UWIN}   = $^O =~ /^uwin(-nt)?$/;
+$Is{Cygwin} = $^O eq 'cygwin';
+$Is{NW5}    = $Config{osname} eq 'NetWare';  # intentional
+$Is{BeOS}   = ($^O =~ /beos/i or $^O eq 'haiku');
+$Is{DOS}    = $^O eq 'dos';
+if( $Is{NW5} ) {
+    $^O = 'NetWare';
+    delete $Is{Win32};
+}
+$Is{VOS}    = $^O eq 'vos';
+$Is{QNX}    = $^O eq 'qnx';
+$Is{AIX}    = $^O eq 'aix';
+$Is{Darwin} = $^O eq 'darwin';
+
+$Is{Unix}   = !grep { $_ } values %Is;
+
+map { delete $Is{$_} unless $Is{$_} } keys %Is;
+_assert( keys %Is == 1 );
+my($OS) = keys %Is;
+
+
+my $class = "ExtUtils::MM_$OS";
+eval "require $class" unless $INC{"ExtUtils/MM_$OS.pm"}; ## no critic
+die $@ if $@;
+unshift @ISA, $class;
+
+
+sub _assert {
+    my $sanity = shift;
+    die sprintf "Assert failed at %s line %d\n", (caller)[1,2] unless $sanity;
+    return;
+}
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_AIX.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_AIX.pm
new file mode 100644 (file)
index 0000000..70eb653
--- /dev/null
@@ -0,0 +1,77 @@
+package ExtUtils::MM_AIX;
+
+use strict;
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+use ExtUtils::MakeMaker::Config;
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Unix);
+
+=head1 NAME
+
+ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+AIX.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 dlsyms
+
+Define DL_FUNCS and DL_VARS and write the *.exp files.
+
+=cut
+
+sub dlsyms {
+    my($self,%attribs) = @_;
+    return '' unless $self->needs_linking;
+    join "\n", $self->xs_dlsyms_iterator(\%attribs);
+}
+
+=head3 xs_dlsyms_ext
+
+On AIX, is C<.exp>.
+
+=cut
+
+sub xs_dlsyms_ext {
+    '.exp';
+}
+
+sub xs_dlsyms_arg {
+    my($self, $file) = @_;
+    return qq{-bE:${file}};
+}
+
+sub init_others {
+    my $self = shift;
+    $self->SUPER::init_others;
+    # perl "hints" add -bE:$(BASEEXT).exp to LDDLFLAGS. strip that out
+    # so right value can be added by xs_make_dynamic_lib to work for XSMULTI
+    $self->{LDDLFLAGS} ||= $Config{lddlflags};
+    $self->{LDDLFLAGS} =~ s#(\s*)\S*\Q$(BASEEXT)\E\S*(\s*)#$1$2#;
+    return;
+}
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Any.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Any.pm
new file mode 100644 (file)
index 0000000..651a8ad
--- /dev/null
@@ -0,0 +1,3098 @@
+package ExtUtils::MM_Any;
+
+use strict;
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+use Carp;
+use File::Spec;
+use File::Basename;
+BEGIN { our @ISA = qw(File::Spec); }
+
+# We need $Verbose
+use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562);
+
+use ExtUtils::MakeMaker::Config;
+
+
+# So we don't have to keep calling the methods over and over again,
+# we have these globals to cache the values.  Faster and shrtr.
+my $Curdir  = __PACKAGE__->curdir;
+#my $Updir   = __PACKAGE__->updir;
+
+my $METASPEC_URL = 'https://metacpan.org/pod/CPAN::Meta::Spec';
+my $METASPEC_V = 2;
+
+=head1 NAME
+
+ExtUtils::MM_Any - Platform-agnostic MM methods
+
+=head1 SYNOPSIS
+
+  FOR INTERNAL USE ONLY!
+
+  package ExtUtils::MM_SomeOS;
+
+  # Temporarily, you have to subclass both.  Put MM_Any first.
+  require ExtUtils::MM_Any;
+  require ExtUtils::MM_Unix;
+  @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix);
+
+=head1 DESCRIPTION
+
+B<FOR INTERNAL USE ONLY!>
+
+ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
+modules.  It contains methods which are either inherently
+cross-platform or are written in a cross-platform manner.
+
+Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix.  This is a
+temporary solution.
+
+B<THIS MAY BE TEMPORARY!>
+
+
+=head1 METHODS
+
+Any methods marked I<Abstract> must be implemented by subclasses.
+
+
+=head2 Cross-platform helper methods
+
+These are methods which help writing cross-platform code.
+
+
+
+=head3 os_flavor  I<Abstract>
+
+    my @os_flavor = $mm->os_flavor;
+
+@os_flavor is the style of operating system this is, usually
+corresponding to the MM_*.pm file we're using.
+
+The first element of @os_flavor is the major family (ie. Unix,
+Windows, VMS, OS/2, etc...) and the rest are sub families.
+
+Some examples:
+
+    Cygwin98       ('Unix',  'Cygwin', 'Cygwin9x')
+    Windows        ('Win32')
+    Win98          ('Win32', 'Win9x')
+    Linux          ('Unix',  'Linux')
+    MacOS X        ('Unix',  'Darwin', 'MacOS', 'MacOS X')
+    OS/2           ('OS/2')
+
+This is used to write code for styles of operating system.
+See os_flavor_is() for use.
+
+
+=head3 os_flavor_is
+
+    my $is_this_flavor = $mm->os_flavor_is($this_flavor);
+    my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors);
+
+Checks to see if the current operating system is one of the given flavors.
+
+This is useful for code like:
+
+    if( $mm->os_flavor_is('Unix') ) {
+        $out = `foo 2>&1`;
+    }
+    else {
+        $out = `foo`;
+    }
+
+=cut
+
+sub os_flavor_is {
+    my $self = shift;
+    my %flavors = map { ($_ => 1) } $self->os_flavor;
+    return (grep { $flavors{$_} } @_) ? 1 : 0;
+}
+
+
+=head3 can_load_xs
+
+    my $can_load_xs = $self->can_load_xs;
+
+Returns true if we have the ability to load XS.
+
+This is important because miniperl, used to build XS modules in the
+core, can not load XS.
+
+=cut
+
+sub can_load_xs {
+    return defined &DynaLoader::boot_DynaLoader ? 1 : 0;
+}
+
+
+=head3 can_run
+
+  use ExtUtils::MM;
+  my $runnable = MM->can_run($Config{make});
+
+If called in a scalar context it will return the full path to the binary
+you asked for if it was found, or C<undef> if it was not.
+
+If called in a list context, it will return a list of the full paths to instances
+of the binary where found in C<PATH>, or an empty list if it was not found.
+
+Copied from L<IPC::Cmd|IPC::Cmd/"$path = can_run( PROGRAM );">, but modified into
+a method (and removed C<$INSTANCES> capability).
+
+=cut
+
+sub can_run {
+    my ($self, $command) = @_;
+
+    # a lot of VMS executables have a symbol defined
+    # check those first
+    if ( $^O eq 'VMS' ) {
+        require VMS::DCLsym;
+        my $syms = VMS::DCLsym->new;
+        return $command if scalar $syms->getsym( uc $command );
+    }
+
+    my @possibles;
+
+    if( File::Spec->file_name_is_absolute($command) ) {
+        return $self->maybe_command($command);
+
+    } else {
+        for my $dir (
+            File::Spec->path,
+            File::Spec->curdir
+        ) {
+            next if ! $dir || ! -d $dir;
+            my $abs = File::Spec->catfile($self->os_flavor_is('Win32') ? Win32::GetShortPathName( $dir ) : $dir, $command);
+            push @possibles, $abs if $abs = $self->maybe_command($abs);
+        }
+    }
+    return @possibles if wantarray;
+    return shift @possibles;
+}
+
+
+=head3 can_redirect_error
+
+  $useredirect = MM->can_redirect_error;
+
+True if on an OS where qx operator (or backticks) can redirect C<STDERR>
+onto C<STDOUT>.
+
+=cut
+
+sub can_redirect_error {
+  my $self = shift;
+  $self->os_flavor_is('Unix')
+      or ($self->os_flavor_is('Win32') and !$self->os_flavor_is('Win9x'))
+      or $self->os_flavor_is('OS/2')
+}
+
+
+=head3 is_make_type
+
+    my $is_dmake = $self->is_make_type('dmake');
+
+Returns true if C<<$self->make>> is the given type; possibilities are:
+
+  gmake    GNU make
+  dmake
+  nmake
+  bsdmake  BSD pmake-derived
+
+=cut
+
+my %maketype2true;
+# undocumented - so t/cd.t can still do its thing
+sub _clear_maketype_cache { %maketype2true = () }
+
+sub is_make_type {
+    my($self, $type) = @_;
+    return $maketype2true{$type} if defined $maketype2true{$type};
+    (undef, undef, my $make_basename) = $self->splitpath($self->make);
+    return $maketype2true{$type} = 1
+        if $make_basename =~ /\b$type\b/i; # executable's filename
+    return $maketype2true{$type} = 0
+        if $make_basename =~ /\b[gdn]make\b/i; # Never fall through for dmake/nmake/gmake
+    # now have to run with "-v" and guess
+    my $redirect = $self->can_redirect_error ? '2>&1' : '';
+    my $make = $self->make || $self->{MAKE};
+    my $minus_v = `"$make" -v $redirect`;
+    return $maketype2true{$type} = 1
+        if $type eq 'gmake' and $minus_v =~ /GNU make/i;
+    return $maketype2true{$type} = 1
+        if $type eq 'bsdmake'
+      and $minus_v =~ /^usage: make \[-BeikNnqrstWwX\]/im;
+    $maketype2true{$type} = 0; # it wasn't whatever you asked
+}
+
+
+=head3 can_dep_space
+
+    my $can_dep_space = $self->can_dep_space;
+
+Returns true if C<make> can handle (probably by quoting)
+dependencies that contain a space. Currently known true for GNU make,
+false for BSD pmake derivative.
+
+=cut
+
+my $cached_dep_space;
+sub can_dep_space {
+    my $self = shift;
+    return $cached_dep_space if defined $cached_dep_space;
+    return $cached_dep_space = 1 if $self->is_make_type('gmake');
+    return $cached_dep_space = 0 if $self->is_make_type('dmake'); # only on W32
+    return $cached_dep_space = 0 if $self->is_make_type('bsdmake');
+    return $cached_dep_space = 0; # assume no
+}
+
+
+=head3 quote_dep
+
+  $text = $mm->quote_dep($text);
+
+Method that protects Makefile single-value constants (mainly filenames),
+so that make will still treat them as single values even if they
+inconveniently have spaces in. If the make program being used cannot
+achieve such protection and the given text would need it, throws an
+exception.
+
+=cut
+
+sub quote_dep {
+    my ($self, $arg) = @_;
+    die <<EOF if $arg =~ / / and not $self->can_dep_space;
+Tried to use make dependency with space for make that can't:
+  '$arg'
+EOF
+    $arg =~ s/( )/\\$1/g; # how GNU make does it
+    return $arg;
+}
+
+
+=head3 split_command
+
+    my @cmds = $MM->split_command($cmd, @args);
+
+Most OS have a maximum command length they can execute at once.  Large
+modules can easily generate commands well past that limit.  Its
+necessary to split long commands up into a series of shorter commands.
+
+C<split_command> will return a series of @cmds each processing part of
+the args.  Collectively they will process all the arguments.  Each
+individual line in @cmds will not be longer than the
+$self->max_exec_len being careful to take into account macro expansion.
+
+$cmd should include any switches and repeated initial arguments.
+
+If no @args are given, no @cmds will be returned.
+
+Pairs of arguments will always be preserved in a single command, this
+is a heuristic for things like pm_to_blib and pod2man which work on
+pairs of arguments.  This makes things like this safe:
+
+    $self->split_command($cmd, %pod2man);
+
+
+=cut
+
+sub split_command {
+    my($self, $cmd, @args) = @_;
+
+    my @cmds = ();
+    return(@cmds) unless @args;
+
+    # If the command was given as a here-doc, there's probably a trailing
+    # newline.
+    chomp $cmd;
+
+    # set aside 30% for macro expansion.
+    my $len_left = int($self->max_exec_len * 0.70);
+    $len_left -= length $self->_expand_macros($cmd);
+
+    do {
+        my $arg_str = '';
+        my @next_args;
+        while( @next_args = splice(@args, 0, 2) ) {
+            # Two at a time to preserve pairs.
+            my $next_arg_str = "\t  ". join ' ', @next_args, "\n";
+
+            if( !length $arg_str ) {
+                $arg_str .= $next_arg_str
+            }
+            elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
+                unshift @args, @next_args;
+                last;
+            }
+            else {
+                $arg_str .= $next_arg_str;
+            }
+        }
+        chop $arg_str;
+
+        push @cmds, $self->escape_newlines("$cmd \n$arg_str");
+    } while @args;
+
+    return @cmds;
+}
+
+
+sub _expand_macros {
+    my($self, $cmd) = @_;
+
+    $cmd =~ s{\$\((\w+)\)}{
+        defined $self->{$1} ? $self->{$1} : "\$($1)"
+    }e;
+    return $cmd;
+}
+
+
+=head3 make_type
+
+Returns a suitable string describing the type of makefile being written.
+
+=cut
+
+# override if this isn't suitable!
+sub make_type { return 'Unix-style'; }
+
+
+=head3 stashmeta
+
+    my @recipelines = $MM->stashmeta($text, $file);
+
+Generates a set of C<@recipelines> which will result in the literal
+C<$text> ending up in literal C<$file> when the recipe is executed. Call
+it once, with all the text you want in C<$file>. Make macros will not
+be expanded, so the locations will be fixed at configure-time, not
+at build-time.
+
+=cut
+
+sub stashmeta {
+    my($self, $text, $file) = @_;
+    $self->echo($text, $file, { allow_variables => 0, append => 0 });
+}
+
+
+=head3 echo
+
+    my @commands = $MM->echo($text);
+    my @commands = $MM->echo($text, $file);
+    my @commands = $MM->echo($text, $file, \%opts);
+
+Generates a set of @commands which print the $text to a $file.
+
+If $file is not given, output goes to STDOUT.
+
+If $opts{append} is true the $file will be appended to rather than
+overwritten.  Default is to overwrite.
+
+If $opts{allow_variables} is true, make variables of the form
+C<$(...)> will not be escaped.  Other C<$> will.  Default is to escape
+all C<$>.
+
+Example of use:
+
+    my $make = join '', map "\t$_\n", $MM->echo($text, $file);
+
+=cut
+
+sub echo {
+    my($self, $text, $file, $opts) = @_;
+
+    # Compatibility with old options
+    if( !ref $opts ) {
+        my $append = $opts;
+        $opts = { append => $append || 0 };
+    }
+    $opts->{allow_variables} = 0 unless defined $opts->{allow_variables};
+
+    my $ql_opts = { allow_variables => $opts->{allow_variables} };
+    my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_, $ql_opts) }
+               split /\n/, $text;
+    if( $file ) {
+        my $redirect = $opts->{append} ? '>>' : '>';
+        $cmds[0] .= " $redirect $file";
+        $_ .= " >> $file" foreach @cmds[1..$#cmds];
+    }
+
+    return @cmds;
+}
+
+
+=head3 wraplist
+
+  my $args = $mm->wraplist(@list);
+
+Takes an array of items and turns them into a well-formatted list of
+arguments.  In most cases this is simply something like:
+
+    FOO \
+    BAR \
+    BAZ
+
+=cut
+
+sub wraplist {
+    my $self = shift;
+    return join " \\\n\t", @_;
+}
+
+
+=head3 maketext_filter
+
+    my $filter_make_text = $mm->maketext_filter($make_text);
+
+The text of the Makefile is run through this method before writing to
+disk.  It allows systems a chance to make portability fixes to the
+Makefile.
+
+By default it does nothing.
+
+This method is protected and not intended to be called outside of
+MakeMaker.
+
+=cut
+
+sub maketext_filter { return $_[1] }
+
+
+=head3 cd  I<Abstract>
+
+  my $subdir_cmd = $MM->cd($subdir, @cmds);
+
+This will generate a make fragment which runs the @cmds in the given
+$dir.  The rough equivalent to this, except cross platform.
+
+  cd $subdir && $cmd
+
+Currently $dir can only go down one level.  "foo" is fine.  "foo/bar" is
+not.  "../foo" is right out.
+
+The resulting $subdir_cmd has no leading tab nor trailing newline.  This
+makes it easier to embed in a make string.  For example.
+
+      my $make = sprintf <<'CODE', $subdir_cmd;
+  foo :
+      $(ECHO) what
+      %s
+      $(ECHO) mouche
+  CODE
+
+
+=head3 oneliner  I<Abstract>
+
+  my $oneliner = $MM->oneliner($perl_code);
+  my $oneliner = $MM->oneliner($perl_code, \@switches);
+
+This will generate a perl one-liner safe for the particular platform
+you're on based on the given $perl_code and @switches (a -e is
+assumed) suitable for using in a make target.  It will use the proper
+shell quoting and escapes.
+
+$(PERLRUN) will be used as perl.
+
+Any newlines in $perl_code will be escaped.  Leading and trailing
+newlines will be stripped.  Makes this idiom much easier:
+
+    my $code = $MM->oneliner(<<'CODE', [...switches...]);
+some code here
+another line here
+CODE
+
+Usage might be something like:
+
+    # an echo emulation
+    $oneliner = $MM->oneliner('print "Foo\n"');
+    $make = '$oneliner > somefile';
+
+Dollar signs in the $perl_code will be protected from make using the
+C<quote_literal> method, unless they are recognised as being a make
+variable, C<$(varname)>, in which case they will be left for make
+to expand. Remember to quote make macros else it might be used as a
+bareword. For example:
+
+    # Assign the value of the $(VERSION_FROM) make macro to $vf.
+    $oneliner = $MM->oneliner('$vf = "$(VERSION_FROM)"');
+
+Its currently very simple and may be expanded sometime in the figure
+to include more flexible code and switches.
+
+
+=head3 quote_literal  I<Abstract>
+
+    my $safe_text = $MM->quote_literal($text);
+    my $safe_text = $MM->quote_literal($text, \%options);
+
+This will quote $text so it is interpreted literally in the shell.
+
+For example, on Unix this would escape any single-quotes in $text and
+put single-quotes around the whole thing.
+
+If $options{allow_variables} is true it will leave C<'$(FOO)'> make
+variables untouched.  If false they will be escaped like any other
+C<$>.  Defaults to true.
+
+=head3 escape_dollarsigns
+
+    my $escaped_text = $MM->escape_dollarsigns($text);
+
+Escapes stray C<$> so they are not interpreted as make variables.
+
+It lets by C<$(...)>.
+
+=cut
+
+sub escape_dollarsigns {
+    my($self, $text) = @_;
+
+    # Escape dollar signs which are not starting a variable
+    $text =~ s{\$ (?!\() }{\$\$}gx;
+
+    return $text;
+}
+
+
+=head3 escape_all_dollarsigns
+
+    my $escaped_text = $MM->escape_all_dollarsigns($text);
+
+Escapes all C<$> so they are not interpreted as make variables.
+
+=cut
+
+sub escape_all_dollarsigns {
+    my($self, $text) = @_;
+
+    # Escape dollar signs
+    $text =~ s{\$}{\$\$}gx;
+
+    return $text;
+}
+
+
+=head3 escape_newlines  I<Abstract>
+
+    my $escaped_text = $MM->escape_newlines($text);
+
+Shell escapes newlines in $text.
+
+
+=head3 max_exec_len  I<Abstract>
+
+    my $max_exec_len = $MM->max_exec_len;
+
+Calculates the maximum command size the OS can exec.  Effectively,
+this is the max size of a shell command line.
+
+=for _private
+$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
+
+
+=head3 make
+
+    my $make = $MM->make;
+
+Returns the make variant we're generating the Makefile for.  This attempts
+to do some normalization on the information from %Config or the user.
+
+=cut
+
+sub make {
+    my $self = shift;
+
+    my $make = lc $self->{MAKE};
+
+    # Truncate anything like foomake6 to just foomake.
+    $make =~ s/^(\w+make).*/$1/;
+
+    # Turn gnumake into gmake.
+    $make =~ s/^gnu/g/;
+
+    return $make;
+}
+
+
+=head2 Targets
+
+These are methods which produce make targets.
+
+
+=head3 all_target
+
+Generate the default target 'all'.
+
+=cut
+
+sub all_target {
+    my $self = shift;
+
+    return <<'MAKE_EXT';
+all :: pure_all
+    $(NOECHO) $(NOOP)
+MAKE_EXT
+
+}
+
+
+=head3 blibdirs_target
+
+    my $make_frag = $mm->blibdirs_target;
+
+Creates the blibdirs target which creates all the directories we use
+in blib/.
+
+The blibdirs.ts target is deprecated.  Depend on blibdirs instead.
+
+
+=cut
+
+sub _xs_list_basenames {
+    my ($self) = @_;
+    map { (my $b = $_) =~ s/\.xs$//; $b } sort keys %{ $self->{XS} };
+}
+
+sub blibdirs_target {
+    my $self = shift;
+
+    my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib
+                                           autodir archautodir
+                                           bin script
+                                           man1dir man3dir
+                                          );
+    if ($self->{XSMULTI}) {
+        for my $ext ($self->_xs_list_basenames) {
+            my ($v, $d, $f) = File::Spec->splitpath($ext);
+            my @d = File::Spec->splitdir($d);
+            shift @d if $d[0] eq 'lib';
+            push @dirs, $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+    }
+    }
+
+    my @exists = map { $_.'$(DFSEP).exists' } @dirs;
+
+    my $make = sprintf <<'MAKE', join(' ', @exists);
+blibdirs : %s
+    $(NOECHO) $(NOOP)
+
+# Backwards compat with 6.18 through 6.25
+blibdirs.ts : blibdirs
+    $(NOECHO) $(NOOP)
+
+MAKE
+
+    $make .= $self->dir_target(@dirs);
+
+    return $make;
+}
+
+
+=head3 clean (o)
+
+Defines the clean target.
+
+=cut
+
+sub clean {
+# --- Cleanup and Distribution Sections ---
+
+    my($self, %attribs) = @_;
+    my @m;
+    push(@m, '
+# Delete temporary files but do not touch installed files. We don\'t delete
+# the Makefile here so a later make realclean still has a makefile to use.
+
+clean :: clean_subdirs
+');
+
+    my @files = sort values %{$self->{XS}}; # .c files from *.xs files
+    push @files, map {
+    my $file = $_;
+    map { $file.$_ } $self->{OBJ_EXT}, qw(.def _def.old .bs .bso .exp .base);
+    } $self->_xs_list_basenames;
+    my @dirs  = qw(blib);
+
+    # Normally these are all under blib but they might have been
+    # redefined.
+    # XXX normally this would be a good idea, but the Perl core sets
+    # INST_LIB = ../../lib rather than actually installing the files.
+    # So a "make clean" in an ext/ directory would blow away lib.
+    # Until the core is adjusted let's leave this out.
+#     push @dirs, qw($(INST_ARCHLIB) $(INST_LIB)
+#                    $(INST_BIN) $(INST_SCRIPT)
+#                    $(INST_MAN1DIR) $(INST_MAN3DIR)
+#                    $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR)
+#                    $(INST_STATIC) $(INST_DYNAMIC)
+#                 );
+
+
+    if( $attribs{FILES} ) {
+        # Use @dirs because we don't know what's in here.
+        push @dirs, ref $attribs{FILES}                ?
+                        @{$attribs{FILES}}             :
+                        split /\s+/, $attribs{FILES}   ;
+    }
+
+    push(@files, qw[$(MAKE_APERL_FILE)
+                    MYMETA.json MYMETA.yml perlmain.c tmon.out mon.out so_locations
+                    blibdirs.ts pm_to_blib pm_to_blib.ts
+                    *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
+                    $(BOOTSTRAP) $(BASEEXT).bso
+                    $(BASEEXT).def lib$(BASEEXT).def
+                    $(BASEEXT).exp $(BASEEXT).x
+                   ]);
+
+    push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
+    push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld'));
+
+    # core files
+    if ($^O eq 'vos') {
+        push(@files, qw[perl*.kp]);
+    }
+    else {
+        push(@files, qw[core core.*perl.*.? *perl.core]);
+    }
+
+    push(@files, map { "core." . "[0-9]"x$_ } (1..5));
+
+    # OS specific things to clean up.  Use @dirs since we don't know
+    # what might be in here.
+    push @dirs, $self->extra_clean_files;
+
+    # Occasionally files are repeated several times from different sources
+    { my(%f) = map { ($_ => 1) } @files; @files = sort keys %f; }
+    { my(%d) = map { ($_ => 1) } @dirs;  @dirs  = sort keys %d; }
+
+    push @m, map "\t$_\n", $self->split_command('- $(RM_F)',  @files);
+    push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs);
+
+    # Leave Makefile.old around for realclean
+    push @m, <<'MAKE';
+      $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+    - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
+MAKE
+
+    push(@m, "\t$attribs{POSTOP}\n")   if $attribs{POSTOP};
+
+    join("", @m);
+}
+
+
+=head3 clean_subdirs_target
+
+  my $make_frag = $MM->clean_subdirs_target;
+
+Returns the clean_subdirs target.  This is used by the clean target to
+call clean on any subdirectories which contain Makefiles.
+
+=cut
+
+sub clean_subdirs_target {
+    my($self) = shift;
+
+    # No subdirectories, no cleaning.
+    return <<'NOOP_FRAG' unless @{$self->{DIR}};
+clean_subdirs :
+    $(NOECHO) $(NOOP)
+NOOP_FRAG
+
+
+    my $clean = "clean_subdirs :\n";
+
+    for my $dir (@{$self->{DIR}}) {
+        my $subclean = $self->oneliner(sprintf <<'CODE', $dir);
+exit 0 unless chdir '%s';  system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)';
+CODE
+
+        $clean .= "\t$subclean\n";
+    }
+
+    return $clean;
+}
+
+
+=head3 dir_target
+
+    my $make_frag = $mm->dir_target(@directories);
+
+Generates targets to create the specified directories and set its
+permission to PERM_DIR.
+
+Because depending on a directory to just ensure it exists doesn't work
+too well (the modified time changes too often) dir_target() creates a
+.exists file in the created directory.  It is this you should depend on.
+For portability purposes you should use the $(DIRFILESEP) macro rather
+than a '/' to separate the directory from the file.
+
+    yourdirectory$(DIRFILESEP).exists
+
+=cut
+
+sub dir_target {
+    my($self, @dirs) = @_;
+
+    my $make = '';
+    foreach my $dir (@dirs) {
+        $make .= sprintf <<'MAKE', ($dir) x 4;
+%s$(DFSEP).exists :: Makefile.PL
+    $(NOECHO) $(MKPATH) %s
+    $(NOECHO) $(CHMOD) $(PERM_DIR) %s
+    $(NOECHO) $(TOUCH) %s$(DFSEP).exists
+
+MAKE
+
+    }
+
+    return $make;
+}
+
+
+=head3 distdir
+
+Defines the scratch directory target that will hold the distribution
+before tar-ing (or shar-ing).
+
+=cut
+
+# For backwards compatibility.
+*dist_dir = *distdir;
+
+sub distdir {
+    my($self) = shift;
+
+    my $meta_target = $self->{NO_META} ? '' : 'distmeta';
+    my $sign_target = !$self->{SIGN}   ? '' : 'distsignature';
+
+    return sprintf <<'MAKE_FRAG', $meta_target, $sign_target;
+create_distdir :
+    $(RM_RF) $(DISTVNAME)
+    $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
+        -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
+
+distdir : create_distdir %s %s
+    $(NOECHO) $(NOOP)
+
+MAKE_FRAG
+
+}
+
+
+=head3 dist_test
+
+Defines a target that produces the distribution in the
+scratch directory, and runs 'perl Makefile.PL; make ;make test' in that
+subdirectory.
+
+=cut
+
+sub dist_test {
+    my($self) = shift;
+
+    my $mpl_args = join " ", map qq["$_"], @ARGV;
+
+    my $test = $self->cd('$(DISTVNAME)',
+                         '$(ABSPERLRUN) Makefile.PL '.$mpl_args,
+                         '$(MAKE) $(PASTHRU)',
+                         '$(MAKE) test $(PASTHRU)'
+                        );
+
+    return sprintf <<'MAKE_FRAG', $test;
+disttest : distdir
+    %s
+
+MAKE_FRAG
+
+
+}
+
+
+=head3 xs_dlsyms_arg
+
+Returns command-line arg(s) to linker for file listing dlsyms to export.
+Defaults to returning empty string, can be overridden by e.g. AIX.
+
+=cut
+
+sub xs_dlsyms_arg {
+    return '';
+}
+
+=head3 xs_dlsyms_ext
+
+Returns file-extension for C<xs_make_dlsyms> method's output file,
+including any "." character.
+
+=cut
+
+sub xs_dlsyms_ext {
+    die "Pure virtual method";
+}
+
+=head3 xs_dlsyms_extra
+
+Returns any extra text to be prepended to the C<$extra> argument of
+C<xs_make_dlsyms>.
+
+=cut
+
+sub xs_dlsyms_extra {
+    '';
+}
+
+=head3 xs_dlsyms_iterator
+
+Iterates over necessary shared objects, calling C<xs_make_dlsyms> method
+for each with appropriate arguments.
+
+=cut
+
+sub xs_dlsyms_iterator {
+    my ($self, $attribs) = @_;
+    if ($self->{XSMULTI}) {
+        my @m;
+        for my $ext ($self->_xs_list_basenames) {
+            my @parts = File::Spec->splitdir($ext);
+            shift @parts if $parts[0] eq 'lib';
+            my $name = join '::', @parts;
+            push @m, $self->xs_make_dlsyms(
+                $attribs,
+                $ext . $self->xs_dlsyms_ext,
+                "$ext.xs",
+                $name,
+                $parts[-1],
+                {}, [], {}, [],
+                $self->xs_dlsyms_extra . q!, 'FILE' => ! . neatvalue($ext),
+            );
+        }
+        return join "\n", @m;
+    } else {
+        return $self->xs_make_dlsyms(
+            $attribs,
+            $self->{BASEEXT} . $self->xs_dlsyms_ext,
+            'Makefile.PL',
+            $self->{NAME},
+            $self->{DLBASE},
+            $attribs->{DL_FUNCS} || $self->{DL_FUNCS} || {},
+            $attribs->{FUNCLIST} || $self->{FUNCLIST} || [],
+            $attribs->{IMPORTS} || $self->{IMPORTS} || {},
+            $attribs->{DL_VARS} || $self->{DL_VARS} || [],
+            $self->xs_dlsyms_extra,
+        );
+    }
+}
+
+=head3 xs_make_dlsyms
+
+    $self->xs_make_dlsyms(
+        \%attribs, # hashref from %attribs in caller
+        "$self->{BASEEXT}.def", # output file for Makefile target
+        'Makefile.PL', # dependency
+        $self->{NAME}, # shared object's "name"
+        $self->{DLBASE}, # last ::-separated part of name
+        $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}, # various params
+        $attribs{FUNCLIST} || $self->{FUNCLIST} || [],
+        $attribs{IMPORTS} || $self->{IMPORTS} || {},
+        $attribs{DL_VARS} || $self->{DL_VARS} || [],
+        # optional extra param that will be added as param to Mksymlists
+    );
+
+Utility method that returns Makefile snippet to call C<Mksymlists>.
+
+=cut
+
+sub xs_make_dlsyms {
+    my ($self, $attribs, $target, $dep, $name, $dlbase, $funcs, $funclist, $imports, $vars, $extra) = @_;
+    my @m = (
+     "\n$target: $dep\n",
+     q!    $(PERLRUN) -MExtUtils::Mksymlists \\
+     -e "Mksymlists('NAME'=>\"!, $name,
+     q!\", 'DLBASE' => '!,$dlbase,
+     # The above two lines quoted differently to work around
+     # a bug in the 4DOS/4NT command line interpreter.  The visible
+     # result of the bug was files named q('extension_name',) *with the
+     # single quotes and the comma* in the extension build directories.
+     q!', 'DL_FUNCS' => !,neatvalue($funcs),
+     q!, 'FUNCLIST' => !,neatvalue($funclist),
+     q!, 'IMPORTS' => !,neatvalue($imports),
+     q!, 'DL_VARS' => !, neatvalue($vars)
+    );
+    push @m, $extra if defined $extra;
+    push @m, qq!);"\n!;
+    join '', @m;
+}
+
+=head3 dynamic (o)
+
+Defines the dynamic target.
+
+=cut
+
+sub dynamic {
+# --- Dynamic Loading Sections ---
+
+    my($self) = shift;
+    '
+dynamic :: $(FIRST_MAKEFILE) config $(INST_BOOT) $(INST_DYNAMIC)
+    $(NOECHO) $(NOOP)
+';
+}
+
+
+=head3 makemakerdflt_target
+
+  my $make_frag = $mm->makemakerdflt_target
+
+Returns a make fragment with the makemakerdeflt_target specified.
+This target is the first target in the Makefile, is the default target
+and simply points off to 'all' just in case any make variant gets
+confused or something gets snuck in before the real 'all' target.
+
+=cut
+
+sub makemakerdflt_target {
+    return <<'MAKE_FRAG';
+makemakerdflt : all
+    $(NOECHO) $(NOOP)
+MAKE_FRAG
+
+}
+
+
+=head3 manifypods_target
+
+  my $manifypods_target = $self->manifypods_target;
+
+Generates the manifypods target.  This target generates man pages from
+all POD files in MAN1PODS and MAN3PODS.
+
+=cut
+
+sub manifypods_target {
+    my($self) = shift;
+
+    my $man1pods      = '';
+    my $man3pods      = '';
+    my $dependencies  = '';
+
+    # populate manXpods & dependencies:
+    foreach my $name (sort keys %{$self->{MAN1PODS}}, sort keys %{$self->{MAN3PODS}}) {
+        $dependencies .= " \\\n\t$name";
+    }
+
+    my $manify = <<END;
+manifypods : pure_all config $dependencies
+END
+
+    my @man_cmds;
+    foreach my $section (qw(1 3)) {
+        my $pods = $self->{"MAN${section}PODS"};
+        my $p2m = sprintf <<'CMD', $section, $] > 5.008 ? " -u" : "";
+    $(NOECHO) $(POD2MAN) --section=%s --perm_rw=$(PERM_RW)%s
+CMD
+        push @man_cmds, $self->split_command($p2m, map {($_,$pods->{$_})} sort keys %$pods);
+    }
+
+    $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
+    $manify .= join '', map { "$_\n" } @man_cmds;
+
+    return $manify;
+}
+
+{
+    my $has_cpan_meta;
+    sub _has_cpan_meta {
+        return $has_cpan_meta if defined $has_cpan_meta;
+        return $has_cpan_meta = !!eval {
+            require CPAN::Meta;
+            CPAN::Meta->VERSION(2.112150);
+            1;
+        };
+    }
+}
+
+=head3 metafile_target
+
+    my $target = $mm->metafile_target;
+
+Generate the metafile target.
+
+Writes the file META.yml (YAML encoded meta-data) and META.json
+(JSON encoded meta-data) about the module in the distdir.
+The format follows Module::Build's as closely as possible.
+
+=cut
+
+sub metafile_target {
+    my $self = shift;
+    return <<'MAKE_FRAG' if $self->{NO_META} or ! _has_cpan_meta();
+metafile :
+    $(NOECHO) $(NOOP)
+MAKE_FRAG
+
+    my $metadata   = $self->metafile_data(
+        $self->{META_ADD}   || {},
+        $self->{META_MERGE} || {},
+    );
+
+    my $meta = $self->_fix_metadata_before_conversion( $metadata );
+
+    my @write_metayml = $self->stashmeta(
+      $meta->as_string({version => "1.4"}), 'META_new.yml'
+    );
+    my @write_metajson = $self->stashmeta(
+      $meta->as_string({version => "2.0"}), 'META_new.json'
+    );
+
+    my $metayml = join("\n\t", @write_metayml);
+    my $metajson = join("\n\t", @write_metajson);
+    return sprintf <<'MAKE_FRAG', $metayml, $metajson;
+metafile : create_distdir
+    $(NOECHO) $(ECHO) Generating META.yml
+    %s
+    -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
+    $(NOECHO) $(ECHO) Generating META.json
+    %s
+    -$(NOECHO) $(MV) META_new.json $(DISTVNAME)/META.json
+MAKE_FRAG
+
+}
+
+=begin private
+
+=head3 _fix_metadata_before_conversion
+
+    $mm->_fix_metadata_before_conversion( \%metadata );
+
+Fixes errors in the metadata before it's handed off to CPAN::Meta for
+conversion. This hopefully results in something that can be used further
+on, no guarantee is made though.
+
+=end private
+
+=cut
+
+sub _fix_metadata_before_conversion {
+    my ( $self, $metadata ) = @_;
+
+    # we should never be called unless this already passed but
+    # prefer to be defensive in case somebody else calls this
+
+    return unless _has_cpan_meta;
+
+    my $bad_version = $metadata->{version} &&
+                      !CPAN::Meta::Validator->new->version( 'version', $metadata->{version} );
+    # just delete all invalid versions
+    if( $bad_version ) {
+        warn "Can't parse version '$metadata->{version}'\n";
+        $metadata->{version} = '';
+    }
+
+    my $validator2 = CPAN::Meta::Validator->new( $metadata );
+    my @errors;
+    push @errors, $validator2->errors if !$validator2->is_valid;
+    my $validator14 = CPAN::Meta::Validator->new(
+        {
+            %$metadata,
+            'meta-spec' => { version => 1.4 },
+        }
+    );
+    push @errors, $validator14->errors if !$validator14->is_valid;
+    # fix non-camelcase custom resource keys (only other trick we know)
+    for my $error ( @errors ) {
+        my ( $key ) = ( $error =~ /Custom resource '(.*)' must be in CamelCase./ );
+        next if !$key;
+
+        # first try to remove all non-alphabetic chars
+        ( my $new_key = $key ) =~ s/[^_a-zA-Z]//g;
+
+        # if that doesn't work, uppercase first one
+        $new_key = ucfirst $new_key if !$validator14->custom_1( $new_key );
+
+        # copy to new key if that worked
+        $metadata->{resources}{$new_key} = $metadata->{resources}{$key}
+          if $validator14->custom_1( $new_key );
+
+        # and delete old one in any case
+        delete $metadata->{resources}{$key};
+    }
+
+    # paper over validation issues, but still complain, necessary because
+    # there's no guarantee that the above will fix ALL errors
+    my $meta = eval { CPAN::Meta->create( $metadata, { lazy_validation => 1 } ) };
+    warn $@ if $@ and
+               $@ !~ /encountered CODE.*, but JSON can only represent references to arrays or hashes/;
+
+    # use the original metadata straight if the conversion failed
+    # or if it can't be stringified.
+    if( !$meta                                                  ||
+        !eval { $meta->as_string( { version => $METASPEC_V } ) }      ||
+        !eval { $meta->as_string }
+    ) {
+        $meta = bless $metadata, 'CPAN::Meta';
+    }
+
+    my $now_license = $meta->as_struct({ version => 2 })->{license};
+    if ($self->{LICENSE} and $self->{LICENSE} ne 'unknown' and
+        @{$now_license} == 1 and $now_license->[0] eq 'unknown'
+    ) {
+        warn "Invalid LICENSE value '$self->{LICENSE}' ignored\n";
+    }
+
+    $meta;
+}
+
+
+=begin private
+
+=head3 _sort_pairs
+
+    my @pairs = _sort_pairs($sort_sub, \%hash);
+
+Sorts the pairs of a hash based on keys ordered according
+to C<$sort_sub>.
+
+=end private
+
+=cut
+
+sub _sort_pairs {
+    my $sort  = shift;
+    my $pairs = shift;
+    return map  { $_ => $pairs->{$_} }
+           sort $sort
+           keys %$pairs;
+}
+
+
+# Taken from Module::Build::Base
+sub _hash_merge {
+    my ($self, $h, $k, $v) = @_;
+    if (ref $h->{$k} eq 'ARRAY') {
+        push @{$h->{$k}}, ref $v ? @$v : $v;
+    } elsif (ref $h->{$k} eq 'HASH') {
+        $self->_hash_merge($h->{$k}, $_, $v->{$_}) foreach keys %$v;
+    } else {
+        $h->{$k} = $v;
+    }
+}
+
+
+=head3 metafile_data
+
+    my $metadata_hashref = $mm->metafile_data(\%meta_add, \%meta_merge);
+
+Returns the data which MakeMaker turns into the META.yml file 
+and the META.json file. It is always in version 2.0 of the format.
+
+Values of %meta_add will overwrite any existing metadata in those
+keys.  %meta_merge will be merged with them.
+
+=cut
+
+sub metafile_data {
+    my $self = shift;
+    my($meta_add, $meta_merge) = @_;
+
+    $meta_add ||= {};
+    $meta_merge ||= {};
+
+    my $version = _normalize_version($self->{VERSION});
+    my $release_status = ($version =~ /_/) ? 'unstable' : 'stable';
+    my %meta = (
+        # required
+        abstract     => $self->{ABSTRACT} || 'unknown',
+        author       => defined($self->{AUTHOR}) ? $self->{AUTHOR} : ['unknown'],
+        dynamic_config => 1,
+        generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
+        license      => [ $self->{LICENSE} || 'unknown' ],
+        'meta-spec'  => {
+            url         => $METASPEC_URL,
+            version     => $METASPEC_V,
+        },
+        name         => $self->{DISTNAME},
+        release_status => $release_status,
+        version      => $version,
+
+        # optional
+        no_index     => { directory => [qw(t inc)] },
+    );
+    $self->_add_requirements_to_meta(\%meta);
+
+    if (!eval { require JSON::PP; require CPAN::Meta::Converter; CPAN::Meta::Converter->VERSION(2.141170) }) {
+      return \%meta;
+    }
+
+    # needs to be based on the original version
+    my $v1_add = _metaspec_version($meta_add) !~ /^2/;
+
+    my ($add_v, $merge_v) = map _metaspec_version($_), $meta_add, $meta_merge;
+    for my $frag ($meta_add, $meta_merge) {
+        my $def_v = $frag == $meta_add ? $merge_v : $add_v;
+        $frag = CPAN::Meta::Converter->new($frag, default_version => $def_v)->upgrade_fragment;
+    }
+
+    # if we upgraded a 1.x _ADD fragment, we gave it a prereqs key that
+    # will override all prereqs, which is more than the user asked for;
+    # instead, we'll go inside the prereqs and override all those
+    while( my($key, $val) = each %$meta_add ) {
+        if ($v1_add and $key eq 'prereqs') {
+            $meta{$key}{$_} = $val->{$_} for keys %$val;
+        } elsif ($key ne 'meta-spec') {
+            $meta{$key} = $val;
+        }
+    }
+
+    while( my($key, $val) = each %$meta_merge ) {
+        next if $key eq 'meta-spec';
+        $self->_hash_merge(\%meta, $key, $val);
+    }
+
+    return \%meta;
+}
+
+
+=begin private
+
+=cut
+
+sub _add_requirements_to_meta {
+    my ( $self, $meta ) = @_;
+    # Check the original args so we can tell between the user setting it
+    # to an empty hash and it just being initialized.
+    $meta->{prereqs}{configure}{requires} = $self->{ARGS}{CONFIGURE_REQUIRES}
+        ? $self->{CONFIGURE_REQUIRES}
+        : { 'ExtUtils::MakeMaker' => 0, };
+    $meta->{prereqs}{build}{requires} = $self->{ARGS}{BUILD_REQUIRES}
+        ? $self->{BUILD_REQUIRES}
+        : { 'ExtUtils::MakeMaker' => 0, };
+    $meta->{prereqs}{test}{requires} = $self->{TEST_REQUIRES}
+        if $self->{ARGS}{TEST_REQUIRES};
+    $meta->{prereqs}{runtime}{requires} = $self->{PREREQ_PM}
+        if $self->{ARGS}{PREREQ_PM};
+    $meta->{prereqs}{runtime}{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION})
+        if $self->{MIN_PERL_VERSION};
+}
+
+# spec version of given fragment - if not given, assume 1.4
+sub _metaspec_version {
+  my ( $meta ) = @_;
+  return $meta->{'meta-spec'}->{version}
+    if defined $meta->{'meta-spec'}
+       and defined $meta->{'meta-spec'}->{version};
+  return '1.4';
+}
+
+sub _add_requirements_to_meta_v1_4 {
+    my ( $self, $meta ) = @_;
+    # Check the original args so we can tell between the user setting it
+    # to an empty hash and it just being initialized.
+    if( $self->{ARGS}{CONFIGURE_REQUIRES} ) {
+        $meta->{configure_requires} = $self->{CONFIGURE_REQUIRES};
+    } else {
+        $meta->{configure_requires} = {
+            'ExtUtils::MakeMaker'       => 0,
+        };
+    }
+    if( $self->{ARGS}{BUILD_REQUIRES} ) {
+        $meta->{build_requires} = $self->{BUILD_REQUIRES};
+    } else {
+        $meta->{build_requires} = {
+            'ExtUtils::MakeMaker'       => 0,
+        };
+    }
+    if( $self->{ARGS}{TEST_REQUIRES} ) {
+        $meta->{build_requires} = {
+          %{ $meta->{build_requires} },
+          %{ $self->{TEST_REQUIRES} },
+        };
+    }
+    $meta->{requires} = $self->{PREREQ_PM}
+        if defined $self->{PREREQ_PM};
+    $meta->{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION})
+        if $self->{MIN_PERL_VERSION};
+}
+
+# Adapted from Module::Build::Base
+sub _normalize_version {
+  my ($version) = @_;
+  $version = 0 unless defined $version;
+
+  if ( ref $version eq 'version' ) { # version objects
+    $version = $version->stringify;
+  }
+  elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots
+    # normalize string tuples without "v": "1.2.3" -> "v1.2.3"
+    $version = "v$version";
+  }
+  else {
+    # leave alone
+  }
+  return $version;
+}
+
+=head3 _dump_hash
+
+    $yaml = _dump_hash(\%options, %hash);
+
+Implements a fake YAML dumper for a hash given
+as a list of pairs. No quoting/escaping is done. Keys
+are supposed to be strings. Values are undef, strings,
+hash refs or array refs of strings.
+
+Supported options are:
+
+    delta => STR - indentation delta
+    use_header => BOOL - whether to include a YAML header
+    indent => STR - a string of spaces
+          default: ''
+
+    max_key_length => INT - maximum key length used to align
+        keys and values of the same hash
+        default: 20
+    key_sort => CODE - a sort sub
+            It may be undef, which means no sorting by keys
+        default: sub { lc $a cmp lc $b }
+
+    customs => HASH - special options for certain keys
+           (whose values are hashes themselves)
+        may contain: max_key_length, key_sort, customs
+
+=end private
+
+=cut
+
+sub _dump_hash {
+    croak "first argument should be a hash ref" unless ref $_[0] eq 'HASH';
+    my $options = shift;
+    my %hash = @_;
+
+    # Use a list to preserve order.
+    my @pairs;
+
+    my $k_sort
+        = exists $options->{key_sort} ? $options->{key_sort}
+                                      : sub { lc $a cmp lc $b };
+    if ($k_sort) {
+        croak "'key_sort' should be a coderef" unless ref $k_sort eq 'CODE';
+        @pairs = _sort_pairs($k_sort, \%hash);
+    } else { # list of pairs, no sorting
+        @pairs = @_;
+    }
+
+    my $yaml     = $options->{use_header} ? "--- #YAML:1.0\n" : '';
+    my $indent   = $options->{indent} || '';
+    my $k_length = min(
+        ($options->{max_key_length} || 20),
+        max(map { length($_) + 1 } grep { !ref $hash{$_} } keys %hash)
+    );
+    my $customs  = $options->{customs} || {};
+
+    # printf format for key
+    my $k_format = "%-${k_length}s";
+
+    while( @pairs ) {
+        my($key, $val) = splice @pairs, 0, 2;
+        $val = '~' unless defined $val;
+        if(ref $val eq 'HASH') {
+            if ( keys %$val ) {
+                my %k_options = ( # options for recursive call
+                    delta => $options->{delta},
+                    use_header => 0,
+                    indent => $indent . $options->{delta},
+                );
+                if (exists $customs->{$key}) {
+                    my %k_custom = %{$customs->{$key}};
+                    foreach my $k (qw(key_sort max_key_length customs)) {
+                        $k_options{$k} = $k_custom{$k} if exists $k_custom{$k};
+                    }
+                }
+                $yaml .= $indent . "$key:\n"
+                  . _dump_hash(\%k_options, %$val);
+            }
+            else {
+                $yaml .= $indent . "$key:  {}\n";
+            }
+        }
+        elsif (ref $val eq 'ARRAY') {
+            if( @$val ) {
+                $yaml .= $indent . "$key:\n";
+
+                for (@$val) {
+                    croak "only nested arrays of non-refs are supported" if ref $_;
+                    $yaml .= $indent . $options->{delta} . "- $_\n";
+                }
+            }
+            else {
+                $yaml .= $indent . "$key:  []\n";
+            }
+        }
+        elsif( ref $val and !blessed($val) ) {
+            croak "only nested hashes, arrays and objects are supported";
+        }
+        else {  # if it's an object, just stringify it
+            $yaml .= $indent . sprintf "$k_format  %s\n", "$key:", $val;
+        }
+    };
+
+    return $yaml;
+
+}
+
+sub blessed {
+    return eval { $_[0]->isa("UNIVERSAL"); };
+}
+
+sub max {
+    return (sort { $b <=> $a } @_)[0];
+}
+
+sub min {
+    return (sort { $a <=> $b } @_)[0];
+}
+
+=head3 metafile_file
+
+    my $meta_yml = $mm->metafile_file(@metadata_pairs);
+
+Turns the @metadata_pairs into YAML.
+
+This method does not implement a complete YAML dumper, being limited
+to dump a hash with values which are strings, undef's or nested hashes
+and arrays of strings. No quoting/escaping is done.
+
+=cut
+
+sub metafile_file {
+    my $self = shift;
+
+    my %dump_options = (
+        use_header => 1,
+        delta      => ' ' x 4,
+        key_sort   => undef,
+    );
+    return _dump_hash(\%dump_options, @_);
+
+}
+
+
+=head3 distmeta_target
+
+    my $make_frag = $mm->distmeta_target;
+
+Generates the distmeta target to add META.yml and META.json to the MANIFEST
+in the distdir.
+
+=cut
+
+sub distmeta_target {
+    my $self = shift;
+
+    my @add_meta = (
+      $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']),
+exit unless -e q{META.yml};
+eval { maniadd({q{META.yml} => q{Module YAML meta-data (added by MakeMaker)}}) }
+    or die "Could not add META.yml to MANIFEST: ${'@'}"
+CODE
+      $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd'])
+exit unless -f q{META.json};
+eval { maniadd({q{META.json} => q{Module JSON meta-data (added by MakeMaker)}}) }
+    or die "Could not add META.json to MANIFEST: ${'@'}"
+CODE
+    );
+
+    my @add_meta_to_distdir = map { $self->cd('$(DISTVNAME)', $_) } @add_meta;
+
+    return sprintf <<'MAKE', @add_meta_to_distdir;
+distmeta : create_distdir metafile
+    $(NOECHO) %s
+    $(NOECHO) %s
+
+MAKE
+
+}
+
+
+=head3 mymeta
+
+    my $mymeta = $mm->mymeta;
+
+Generate MYMETA information as a hash either from an existing CPAN Meta file
+(META.json or META.yml) or from internal data.
+
+=cut
+
+sub mymeta {
+    my $self = shift;
+    my $file = shift || ''; # for testing
+
+    my $mymeta = $self->_mymeta_from_meta($file);
+    my $v2 = 1;
+
+    unless ( $mymeta ) {
+        $mymeta = $self->metafile_data(
+            $self->{META_ADD}   || {},
+            $self->{META_MERGE} || {},
+        );
+        $v2 = 0;
+    }
+
+    # Overwrite the non-configure dependency hashes
+    $self->_add_requirements_to_meta($mymeta);
+
+    $mymeta->{dynamic_config} = 0;
+
+    return $mymeta;
+}
+
+
+sub _mymeta_from_meta {
+    my $self = shift;
+    my $metafile = shift || ''; # for testing
+
+    return unless _has_cpan_meta();
+
+    my $meta;
+    for my $file ( $metafile, "META.json", "META.yml" ) {
+      next unless -e $file;
+      eval {
+          $meta = CPAN::Meta->load_file($file)->as_struct( { version => 2 } );
+      };
+      last if $meta;
+    }
+    return unless $meta;
+
+    # META.yml before 6.25_01 cannot be trusted.  META.yml lived in the source directory.
+    # There was a good chance the author accidentally uploaded a stale META.yml if they
+    # rolled their own tarball rather than using "make dist".
+    if ($meta->{generated_by} &&
+        $meta->{generated_by} =~ /ExtUtils::MakeMaker version ([\d\._]+)/) {
+        my $eummv = do { local $^W = 0; $1+0; };
+        if ($eummv < 6.2501) {
+            return;
+        }
+    }
+
+    return $meta;
+}
+
+=head3 write_mymeta
+
+    $self->write_mymeta( $mymeta );
+
+Write MYMETA information to MYMETA.json and MYMETA.yml.
+
+=cut
+
+sub write_mymeta {
+    my $self = shift;
+    my $mymeta = shift;
+
+    return unless _has_cpan_meta();
+
+    my $meta_obj = $self->_fix_metadata_before_conversion( $mymeta );
+
+    $meta_obj->save( 'MYMETA.json', { version => "2.0" } );
+    $meta_obj->save( 'MYMETA.yml', { version => "1.4" } );
+    return 1;
+}
+
+=head3 realclean (o)
+
+Defines the realclean target.
+
+=cut
+
+sub realclean {
+    my($self, %attribs) = @_;
+
+    my @dirs  = qw($(DISTVNAME));
+    my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD));
+
+    # Special exception for the perl core where INST_* is not in blib.
+    # This cleans up the files built from the ext/ directory (all XS).
+    if( $self->{PERL_CORE} ) {
+        push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR));
+        push @files, values %{$self->{PM}};
+    }
+
+    if( $self->has_link_code ){
+        push @files, qw($(OBJECT));
+    }
+
+    if( $attribs{FILES} ) {
+        if( ref $attribs{FILES} ) {
+            push @dirs, @{ $attribs{FILES} };
+        }
+        else {
+            push @dirs, split /\s+/, $attribs{FILES};
+        }
+    }
+
+    # Occasionally files are repeated several times from different sources
+    { my(%f) = map { ($_ => 1) } @files;  @files = sort keys %f; }
+    { my(%d) = map { ($_ => 1) } @dirs;   @dirs  = sort keys %d; }
+
+    my $rm_cmd  = join "\n\t", map { "$_" }
+                    $self->split_command('- $(RM_F)',  @files);
+    my $rmf_cmd = join "\n\t", map { "$_" }
+                    $self->split_command('- $(RM_RF)', @dirs);
+
+    my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd;
+# Delete temporary files (via clean) and also delete dist files
+realclean purge :: realclean_subdirs
+    %s
+    %s
+MAKE
+
+    $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP};
+
+    return $m;
+}
+
+
+=head3 realclean_subdirs_target
+
+  my $make_frag = $MM->realclean_subdirs_target;
+
+Returns the realclean_subdirs target.  This is used by the realclean
+target to call realclean on any subdirectories which contain Makefiles.
+
+=cut
+
+sub realclean_subdirs_target {
+    my $self = shift;
+    my @m = <<'EOF';
+# so clean is forced to complete before realclean_subdirs runs
+realclean_subdirs : clean
+EOF
+    return join '', @m, "\t\$(NOECHO) \$(NOOP)\n" unless @{$self->{DIR}};
+    foreach my $dir (@{$self->{DIR}}) {
+        foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) {
+            my $subrclean .= $self->oneliner(_sprintf562 <<'CODE', $dir, $makefile);
+chdir '%1$s';  system '$(MAKE) $(USEMAKEFILE) %2$s realclean' if -f '%2$s';
+CODE
+            push @m, "\t- $subrclean\n";
+        }
+    }
+    return join '', @m;
+}
+
+
+=head3 signature_target
+
+    my $target = $mm->signature_target;
+
+Generate the signature target.
+
+Writes the file SIGNATURE with "cpansign -s".
+
+=cut
+
+sub signature_target {
+    my $self = shift;
+
+    return <<'MAKE_FRAG';
+signature :
+    cpansign -s
+MAKE_FRAG
+
+}
+
+
+=head3 distsignature_target
+
+    my $make_frag = $mm->distsignature_target;
+
+Generates the distsignature target to add SIGNATURE to the MANIFEST in the
+distdir.
+
+=cut
+
+sub distsignature_target {
+    my $self = shift;
+
+    my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
+eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) }
+    or die "Could not add SIGNATURE to MANIFEST: ${'@'}"
+CODE
+
+    my $sign_dist        = $self->cd('$(DISTVNAME)' => 'cpansign -s');
+
+    # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not
+    # exist
+    my $touch_sig        = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE');
+    my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign );
+
+    return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist
+distsignature : distmeta
+    $(NOECHO) %s
+    $(NOECHO) %s
+    %s
+
+MAKE
+
+}
+
+
+=head3 special_targets
+
+  my $make_frag = $mm->special_targets
+
+Returns a make fragment containing any targets which have special
+meaning to make.  For example, .SUFFIXES and .PHONY.
+
+=cut
+
+sub special_targets {
+    my $make_frag = <<'MAKE_FRAG';
+.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+
+.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir pure_all subdirs clean_subdirs makemakerdflt manifypods realclean_subdirs subdirs_dynamic subdirs_pure_nolink subdirs_static subdirs-test_dynamic subdirs-test_static test_dynamic test_static
+
+MAKE_FRAG
+
+    $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
+.NO_CONFIG_REC: Makefile
+
+MAKE_FRAG
+
+    return $make_frag;
+}
+
+
+
+
+=head2 Init methods
+
+Methods which help initialize the MakeMaker object and macros.
+
+
+=head3 init_ABSTRACT
+
+    $mm->init_ABSTRACT
+
+=cut
+
+sub init_ABSTRACT {
+    my $self = shift;
+
+    if( $self->{ABSTRACT_FROM} and $self->{ABSTRACT} ) {
+        warn "Both ABSTRACT_FROM and ABSTRACT are set.  ".
+             "Ignoring ABSTRACT_FROM.\n";
+        return;
+    }
+
+    if ($self->{ABSTRACT_FROM}){
+        $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
+            carp "WARNING: Setting ABSTRACT via file ".
+                 "'$self->{ABSTRACT_FROM}' failed\n";
+    }
+
+    if ($self->{ABSTRACT} && $self->{ABSTRACT} =~ m![[:cntrl:]]+!) {
+            warn "WARNING: ABSTRACT contains control character(s),".
+                 " they will be removed\n";
+            $self->{ABSTRACT} =~ s![[:cntrl:]]+!!g;
+            return;
+    }
+}
+
+=head3 init_INST
+
+    $mm->init_INST;
+
+Called by init_main.  Sets up all INST_* variables except those related
+to XS code.  Those are handled in init_xs.
+
+=cut
+
+sub init_INST {
+    my($self) = shift;
+
+    $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch");
+    $self->{INST_BIN}     ||= $self->catdir($Curdir,'blib','bin');
+
+    # INST_LIB typically pre-set if building an extension after
+    # perl has been built and installed. Setting INST_LIB allows
+    # you to build directly into, say $Config{privlibexp}.
+    unless ($self->{INST_LIB}){
+        if ($self->{PERL_CORE}) {
+            $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
+        } else {
+            $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib");
+        }
+    }
+
+    my @parentdir = split(/::/, $self->{PARENT_NAME});
+    $self->{INST_LIBDIR}      = $self->catdir('$(INST_LIB)',     @parentdir);
+    $self->{INST_ARCHLIBDIR}  = $self->catdir('$(INST_ARCHLIB)', @parentdir);
+    $self->{INST_AUTODIR}     = $self->catdir('$(INST_LIB)', 'auto',
+                                              '$(FULLEXT)');
+    $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto',
+                                              '$(FULLEXT)');
+
+    $self->{INST_SCRIPT}  ||= $self->catdir($Curdir,'blib','script');
+
+    $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
+    $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
+
+    return 1;
+}
+
+
+=head3 init_INSTALL
+
+    $mm->init_INSTALL;
+
+Called by init_main.  Sets up all INSTALL_* variables (except
+INSTALLDIRS) and *PREFIX.
+
+=cut
+
+sub init_INSTALL {
+    my($self) = shift;
+
+    if( $self->{ARGS}{INSTALL_BASE} and $self->{ARGS}{PREFIX} ) {
+        die "Only one of PREFIX or INSTALL_BASE can be given.  Not both.\n";
+    }
+
+    if( $self->{ARGS}{INSTALL_BASE} ) {
+        $self->init_INSTALL_from_INSTALL_BASE;
+    }
+    else {
+        $self->init_INSTALL_from_PREFIX;
+    }
+}
+
+
+=head3 init_INSTALL_from_PREFIX
+
+  $mm->init_INSTALL_from_PREFIX;
+
+=cut
+
+sub init_INSTALL_from_PREFIX {
+    my $self = shift;
+
+    $self->init_lib2arch;
+
+    # There are often no Config.pm defaults for these new man variables so
+    # we fall back to the old behavior which is to use installman*dir
+    foreach my $num (1, 3) {
+        my $k = 'installsiteman'.$num.'dir';
+
+        $self->{uc $k} ||= uc "\$(installman${num}dir)"
+          unless $Config{$k};
+    }
+
+    foreach my $num (1, 3) {
+        my $k = 'installvendorman'.$num.'dir';
+
+        unless( $Config{$k} ) {
+            $self->{uc $k}  ||= $Config{usevendorprefix}
+                              ? uc "\$(installman${num}dir)"
+                              : '';
+        }
+    }
+
+    $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)'
+      unless $Config{installsitebin};
+    $self->{INSTALLSITESCRIPT} ||= '$(INSTALLSCRIPT)'
+      unless $Config{installsitescript};
+
+    unless( $Config{installvendorbin} ) {
+        $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix}
+                                    ? $Config{installbin}
+                                    : '';
+    }
+    unless( $Config{installvendorscript} ) {
+        $self->{INSTALLVENDORSCRIPT} ||= $Config{usevendorprefix}
+                                       ? $Config{installscript}
+                                       : '';
+    }
+
+
+    my $iprefix = $Config{installprefixexp} || $Config{installprefix} ||
+                  $Config{prefixexp}        || $Config{prefix} || '';
+    my $vprefix = $Config{usevendorprefix}  ? $Config{vendorprefixexp} : '';
+    my $sprefix = $Config{siteprefixexp}    || '';
+
+    # 5.005_03 doesn't have a siteprefix.
+    $sprefix = $iprefix unless $sprefix;
+
+
+    $self->{PREFIX}       ||= '';
+
+    if( $self->{PREFIX} ) {
+        @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} =
+          ('$(PREFIX)') x 3;
+    }
+    else {
+        $self->{PERLPREFIX}   ||= $iprefix;
+        $self->{SITEPREFIX}   ||= $sprefix;
+        $self->{VENDORPREFIX} ||= $vprefix;
+
+        # Lots of MM extension authors like to use $(PREFIX) so we
+        # put something sensible in there no matter what.
+        $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
+    }
+
+    my $arch    = $Config{archname};
+    my $version = $Config{version};
+
+    # default style
+    my $libstyle = $Config{installstyle} || 'lib/perl5';
+    my $manstyle = '';
+
+    if( $self->{LIBSTYLE} ) {
+        $libstyle = $self->{LIBSTYLE};
+        $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
+    }
+
+    # Some systems, like VOS, set installman*dir to '' if they can't
+    # read man pages.
+    for my $num (1, 3) {
+        $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
+          unless $Config{'installman'.$num.'dir'};
+    }
+
+    my %bin_layouts =
+    (
+        bin         => { s => $iprefix,
+                         t => 'perl',
+                         d => 'bin' },
+        vendorbin   => { s => $vprefix,
+                         t => 'vendor',
+                         d => 'bin' },
+        sitebin     => { s => $sprefix,
+                         t => 'site',
+                         d => 'bin' },
+        script      => { s => $iprefix,
+                         t => 'perl',
+                         d => 'bin' },
+        vendorscript=> { s => $vprefix,
+                         t => 'vendor',
+                         d => 'bin' },
+        sitescript  => { s => $sprefix,
+                         t => 'site',
+                         d => 'bin' },
+    );
+
+    my %man_layouts =
+    (
+        man1dir         => { s => $iprefix,
+                             t => 'perl',
+                             d => 'man/man1',
+                             style => $manstyle, },
+        siteman1dir     => { s => $sprefix,
+                             t => 'site',
+                             d => 'man/man1',
+                             style => $manstyle, },
+        vendorman1dir   => { s => $vprefix,
+                             t => 'vendor',
+                             d => 'man/man1',
+                             style => $manstyle, },
+
+        man3dir         => { s => $iprefix,
+                             t => 'perl',
+                             d => 'man/man3',
+                             style => $manstyle, },
+        siteman3dir     => { s => $sprefix,
+                             t => 'site',
+                             d => 'man/man3',
+                             style => $manstyle, },
+        vendorman3dir   => { s => $vprefix,
+                             t => 'vendor',
+                             d => 'man/man3',
+                             style => $manstyle, },
+    );
+
+    my %lib_layouts =
+    (
+        privlib     => { s => $iprefix,
+                         t => 'perl',
+                         d => '',
+                         style => $libstyle, },
+        vendorlib   => { s => $vprefix,
+                         t => 'vendor',
+                         d => '',
+                         style => $libstyle, },
+        sitelib     => { s => $sprefix,
+                         t => 'site',
+                         d => 'site_perl',
+                         style => $libstyle, },
+
+        archlib     => { s => $iprefix,
+                         t => 'perl',
+                         d => "$version/$arch",
+                         style => $libstyle },
+        vendorarch  => { s => $vprefix,
+                         t => 'vendor',
+                         d => "$version/$arch",
+                         style => $libstyle },
+        sitearch    => { s => $sprefix,
+                         t => 'site',
+                         d => "site_perl/$version/$arch",
+                         style => $libstyle },
+    );
+
+
+    # Special case for LIB.
+    if( $self->{LIB} ) {
+        foreach my $var (keys %lib_layouts) {
+            my $Installvar = uc "install$var";
+
+            if( $var =~ /arch/ ) {
+                $self->{$Installvar} ||=
+                  $self->catdir($self->{LIB}, $Config{archname});
+            }
+            else {
+                $self->{$Installvar} ||= $self->{LIB};
+            }
+        }
+    }
+
+    my %type2prefix = ( perl    => 'PERLPREFIX',
+                        site    => 'SITEPREFIX',
+                        vendor  => 'VENDORPREFIX'
+                      );
+
+    my %layouts = (%bin_layouts, %man_layouts, %lib_layouts);
+    while( my($var, $layout) = each(%layouts) ) {
+        my($s, $t, $d, $style) = @{$layout}{qw(s t d style)};
+        my $r = '$('.$type2prefix{$t}.')';
+
+        warn "Prefixing $var\n" if $Verbose >= 2;
+
+        my $installvar = "install$var";
+        my $Installvar = uc $installvar;
+        next if $self->{$Installvar};
+
+        $d = "$style/$d" if $style;
+        $self->prefixify($installvar, $s, $r, $d);
+
+        warn "  $Installvar == $self->{$Installvar}\n"
+          if $Verbose >= 2;
+    }
+
+    # Generate these if they weren't figured out.
+    $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH};
+    $self->{VENDORLIBEXP}  ||= $self->{INSTALLVENDORLIB};
+
+    return 1;
+}
+
+
+=head3 init_from_INSTALL_BASE
+
+    $mm->init_from_INSTALL_BASE
+
+=cut
+
+my %map = (
+           lib      => [qw(lib perl5)],
+           arch     => [('lib', 'perl5', $Config{archname})],
+           bin      => [qw(bin)],
+           man1dir  => [qw(man man1)],
+           man3dir  => [qw(man man3)]
+          );
+$map{script} = $map{bin};
+
+sub init_INSTALL_from_INSTALL_BASE {
+    my $self = shift;
+
+    @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} =
+                                                         '$(INSTALL_BASE)';
+
+    my %install;
+    foreach my $thing (keys %map) {
+        foreach my $dir (('', 'SITE', 'VENDOR')) {
+            my $uc_thing = uc $thing;
+            my $key = "INSTALL".$dir.$uc_thing;
+
+            $install{$key} ||=
+              $self->catdir('$(INSTALL_BASE)', @{$map{$thing}});
+        }
+    }
+
+    # Adjust for variable quirks.
+    $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH};
+    $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB};
+
+    foreach my $key (keys %install) {
+        $self->{$key} ||= $install{$key};
+    }
+
+    return 1;
+}
+
+
+=head3 init_VERSION  I<Abstract>
+
+    $mm->init_VERSION
+
+Initialize macros representing versions of MakeMaker and other tools
+
+MAKEMAKER: path to the MakeMaker module.
+
+MM_VERSION: ExtUtils::MakeMaker Version
+
+MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards
+             compat)
+
+VERSION: version of your module
+
+VERSION_MACRO: which macro represents the version (usually 'VERSION')
+
+VERSION_SYM: like version but safe for use as an RCS revision number
+
+DEFINE_VERSION: -D line to set the module version when compiling
+
+XS_VERSION: version in your .xs file.  Defaults to $(VERSION)
+
+XS_VERSION_MACRO: which macro represents the XS version.
+
+XS_DEFINE_VERSION: -D line to set the xs version when compiling.
+
+Called by init_main.
+
+=cut
+
+sub init_VERSION {
+    my($self) = shift;
+
+    $self->{MAKEMAKER}  = $ExtUtils::MakeMaker::Filename;
+    $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
+    $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
+    $self->{VERSION_FROM} ||= '';
+
+    if ($self->{VERSION_FROM}){
+        $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
+        if( $self->{VERSION} eq 'undef' ) {
+            carp("WARNING: Setting VERSION via file ".
+                 "'$self->{VERSION_FROM}' failed\n");
+        }
+    }
+
+    if (defined $self->{VERSION}) {
+        if ( $self->{VERSION} !~ /^\s*v?[\d_\.]+\s*$/ ) {
+          require version;
+          my $normal = eval { version->new( $self->{VERSION} ) };
+          $self->{VERSION} = $normal if defined $normal;
+        }
+        $self->{VERSION} =~ s/^\s+//;
+        $self->{VERSION} =~ s/\s+$//;
+    }
+    else {
+        $self->{VERSION} = '';
+    }
+
+
+    $self->{VERSION_MACRO}  = 'VERSION';
+    ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
+    $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
+
+
+    # Graham Barr and Paul Marquess had some ideas how to ensure
+    # version compatibility between the *.pm file and the
+    # corresponding *.xs file. The bottom line was, that we need an
+    # XS_VERSION macro that defaults to VERSION:
+    $self->{XS_VERSION} ||= $self->{VERSION};
+
+    $self->{XS_VERSION_MACRO}  = 'XS_VERSION';
+    $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
+
+}
+
+
+=head3 init_tools
+
+    $MM->init_tools();
+
+Initializes the simple macro definitions used by tools_other() and
+places them in the $MM object.  These use conservative cross platform
+versions and should be overridden with platform specific versions for
+performance.
+
+Defines at least these macros.
+
+  Macro             Description
+
+  NOOP              Do nothing
+  NOECHO            Tell make not to display the command itself
+
+  SHELL             Program used to run shell commands
+
+  ECHO              Print text adding a newline on the end
+  RM_F              Remove a file
+  RM_RF             Remove a directory
+  TOUCH             Update a file's timestamp
+  TEST_F            Test for a file's existence
+  TEST_S            Test the size of a file
+  CP                Copy a file
+  CP_NONEMPTY       Copy a file if it is not empty
+  MV                Move a file
+  CHMOD             Change permissions on a file
+  FALSE             Exit with non-zero
+  TRUE              Exit with zero
+
+  UMASK_NULL        Nullify umask
+  DEV_NULL          Suppress all command output
+
+=cut
+
+sub init_tools {
+    my $self = shift;
+
+    $self->{ECHO}     ||= $self->oneliner('binmode STDOUT, qq{:raw}; print qq{@ARGV}', ['-l']);
+    $self->{ECHO_N}   ||= $self->oneliner('print qq{@ARGV}');
+
+    $self->{TOUCH}    ||= $self->oneliner('touch', ["-MExtUtils::Command"]);
+    $self->{CHMOD}    ||= $self->oneliner('chmod', ["-MExtUtils::Command"]);
+    $self->{RM_F}     ||= $self->oneliner('rm_f',  ["-MExtUtils::Command"]);
+    $self->{RM_RF}    ||= $self->oneliner('rm_rf', ["-MExtUtils::Command"]);
+    $self->{TEST_F}   ||= $self->oneliner('test_f', ["-MExtUtils::Command"]);
+    $self->{TEST_S}   ||= $self->oneliner('test_s', ["-MExtUtils::Command::MM"]);
+    $self->{CP_NONEMPTY} ||= $self->oneliner('cp_nonempty', ["-MExtUtils::Command::MM"]);
+    $self->{FALSE}    ||= $self->oneliner('exit 1');
+    $self->{TRUE}     ||= $self->oneliner('exit 0');
+
+    $self->{MKPATH}   ||= $self->oneliner('mkpath', ["-MExtUtils::Command"]);
+
+    $self->{CP}       ||= $self->oneliner('cp', ["-MExtUtils::Command"]);
+    $self->{MV}       ||= $self->oneliner('mv', ["-MExtUtils::Command"]);
+
+    $self->{MOD_INSTALL} ||=
+      $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
+install([ from_to => {@ARGV}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]);
+CODE
+    $self->{DOC_INSTALL} ||= $self->oneliner('perllocal_install', ["-MExtUtils::Command::MM"]);
+    $self->{UNINSTALL}   ||= $self->oneliner('uninstall', ["-MExtUtils::Command::MM"]);
+    $self->{WARN_IF_OLD_PACKLIST} ||=
+      $self->oneliner('warn_if_old_packlist', ["-MExtUtils::Command::MM"]);
+    $self->{FIXIN}       ||= $self->oneliner('MY->fixin(shift)', ["-MExtUtils::MY"]);
+    $self->{EQUALIZE_TIMESTAMP} ||= $self->oneliner('eqtime', ["-MExtUtils::Command"]);
+
+    $self->{UNINST}     ||= 0;
+    $self->{VERBINST}   ||= 0;
+
+    $self->{SHELL}              ||= $Config{sh};
+
+    # UMASK_NULL is not used by MakeMaker but some CPAN modules
+    # make use of it.
+    $self->{UMASK_NULL}         ||= "umask 0";
+
+    # Not the greatest default, but its something.
+    $self->{DEV_NULL}           ||= "> /dev/null 2>&1";
+
+    $self->{NOOP}               ||= '$(TRUE)';
+    $self->{NOECHO}             = '@' unless defined $self->{NOECHO};
+
+    $self->{FIRST_MAKEFILE}     ||= $self->{MAKEFILE} || 'Makefile';
+    $self->{MAKEFILE}           ||= $self->{FIRST_MAKEFILE};
+    $self->{MAKEFILE_OLD}       ||= $self->{MAKEFILE}.'.old';
+    $self->{MAKE_APERL_FILE}    ||= $self->{MAKEFILE}.'.aperl';
+
+    # Not everybody uses -f to indicate "use this Makefile instead"
+    $self->{USEMAKEFILE}        ||= '-f';
+
+    # Some makes require a wrapper around macros passed in on the command
+    # line.
+    $self->{MACROSTART}         ||= '';
+    $self->{MACROEND}           ||= '';
+
+    return;
+}
+
+
+=head3 init_others
+
+    $MM->init_others();
+
+Initializes the macro definitions having to do with compiling and
+linking used by tools_other() and places them in the $MM object.
+
+If there is no description, its the same as the parameter to
+WriteMakefile() documented in ExtUtils::MakeMaker.
+
+=cut
+
+sub init_others {
+    my $self = shift;
+
+    $self->{LD_RUN_PATH} = "";
+
+    $self->{LIBS} = $self->_fix_libs($self->{LIBS});
+
+    # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
+    foreach my $libs ( @{$self->{LIBS}} ){
+        $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
+        my(@libs) = $self->extliblist($libs);
+        if ($libs[0] or $libs[1] or $libs[2]){
+            # LD_RUN_PATH now computed by ExtUtils::Liblist
+            ($self->{EXTRALIBS},  $self->{BSLOADLIBS},
+             $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
+            last;
+        }
+    }
+
+    if ( $self->{OBJECT} ) {
+        $self->{OBJECT} = join(" ", @{$self->{OBJECT}}) if ref $self->{OBJECT};
+        $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
+    } elsif ( ($self->{MAGICXS} || $self->{XSMULTI}) && @{$self->{O_FILES}||[]} ) {
+        $self->{OBJECT} = join(" ", @{$self->{O_FILES}});
+        $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
+    } else {
+        # init_dirscan should have found out, if we have C files
+        $self->{OBJECT} = "";
+        $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
+    }
+    $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
+
+    $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
+    $self->{PERLMAINCC} ||= '$(CC)';
+    $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
+
+    # Sanity check: don't define LINKTYPE = dynamic if we're skipping
+    # the 'dynamic' section of MM.  We don't have this problem with
+    # 'static', since we either must use it (%Config says we can't
+    # use dynamic loading) or the caller asked for it explicitly.
+    if (!$self->{LINKTYPE}) {
+       $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
+                        ? 'static'
+                        : ($Config{usedl} ? 'dynamic' : 'static');
+    }
+
+    return;
+}
+
+
+# Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
+# undefined. In any case we turn it into an anon array
+sub _fix_libs {
+    my($self, $libs) = @_;
+
+    return !defined $libs       ? ['']          :
+           !ref $libs           ? [$libs]       :
+           !defined $libs->[0]  ? ['']          :
+                                  $libs         ;
+}
+
+
+=head3 tools_other
+
+    my $make_frag = $MM->tools_other;
+
+Returns a make fragment containing definitions for the macros init_others()
+initializes.
+
+=cut
+
+sub tools_other {
+    my($self) = shift;
+    my @m;
+
+    # We set PM_FILTER as late as possible so it can see all the earlier
+    # on macro-order sensitive makes such as nmake.
+    for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH
+                      UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP
+                      FALSE TRUE
+                      ECHO ECHO_N
+                      UNINST VERBINST
+                      MOD_INSTALL DOC_INSTALL UNINSTALL
+                      WARN_IF_OLD_PACKLIST
+                      MACROSTART MACROEND
+                      USEMAKEFILE
+                      PM_FILTER
+                      FIXIN
+                      CP_NONEMPTY
+                    } )
+    {
+        next unless defined $self->{$tool};
+        push @m, "$tool = $self->{$tool}\n";
+    }
+
+    return join "", @m;
+}
+
+
+=head3 init_DIRFILESEP  I<Abstract>
+
+  $MM->init_DIRFILESEP;
+  my $dirfilesep = $MM->{DIRFILESEP};
+
+Initializes the DIRFILESEP macro which is the separator between the
+directory and filename in a filepath.  ie. / on Unix, \ on Win32 and
+nothing on VMS.
+
+For example:
+
+    # instead of $(INST_ARCHAUTODIR)/extralibs.ld
+    $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
+
+Something of a hack but it prevents a lot of code duplication between
+MM_* variants.
+
+Do not use this as a separator between directories.  Some operating
+systems use different separators between subdirectories as between
+directories and filenames (for example:  VOLUME:[dir1.dir2]file on VMS).
+
+=head3 init_linker  I<Abstract>
+
+    $mm->init_linker;
+
+Initialize macros which have to do with linking.
+
+PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
+extensions.
+
+PERL_ARCHIVE_AFTER: path to a library which should be put on the
+linker command line I<after> the external libraries to be linked to
+dynamic extensions.  This may be needed if the linker is one-pass, and
+Perl includes some overrides for C RTL functions, such as malloc().
+
+EXPORT_LIST: name of a file that is passed to linker to define symbols
+to be exported.
+
+Some OSes do not need these in which case leave it blank.
+
+
+=head3 init_platform
+
+    $mm->init_platform
+
+Initialize any macros which are for platform specific use only.
+
+A typical one is the version number of your OS specific module.
+(ie. MM_Unix_VERSION or MM_VMS_VERSION).
+
+=cut
+
+sub init_platform {
+    return '';
+}
+
+
+=head3 init_MAKE
+
+    $mm->init_MAKE
+
+Initialize MAKE from either a MAKE environment variable or $Config{make}.
+
+=cut
+
+sub init_MAKE {
+    my $self = shift;
+
+    $self->{MAKE} ||= $ENV{MAKE} || $Config{make};
+}
+
+
+=head2 Tools
+
+A grab bag of methods to generate specific macros and commands.
+
+
+
+=head3 manifypods
+
+Defines targets and routines to translate the pods into manpages and
+put them into the INST_* directories.
+
+=cut
+
+sub manifypods {
+    my $self          = shift;
+
+    my $POD2MAN_macro = $self->POD2MAN_macro();
+    my $manifypods_target = $self->manifypods_target();
+
+    return <<END_OF_TARGET;
+
+$POD2MAN_macro
+
+$manifypods_target
+
+END_OF_TARGET
+
+}
+
+
+=head3 POD2MAN_macro
+
+  my $pod2man_macro = $self->POD2MAN_macro
+
+Returns a definition for the POD2MAN macro.  This is a program
+which emulates the pod2man utility.  You can add more switches to the
+command by simply appending them on the macro.
+
+Typical usage:
+
+    $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
+
+=cut
+
+sub POD2MAN_macro {
+    my $self = shift;
+
+# Need the trailing '--' so perl stops gobbling arguments and - happens
+# to be an alternative end of line separator on VMS so we quote it
+    return <<'END_OF_DEF';
+POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
+POD2MAN = $(POD2MAN_EXE)
+END_OF_DEF
+}
+
+
+=head3 test_via_harness
+
+  my $command = $mm->test_via_harness($perl, $tests);
+
+Returns a $command line which runs the given set of $tests with
+Test::Harness and the given $perl.
+
+Used on the t/*.t files.
+
+=cut
+
+sub test_via_harness {
+    my($self, $perl, $tests) = @_;
+
+    return qq{\t$perl "-MExtUtils::Command::MM" "-MTest::Harness" }.
+           qq{"-e" "undef *Test::Harness::Switches; test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
+}
+
+=head3 test_via_script
+
+  my $command = $mm->test_via_script($perl, $script);
+
+Returns a $command line which just runs a single test without
+Test::Harness.  No checks are done on the results, they're just
+printed.
+
+Used for test.pl, since they don't always follow Test::Harness
+formatting.
+
+=cut
+
+sub test_via_script {
+    my($self, $perl, $script) = @_;
+    return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
+}
+
+
+=head3 tool_autosplit
+
+Defines a simple perl call that runs autosplit. May be deprecated by
+pm_to_blib soon.
+
+=cut
+
+sub tool_autosplit {
+    my($self, %attribs) = @_;
+
+    my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};'
+                                  : '';
+
+    my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
+use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
+PERL_CODE
+
+    return sprintf <<'MAKE_FRAG', $asplit;
+# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
+AUTOSPLITFILE = %s
+
+MAKE_FRAG
+
+}
+
+
+=head3 arch_check
+
+    my $arch_ok = $mm->arch_check(
+        $INC{"Config.pm"},
+        File::Spec->catfile($Config{archlibexp}, "Config.pm")
+    );
+
+A sanity check that what Perl thinks the architecture is and what
+Config thinks the architecture is are the same.  If they're not it
+will return false and show a diagnostic message.
+
+When building Perl it will always return true, as nothing is installed
+yet.
+
+The interface is a bit odd because this is the result of a
+quick refactoring.  Don't rely on it.
+
+=cut
+
+sub arch_check {
+    my $self = shift;
+    my($pconfig, $cconfig) = @_;
+
+    return 1 if $self->{PERL_SRC};
+
+    my($pvol, $pthinks) = $self->splitpath($pconfig);
+    my($cvol, $cthinks) = $self->splitpath($cconfig);
+
+    $pthinks = $self->canonpath($pthinks);
+    $cthinks = $self->canonpath($cthinks);
+
+    my $ret = 1;
+    if ($pthinks ne $cthinks) {
+        print "Have $pthinks\n";
+        print "Want $cthinks\n";
+
+        $ret = 0;
+
+        my $arch = (grep length, $self->splitdir($pthinks))[-1];
+
+        print <<END unless $self->{UNINSTALLED_PERL};
+Your perl and your Config.pm seem to have different ideas about the
+architecture they are running on.
+Perl thinks: [$arch]
+Config says: [$Config{archname}]
+This may or may not cause problems. Please check your installation of perl
+if you have problems building this extension.
+END
+    }
+
+    return $ret;
+}
+
+
+
+=head2 File::Spec wrappers
+
+ExtUtils::MM_Any is a subclass of File::Spec.  The methods noted here
+override File::Spec.
+
+
+
+=head3 catfile
+
+File::Spec <= 0.83 has a bug where the file part of catfile is not
+canonicalized.  This override fixes that bug.
+
+=cut
+
+sub catfile {
+    my $self = shift;
+    return $self->canonpath($self->SUPER::catfile(@_));
+}
+
+
+
+=head2 Misc
+
+Methods I can't really figure out where they should go yet.
+
+
+=head3 find_tests
+
+  my $test = $mm->find_tests;
+
+Returns a string suitable for feeding to the shell to return all
+tests in t/*.t.
+
+=cut
+
+sub find_tests {
+    my($self) = shift;
+    return -d 't' ? 't/*.t' : '';
+}
+
+=head3 find_tests_recursive
+
+  my $tests = $mm->find_tests_recursive;
+
+Returns a string suitable for feeding to the shell to return all
+tests in t/ but recursively. Equivalent to
+
+  my $tests = $mm->find_tests_recursive_in('t');
+
+=cut
+
+sub find_tests_recursive {
+    my $self = shift;
+    return $self->find_tests_recursive_in('t');
+}
+
+=head3 find_tests_recursive_in
+
+  my $tests = $mm->find_tests_recursive_in($dir);
+
+Returns a string suitable for feeding to the shell to return all
+tests in $dir recursively.
+
+=cut
+
+sub find_tests_recursive_in {
+    my($self, $dir) = @_;
+    return '' unless -d $dir;
+
+    require File::Find;
+
+    my $base_depth = grep { $_ ne '' } File::Spec->splitdir( (File::Spec->splitpath($dir))[1] );
+    my %depths;
+
+    my $wanted = sub {
+        return unless m!\.t$!;
+        my ($volume,$directories,$file) =
+            File::Spec->splitpath( $File::Find::name  );
+        my $depth = grep { $_ ne '' } File::Spec->splitdir( $directories );
+        $depth -= $base_depth;
+        $depths{ $depth } = 1;
+    };
+
+    File::Find::find( $wanted, $dir );
+
+    return join ' ',
+        map { $dir . '/*' x $_ . '.t' }
+        sort { $a <=> $b }
+        keys %depths;
+}
+
+=head3 extra_clean_files
+
+    my @files_to_clean = $MM->extra_clean_files;
+
+Returns a list of OS specific files to be removed in the clean target in
+addition to the usual set.
+
+=cut
+
+# An empty method here tickled a perl 5.8.1 bug and would return its object.
+sub extra_clean_files {
+    return;
+}
+
+
+=head3 installvars
+
+    my @installvars = $mm->installvars;
+
+A list of all the INSTALL* variables without the INSTALL prefix.  Useful
+for iteration or building related variable sets.
+
+=cut
+
+sub installvars {
+    return qw(PRIVLIB SITELIB  VENDORLIB
+              ARCHLIB SITEARCH VENDORARCH
+              BIN     SITEBIN  VENDORBIN
+              SCRIPT  SITESCRIPT  VENDORSCRIPT
+              MAN1DIR SITEMAN1DIR VENDORMAN1DIR
+              MAN3DIR SITEMAN3DIR VENDORMAN3DIR
+             );
+}
+
+
+=head3 libscan
+
+  my $wanted = $self->libscan($path);
+
+Takes a path to a file or dir and returns an empty string if we don't
+want to include this file in the library.  Otherwise it returns the
+the $path unchanged.
+
+Mainly used to exclude version control administrative directories
+and base-level F<README.pod> from installation.
+
+=cut
+
+sub libscan {
+    my($self,$path) = @_;
+
+    if ($path =~ m<^README\.pod$>i) {
+        warn "WARNING: Older versions of ExtUtils::MakeMaker may errantly install $path as part of this distribution. It is recommended to avoid using this path in CPAN modules.\n";
+        return '';
+    }
+
+    my($dirs,$file) = ($self->splitpath($path))[1,2];
+    return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/,
+                     $self->splitdir($dirs), $file;
+
+    return $path;
+}
+
+
+=head3 platform_constants
+
+    my $make_frag = $mm->platform_constants
+
+Returns a make fragment defining all the macros initialized in
+init_platform() rather than put them in constants().
+
+=cut
+
+sub platform_constants {
+    return '';
+}
+
+=head3 post_constants (o)
+
+Returns an empty string per default. Dedicated to overrides from
+within Makefile.PL after all constants have been defined.
+
+=cut
+
+sub post_constants {
+    "";
+}
+
+=head3 post_initialize (o)
+
+Returns an empty string per default. Used in Makefile.PLs to add some
+chunk of text to the Makefile after the object is initialized.
+
+=cut
+
+sub post_initialize {
+    "";
+}
+
+=head3 postamble (o)
+
+Returns an empty string. Can be used in Makefile.PLs to write some
+text to the Makefile at the end.
+
+=cut
+
+sub postamble {
+    "";
+}
+
+=begin private
+
+=head3 _PREREQ_PRINT
+
+    $self->_PREREQ_PRINT;
+
+Implements PREREQ_PRINT.
+
+Refactored out of MakeMaker->new().
+
+=end private
+
+=cut
+
+sub _PREREQ_PRINT {
+    my $self = shift;
+
+    require Data::Dumper;
+    my @what = ('PREREQ_PM');
+    push @what, 'MIN_PERL_VERSION' if $self->{MIN_PERL_VERSION};
+    push @what, 'BUILD_REQUIRES'   if $self->{BUILD_REQUIRES};
+    print Data::Dumper->Dump([@{$self}{@what}], \@what);
+    exit 0;
+}
+
+
+=begin private
+
+=head3 _PRINT_PREREQ
+
+  $mm->_PRINT_PREREQ;
+
+Implements PRINT_PREREQ, a slightly different version of PREREQ_PRINT
+added by Redhat to, I think, support generating RPMs from Perl modules.
+
+Should not include BUILD_REQUIRES as RPMs do not include them.
+
+Refactored out of MakeMaker->new().
+
+=end private
+
+=cut
+
+sub _PRINT_PREREQ {
+    my $self = shift;
+
+    my $prereqs= $self->{PREREQ_PM};
+    my @prereq = map { [$_, $prereqs->{$_}] } keys %$prereqs;
+
+    if ( $self->{MIN_PERL_VERSION} ) {
+        push @prereq, ['perl' => $self->{MIN_PERL_VERSION}];
+    }
+
+    print join(" ", map { "perl($_->[0])>=$_->[1] " }
+                 sort { $a->[0] cmp $b->[0] } @prereq), "\n";
+    exit 0;
+}
+
+
+=begin private
+
+=head3 _perl_header_files
+
+  my $perl_header_files= $self->_perl_header_files;
+
+returns a sorted list of header files as found in PERL_SRC or $archlibexp/CORE.
+
+Used by perldepend() in MM_Unix and MM_VMS via _perl_header_files_fragment()
+
+=end private
+
+=cut
+
+sub _perl_header_files {
+    my $self = shift;
+
+    my $header_dir = $self->{PERL_SRC} || $ENV{PERL_SRC} || $self->catdir($Config{archlibexp}, 'CORE');
+    opendir my $dh, $header_dir
+        or die "Failed to opendir '$header_dir' to find header files: $!";
+
+    # we need to use a temporary here as the sort in scalar context would have undefined results.
+    my @perl_headers= sort grep { /\.h\z/ } readdir($dh);
+
+    closedir $dh;
+
+    return @perl_headers;
+}
+
+=begin private
+
+=head3 _perl_header_files_fragment ($o, $separator)
+
+  my $perl_header_files_fragment= $self->_perl_header_files_fragment("/");
+
+return a Makefile fragment which holds the list of perl header files which
+XS code depends on $(PERL_INC), and sets up the dependency for the $(OBJECT) file.
+
+The $separator argument defaults to "". MM_VMS will set it to "" and MM_UNIX to "/"
+in perldepend(). This reason child subclasses need to control this is that in
+VMS the $(PERL_INC) directory will already have delimiters in it, but in
+UNIX $(PERL_INC) will need a slash between it an the filename. Hypothetically
+win32 could use "\\" (but it doesn't need to).
+
+=end private
+
+=cut
+
+sub _perl_header_files_fragment {
+    my ($self, $separator)= @_;
+    $separator ||= "";
+    return join("\\\n",
+                "PERL_HDRS = ",
+                map {
+                    sprintf( "        \$(PERL_INCDEP)%s%s            ", $separator, $_ )
+                } $self->_perl_header_files()
+           ) . "\n\n"
+           . "\$(OBJECT) : \$(PERL_HDRS)\n";
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> and the denizens of
+makemaker@perl.org with code from ExtUtils::MM_Unix and
+ExtUtils::MM_Win32.
+
+
+=cut
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_BeOS.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_BeOS.pm
new file mode 100644 (file)
index 0000000..bd3769f
--- /dev/null
@@ -0,0 +1,63 @@
+package ExtUtils::MM_BeOS;
+
+use strict;
+
+=head1 NAME
+
+ExtUtils::MM_BeOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_BeOS;    # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over 4
+
+=cut
+
+use ExtUtils::MakeMaker::Config;
+use File::Spec;
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+
+our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+
+=item os_flavor
+
+BeOS is BeOS.
+
+=cut
+
+sub os_flavor {
+    return('BeOS');
+}
+
+=item init_linker
+
+libperl.a equivalent to be linked to dynamic extensions.
+
+=cut
+
+sub init_linker {
+    my($self) = shift;
+
+    $self->{PERL_ARCHIVE} ||=
+      File::Spec->catdir('$(PERL_INC)',$Config{libperl});
+    $self->{PERL_ARCHIVEDEP} ||= '';
+    $self->{PERL_ARCHIVE_AFTER} ||= '';
+    $self->{EXPORT_LIST}  ||= '';
+}
+
+=back
+
+1;
+__END__
+
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Cygwin.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Cygwin.pm
new file mode 100644 (file)
index 0000000..ab66061
--- /dev/null
@@ -0,0 +1,175 @@
+package ExtUtils::MM_Cygwin;
+
+use strict;
+
+use ExtUtils::MakeMaker::Config;
+use File::Spec;
+
+require ExtUtils::MM_Unix;
+require ExtUtils::MM_Win32;
+our @ISA = qw( ExtUtils::MM_Unix );
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+
+=head1 NAME
+
+ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided there.
+
+=over 4
+
+=item os_flavor
+
+We're Unix and Cygwin.
+
+=cut
+
+sub os_flavor {
+    return('Unix', 'Cygwin');
+}
+
+=item cflags
+
+if configured for dynamic loading, triggers #define EXT in EXTERN.h
+
+=cut
+
+sub cflags {
+    my($self,$libperl)=@_;
+    return $self->{CFLAGS} if $self->{CFLAGS};
+    return '' unless $self->needs_linking();
+
+    my $base = $self->SUPER::cflags($libperl);
+    foreach (split /\n/, $base) {
+        /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
+    };
+    $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true');
+
+    return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+};
+
+}
+
+
+=item replace_manpage_separator
+
+replaces strings '::' with '.' in MAN*POD man page names
+
+=cut
+
+sub replace_manpage_separator {
+    my($self, $man) = @_;
+    $man =~ s{/+}{.}g;
+    return $man;
+}
+
+=item init_linker
+
+points to libperl.a
+
+=cut
+
+sub init_linker {
+    my $self = shift;
+
+    if ($Config{useshrplib} eq 'true') {
+        my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}";
+        if( $] >= 5.006002 ) {
+            $libperl =~ s/(dll\.)?a$/dll.a/;
+        }
+        $self->{PERL_ARCHIVE} = $libperl;
+    } else {
+        $self->{PERL_ARCHIVE} =
+          '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
+    }
+
+    $self->{PERL_ARCHIVEDEP} ||= '';
+    $self->{PERL_ARCHIVE_AFTER} ||= '';
+    $self->{EXPORT_LIST}  ||= '';
+}
+
+=item maybe_command
+
+Determine whether a file is native to Cygwin by checking whether it
+resides inside the Cygwin installation (using Windows paths). If so,
+use C<ExtUtils::MM_Unix> to determine if it may be a command.
+Otherwise use the tests from C<ExtUtils::MM_Win32>.
+
+=cut
+
+sub maybe_command {
+    my ($self, $file) = @_;
+
+    my $cygpath = Cygwin::posix_to_win_path('/', 1);
+    my $filepath = Cygwin::posix_to_win_path($file, 1);
+
+    return (substr($filepath,0,length($cygpath)) eq $cygpath)
+    ? $self->SUPER::maybe_command($file) # Unix
+    : ExtUtils::MM_Win32->maybe_command($file); # Win32
+}
+
+=item dynamic_lib
+
+Use the default to produce the *.dll's.
+But for new archdir dll's use the same rebase address if the old exists.
+
+=cut
+
+sub dynamic_lib {
+    my($self, %attribs) = @_;
+    my $s = ExtUtils::MM_Unix::dynamic_lib($self, %attribs);
+    return '' unless $s;
+    return $s unless %{$self->{XS}};
+
+    # do an ephemeral rebase so the new DLL fits to the current rebase map
+    $s .= "\t/bin/find \$\(INST_ARCHLIB\)/auto -xdev -name \\*.$self->{DLEXT} | /bin/rebase -sOT -" if (( $Config{myarchname} eq 'i686-cygwin' ) and not ( exists $ENV{CYGPORT_PACKAGE_VERSION} ));
+    $s;
+}
+
+=item install
+
+Rebase dll's with the global rebase database after installation.
+
+=cut
+
+sub install {
+    my($self, %attribs) = @_;
+    my $s = ExtUtils::MM_Unix::install($self, %attribs);
+    return '' unless $s;
+    return $s unless %{$self->{XS}};
+
+    my $INSTALLDIRS = $self->{INSTALLDIRS};
+    my $INSTALLLIB = $self->{"INSTALL". ($INSTALLDIRS eq 'perl' ? 'ARCHLIB' : uc($INSTALLDIRS)."ARCH")};
+    my $dop = "\$\(DESTDIR\)$INSTALLLIB/auto/";
+    my $dll = "$dop/$self->{FULLEXT}/$self->{BASEEXT}.$self->{DLEXT}";
+    $s =~ s|^(pure_install :: pure_\$\(INSTALLDIRS\)_install\n\t)\$\(NOECHO\) \$\(NOOP\)\n|$1\$(CHMOD) \$(PERM_RWX) $dll\n\t/bin/find $dop -xdev -name \\*.$self->{DLEXT} \| /bin/rebase -sOT -\n|m if (( $Config{myarchname} eq 'i686-cygwin') and not ( exists $ENV{CYGPORT_PACKAGE_VERSION} ));
+    $s;
+}
+
+=item all_target
+
+Build man pages, too
+
+=cut
+
+sub all_target {
+    ExtUtils::MM_Unix::all_target(shift);
+}
+
+=back
+
+=cut
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_DOS.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_DOS.pm
new file mode 100644 (file)
index 0000000..63abe91
--- /dev/null
@@ -0,0 +1,74 @@
+package ExtUtils::MM_DOS;
+
+use strict;
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
+
+
+=head1 NAME
+
+ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality
+for DOS.
+
+Unless otherwise stated, it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=over 4
+
+=item os_flavor
+
+=cut
+
+sub os_flavor {
+    return('DOS');
+}
+
+=item B<replace_manpage_separator>
+
+Generates Foo__Bar.3 style man page names
+
+=cut
+
+sub replace_manpage_separator {
+    my($self, $man) = @_;
+
+    $man =~ s,/+,__,g;
+    return $man;
+}
+
+=item xs_static_lib_is_xs
+
+=cut
+
+sub xs_static_lib_is_xs {
+    return 1;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MM_Unix>, L<ExtUtils::MakeMaker>
+
+=cut
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Darwin.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Darwin.pm
new file mode 100644 (file)
index 0000000..7257d9d
--- /dev/null
@@ -0,0 +1,48 @@
+package ExtUtils::MM_Darwin;
+
+use strict;
+
+BEGIN {
+    require ExtUtils::MM_Unix;
+    our @ISA = qw( ExtUtils::MM_Unix );
+}
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+
+=head1 NAME
+
+ExtUtils::MM_Darwin - special behaviors for OS X
+
+=head1 SYNOPSIS
+
+    For internal MakeMaker use only
+
+=head1 DESCRIPTION
+
+See L<ExtUtils::MM_Unix> for L<ExtUtils::MM_Any> for documentation on the
+methods overridden here.
+
+=head2 Overridden Methods
+
+=head3 init_dist
+
+Turn off Apple tar's tendency to copy resource forks as "._foo" files.
+
+=cut
+
+sub init_dist {
+    my $self = shift;
+
+    # Thank you, Apple, for breaking tar and then breaking the work around.
+    # 10.4 wants COPY_EXTENDED_ATTRIBUTES_DISABLE while 10.5 wants
+    # COPYFILE_DISABLE.  I'm not going to push my luck and instead just
+    # set both.
+    $self->{TAR} ||=
+        'COPY_EXTENDED_ATTRIBUTES_DISABLE=1 COPYFILE_DISABLE=1 tar';
+
+    $self->SUPER::init_dist(@_);
+}
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_MacOS.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_MacOS.pm
new file mode 100644 (file)
index 0000000..872cb8f
--- /dev/null
@@ -0,0 +1,34 @@
+package ExtUtils::MM_MacOS;
+
+use strict;
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+sub new {
+    die 'MacOS Classic (MacPerl) is no longer supported by MakeMaker';
+}
+
+=head1 NAME
+
+ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
+
+=head1 SYNOPSIS
+
+  # MM_MacOS no longer contains any code.  This is just a stub.
+
+=head1 DESCRIPTION
+
+Once upon a time, MakeMaker could produce an approximation of a correct
+Makefile on MacOS Classic (MacPerl).  Due to a lack of maintainers, this
+fell out of sync with the rest of MakeMaker and hadn't worked in years.
+Since there's little chance of it being repaired, MacOS Classic is fading
+away, and the code was icky to begin with, the code has been deleted to
+make maintenance easier.
+
+Anyone interested in resurrecting this file should pull the old version
+from the MakeMaker CVS repository and contact makemaker@perl.org.
+
+=cut
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_NW5.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_NW5.pm
new file mode 100644 (file)
index 0000000..b30911a
--- /dev/null
@@ -0,0 +1,208 @@
+package ExtUtils::MM_NW5;
+
+=head1 NAME
+
+ExtUtils::MM_NW5 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_NW5; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=over
+
+=cut
+
+use strict;
+use ExtUtils::MakeMaker::Config;
+use File::Basename;
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+require ExtUtils::MM_Win32;
+our @ISA = qw(ExtUtils::MM_Win32);
+
+use ExtUtils::MakeMaker qw(&neatvalue &_sprintf562);
+
+$ENV{EMXSHELL} = 'sh'; # to run `commands`
+
+my $BORLAND  = $Config{'cc'} =~ /\bbcc/i;
+my $GCC      = $Config{'cc'} =~ /\bgcc/i;
+
+
+=item os_flavor
+
+We're Netware in addition to being Windows.
+
+=cut
+
+sub os_flavor {
+    my $self = shift;
+    return ($self->SUPER::os_flavor, 'Netware');
+}
+
+=item init_platform
+
+Add Netware macros.
+
+LIBPTH, BASE_IMPORT, NLM_VERSION, MPKTOOL, TOOLPATH, BOOT_SYMBOL,
+NLM_SHORT_NAME, INCLUDE, PATH, MM_NW5_REVISION
+
+
+=item platform_constants
+
+Add Netware macros initialized above to the Makefile.
+
+=cut
+
+sub init_platform {
+    my($self) = shift;
+
+    # To get Win32's setup.
+    $self->SUPER::init_platform;
+
+    # incpath is copied to makefile var INCLUDE in constants sub, here just
+    # make it empty
+    my $libpth = $Config{'libpth'};
+    $libpth =~ s( )(;);
+    $self->{'LIBPTH'} = $libpth;
+
+    $self->{'BASE_IMPORT'} = $Config{'base_import'};
+
+    # Additional import file specified from Makefile.pl
+    if($self->{'base_import'}) {
+        $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'};
+    }
+
+    $self->{'NLM_VERSION'} = $Config{'nlm_version'};
+    $self->{'MPKTOOL'}     = $Config{'mpktool'};
+    $self->{'TOOLPATH'}    = $Config{'toolpath'};
+
+    (my $boot = $self->{'NAME'}) =~ s/:/_/g;
+    $self->{'BOOT_SYMBOL'}=$boot;
+
+    # If the final binary name is greater than 8 chars,
+    # truncate it here.
+    if(length($self->{'BASEEXT'}) > 8) {
+        $self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8);
+    }
+
+    # Get the include path and replace the spaces with ;
+    # Copy this to makefile as INCLUDE = d:\...;d:\;
+    ($self->{INCLUDE} = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
+
+    # Set the path to CodeWarrior binaries which might not have been set in
+    # any other place
+    $self->{PATH} = '$(PATH);$(TOOLPATH)';
+
+    $self->{MM_NW5_VERSION} = $VERSION;
+}
+
+sub platform_constants {
+    my($self) = shift;
+    my $make_frag = '';
+
+    # Setup Win32's constants.
+    $make_frag .= $self->SUPER::platform_constants;
+
+    foreach my $macro (qw(LIBPTH BASE_IMPORT NLM_VERSION MPKTOOL
+                          TOOLPATH BOOT_SYMBOL NLM_SHORT_NAME INCLUDE PATH
+                          MM_NW5_VERSION
+                      ))
+    {
+        next unless defined $self->{$macro};
+        $make_frag .= "$macro = $self->{$macro}\n";
+    }
+
+    return $make_frag;
+}
+
+=item static_lib_pure_cmd
+
+Defines how to run the archive utility
+
+=cut
+
+sub static_lib_pure_cmd {
+    my ($self, $src) = @_;
+    $src =~ s/(\$\(\w+)(\))/$1:^"+"$2/g if $BORLAND;
+    sprintf qq{\t\$(AR) %s\n}, ($BORLAND ? '$@ ' . $src
+                          : ($GCC ? '-ru $@ ' . $src
+                                  : '-type library -o $@ ' . $src));
+}
+
+=item xs_static_lib_is_xs
+
+=cut
+
+sub xs_static_lib_is_xs {
+    return 1;
+}
+
+=item dynamic_lib
+
+Override of utility methods for OS-specific work.
+
+=cut
+
+sub xs_make_dynamic_lib {
+    my ($self, $attribs, $from, $to, $todir, $ldfrom, $exportlist) = @_;
+    my @m;
+    # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
+    if ($to =~ /^\$/) {
+        if ($self->{NLM_SHORT_NAME}) {
+            # deal with shortnames
+            my $newto = q{$(INST_AUTODIR)\\$(NLM_SHORT_NAME).$(DLEXT)};
+            push @m, "$to: $newto\n\n";
+            $to = $newto;
+        }
+    } else {
+        my ($v, $d, $f) = File::Spec->splitpath($to);
+        # relies on $f having a literal "." in it, unlike for $(OBJ_EXT)
+        if ($f =~ /[^\.]{9}\./) {
+            # 9+ chars before '.', need to shorten
+            $f = substr $f, 0, 8;
+        }
+        my $newto = File::Spec->catpath($v, $d, $f);
+        push @m, "$to: $newto\n\n";
+        $to = $newto;
+    }
+    # bits below should be in dlsyms, not here
+    #                                   1    2      3       4
+    push @m, _sprintf562 <<'MAKE_FRAG', $to, $from, $todir, $exportlist;
+# Create xdc data for an MT safe NLM in case of mpk build
+%1$s: %2$s $(MYEXTLIB) $(BOOTSTRAP) %3$s$(DFSEP).exists
+    $(NOECHO) $(ECHO) Export boot_$(BOOT_SYMBOL) > %4$s
+    $(NOECHO) $(ECHO) $(BASE_IMPORT) >> %4$s
+    $(NOECHO) $(ECHO) Import @$(PERL_INC)\perl.imp >> %4$s
+MAKE_FRAG
+    if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
+        (my $xdc = $exportlist) =~ s#def\z#xdc#;
+        $xdc = '$(BASEEXT).xdc';
+        push @m, sprintf <<'MAKE_FRAG', $xdc, $exportlist;
+    $(MPKTOOL) $(XDCFLAGS) %s
+    $(NOECHO) $(ECHO) xdcdata $(BASEEXT).xdc >> %s
+MAKE_FRAG
+    }
+    # Reconstruct the X.Y.Z version.
+    my $version = join '.', map { sprintf "%d", $_ }
+                              $] =~ /(\d)\.(\d{3})(\d{2})/;
+    push @m, sprintf <<'EOF', $from, $version, $to, $exportlist;
+    $(LD) $(LDFLAGS) %s -desc "Perl %s Extension ($(BASEEXT))  XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION) -o %s $(MYEXTLIB) $(PERL_INC)\Main.lib -commandfile %s
+    $(CHMOD) 755 $@
+EOF
+    join '', @m;
+}
+
+1;
+__END__
+
+=back
+
+=cut
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_OS2.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_OS2.pm
new file mode 100644 (file)
index 0000000..8c6b3d2
--- /dev/null
@@ -0,0 +1,146 @@
+package ExtUtils::MM_OS2;
+
+use strict;
+
+use ExtUtils::MakeMaker qw(neatvalue);
+use File::Spec;
+
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+require ExtUtils::MM_Any;
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Any ExtUtils::MM_Unix);
+
+=pod
+
+=head1 NAME
+
+ExtUtils::MM_OS2 - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_OS2; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided
+there. This package overrides the implementation of these methods, not
+the semantics.
+
+=head1 METHODS
+
+=over 4
+
+=item init_dist
+
+Define TO_UNIX to convert OS2 linefeeds to Unix style.
+
+=cut
+
+sub init_dist {
+    my($self) = @_;
+
+    $self->{TO_UNIX} ||= <<'MAKE_TEXT';
+$(NOECHO) $(TEST_F) tmp.zip && $(RM_F) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM_F) tmp.zip
+MAKE_TEXT
+
+    $self->SUPER::init_dist;
+}
+
+sub dlsyms {
+    my($self,%attribs) = @_;
+    if ($self->{IMPORTS} && %{$self->{IMPORTS}}) {
+    # Make import files (needed for static build)
+    -d 'tmp_imp' or mkdir 'tmp_imp', 0777 or die "Can't mkdir tmp_imp";
+    open my $imp, '>', 'tmpimp.imp' or die "Can't open tmpimp.imp";
+    foreach my $name (sort keys %{$self->{IMPORTS}}) {
+        my $exp = $self->{IMPORTS}->{$name};
+        my ($lib, $id) = ($exp =~ /(.*)\.(.*)/) or die "Malformed IMPORT `$exp'";
+        print $imp "$name $lib $id ?\n";
+    }
+    close $imp or die "Can't close tmpimp.imp";
+    # print "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp\n";
+    system "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp"
+        and die "Cannot make import library: $!, \$?=$?";
+    # May be running under miniperl, so have no glob...
+    eval { unlink <tmp_imp/*>; 1 } or system "rm tmp_imp/*";
+    system "cd tmp_imp; $Config::Config{ar} x ../tmpimp$Config::Config{lib_ext}"
+        and die "Cannot extract import objects: $!, \$?=$?";
+    }
+    return '' if $self->{SKIPHASH}{'dynamic'};
+    $self->xs_dlsyms_iterator(\%attribs);
+}
+
+sub xs_dlsyms_ext {
+    '.def';
+}
+
+sub xs_dlsyms_extra {
+    join '', map { qq{, "$_" => "\$($_)"} } qw(VERSION DISTNAME INSTALLDIRS);
+}
+
+sub static_lib_pure_cmd {
+    my($self) = @_;
+    my $old = $self->SUPER::static_lib_pure_cmd;
+    return $old unless $self->{IMPORTS} && %{$self->{IMPORTS}};
+    $old . <<'EOC';
+    $(AR) $(AR_STATIC_ARGS) "$@" tmp_imp/*
+    $(RANLIB) "$@"
+EOC
+}
+
+sub replace_manpage_separator {
+    my($self,$man) = @_;
+    $man =~ s,/+,.,g;
+    $man;
+}
+
+sub maybe_command {
+    my($self,$file) = @_;
+    $file =~ s,[/\\]+,/,g;
+    return $file if -x $file && ! -d _;
+    return "$file.exe" if -x "$file.exe" && ! -d _;
+    return "$file.cmd" if -x "$file.cmd" && ! -d _;
+    return;
+}
+
+=item init_linker
+
+=cut
+
+sub init_linker {
+    my $self = shift;
+
+    $self->{PERL_ARCHIVE} = "\$(PERL_INC)/libperl\$(LIB_EXT)";
+
+    $self->{PERL_ARCHIVEDEP} ||= '';
+    $self->{PERL_ARCHIVE_AFTER} = $OS2::is_aout
+      ? ''
+      : '$(PERL_INC)/libperl_override$(LIB_EXT)';
+    $self->{EXPORT_LIST} = '$(BASEEXT).def';
+}
+
+=item os_flavor
+
+OS/2 is OS/2
+
+=cut
+
+sub os_flavor {
+    return('OS/2');
+}
+
+=item xs_static_lib_is_xs
+
+=cut
+
+sub xs_static_lib_is_xs {
+    return 1;
+}
+
+=back
+
+=cut
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_QNX.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_QNX.pm
new file mode 100644 (file)
index 0000000..30bd29d
--- /dev/null
@@ -0,0 +1,58 @@
+package ExtUtils::MM_QNX;
+
+use strict;
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+QNX.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=head3 extra_clean_files
+
+Add .err files corresponding to each .c file.
+
+=cut
+
+sub extra_clean_files {
+    my $self = shift;
+
+    my @errfiles = @{$self->{C}};
+    for ( @errfiles ) {
+    s/.c$/.err/;
+    }
+
+    return( @errfiles, 'perlmain.err' );
+}
+
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
+
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_UWIN.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_UWIN.pm
new file mode 100644 (file)
index 0000000..e231c07
--- /dev/null
@@ -0,0 +1,65 @@
+package ExtUtils::MM_UWIN;
+
+use strict;
+our $VERSION = '7.32';
+$VERSION = eval $VERSION;
+
+require ExtUtils::MM_Unix;
+our @ISA = qw(ExtUtils::MM_Unix);
+
+
+=head1 NAME
+
+ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
+
+=head1 SYNOPSIS
+
+  Don't use this module directly.
+  Use ExtUtils::MM and let it choose.
+
+=head1 DESCRIPTION
+
+This is a subclass of ExtUtils::MM_Unix which contains functionality for
+the AT&T U/WIN UNIX on Windows environment.
+
+Unless otherwise stated it works just like ExtUtils::MM_Unix
+
+=head2 Overridden methods
+
+=over 4
+
+=item os_flavor
+
+In addition to being Unix, we're U/WIN.
+
+=cut
+
+sub os_flavor {
+    return('Unix', 'U/WIN');
+}
+
+
+=item B<replace_manpage_separator>
+
+=cut
+
+sub replace_manpage_separator {
+    my($self, $man) = @_;
+
+    $man =~ s,/+,.,g;
+    return $man;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
+
+=head1 SEE ALSO
+
+L<ExtUtils::MM_Win32>, L<ExtUtils::MakeMaker>
+
+=cut
+
+1;
diff --git a/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Unix.pm b/Tools/Scripts/test262/local/lib/perl5/ExtUtils/MM_Unix.pm
new file mode 100644 (file)
index 0000000..fac67e4
--- /dev/null
@@ -0,0 +1,4020 @@
+package ExtUtils::MM_Unix;
+
+require 5.006;
+
+use strict;
+
+use Carp;
+use ExtUtils::MakeMaker::Config;
+use File::Basename qw(basename dirname);
+
+our %Config_Override;
+
+use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562);
+
+# If we make $VERSION an our variable parse_version() breaks
+use vars qw($VERSION);
+$VERSION = '7.32';
+$VERSION = eval $VERSION;  ## no critic [BuiltinFunctions::ProhibitStringyEval]
+
+require ExtUtils::MM_Any;
+our @ISA = qw(ExtUtils::MM_Any);
+
+my %Is;
+BEGIN {
+    $Is{OS2}     = $^O eq 'os2';
+    $Is{Win32}   = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare';
+    $Is{Dos}     = $^O eq 'dos';
+    $Is{VMS}     = $^O eq 'VMS';
+    $Is{OSF}     = $^O eq 'dec_osf';
+    $Is{IRIX}    = $^O eq 'irix';
+    $Is{NetBSD}  = $^O eq 'netbsd';
+    $Is{Interix} = $^O eq 'interix';
+    $Is{SunOS4}  = $^O eq 'sunos';
+    $Is{Solaris} = $^O eq 'solaris';
+    $Is{SunOS}   = $Is{SunOS4} || $Is{Solaris};
+    $Is{BSD}     = ($^O =~ /^(?:free|net|open)bsd$/ or
+                   grep( $^O eq $_, qw(bsdos interix dragonfly) )
+                  );
+    $Is{Android} = $^O =~ /android/;
+}
+
+BEGIN {
+    if( $Is{VMS} ) {
+        # For things like vmsify()
+        require VMS::Filespec;
+        VMS::Filespec->import;
+    }
+}
+
+
+=head1 NAME
+
+ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+C<require ExtUtils::MM_Unix;>
+
+=head1 DESCRIPTION
+
+The methods provided by this package are designed to be used in
+conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
+Makefile, it creates one or more objects that inherit their methods
+from a package C<MM>. MM itself doesn't provide any methods, but it
+ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
+specific packages take the responsibility for all the methods provided
+by MM_Unix. We are trying to reduce the number of the necessary
+overrides by defining rather primitive operations within
+ExtUtils::MM_Unix.
+
+If you are going to write a platform specific MM package, please try
+to limit the necessary overrides to primitive methods, and if it is not
+possible to do so, let's work out how to achieve that gain.
+
+If you are overriding any of these methods in your Makefile.PL (in the
+MY class), please report that to the makemaker mailing list. We are
+trying to minimize the necessary method overrides and switch to data
+driven Makefile.PLs wherever possible. In the long run less methods
+will be overridable via the MY class.
+
+=head1 METHODS
+
+The following description of methods is still under
+development. Please refer to the code for not suitably documented
+sections and complain loudly to the makemaker@perl.org mailing list.
+Better yet, provide a patch.
+
+Not all of the methods below are overridable in a
+Makefile.PL. Overridable methods are marked as (o). All methods are
+overridable by a platform specific MM_*.pm file.
+
+Cross-platform methods are being moved into MM_Any.  If you can't find
+something that used to be in here, look in MM_Any.
+
+=cut
+
+# So we don't have to keep calling the methods over and over again,
+# we have these globals to cache the values.  Faster and shrtr.
+my $Curdir  = __PACKAGE__->curdir;
+my $Updir   = __PACKAGE__->updir;
+
+
+=head2 Methods
+
+=over 4
+
+=item os_flavor
+
+Simply says that we're Unix.
+
+=cut
+
+sub os_flavor {
+    return('Unix');
+}
+
+
+=item c_o (o)
+
+Defines the suffix rules to compile different flavors of C files to
+object files.
+
+=cut
+
+sub c_o {
+# --- Translation Sections ---
+
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    my(@m);
+
+    my $command = '$(CCCMD)';
+    my $flags   = '$(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE)';
+
+    if (my $cpp = $Config{cpprun}) {
+        my $cpp_cmd = $self->const_cccmd;
+        $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
+        push @m, qq{
+.c.i:
+    $cpp_cmd $flags \$*.c > \$*.i
+};
+    }
+
+    my $m_o = $self->{XSMULTI} ? $self->xs_obj_opt('$*.s') : '';
+    push @m, sprintf <<'EOF', $command, $flags, $m_o;
+
+.c.s :
+    %s -S %s $*.c %s
+EOF
+
+    my @exts = qw(c cpp cxx cc);
+    push @exts, 'C' if !$Is{OS2} and !$Is{Win32} and !$Is{Dos}; #Case-specific
+    $m_o = $self->{XSMULTI} ? $self->xs_obj_opt('$*$(OBJ_EXT)') : '';
+    for my $ext (@exts) {
+    push @m, "\n.$ext\$(OBJ_EXT) :\n\t$command $flags \$*.$ext" . ( $m_o ? " $m_o" : '' ) . "\n";
+    }
+    return join "", @m;
+}
+
+
+=item xs_obj_opt
+
+Takes the object file as an argument, and returns the portion of compile
+command-line that will output to the specified object file.
+
+=cut
+
+sub xs_obj_opt {
+    my ($self, $output_file) = @_;
+    "-o $output_file";
+}
+
+
+=item cflags (o)
+
+Does very much the same as the cflags script in the perl
+distribution. It doesn't return the whole compiler command line, but
+initializes all of its parts. The const_cccmd method then actually
+returns the definition of the CCCMD macro which uses these parts.
+
+=cut
+
+#'
+
+sub cflags {
+    my($self,$libperl)=@_;
+    return $self->{CFLAGS} if $self->{CFLAGS};
+    return '' unless $self->needs_linking();
+
+    my($prog, $uc, $perltype, %cflags);
+    $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
+    $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
+
+    @cflags{qw(cc ccflags optimize shellflags)}
+    = @Config{qw(cc ccflags optimize shellflags)};
+
+    # Perl 5.21.4 adds the (gcc) warning (-Wall ...) and std (-std=c89)
+    # flags to the %Config, and the modules in the core should be built
+    # with the warning flags, but NOT the -std=c89 flags (the latter
+    # would break using any system header files that are strict C99).
+    my @ccextraflags = qw(ccwarnflags);
+    if ($ENV{PERL_CORE}) {
+      for my $x (@ccextraflags) {
+        if (exists $Config{$x}) {
+          $cflags{$x} = $Config{$x};
+        }
+      }
+    }
+
+    my($optdebug) = "";
+
+    $cflags{shellflags} ||= '';
+
+    my(%map) =  (
+        D =>   '-DDEBUGGING',
+        E =>   '-DEMBED',
+        DE =>  '-DDEBUGGING -DEMBED',
+        M =>   '-DEMBED -DMULTIPLICITY',
+        DM =>  '-DDEBUGGING -DEMBED -DMULTIPLICITY',
+        );
+
+    if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
+    $uc = uc($1);
+    } else {
+    $uc = ""; # avoid warning
+    }
+    $perltype = $map{$uc} ? $map{$uc} : "";
+
+    if ($uc =~ /^D/) {
+    $optdebug = "-g";
+    }
+
+
+    my($name);
+    ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
+    if ($prog = $Config{$name}) {
+    # Expand hints for this extension via the shell
+    print "Processing $name hint:\n" if $Verbose;
+    my(@o)=`cc=\"$cflags{cc}\"
+      ccflags=\"$cflags{ccflags}\"
+      optimize=\"$cflags{optimize}\"
+      perltype=\"$cflags{perltype}\"
+      optdebug=\"$cflags{optdebug}\"
+      eval '$prog'
+      echo cc=\$cc
+      echo ccflags=\$ccflags
+      echo optimize=\$optimize
+      echo perltype=\$perltype
+      echo optdebug=\$optdebug
+      `;
+    foreach my $line (@o){
+        chomp $line;
+        if ($line =~ /(.*?)=\s*(.*)\s*$/){
+        $cflags{$1} = $2;
+        print "    $1 = $2\n" if $Verbose;
+        } else {
+        print "Unrecognised result from hint: '$line'\n";
+        }
+    }
+    }
+
+    if ($optdebug) {
+    $cflags{optimize} = $optdebug;
+    }
+
+    for (qw(ccflags optimize perltype)) {
+        $cflags{$_} ||= '';
+    $cflags{$_} =~ s/^\s+//;
+    $cflags{$_} =~ s/\s+/ /g;
+    $cflags{$_} =~ s/\s+$//;
+    $self->{uc $_} ||= $cflags{$_};
+    }
+
+    if ($self->{POLLUTE}) {
+    $self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
+    }
+
+    for my $x (@ccextraflags) {
+      next unless exists $cflags{$x};
+      $self->{CCFLAGS} .= $cflags{$x} =~ m!^\s! ? $cflags{$x} : ' ' . $cflags{$x};
+    }
+
+    my $pollute = '';
+    if ($Config{usemymalloc} and not $Config{bincompat5005}
+    and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
+    and $self->{PERL_MALLOC_OK}) {
+    $pollute = '$(PERL_MALLOC_DEF)';
+    }
+
+    return $self->{CFLAGS} = qq{
+CCFLAGS = $self->{CCFLAGS}
+OPTIMIZE = $self->{OPTIMIZE}
+PERLTYPE = $self->{PERLTYPE}
+MPOLLUTE = $pollute
+};
+
+}
+
+
+=item const_cccmd (o)
+
+Returns the full compiler call for C programs and stores the
+definition in CONST_CCCMD.
+
+=cut
+
+sub const_cccmd {
+    my($self,$libperl)=@_;
+    return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+    return '' unless $self->needs_linking();
+    return $self->{CONST_CCCMD} =
+    q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
+    $(CCFLAGS) $(OPTIMIZE) \\
+    $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
+    $(XS_DEFINE_VERSION)};
+}
+
+=item const_config (o)
+
+Sets SHELL if needed, then defines a couple of constants in the Makefile
+that are imported from %Config.
+
+=cut
+
+sub const_config {
+# --- Constants Sections ---
+
+    my($self) = shift;
+    my @m = $self->specify_shell(); # Usually returns empty string
+    push @m, <<"END";
+
+# These definitions are from config.sh (via $INC{'Config.pm'}).
+# They may have been overridden via Makefile.PL or on the command line.
+END
+
+    my(%once_only);
+    foreach my $key (@{$self->{CONFIG}}){
+        # SITE*EXP macros are defined in &constants; avoid duplicates here
+        next if $once_only{$key};
+        push @m, uc($key) , ' = ' , $self->{uc $key}, "\n";
+        $once_only{$key} = 1;
+    }
+    join('', @m);
+}
+
+=item const_loadlibs (o)
+
+Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
+L<ExtUtils::Liblist> for details.
+
+=cut
+
+sub const_loadlibs {
+    my($self) = shift;
+    return "" unless $self->needs_linking;
+    my @m;
+    push @m, qq{
+# $self->{NAME} might depend on some other libraries:
+# See ExtUtils::Liblist for details
+#
+};
+    for my $tmp (qw/
+         EXTRALIBS LDLOADLIBS BSLOADLIBS
+         /) {
+        next unless defined $self->{$tmp};
+        push @m, "$tmp = $self->{$tmp}\n";
+    }
+    # don't set LD_RUN_PATH if empty
+    for my $tmp (qw/
+         LD_RUN_PATH
+         /) {
+        next unless $self->{$tmp};
+        push @m, "$tmp = $self->{$tmp}\n";
+    }
+    return join "", @m;
+}
+
+=item constants (o)
+
+  my $make_frag = $mm->constants;
+
+Prints out macros for lots of constants.
+
+=cut
+
+sub constants {
+    my($self) = @_;
+    my @m = ();
+
+    $self->{DFSEP} = '$(DIRFILESEP)';  # alias for internal use
+
+    for my $macro (qw(
+
+              AR_STATIC_ARGS DIRFILESEP DFSEP
+              NAME NAME_SYM
+              VERSION    VERSION_MACRO    VERSION_SYM DEFINE_VERSION
+              XS_VERSION XS_VERSION_MACRO             XS_DEFINE_VERSION
+              INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB
+              INST_MAN1DIR INST_MAN3DIR
+              MAN1EXT      MAN3EXT
+              INSTALLDIRS INSTALL_BASE DESTDIR PREFIX
+              PERLPREFIX      SITEPREFIX      VENDORPREFIX
+                   ),
+                   (map { ("INSTALL".$_,
+                          "DESTINSTALL".$_)
+                        } $self->installvars),
+                   qw(
+              PERL_LIB
+              PERL_ARCHLIB PERL_ARCHLIBDEP
+              LIBPERL_A MYEXTLIB
+              FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE
+              PERLMAINCC PERL_SRC PERL_INC PERL_INCDEP
+              PERL            FULLPERL          ABSPERL
+              PERLRUN         FULLPERLRUN       ABSPERLRUN
+              PERLRUNINST     FULLPERLRUNINST   ABSPERLRUNINST
+              PERL_CORE
+              PERM_DIR PERM_RW PERM_RWX
+
+          ) )
+    {
+    next unless defined $self->{$macro};
+
+        # pathnames can have sharp signs in them; escape them so
+        # make doesn't think it is a comment-start character.
+        $self->{$macro} =~ s/#/\\#/g;
+    $self->{$macro} = $self->quote_dep($self->{$macro})
+      if $ExtUtils::MakeMaker::macro_dep{$macro};
+    push @m, "$macro = $self->{$macro}\n";
+    }
+
+    push @m, qq{
+MAKEMAKER   = $self->{MAKEMAKER}
+MM_VERSION  = $self->{MM_VERSION}
+MM_REVISION = $self->{MM_REVISION}
+};
+
+    push @m, q{
+# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
+# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
+# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
+# DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
+};
+
+    for my $macro (qw/
+              MAKE
+          FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
+          LDFROM LINKTYPE BOOTDEP
+          /    )
+    {
+    next unless defined $self->{$macro};
+    push @m, "$macro = $self->{$macro}\n";
+    }
+
+    push @m, "
+# Handy lists of source code files:
+XS_FILES = ".$self->wraplist(sort keys %{$self->{XS}})."
+C_FILES  = ".$self->wraplist(sort @{$self->{C}})."
+O_FILES  = ".$self->wraplist(sort @{$self->{O_FILES}})."
+H_FILES  = ".$self->wraplist(sort @{$self->{H}})."
+MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
+MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
+";
+
+
+    push @m, q{
+# Where is the Config information that we are using/depend on
+CONFIGDEP = $(PERL_ARCHLIBDEP)$(DFSEP)Config.pm $(PERL_INCDEP)$(DFSEP)config.h
+} if -e $self->catfile( $self->{PERL_INC}, 'config.h' );
+
+
+    push @m, qq{
+# Where to build things
+INST_LIBDIR      = $self->{INST_LIBDIR}
+INST_ARCHLIBDIR  = $self->{INST_ARCHLIBDIR}
+
+INST_AUTODIR     = $self->{INST_AUTODIR}
+INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
+
+INST_STATIC      = $self->{INST_STATIC}
+INST_DYNAMIC     = $self->{INST_DYNAMIC}
+INST_BOOT        = $self->{INST_BOOT}
+};
+
+    push @m, qq{
+# Extra linker info
+EXPORT_LIST        = $self->{EXPORT_LIST}
+PERL_ARCHIVE       = $self->{PERL_ARCHIVE}
+PERL_ARCHIVEDEP    = $self->{PERL_ARCHIVEDEP}
+PERL_ARCHIVE_AFTER = $self->{PERL_ARCHIVE_AFTER}
+};
+
+    push @m, "
+
+TO_INST_PM = ".$self->wraplist(map $self->quote_dep($_), sort keys %{$self->{PM}})."\n";
+
+    join('',@m);
+}
+
+
+=item depend (o)
+
+Same as macro for the depend attribute.
+
+=cut
+
+sub depend {
+    my($self,%attribs) = @_;
+    my(@m,$key,$val);
+    for my $key (sort keys %attribs){
+    my $val = $attribs{$key};
+    next unless defined $key and defined $val;
+    push @m, "$key : $val\n";
+    }
+    join "", @m;
+}
+
+
+=item init_DEST
+
+  $mm->init_DEST
+
+Defines the DESTDIR and DEST* variables paralleling the INSTALL*.
+
+=cut
+
+sub init_DEST {
+    my $self = shift;
+
+    # Initialize DESTDIR
+    $self->{DESTDIR} ||= '';
+
+    # Make DEST variables.
+    foreach my $var ($self->installvars) {
+        my $destvar = 'DESTINSTALL'.$var;
+        $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')';
+    }
+}
+
+
+=item init_dist
+
+  $mm->init_dist;
+
+Defines a lot of macros for distribution support.
+
+  macro         description                     default
+
+  TAR           tar command to use              tar
+  TARFLAGS      flags to pass to TAR            cvf
+
+  ZIP           zip command to use              zip
+  ZIPFLAGS      flags to pass to ZIP            -r
+
+  COMPRESS      compression command to          gzip --best
+                use for tarfiles
+  SUFFIX        suffix to put on                .gz
+                compressed files
+
+  SHAR          shar command to use             shar
+
+  PREOP         extra commands to run before
+                making the archive
+  POSTOP        extra commands to run after
+                making the archive
+
+  TO_UNIX       a command to convert linefeeds
+                to Unix style in your archive
+
+  CI            command to checkin your         ci -u
+                sources to version control
+  RCS_LABEL     command to label your sources   rcs -Nv$(VERSION_SYM): -q
+                just after CI is run
+
+  DIST_CP       $how argument to manicopy()     best
+                when the distdir is created
+
+  DIST_DEFAULT  default target to use to        tardist
+                create a distribution
+
+  DISTVNAME     name of the resulting archive   $(DISTNAME)-$(VERSION)
+                (minus suffixes)
+
+=cut
+
+sub init_dist {
+    my $self = shift;
+
+    $self->{TAR}      ||= 'tar';
+    $self->{TARFLAGS} ||= 'cvf';
+    $self->{ZIP}      ||= 'zip';
+    $self->{ZIPFLAGS} ||= '-r';
+    $self->{COMPRESS} ||= 'gzip --best';
+    $self->{SUFFIX}   ||= '.gz';
+    $self->{SHAR}     ||= 'shar';
+    $self->{PREOP}    ||= '$(NOECHO) $(NOOP)'; # eg update MANIFEST
+    $self->{POSTOP}   ||= '$(NOECHO) $(NOOP)'; # eg remove the distdir
+    $self->{TO_UNIX}  ||= '$(NOECHO) $(NOOP)';
+
+    $self->{CI}       ||= 'ci -u';
+    $self->{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q';
+    $self->{DIST_CP}  ||= 'best';
+    $self->{DIST_DEFAULT} ||= 'tardist';
+
+    ($self->{DISTNAME} = $self->{NAME}) =~ s{::}{-}g unless $self->{DISTNAME};
+    $self->{DISTVNAME} ||= $self->{DISTNAME}.'-'.$self->{VERSION};
+}
+
+=item dist (o)
+
+  my $dist_macros = $mm->dist(%overrides);
+
+Generates a make fragment defining all the macros initialized in
+init_dist.
+
+%overrides can be used to override any of the above.
+
+=cut
+
+sub dist {
+    my($self, %attribs) = @_;
+
+    my $make = '';
+    if ( $attribs{SUFFIX} && $attribs{SUFFIX} !~ m!^\.! ) {
+      $attribs{SUFFIX} = '.' . $attribs{SUFFIX};
+    }
+    foreach my $key (qw(
+            TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR
+            PREOP POSTOP TO_UNIX
+            CI RCS_LABEL DIST_CP DIST_DEFAULT
+            DISTNAME DISTVNAME
+           ))
+    {
+        my $value = $attribs{$key} || $self->{$key};
+        $make .= "$key = $value\n";
+    }
+
+    return $make;
+}
+
+=item dist_basics (o)
+
+Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
+
+=cut
+
+sub dist_basics {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+distclean :: realclean distcheck
+    $(NOECHO) $(NOOP)
+
+distcheck :
+    $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
+
+skipcheck :
+    $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
+
+manifest :
+    $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
+
+veryclean : realclean
+    $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old
+
+MAKE_FRAG
+
+}
+
+=item dist_ci (o)
+
+Defines a check in target for RCS.
+
+=cut
+
+sub dist_ci {
+    my($self) = shift;
+    return sprintf "ci :\n\t%s\n", $self->oneliner(<<'EOF', [qw(-MExtUtils::Manifest=maniread)]);
+@all = sort keys %{ maniread() };
+print(qq{Executing $(CI) @all\n});
+system(qq{$(CI) @all}) == 0 or die $!;
+print(qq{Executing $(RCS_LABEL) ...\n});
+system(qq{$(RCS_LABEL) @all}) == 0 or die $!;
+EOF
+}
+
+=item dist_core (o)
+
+  my $dist_make_fragment = $MM->dist_core;
+
+Puts the targets necessary for 'make dist' together into one make
+fragment.
+
+=cut
+
+sub dist_core {
+    my($self) = shift;
+
+    my $make_frag = '';
+    foreach my $target (qw(dist tardist uutardist tarfile zipdist zipfile
+                           shdist))
+    {
+        my $method = $target.'_target';
+        $make_frag .= "\n";
+        $make_frag .= $self->$method();
+    }
+
+    return $make_frag;
+}
+
+
+=item B<dist_target>
+
+  my $make_frag = $MM->dist_target;
+
+Returns the 'dist' target to make an archive for distribution.  This
+target simply checks to make sure the Makefile is up-to-date and
+depends on $(DIST_DEFAULT).
+
+=cut
+
+sub dist_target {
+    my($self) = shift;
+
+    my $date_check = $self->oneliner(<<'CODE', ['-l']);
+print 'Warning: Makefile possibly out of date with $(VERSION_FROM)'
+    if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
+CODE
+
+    return sprintf <<'MAKE_FRAG', $date_check;
+dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
+    $(NOECHO) %s
+MAKE_FRAG
+}
+
+=item B<tardist_target>
+
+  my $make_frag = $MM->tardist_target;
+
+Returns the 'tardist' target which is simply so 'make tardist' works.
+The real work is done by the dynamically named tardistfile_target()
+method, tardist should have that as a dependency.
+
+=cut
+
+sub tardist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+tardist : $(DISTVNAME).tar$(SUFFIX)
+    $(NOECHO) $(NOOP)
+MAKE_FRAG
+}
+
+=item B<zipdist_target>
+
+  my $make_frag = $MM->zipdist_target;
+
+Returns the 'zipdist' target which is simply so 'make zipdist' works.
+The real work is done by the dynamically named zipdistfile_target()
+method, zipdist should have that as a dependency.
+
+=cut
+
+sub zipdist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+zipdist : $(DISTVNAME).zip
+    $(NOECHO) $(NOOP)
+MAKE_FRAG
+}
+
+=item B<tarfile_target>
+
+  my $make_frag = $MM->tarfile_target;
+
+The name of this target is the name of the tarball generated by
+tardist.  This target does the actual work of turning the distdir into
+a tarball.
+
+=cut
+
+sub tarfile_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+$(DISTVNAME).tar$(SUFFIX) : distdir
+    $(PREOP)
+    $(TO_UNIX)
+    $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
+    $(RM_RF) $(DISTVNAME)
+    $(COMPRESS) $(DISTVNAME).tar
+    $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)'
+    $(POSTOP)
+MAKE_FRAG
+}
+
+=item zipfile_target
+
+  my $make_frag = $MM->zipfile_target;
+
+The name of this target is the name of the zip file generated by
+zipdist.  This target does the actual work of turning the distdir into
+a zip file.
+
+=cut
+
+sub zipfile_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+$(DISTVNAME).zip : distdir
+    $(PREOP)
+    $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
+    $(RM_RF) $(DISTVNAME)
+    $(NOECHO) $(ECHO) 'Created $(DISTVNAME).zip'
+    $(POSTOP)
+MAKE_FRAG
+}
+
+=item uutardist_target
+
+  my $make_frag = $MM->uutardist_target;
+
+Converts the tarfile into a uuencoded file
+
+=cut
+
+sub uutardist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+uutardist : $(DISTVNAME).tar$(SUFFIX)
+    uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
+    $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)_uu'
+MAKE_FRAG
+}
+
+
+=item shdist_target
+
+  my $make_frag = $MM->shdist_target;
+
+Converts the distdir into a shell archive.
+
+=cut
+
+sub shdist_target {
+    my($self) = shift;
+
+    return <<'MAKE_FRAG';
+shdist : distdir
+    $(PREOP)
+    $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
+    $(RM_RF) $(DISTVNAME)
+    $(NOECHO) $(ECHO) 'Created $(DISTVNAME).shar'
+    $(POSTOP)
+MAKE_FRAG
+}
+
+
+=item dlsyms (o)
+
+Used by some OS' to define DL_FUNCS and DL_VARS and write the *.exp files.
+
+Normally just returns an empty string.
+
+=cut
+
+sub dlsyms {
+    return '';
+}
+
+
+=item dynamic_bs (o)
+
+Defines targets for bootstrap files.
+
+=cut
+
+sub dynamic_bs {
+    my($self, %attribs) = @_;
+    return "\nBOOTSTRAP =\n" unless $self->has_link_code();
+    my @exts;
+    if ($self->{XSMULTI}) {
+    @exts = $self->_xs_list_basenames;
+    } else {
+    @exts = '$(BASEEXT)';
+    }
+    return join "\n",
+        "BOOTSTRAP = @{[map { qq{$_.bs} } @exts]}\n",
+        map { $self->_xs_make_bs($_) } @exts;
+}
+
+sub _xs_make_bs {
+    my ($self, $basename) = @_;
+    my ($v, $d, $f) = File::Spec->splitpath($basename);
+    my @d = File::Spec->splitdir($d);
+    shift @d if $self->{XSMULTI} and $d[0] eq 'lib';
+    my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+    $instdir = '$(INST_ARCHAUTODIR)' if $basename eq '$(BASEEXT)';
+    my $instfile = $self->catfile($instdir, "$f.bs");
+    my $exists = "$instdir\$(DFSEP).exists"; # match blibdirs_target
+    #                                 1          2          3
+    return _sprintf562 <<'MAKE_FRAG', $basename, $instfile, $exists;
+# As Mkbootstrap might not write a file (if none is required)
+# we use touch to prevent make continually trying to remake it.
+# The DynaLoader only reads a non-empty file.
+%1$s.bs : $(FIRST_MAKEFILE) $(BOOTDEP)
+    $(NOECHO) $(ECHO) "Running Mkbootstrap for %1$s ($(BSLOADLIBS))"
+    $(NOECHO) $(PERLRUN) \
+        "-MExtUtils::Mkbootstrap" \
+        -e "Mkbootstrap('%1$s','$(BSLOADLIBS)');"
+    $(NOECHO) $(TOUCH) "%1$s.bs"
+    $(CHMOD) $(PERM_RW) "%1$s.bs"
+
+%2$s : %1$s.bs %3$s
+    $(NOECHO) $(RM_RF) %2$s
+    - $(CP_NONEMPTY) %1$s.bs %2$s $(PERM_RW)
+MAKE_FRAG
+}
+
+=item dynamic_lib (o)
+
+Defines how to produce the *.so (or equivalent) files.
+
+=cut
+
+sub dynamic_lib {
+    my($self, %attribs) = @_;
+    return '' unless $self->needs_linking(); #might be because of a subdir
+    return '' unless $self->has_link_code;
+    my @m = $self->xs_dynamic_lib_macros(\%attribs);
+    my @libs;
+    my $dlsyms_ext = eval { $self->xs_dlsyms_ext };
+    if ($self->{XSMULTI}) {
+        my @exts = $self->_xs_list_basenames;
+        for my $ext (@exts) {
+            my ($v, $d, $f) = File::Spec->splitpath($ext);
+            my @d = File::Spec->splitdir($d);
+            shift @d if $d[0] eq 'lib';
+            my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+
+            # Dynamic library names may need special handling.
+            eval { require DynaLoader };
+            if (defined &DynaLoader::mod2fname) {
+                $f = &DynaLoader::mod2fname([@d, $f]);
+            }
+
+            my $instfile = $self->catfile($instdir, "$f.\$(DLEXT)");
+            my $objfile = $self->_xsbuild_value('xs', $ext, 'OBJECT');
+            $objfile = "$ext\$(OBJ_EXT)" unless defined $objfile;
+            my $ldfrom = $self->_xsbuild_value('xs', $ext, 'LDFROM');
+            $ldfrom = $objfile unless defined $ldfrom;
+            my $exportlist = "$ext.def";
+            my @libchunk = ($objfile, $instfile, $instdir, $ldfrom, $exportlist);
+            push @libchunk, $dlsyms_ext ? $ext.$dlsyms_ext : undef;
+            push @libs, \@libchunk;
+        }
+    } else {
+        my @libchunk = qw($(OBJECT) $(INST_DYNAMIC) $(INST_ARCHAUTODIR) $(LDFROM) $(EXPORT_LIST));
+        push @libchunk, $dlsyms_ext ? '$(BASEEXT)'.$dlsyms_ext : undef;
+        @libs = (\@libchunk);
+    }
+    push @m, map { $self->xs_make_dynamic_lib(\%attribs, @$_); } @libs;
+
+    return join("\n",@m);
+}
+
+=item xs_dynamic_lib_macros
+
+Defines the macros for the C<dynamic_lib> section.
+
+=cut
+
+sub xs_dynamic_lib_macros {
+    my ($self, $attribs) = @_;
+    my $otherldflags = $attribs->{OTHERLDFLAGS} || "";
+    my $inst_dynamic_dep = $attribs->{INST_DYNAMIC_DEP} || "";
+    my $armaybe = $self->_xs_armaybe($attribs);
+    my $ld_opt = $Is{OS2} ? '$(OPTIMIZE) ' : ''; # Useful on other systems too?
+    my $ld_fix = $Is{OS2} ? '|| ( $(RM_F) $@ && sh -c false )' : '';
+    sprintf <<'EOF', $armaybe, $ld_opt.$otherldflags, $inst_dynamic_dep, $ld_fix;
+# This section creates the dynamically loadable objects from relevant
+# objects and possibly $(MYEXTLIB).
+ARMAYBE = %s
+OTHERLDFLAGS = %s
+INST_DYNAMIC_DEP = %s
+INST_DYNAMIC_FIX = %s
+EOF
+}
+
+sub _xs_armaybe {
+    my ($self, $attribs) = @_;
+    my $armaybe = $attribs->{ARMAYBE} || $self->{ARMAYBE} || ":";
+    $armaybe = 'ar' if ($Is{OSF} and $armaybe eq ':');
+    $armaybe;
+}
+
+=item xs_make_dynamic_lib
+
+Defines the recipes for the C<dynamic_lib> section.
+
+=cut
+
+sub xs_make_dynamic_lib {
+    my ($self, $attribs, $object, $to, $todir, $ldfrom, $exportlist, $dlsyms) = @_;
+    $exportlist = '' if $exportlist ne '$(EXPORT_LIST)';
+    my $armaybe = $self->_xs_armaybe($attribs);
+    my @m = sprintf '%s : %s $(MYEXTLIB) %s$(DFSEP).exists %s $(PERL_ARCHIVEDEP) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP) %s'."\n", $to, $object, $todir, $exportlist, ($dlsyms || '');
+    my $dlsyms_arg = $self->xs_dlsyms_arg($dlsyms);
+    if ($armaybe ne ':'){
+        $ldfrom = 'tmp$(LIB_EXT)';
+        push(@m,"    \$(ARMAYBE) cr $ldfrom $object\n");
+        push(@m,"    \$(RANLIB) $ldfrom\n");
+    }
+    $ldfrom = "-all $ldfrom -none" if $Is{OSF};
+
+    # The IRIX linker doesn't use LD_RUN_PATH
+    my $ldrun = $Is{IRIX} && $self->{LD_RUN_PATH} ?
+                       qq{-rpath "$self->{LD_RUN_PATH}"} : '';
+
+    # For example in AIX the shared objects/libraries from previous builds
+    # linger quite a while in the shared dynalinker cache even when nobody
+    # is using them.  This is painful if one for instance tries to restart
+    # a failed build because the link command will fail unnecessarily 'cos
+    # the shared object/library is 'busy'.
+    push(@m,"    \$(RM_F) \$\@\n");
+
+    my $libs = '$(LDLOADLIBS)';
+    if (($Is{NetBSD} || $Is{Interix} || $Is{Android}) && $Config{'useshrplib'} eq 'true') {
+        # Use nothing on static perl platforms, and to the flags needed
+        # to link against the shared libperl library on shared perl
+        # platforms.  We peek at lddlflags to see if we need -Wl,-R
+        # or -R to add paths to the run-time library search path.
+        if ($Config{'lddlflags'} =~ /-Wl,-R/) {
+            $libs .= ' "-L$(PERL_INC)" "-Wl,-R$(INSTALLARCHLIB)/CORE" "-Wl,-R$(PERL_ARCHLIB)/CORE" -lperl';
+        } elsif ($Config{'lddlflags'} =~ /-R/) {
+            $libs .= ' "-L$(PERL_INC)" "-R$(INSTALLARCHLIB)/CORE" "-R$(PERL_ARCHLIB)/CORE" -lperl';
+        } elsif ( $Is{Android} ) {
+            # The Android linker will not recognize symbols from
+            # libperl unless the module explicitly depends on it.
+            $libs .= ' "-L$(PERL_INC)" -lperl';
+        }
+    }
+
+    my $ld_run_path_shell = "";
+    if ($self->{LD_RUN_PATH} ne "") {
+        $ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" ';
+    }
+
+    push @m, sprintf <<'MAKE', $ld_run_path_shell, $ldrun, $dlsyms_arg, $ldfrom, $self->xs_obj_opt('$@'), $libs, $exportlist;
+    %s$(LD) %s $(LDDLFLAGS) %s %s $(OTHERLDFLAGS) %s $(MYEXTLIB) \
+      $(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) %s \
+      $(INST_DYNAMIC_FIX)
+    $(CHMOD) $(PERM_RWX) $@
+MAKE
+    join '', @m;
+}
+
+=item exescan
+
+Deprecated method. Use libscan instead.
+
+=cut
+
+sub exescan {
+    my($self,$path) = @_;
+    $path;
+}
+
+=item extliblist
+
+Called by init_others, and calls ext ExtUtils::Liblist. See
+L<ExtUtils::Liblist> for details.
+
+=cut
+
+sub extliblist {
+    my($self,$libs) = @_;
+    require ExtUtils::Liblist;
+    $self->ext($libs, $Verbose);
+}
+
+=item find_perl
+
+Finds the executables PERL and FULLPERL
+
+=cut
+
+sub find_perl {
+    my($self, $ver, $names, $dirs, $trace) = @_;
+
+    if ($trace >= 2){
+        print "Looking for perl $ver by these names:
+@$names
+in these dirs:
+@$dirs
+";
+    }
+
+    my $stderr_duped = 0;
+    local *STDERR_COPY;
+
+    unless ($Is{BSD}) {
+        # >& and lexical filehandles together give 5.6.2 indigestion
+        if( open(STDERR_COPY, '>&STDERR') ) {  ## no critic
+            $stderr_duped = 1;
+        }
+        else {
+            warn <<WARNING;
+find_perl() can't dup STDERR: $!
+You might see some garbage while we search for Perl
+WARNING
+        }
+    }
+
+    foreach my $name (@$names){
+        my ($abs, $use_dir);
+        if ($self->file_name_is_absolute($name)) {     # /foo/bar
+            $abs = $name;
+        } elsif ($self->canonpath($name) eq
+                 $self->canonpath(basename($name))) {  # foo
+            $use_dir = 1;
+        } else {                                            # foo/bar
+            $abs = $self->catfile($Curdir, $name);
+        }
+        foreach my $dir ($use_dir ? @$dirs : 1){
+            next unless defined $dir; # $self->{PERL_SRC} may be undefined
+
+            $abs = $self->catfile($dir, $name)
+                if $use_dir;
+
+            print "Checking $abs\n" if ($trace >= 2);
+            next unless $self->maybe_command($abs);
+            print "Executing $abs\n" if ($trace >= 2);
+
+            my $val;
+            my $version_check = qq{"$abs" -le "require $ver; print qq{VER_OK}"};
+
+            # To avoid using the unportable 2>&1 to suppress STDERR,
+            # we close it before running the command.
+            # However, thanks to a thread library bug in many BSDs
+            # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 )
+            # we cannot use the fancier more portable way in here
+            # but instead need to use the traditional 2>&1 construct.
+            if ($Is{BSD}) {
+                $val = `$version_check 2>&1`;
+            } else {
+                close STDERR if $stderr_duped;
+                $val = `$version_check`;
+
+                # 5.6.2's 3-arg open doesn't work with >&
+                open STDERR, ">&STDERR_COPY"  ## no critic
+                        if $stderr_duped;
+            }
+
+            if ($val =~ /^VER_OK/m) {
+                print "Using PERL=$abs\n" if $trace;
+                return $abs;
+            } elsif ($trace >= 2) {
+                print "Result: '$val' ".($? >> 8)."\n";
+            }
+        }
+    }
+    print "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+    0; # false and not empty
+}
+
+
+=item fixin
+
+  $mm->fixin(@files);
+
+Inserts the sharpbang or equivalent magic number to a set of @files.
+
+=cut
+
+sub fixin {    # stolen from the pink Camel book, more or less
+    my ( $self, @files ) = @_;
+
+    for my $file (@files) {
+        my $file_new = "$file.new";
+        my $file_bak = "$file.bak";
+
+        open( my $fixin, '<', $file ) or croak "Can't process '$file': $!";
+        local $/ = "\n";
+        chomp( my $line = <$fixin> );
+        next unless $line =~ s/^\s*\#!\s*//;    # Not a shebang file.
+
+        my $shb = $self->_fixin_replace_shebang( $file, $line );
+        next unless defined $shb;
+
+        open( my $fixout, ">", "$file_new" ) or do {
+            warn "Can't create new $file: $!\n";
+            next;
+        };
+
+        # Print out the new #! line (or equivalent).
+        local $\;
+        local $/;
+        print $fixout $shb, <$fixin>;
+        close $fixin;
+        close $fixout;
+
+        chmod 0666, $file_bak;
+        unlink $file_bak;
+        unless ( _rename( $file, $file_bak ) ) {
+            warn "Can't rename $file to $file_bak: $!";
+            next;
+        }
+        unless ( _rename( $file_new, $file ) ) {
+            warn "Can't rename $file_new to $file: $!";
+            unless ( _rename( $file_bak, $file ) ) {
+                warn "Can't rename $file_bak back to $file either: $!";
+                warn "Leaving $file renamed as $file_bak\n";
+            }
+            next;
+        }
+        unlink $file_bak;
+    }
+    continue {
+        system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+    }
+}
+
+
+sub _rename {
+    my($old, $new) = @_;
+
+    foreach my $file ($old, $new) {
+        if( $Is{VMS} and basename($file) !~ /\./ ) {
+            # rename() in 5.8.0 on VMS will not rename a file if it
+            # does not contain a dot yet it returns success.
+            $file = "$file.";
+        }
+    }
+
+    return rename($old, $new);
+}
+
+sub _fixin_replace_shebang {
+    my ( $self, $file, $line ) = @_;
+
+    # Now figure out the interpreter name.
+    my ( $cmd, $arg ) = split ' ', $line, 2;
+    $cmd =~ s!^.*/!!;
+
+    # Now look (in reverse) for interpreter in absolute PATH (unless perl).
+    my $interpreter;
+    if ( $cmd =~ m{^perl(?:\z|[^a-z])} ) {
+        if ( $Config{startperl} =~ m,^\#!.*/perl, ) {
+            $interpreter = $Config{startperl};
+            $interpreter =~ s,^\#!,,;
+        }
+        else {
+            $interpreter = $Config{perlpath};
+        }
+    }
+    else {
+        my (@absdirs)
+            = reverse grep { $self->file_name_is_absolute($_) } $self->path;
+        $interpreter = '';
+
+        foreach my $dir (@absdirs) {
+            my $maybefile = $self->catfile($dir,$cmd);
+            if ( $self->maybe_command($maybefile) ) {
+                warn "Ignoring $interpreter in $file\n"
+                    if $Verbose && $interpreter;
+                $interpreter = $maybefile;
+            }
+        }
+    }
+
+    # Figure out how to invoke interpreter on this machine.
+
+    my ($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/;
+    my ($shb) = "";
+    if ($interpreter) {
+        print "Changing sharpbang in $file to $interpreter"
+            if $Verbose;
+         # this is probably value-free on DOSISH platforms
+        if ($does_shbang) {
+            $shb .= "$Config{'sharpbang'}$interpreter";
+            $shb .= ' ' . $arg if defined $arg;
+            $shb .= "\n";
+        }
+    }
+    else {
+        warn "Can't find $cmd in PATH, $file unchanged"
+            if $Verbose;
+        return;
+    }
+    return $shb
+}
+
+=item force (o)
+
+Writes an empty FORCE: target.
+
+=cut
+
+sub force {
+    my($self) = shift;
+    '# Phony target to force checking subdirectories.
+FORCE :
+    $(NOECHO) $(NOOP)
+';
+}
+
+=item guess_name
+
+Guess the name of this package by examining the working directory's
+name. MakeMaker calls this only if the developer has not supplied a
+NAME attribute.
+
+=cut
+
+# ';
+
+sub guess_name {
+    my($self) = @_;
+    use Cwd 'cwd';
+    my $name = basename(cwd());
+    $name =~ s|[\-_][\d\.\-]+\z||;  # this is new with MM 5.00, we
+                                    # strip minus or underline
+                                    # followed by a float or some such
+    print "Warning: Guessing NAME [$name] from current directory name.\n";
+    $name;
+}
+
+=item has_link_code
+
+Returns true if C, XS, MYEXTLIB or similar objects exist within this
+object that need a compiler. Does not descend into subdirectories as
+needs_linking() does.
+
+=cut
+
+sub has_link_code {
+    my($self) = shift;
+    return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
+    if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
+    $self->{HAS_LINK_CODE} = 1;
+    return 1;
+    }
+    return $self->{HAS_LINK_CODE} = 0;
+}
+
+
+=item init_dirscan
+
+Scans the directory structure and initializes DIR, XS, XS_FILES,
+C, C_FILES, O_FILES, H, H_FILES, PL_FILES, EXE_FILES.
+
+Called by init_main.
+
+=cut
+
+sub init_dirscan {    # --- File and Directory Lists (.xs .pm .pod etc)
+    my($self) = @_;
+    my(%dir, %xs, %c, %o, %h, %pl_files, %pm);
+
+    my %ignore = map {( $_ => 1 )} qw(Makefile.PL Build.PL test.pl t);
+
+    # ignore the distdir
+    $Is{VMS} ? $ignore{"$self->{DISTVNAME}.dir"} = 1
+            : $ignore{$self->{DISTVNAME}} = 1;
+
+    my $distprefix = $Is{VMS} ? qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+\.dir$/i
+                              : qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+$/;
+
+    @ignore{map lc, keys %ignore} = values %ignore if $Is{VMS};
+
+    if ( defined $self->{XS} and !defined $self->{C} ) {
+    my @c_files = grep { m/\.c(pp|xx)?\z/i } values %{$self->{XS}};
+    my @o_files = grep { m/(?:.(?:o(?:bj)?)|\$\(OBJ_EXT\))\z/i } values %{$self->{XS}};
+    %c = map { $_ => 1 } @c_files;
+    %o = map { $_ => 1 } @o_files;
+    }
+
+    foreach my $name ($self->lsdir($Curdir)){
+    next if $name =~ /\#/;
+    next if $name =~ $distprefix && -d $name;
+    $name = lc($name) if $Is{VMS};
+    next if $name eq $Curdir or $name eq $Updir or $ignore{$name};
+    next unless $self->libscan($name);
+    if (-d $name){
+        next if -l $name; # We do not support symlinks at all
+            next if $self->{NORECURS};
+        $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
+    } elsif ($name =~ /\.xs\z/){
+        my($c); ($c = $name) =~ s/\.xs\z/.c/;
+        $xs{$name} = $c;
+        $c{$c} = 1;
+    } elsif ($name =~ /\.c(pp|xx|c)?\z/i){  # .c .C .cpp .cxx .cc
+        $c{$name} = 1
+        unless $name =~ m/perlmain\.c/; # See MAP_TARGET
+    } elsif ($name =~ /\.h\z/i){
+        $h{$name} = 1;
+    } elsif ($name =~ /\.PL\z/) {
+        ($pl_files{$name} = $name) =~ s/\.PL\z// ;
+    } elsif (($Is{VMS} || $Is{Dos}) && $name =~ /[._]pl$/i) {
+        # case-insensitive filesystem, one dot per name, so foo.h.PL
+        # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
+        local($/); open(my $pl, '<', $name); my $txt = <$pl>; close $pl;
+        if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
+        ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
+        }
+        else {
+                $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name);
+            }
+    } elsif ($name =~ /\.(p[ml]|pod)\z/){
+        $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name);
+    }
+    }
+
+    $self->{PL_FILES}   ||= \%pl_files;
+    $self->{DIR}        ||= [sort keys %dir];
+    $self->{XS}         ||= \%xs;
+    $self->{C}          ||= [sort keys %c];
+    $self->{H}          ||= [sort keys %h];
+    $self->{PM}         ||= \%pm;
+
+    my @o_files = @{$self->{C}};
+    %o = (%o, map { $_ => 1 } grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files);
+    $self->{O_FILES} = [sort keys %o];
+}
+
+
+=item init_MANPODS
+
+Determines if man pages should be generated and initializes MAN1PODS
+and MAN3PODS as appropriate.
+
+=cut
+
+sub init_MANPODS {
+    my $self = shift;
+
+    # Set up names of manual pages to generate from pods
+    foreach my $man (qw(MAN1 MAN3)) {
+        if ( $self->{"${man}PODS"}
+             or $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/
+        ) {
+            $self->{"${man}PODS"} ||= {};
+        }
+        else {
+            my $init_method = "init_${man}PODS";
+            $self->$init_method();
+        }
+    }
+}
+
+
+sub _has_pod {
+    my($self, $file) = @_;
+
+    my($ispod)=0;
+    if (open( my $fh, '<', $file )) {
+        while (<$fh>) {
+            if (/^=(?:head\d+|item|pod)\b/) {
+                $ispod=1;
+                last;
+            }
+        }
+        close $fh;
+    } else {
+        # If it doesn't exist yet, we assume, it has pods in it
+        $ispod = 1;
+    }
+
+    return $ispod;
+}
+
+
+=item init_MAN1PODS
+
+Initializes MAN1PODS from the list of EXE_FILES.
+
+=cut
+
+sub init_MAN1PODS {
+    my($self) = @_;
+
+    if ( exists $self->{EXE_FILES} ) {
+    foreach my $name (@{$self->{EXE_FILES}}) {
+        next unless $self->_has_pod($name);
+
+        $self->{MAN1PODS}->{$name} =
+        $self->catfile("\$(INST_MAN1DIR)",
+                   basename($name).".\$(MAN1EXT)");
+    }
+    }
+}
+
+
+=item init_MAN3PODS
+
+Initializes MAN3PODS from the list of PM files.
+
+=cut
+
+sub init_MAN3PODS {
+    my $self = shift;
+
+    my %manifypods = (); # we collect the keys first, i.e. the files
+                         # we have to convert to pod
+
+    foreach my $name (keys %{$self->{PM}}) {
+    if ($name =~ /\.pod\z/ ) {
+        $manifypods{$name} = $self->{PM}{$name};
+    } elsif ($name =~ /\.p[ml]\z/ ) {
+        if( $self->_has_pod($name) ) {
+        $manifypods{$name} = $self->{PM}{$name};
+        }
+    }
+    }
+
+    my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}};
+
+    # Remove "Configure.pm" and similar, if it's not the only pod listed
+    # To force inclusion, just name it "Configure.pod", or override
+    # MAN3PODS
+    foreach my $name (keys %manifypods) {
+    if (
+            ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) or
+            ( $name =~ m/^README\.pod$/i ) # don't manify top-level README.pod
+        ) {
+        delete $manifypods{$name};
+        next;
+    }
+    my($manpagename) = $name;
+    $manpagename =~ s/\.p(od|m|l)\z//;
+    # everything below lib is ok
+    unless($manpagename =~ s!^\W*($parentlibs_re)\W+!!s) {
+        $manpagename = $self->catfile(
+            split(/::/,$self->{PARENT_NAME}),$manpagename
+        );
+    }
+    $manpagename = $self->replace_manpage_separator($manpagename);
+    $self->{MAN3PODS}->{$name} =
+        $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
+    }
+}
+
+
+=item init_PM
+
+Initializes PMLIBDIRS and PM from PMLIBDIRS.
+
+=cut
+
+sub init_PM {
+    my $self = shift;
+
+    # Some larger extensions often wish to install a number of *.pm/pl
+    # files into the library in various locations.
+
+    # The attribute PMLIBDIRS holds an array reference which lists
+    # subdirectories which we should search for library files to
+    # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ].  We
+    # recursively search through the named directories (skipping any
+    # which don't exist or contain Makefile.PL files).
+
+    # For each *.pm or *.pl file found $self->libscan() is called with
+    # the default installation path in $_[1]. The return value of
+    # libscan defines the actual installation location.  The default
+    # libscan function simply returns the path.  The file is skipped
+    # if libscan returns false.
+
+    # The default installation location passed to libscan in $_[1] is:
+    #
+    #  ./*.pm        => $(INST_LIBDIR)/*.pm
+    #  ./xyz/...    => $(INST_LIBDIR)/xyz/...
+    #  ./lib/...    => $(INST_LIB)/...
+    #
+    # In this way the 'lib' directory is seen as the root of the actual
+    # perl library whereas the others are relative to INST_LIBDIR
+    # (which includes PARENT_NAME). This is a subtle distinction but one
+    # that's important for nested modules.
+
+    unless( $self->{PMLIBDIRS} ) {
+        if( $Is{VMS} ) {
+            # Avoid logical name vs directory collisions
+            $self->{PMLIBDIRS} = ['./lib', "./$self->{BASEEXT}"];
+        }
+        else {
+            $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}];
+        }
+    }
+
+    #only existing directories that aren't in $dir are allowed
+
+    # Avoid $_ wherever possible:
+    # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
+    my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
+    @{$self->{PMLIBDIRS}} = ();
+    my %dir = map { ($_ => $_) } @{$self->{DIR}};
+    foreach my $pmlibdir (@pmlibdirs) {
+    -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
+    }
+
+    unless( $self->{PMLIBPARENTDIRS} ) {
+    @{$self->{PMLIBPARENTDIRS}} = ('lib');
+    }
+
+    return if $self->{PM} and $self->{ARGS}{PM};
+
+    if (@{$self->{PMLIBDIRS}}){
+    print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
+        if ($Verbose >= 2);
+    require File::Find;
+        File::Find::find(sub {
+            if (-d $_){
+                unless ($self->libscan($_)){
+                    $File::Find::prune = 1;
+                }
+                return;
+            }
+            return if /\#/;
+            return if /~$/;             # emacs temp files
+            return if /,v$/;            # RCS files
+            return if m{\.swp$};        # vim swap files
+
+        my $path   = $File::Find::name;
+            my $prefix = $self->{INST_LIBDIR};
+            my $striplibpath;
+
+        my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}};
+        $prefix =  $self->{INST_LIB}
+                if ($striplibpath = $path) =~ s{^(\W*)($parentlibs_re)\W}
+                                           {$1}i;
+
+        my($inst) = $self->catfile($prefix,$striplibpath);
+        local($_) = $inst; # for backwards compatibility
+        $inst = $self->libscan($inst);
+        print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
+        return unless $inst;
+        if ($self->{XSMULTI} and $inst =~ /\.xs\z/) {
+        my($base); ($base = $path) =~ s/\.xs\z//;
+        $self->{XS}{$path} = "$base.c";
+        push @{$self->{C}}, "$base.c";
+        push @{$self->{O_FILES}}, "$base$self->{OBJ_EXT}";
+        } else {
+        $self->{PM}{$path} = $inst;
+        }
+    }, @{$self->{PMLIBDIRS}});
+    }
+}
+
+
+=item init_DIRFILESEP
+
+Using / for Unix.  Called by init_main.
+
+=cut
+
+sub init_DIRFILESEP {
+    my($self) = shift;
+
+    $self->{DIRFILESEP} = '/';
+}
+
+
+=item init_main
+
+Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE,
+EXE_EXT, FULLEXT, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, INST_*,
+INSTALL*, INSTALLDIRS, LIB_EXT, LIBPERL_A, MAP_TARGET, NAME,
+OBJ_EXT, PARENT_NAME, PERL, PERL_ARCHLIB, PERL_INC, PERL_LIB,
+PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, VERSION,
+VERSION_SYM, XS_VERSION.
+
+=cut
+
+sub init_main {
+    my($self) = @_;
+
+    # --- Initialize Module Name and Paths
+
+    # NAME    = Foo::Bar::Oracle
+    # FULLEXT = Foo/Bar/Oracle
+    # BASEEXT = Oracle
+    # PARENT_NAME = Foo::Bar
+### Only UNIX:
+###    ($self->{FULLEXT} =
+###     $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
+    $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
+
+
+    # Copied from DynaLoader:
+
+    my(@modparts) = split(/::/,$self->{NAME});
+    my($modfname) = $modparts[-1];
+
+    # Some systems have restrictions on files names for DLL's etc.
+    # mod2fname returns appropriate file base name (typically truncated)
+    # It may also edit @modparts if required.
+    # We require DynaLoader to make sure that mod2fname is loaded
+    eval { require DynaLoader };
+    if (defined &DynaLoader::mod2fname) {
+        $modfname = &DynaLoader::mod2fname(\@modparts);
+    }
+
+    ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
+    $self->{PARENT_NAME} ||= '';
+
+    if (defined &DynaLoader::mod2fname) {
+    # As of 5.001m, dl_os2 appends '_'
+    $self->{DLBASE} = $modfname;
+    } else {
+    $self->{DLBASE} = '$(BASEEXT)';
+    }
+
+
+    # --- Initialize PERL_LIB, PERL_SRC
+
+    # *Real* information: where did we get these two from? ...
+    my $inc_config_dir = dirname($INC{'Config.pm'});
+    my $inc_carp_dir   = dirname($INC{'Carp.pm'});
+
+    unless ($self->{PERL_SRC}){
+        foreach my $dir_count (1..8) { # 8 is the VMS limit for nesting
+            my $dir = $self->catdir(($Updir) x $dir_count);
+
+            if (-f $self->catfile($dir,"config_h.SH")   &&
+                -f $self->catfile($dir,"perl.h")        &&
+                -f $self->catfile($dir,"lib","strict.pm")
+            ) {
+                $self->{PERL_SRC}=$dir ;
+                last;
+            }
+        }
+    }
+
+    warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if
+      $self->{PERL_CORE} and !$self->{PERL_SRC};
+
+    if ($self->{PERL_SRC}){
+    $self->{PERL_LIB}     ||= $self->catdir("$self->{PERL_SRC}","lib");
+
+        $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
+        $self->{PERL_INC}     = ($Is{Win32}) ?
+            $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
+
+    # catch a situation that has occurred a few times in the past:
+    unless (
+        -s $self->catfile($self->{PERL_SRC},'cflags')
+        or
+        $Is{VMS}
+        &&
+        -s $self->catfile($self->{PERL_SRC},'vmsish.h')
+        or
+        $Is{Win32}
+           ){
+        warn qq{
+You cannot build extensions below the perl source tree after executing
+a 'make clean' in the perl source tree.
+
+To rebuild extensions distributed with the perl source you should
+simply Configure (to include those extensions) and then build perl as
+normal. After installing perl the source tree can be deleted. It is
+not needed for building extensions by running 'perl Makefile.PL'
+usually without extra arguments.
+
+It is recommended that you unpack and build additional extensions away
+from the perl source tree.
+};
+    }
+    } else {
+    # we should also consider $ENV{PERL5LIB} here
+        my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
+    $self->{PERL_LIB}     ||= $Config{privlibexp};
+    $self->{PERL_ARCHLIB} ||= $Config{archlibexp};
+    $self->{PERL_INC}     = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
+    my $perl_h;
+
+    if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
+        and not $old){
+        # Maybe somebody tries to build an extension with an
+        # uninstalled Perl outside of Perl build tree
+        my $lib;
+        for my $dir (@INC) {
+          $lib = $dir, last if -e $self->catfile($dir, "Config.pm");
+        }
+        if ($lib) {
+              # Win32 puts its header files in /perl/src/lib/CORE.
+              # Unix leaves them in /perl/src.
+          my $inc = $Is{Win32} ? $self->catdir($lib, "CORE" )
+                                  : dirname $lib;
+          if (-e $self->catfile($inc, "perl.h")) {
+        $self->{PERL_LIB}       = $lib;
+        $self->{PERL_ARCHLIB}       = $lib;
+        $self->{PERL_INC}       = $inc;
+        $self->{UNINSTALLED_PERL}  = 1;
+        print <<EOP;
+... Detected uninstalled Perl.  Trying to continue.
+EOP
+          }
+        }
+    }
+    }
+
+    if ($Is{Android}) {
+        # Android fun times!
+        # ../../perl -I../../lib -MFile::Glob -e1 works
+        # ../../../perl -I../../../lib -MFile::Glob -e1 fails to find
+        # the .so for File::Glob.
+        # This always affects core perl, but may also affect an installed
+        # perl built with -Duserelocatableinc.
+        $self->{PERL_LIB} = File::Spec->rel2abs($self->{PERL_LIB});
+        $self->{PERL_ARCHLIB} = File::Spec->rel2abs($self->{PERL_ARCHLIB});
+    }
+    $self->{PERL_INCDEP} = $self->{PERL_INC};
+    $self->{PERL_ARCHLIBDEP} = $self->{PERL_ARCHLIB};
+
+    # We get SITELIBEXP and SITEARCHEXP directly via
+    # Get_from_Config. When we are running standard modules, these
+    # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
+    # set it to "site". I prefer that INSTALLDIRS be set from outside
+    # MakeMaker.
+    $self->{INSTALLDIRS} ||= "site";
+
+    $self->{MAN1EXT} ||= $Config{man1ext};
+    $self->{MAN3EXT} ||= $Config{man3ext};
+
+    # Get some stuff out of %Config if we haven't yet done so
+    print "CONFIG must be an array ref\n"
+        if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
+    $self->{CONFIG} = [] unless (ref $self->{CONFIG});
+    push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
+    push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags};
+    my(%once_only);
+    foreach my $m (@{$self->{CONFIG}}){
+        next if $once_only{$m};
+        print "CONFIG key '$m' does not exist in Config.pm\n"
+                unless exists $Config{$m};
+        $self->{uc $m} ||= $Config{$m};
+        $once_only{$m} = 1;
+    }
+
+# This is too dangerous:
+#    if ($^O eq "next") {
+#    $self->{AR} = "libtool";
+#    $self->{AR_STATIC_ARGS} = "-o";
+#    }
+# But I leave it as a placeholder
+
+    $self->{AR_STATIC_ARGS} ||= "cr";
+
+    # These should never be needed
+    $self->{OBJ_EXT} ||= '.o';
+    $self->{LIB_EXT} ||= '.a';
+
+    $self->{MAP_TARGET} ||= "perl";
+
+    $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
+
+    # make a simple check if we find strict
+    warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
+        (strict.pm not found)"
+        unless -f $self->catfile("$self->{PERL_LIB}","strict.pm") ||
+               $self->{NAME} eq "ExtUtils::MakeMaker";
+}
+
+=item init_tools
+
+Initializes tools to use their common (and faster) Unix commands.
+
+=cut
+
+sub init_tools {
+    my $self = shift;
+
+    $self->{ECHO}       ||= 'echo';
+    $self->{ECHO_N}     ||= 'echo -n';
+    $self->{RM_F}       ||= "rm -f";
+    $self->{RM_RF}      ||= "rm -rf";
+    $self->{TOUCH}      ||= "touch";
+    $self->{TEST_F}     ||= "test -f";
+    $self->{TEST_S}     ||= "test -s";
+    $self->{CP}         ||= "cp";
+    $self->{MV}         ||= "mv";
+    $self->{CHMOD}      ||= "chmod";
+    $self->{FALSE}      ||= 'false';
+    $self->{TRUE}       ||= 'true';
+
+    $self->{LD}         ||= 'ld';
+
+    return $self->SUPER::init_tools(@_);
+
+    # After SUPER::init_tools so $Config{shell} has a
+    # chance to get set.
+    $self->{SHELL}      ||= '/bin/sh';
+
+    return;
+}
+
+
+=item init_linker
+
+Unix has no need of special linker flags.
+
+=cut
+
+sub init_linker {
+    my($self) = shift;
+    $self->{PERL_ARCHIVE} ||= '';
+    $self->{PERL_ARCHIVEDEP} ||= '';
+    $self->{PERL_ARCHIVE_AFTER} ||= '';
+    $self->{EXPORT_LIST}  ||= '';
+}
+
+
+=begin _protected
+
+=item init_lib2arch
+
+    $mm->init_lib2arch
+
+=end _protected
+
+=cut
+
+sub init_lib2arch {
+    my($self) = shift;
+
+    # The user who requests an installation directory explicitly
+    # should not have to tell us an architecture installation directory
+    # as well. We look if a directory exists that is named after the
+    # architecture. If not we take it as a sign that it should be the
+    # same as the requested installation directory. Otherwise we take
+    # the found one.
+    for my $libpair ({l=>"privlib",   a=>"archlib"},
+                     {l=>"sitelib",   a=>"sitearch"},
+                     {l=>"vendorlib", a=>"vendorarch"},
+                    )
+    {
+        my $lib = "install$libpair->{l}";
+        my $Lib = uc $lib;
+        my $Arch = uc "install$libpair->{a}";
+        if( $self->{$Lib} && ! $self->{$Arch} ){
+            my($ilib) = $Config{$lib};
+
+            $self->prefixify($Arch,$ilib,$self->{$Lib});
+
+            unless (-d $self->{$Arch}) {
+                print "Directory $self->{$Arch} not found\n"
+                  if $Verbose;
+                $self->{$Arch} = $self->{$Lib};
+            }
+            print "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
+        }
+    }
+}
+
+
+=item init_PERL
+
+    $mm->init_PERL;
+
+Called by init_main.  Sets up ABSPERL, PERL, FULLPERL and all the
+*PERLRUN* permutations.
+
+    PERL is allowed to be miniperl
+    FULLPERL must be a complete perl
+
+    ABSPERL is PERL converted to an absolute path
+
+    *PERLRUN contains everything necessary to run perl, find it's
+         libraries, etc...
+
+    *PERLRUNINST is *PERLRUN + everything necessary to find the
+         modules being built.
+
+=cut
+
+sub init_PERL {
+    my($self) = shift;
+
+    my @defpath = ();
+    foreach my $component ($self->{PERL_SRC}, $self->path(),
+                           $Config{binexp})
+    {
+    push @defpath, $component if defined $component;
+    }
+
+    # Build up a set of file names (not command names).
+    my $thisperl = $self->canonpath($^X);
+    $thisperl .= $Config{exe_ext} unless
+                # VMS might have a file version # at the end
+      $Is{VMS} ? $thisperl =~ m/$Config{exe_ext}(;\d+)?$/i
+              : $thisperl =~ m/$Config{exe_ext}$/i;
+
+    # We need a relative path to perl when in the core.
+    $thisperl = $self->abs2rel($thisperl) if $self->{PERL_CORE};
+
+    my @perls = ($thisperl);
+    push @perls, map { "$_$Config{exe_ext}" }
+                     ("perl$Config{version}", 'perl5', 'perl');
+
+    # miniperl has priority over all but the canonical perl when in the
+    # core.  Otherwise its a last resort.
+    my $miniperl = "miniperl$Config{exe_ext}";
+    if( $self->{PERL_CORE} ) {
+        splice @perls, 1, 0, $miniperl;
+    }
+    else {
+        push @perls, $miniperl;
+    }
+
+    $self->{PERL} ||=
+        $self->find_perl(5.0, \@perls, \@defpath, $Verbose );
+
+    my $perl = $self->{PERL};
+    $perl =~ s/^"//;
+    my $has_mcr = $perl =~ s/^MCR\s*//;
+    my $perlflags = '';
+    my $stripped_perl;
+    while ($perl) {
+    ($stripped_perl = $perl) =~ s/"$//;
+    last if -x $stripped_perl;
+    last unless $perl =~ s/(\s+\S+)$//;
+    $perlflags = $1.$perlflags;
+    }
+    $self->{PERL} = $stripped_perl;
+    $self->{PERL} = 'MCR '.$self->{PERL} if $has_mcr || $Is{VMS};
+
+    # When built for debugging, VMS doesn't create perl.exe but ndbgperl.exe.
+    my $perl_name = 'perl';
+    $perl_name = 'ndbgperl' if $Is{VMS} &&
+      defined $Config{usevmsdebug} && $Config{usevmsdebug} eq 'define';
+
+    # XXX This logic is flawed.  If "miniperl" is anywhere in the path
+    # it will get confused.  It should be fixed to work only on the filename.
+    # Define 'FULLPERL' to be a non-miniperl (used in test: target)
+    unless ($self->{FULLPERL}) {
+      ($self->{FULLPERL} = $self->{PERL}) =~ s/\Q$miniperl\E$/$perl_name$Config{exe_ext}/i;
+      $self->{FULLPERL} = qq{"$self->{FULLPERL}"}.$perlflags;
+    }
+    # Can't have an image name with quotes, and findperl will have
+    # already escaped spaces.
+    $self->{FULLPERL} =~ tr/"//d if $Is{VMS};
+
+    # Little hack to get around VMS's find_perl putting "MCR" in front
+    # sometimes.
+    $self->{ABSPERL} = $self->{PERL};
+    $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//;
+    if( $self->file_name_is_absolute($self->{ABSPERL}) ) {
+        $self->{ABSPERL} = '$(PERL)';
+    }
+    else {
+        $self->{ABSPERL} = $self->rel2abs($self->{ABSPERL});
+
+        # Quote the perl command if it contains whitespace
+        $self->{ABSPERL} = $self->quote_literal($self->{ABSPERL})
+          if $self->{ABSPERL} =~ /\s/;
+
+        $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr;
+    }
+    $self->{PERL} = qq{"$self->{PERL}"}.$perlflags;
+
+    # Can't have an image name with quotes, and findperl will have
+    # already escaped spaces.
+    $self->{PERL} =~ tr/"//d if $Is{VMS};
+
+    # Are we building the core?
+    $self->{PERL_CORE} = $ENV{PERL_CORE} unless exists $self->{PERL_CORE};
+    $self->{PERL_CORE} = 0               unless defined $self->{PERL_CORE};
+
+    # Make sure perl can find itself before it's installed.
+    my $lib_paths = $self->{UNINSTALLED_PERL} || $self->{PERL_CORE}
+        ? ( $self->{PERL_ARCHLIB} && $self->{PERL_LIB} && $self->{PERL_ARCHLIB} ne $self->{PERL_LIB} ) ?
+            q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"} : q{ "-I$(PERL_LIB)"}
+        : undef;
+    my $inst_lib_paths = $self->{INST_ARCHLIB} ne $self->{INST_LIB}
+        ? 'RUN)'.$perlflags.' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"'
+        : 'RUN)'.$perlflags.' "-I$(INST_LIB)"';
+    # How do we run perl?
+    foreach my $perl (qw(PERL FULLPERL ABSPERL)) {
+        my $run  = $perl.'RUN';
+
+        $self->{$run}  = qq{\$($perl)};
+        $self->{$run} .= $lib_paths if $lib_paths;
+
+        $self->{$perl.'RUNINST'} = '$('.$perl.$inst_lib_paths;
+    }
+
+    return 1;
+}
+
+
+=item init_platform
+
+=item platform_constants
+
+Add MM_Unix_VERSION.
+
+=cut
+
+sub init_platform {
+    my($self) = shift;
+
+    $self->{MM_Unix_VERSION} = $VERSION;
+    $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '.
+                               '-Dfree=Perl_mfree -Drealloc=Perl_realloc '.
+                               '-Dcalloc=Perl_calloc';
+
+}
+
+sub platform_constants {
+    my($self) = shift;
+    my $make_frag = '';
+
+    foreach my $macro (qw(MM_Unix_VERSION PERL_MALLOC_DEF))
+    {
+        next unless defined $self->{$macro};
+        $make_frag .= "$macro = $self->{$macro}\n";
+    }
+
+    return $make_frag;
+}
+
+
+=item init_PERM
+
+  $mm->init_PERM
+
+Called by init_main.  Initializes PERL_*
+
+=cut
+
+sub init_PERM {
+    my($self) = shift;
+
+    $self->{PERM_DIR} = 755  unless defined $self->{PERM_DIR};
+    $self->{PERM_RW}  = 644  unless defined $self->{PERM_RW};
+    $self->{PERM_RWX} = 755  unless defined $self->{PERM_RWX};
+
+    return 1;
+}
+
+
+=item init_xs
+
+    $mm->init_xs
+
+Sets up macros having to do with XS code.  Currently just INST_STATIC,
+INST_DYNAMIC and INST_BOOT.
+
+=cut
+
+sub init_xs {
+    my $self = shift;
+
+    if ($self->has_link_code()) {
+        $self->{INST_STATIC}  =
+          $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT)$(LIB_EXT)');
+        $self->{INST_DYNAMIC} =
+          $self->catfile('$(INST_ARCHAUTODIR)', '$(DLBASE).$(DLEXT)');
+        $self->{INST_BOOT}    =
+          $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT).bs');
+    if ($self->{XSMULTI}) {
+        my @exts = $self->_xs_list_basenames;
+        my (@statics, @dynamics, @boots);
+        for my $ext (@exts) {
+        my ($v, $d, $f) = File::Spec->splitpath($ext);
+        my @d = File::Spec->splitdir($d);
+        shift @d if defined $d[0] and $d[0] eq 'lib';
+        my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f);
+        my $instfile = $self->catfile($instdir, $f);
+        push @statics, "$instfile\$(LIB_EXT)";
+
+                # Dynamic library names may need special handling.
+                my $dynfile = $instfile;
+                eval { require DynaLoader };
+                if (defined &DynaLoader::mod2fname) {
+                    $dynfile = $self->catfile($instdir, &DynaLoader::mod2fname([@d, $f]));
+                }
+
+        push @dynamics, "$dynfile.\$(DLEXT)";
+        push @boots, "$instfile.bs";
+        }
+        $self->{INST_STATIC} = join ' ', @statics;
+        $self->{INST_DYNAMIC} = join ' ', @dynamics;
+        $self->{INST_BOOT} = join ' ', @boots;
+    }
+    } else {
+        $self->{INST_STATIC}  = '';
+        $self->{INST_DYNAMIC} = '';
+        $self->{INST_BOOT}    = '';
+    }
+}
+
+=item install (o)
+
+Defines the install target.
+
+=cut
+
+sub install {
+    my($self, %attribs) = @_;
+    my(@m);
+
+    push @m, q{
+install :: pure_install doc_install
+    $(NOECHO) $(NOOP)
+
+install_perl :: pure_perl_install doc_perl_install
+    $(NOECHO) $(NOOP)
+
+install_site :: pure_site_install doc_site_install
+    $(NOECHO) $(NOOP)
+
+install_vendor :: pure_vendor_install doc_vendor_install
+    $(NOECHO) $(NOOP)
+
+pure_install :: pure_$(INSTALLDIRS)_install
+    $(NOECHO) $(NOOP)
+
+doc_install :: doc_$(INSTALLDIRS)_install
+    $(NOECHO) $(NOOP)
+
+pure__install : pure_site_install
+    $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+doc__install : doc_site_install
+    $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
+
+pure_perl_install :: all
+    $(NOECHO) $(MOD_INSTALL) \
+};
+
+    push @m,
+q{        read "}.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \
+        write "}.$self->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \
+} unless $self->{NO_PACKLIST};
+
+    push @m,
+q{        "$(INST_LIB)" "$(DESTINSTALLPRIVLIB)" \
+        "$(INST_ARCHLIB)" "$(DESTINSTALLARCHLIB)" \
+        "$(INST_BIN)" "$(DESTINSTALLBIN)" \
+        "$(INST_SCRIPT)" "$(DESTINSTALLSCRIPT)" \
+        "$(INST_MAN1DIR)" "$(DESTINSTALLMAN1DIR)" \
+        "$(INST_MAN3DIR)" "$(DESTINSTALLMAN3DIR)"
+    $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+        "}.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{"
+
+
+pure_site_install :: all
+    $(NOECHO) $(MOD_INSTALL) \
+};
+    push @m,
+q{        read "}.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \
+        write "}.$self->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{" \
+} unless $self->{NO_PACKLIST};
+
+    push @m,
+q{        "$(INST_LIB)" "$(DESTINSTALLSITELIB)" \
+        "$(INST_ARCHLIB)" "$(DESTINSTALLSITEARCH)" \
+        "$(INST_BIN)" "$(DESTINSTALLSITEBIN)" \
+        "$(INST_SCRIPT)" "$(DESTINSTALLSITESCRIPT)" \
+        "$(INST_MAN1DIR)" "$(DESTINSTALLSITEMAN1DIR)" \
+        "$(INST_MAN3DIR)" "$(DESTINSTALLSITEMAN3DIR)"
+    $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
+        "}.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{"
+
+pure_vendor_install :: all
+    $(NOECHO) $(MOD_INSTALL) \
+};
+    push @m,
+q{        read "}.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \
+        write "}.$self->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{" \
+} unless $self->{NO_PACKLIST};
+
+    push @m,
+q{        "$(INST_LIB)" "$(DESTINSTALLVENDORLIB)" \
+        "$(INST_ARCHLIB)" "$(DESTINSTALLVENDORARCH)" \
+        "$(INST_BIN)" "$(DESTINSTALLVENDORBIN)" \
+        "$(INST_SCRIPT)" "$(DESTINSTALLVENDORSCRIPT)" \
+        "$(INST_MAN1DIR)" "$(DESTINSTALLVENDORMAN1DIR)" \
+        "$(INST_MAN3DIR)" "$(DESTINSTALLVENDORMAN3DIR)"
+
+};
+
+    push @m, q{
+doc_perl_install :: all
+    $(NOECHO) $(NOOP)
+
+doc_site_install :: all
+    $(NOECHO) $(NOOP)
+
+doc_vendor_install :: all
+    $(NOECHO) $(NOOP)
+
+} if $self->{NO_PERLLOCAL};
+
+    push @m, q{
+doc_perl_install :: all
+    $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
+    -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
+    -$(NOECHO) $(DOC_INSTALL) \
+        "Module" "$(NAME)" \
+        "installed into" "$(INSTALLPRIVLIB)" \
+        LINKTYPE "$(LINKTYPE)" \
+        VERSION "$(VERSION)" \
+        EXE_FILES "$(EXE_FILES)" \
+        >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{"
+
+doc_site_install :: all
+    $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
+    -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
+    -$(NOECHO) $(DOC_INSTALL) \
+        "Module" "$(NAME)" \
+        "installed into" "$(INSTALLSITELIB)" \
+        LINKTYPE "$(LINKTYPE)" \
+        VERSION "$(VERSION)" \
+        EXE_FILES "$(EXE_FILES)" \
+        >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{"
+
+doc_vendor_install :: all
+    $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
+    -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
+    -$(NOECHO) $(DOC_INSTALL) \
+        "Module" "$(NAME)" \
+        "installed into" "$(INSTALLVENDORLIB)" \
+        LINKTYPE "$(LINKTYPE)" \
+        VERSION "$(VERSION)" \
+        EXE_FILES "$(EXE_FILES)" \
+        >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{"
+
+} unless $self->{NO_PERLLOCAL};
+
+    push @m, q{
+uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+    $(NOECHO) $(NOOP)
+
+uninstall_from_perldirs ::
+    $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{"
+
+uninstall_from_sitedirs ::
+    $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{"
+
+uninstall_from_vendordirs ::
+    $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{"
+};
+
+    join("",@m);
+}
+
+=item installbin (o)
+
+Defines targets to make and to install EXE_FILES.
+
+=cut
+
+sub installbin {
+    my($self) = shift;
+
+    return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
+    my @exefiles = sort @{$self->{EXE_FILES}};
+    return "" unless @exefiles;
+
+    @exefiles = map vmsify($_), @exefiles if $Is{VMS};
+
+    my %fromto;
+    for my $from (@exefiles) {
+    my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
+
+    local($_) = $path; # for backwards compatibility
+    my $to = $self->libscan($path);
+    print "libscan($from) => '$to'\n" if ($Verbose >=2);
+
+        $to = vmsify($to) if $Is{VMS};
+    $fromto{$from} = $to;
+    }
+    my @to   = sort values %fromto;
+
+    my @m;
+    push(@m, qq{
+EXE_FILES = @exefiles
+
+pure_all :: @to
+    \$(NOECHO) \$(NOOP)
+
+realclean ::
+});
+
+    # realclean can get rather large.
+    push @m, map&