+sub build_extension {
+ my ($ext_dir, $perl, $mname, $pass_through) = @_;
+
+ unless (chdir "$ext_dir") {
+ warn "Cannot cd to $ext_dir: $!";
+ return;
+ }
+
+ my $up = $ext_dir;
+ $up =~ s![^/]+!..!g;
+
+ $perl ||= "$up/miniperl";
+ my $return_dir = $up;
+ my $lib_dir = "$up/lib";
+ # $lib_dir must be last, as we're copying files into it, and in a parallel
+ # make there's a race condition if one process tries to open a module that
+ # another process has half-written.
+ my @new_inc = ((map {"$up/$_"} @toolchain), $lib_dir);
+ if ($is_Win32) {
+ @new_inc = map {File::Spec::Functions::rel2abs($_)} @new_inc;
+ }
+ $ENV{PERL5LIB} = join $Config{path_sep}, @new_inc;
+ $ENV{PERL_CORE} = 1;
+ # warn $ENV{PERL5LIB};
+
+ my $makefile;
+ if ($is_VMS) {
+ $makefile = 'descrip.mms';
+ if ($target =~ /clean$/
+ && !-f $makefile
+ && -f "${makefile}_old") {
+ $makefile = "${makefile}_old";
+ }
+ } else {
+ $makefile = 'Makefile';
+ }
+
+ if (!-f $makefile) {
+ if (!-f 'Makefile.PL') {
+ print "\nCreating Makefile.PL in $ext_dir for $mname\n";
+ my ($fromname, $key, $value);
+ if ($mname eq 'podlators') {
+ # We need to special case this somewhere, and this is fewer
+ # lines of code than a core-only Makefile.PL, and no more
+ # complex
+ $fromname = 'VERSION';
+ $key = 'DISTNAME';
+ $value = 'podlators';
+ $mname = 'Pod';
+ } else {
+ $key = 'ABSTRACT_FROM';
+ # We need to cope well with various possible layouts
+ my @dirs = split /::/, $mname;
+ my $leaf = pop @dirs;
+ my $leafname = "$leaf.pm";
+ my $pathname = join '/', @dirs, $leafname;
+ my @locations = ($leafname, $pathname, "lib/$pathname");
+ foreach (@locations) {
+ if (-f $_) {
+ $fromname = $_;
+ last;
+ }
+ }
+
+ unless ($fromname) {
+ die "For $mname tried @locations in in $ext_dir but can't find source";
+ }
+ ($value = $fromname) =~ s/\.pm\z/.pod/;
+ $value = $fromname unless -e $value;
+ }
+ open my $fh, '>', 'Makefile.PL'
+ or die "Can't open Makefile.PL for writing: $!";
+ printf $fh <<'EOM', $0, $mname, $fromname, $key, $value;
+#-*- buffer-read-only: t -*-
+
+# This Makefile.PL was written by %s.
+# It will be deleted automatically by make realclean
+
+use strict;
+use ExtUtils::MakeMaker;
+
+# This is what the .PL extracts to. Not the ultimate file that is installed.
+# (ie Win32 runs pl2bat after this)