This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In bisect-runner.pl, consolidate the code that patches Configure and hints.
authorNicholas Clark <nick@ccl4.org>
Tue, 1 Nov 2011 13:00:21 +0000 (14:00 +0100)
committerNicholas Clark <nick@ccl4.org>
Tue, 1 Nov 2011 21:21:28 +0000 (22:21 +0100)
All the code that patches Configure is now moved to patch_Configure().
All the code that patches hints files is now moved to patch_hints().

This should start to make it easier to see the main flow of the program.

Porting/bisect-runner.pl

index 835688b..020fcd5 100755 (executable)
@@ -571,608 +571,148 @@ my $major
                        qr/^#define\s+(?:PERL_VERSION|PATCHLEVEL)\s+(\d+)\s/,
                        0);
 
-if ($major < 1) {
-    if (extract_from_file('Configure',
-                          qr/^         \*=\*\) echo "\$1" >> \$optdef;;$/)) {
-        # This is "        Spaces now allowed in -D command line options.",
-        # part of commit ecfc54246c2a6f42
-        apply_patch(<<'EOPATCH');
-diff --git a/Configure b/Configure
-index 3d3b38d..78ffe16 100755
---- a/Configure
-+++ b/Configure
-@@ -652,7 +777,8 @@ while test $# -gt 0; do
-                       echo "$me: use '-U symbol=', not '-D symbol='." >&2
-                       echo "$me: ignoring -D $1" >&2
-                       ;;
--              *=*) echo "$1" >> $optdef;;
-+              *=*) echo "$1" | \
-+                              sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> $optdef;;
-               *) echo "$1='define'" >> $optdef;;
-               esac
-               shift
-EOPATCH
-    }
-    if (extract_from_file('Configure', qr/^if \$contains 'd_namlen' \$xinc\b/)) {
-        # Configure's original simple "grep" for d_namlen falls foul of the
-        # approach taken by the glibc headers:
-        # #ifdef _DIRENT_HAVE_D_NAMLEN
-        # # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
-        #
-        # where _DIRENT_HAVE_D_NAMLEN is not defined on Linux.
-        # This is also part of commit ecfc54246c2a6f42
+patch_Configure();
+patch_hints();
+
+# Cwd.xs added in commit 0d2079faa739aaa9. Cwd.pm moved to ext/ 8 years later
+# in commit 403f501d5b37ebf0
+if ($major > 0 && <*/Cwd/Cwd.xs>) {
+    if ($major < 10 && !extract_from_file('Makefile.SH', qr/^extra_dep=''$/)) {
+        # The Makefile.PL for Unicode::Normalize needs
+        # lib/unicore/CombiningClass.pl. Even without a parallel build, we need
+        # a dependency to ensure that it builds. This is a variant of commit
+        # 9f3ef600c170f61e. Putting this for earlier versions gives us a spot
+        # on which to hang the edits below
         apply_patch(<<'EOPATCH');
-diff --git a/Configure b/Configure
-index 3d3b38d..78ffe16 100755
---- a/Configure
-+++ b/Configure
-@@ -3935,7 +4045,8 @@ $rm -f try.c
+diff --git a/Makefile.SH b/Makefile.SH
+index f61d0db..6097954 100644
+--- a/Makefile.SH
++++ b/Makefile.SH
+@@ -155,10 +155,20 @@ esac
+ : Prepare dependency lists for Makefile.
+ dynamic_list=' '
++extra_dep=''
+ for f in $dynamic_ext; do
+     : the dependency named here will never exist
+       base=`echo "$f" | sed 's/.*\///'`
+-    dynamic_list="$dynamic_list lib/auto/$f/$base.$dlext"
++    this_target="lib/auto/$f/$base.$dlext"
++    dynamic_list="$dynamic_list $this_target"
++
++    : Parallel makes reveal that we have some interdependencies
++    case $f in
++      Math/BigInt/FastCalc) extra_dep="$extra_dep
++$this_target: lib/auto/List/Util/Util.$dlext" ;;
++      Unicode/Normalize) extra_dep="$extra_dep
++$this_target: lib/unicore/CombiningClass.pl" ;;
++    esac
+ done
+ static_list=' '
+@@ -987,2 +997,9 @@ n_dummy $(nonxs_ext):      miniperl$(EXE_EXT) preplibrary $(DYNALOADER) FORCE
+       @$(LDLIBPTH) sh ext/util/make_ext nonxs $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
++!NO!SUBS!
++
++$spitshell >>Makefile <<EOF
++$extra_dep
++EOF
++
++$spitshell >>Makefile <<'!NO!SUBS!'
  
- : see if the directory entry stores field length
- echo " "
--if $contains 'd_namlen' $xinc >/dev/null 2>&1; then
-+$cppstdin $cppflags $cppminus < "$xinc" > try.c
-+if $contains 'd_namlen' try.c >/dev/null 2>&1; then
-       echo "Good, your directory entry keeps length information in d_namlen." >&4
-       val="$define"
- else
 EOPATCH
     }
+    if ($major < 14) {
+        # Commits dc0655f797469c47 and d11a62fe01f2ecb2
+        edit_file('Makefile.SH', sub {
+                      my $code = shift;
+                      foreach my $ext (qw(Encode SDBM_File)) {
+                          next if $code =~ /\b$ext\) extra_dep=/s;
+                          $code =~ s!(\) extra_dep="\$extra_dep
+\$this_target: .*?" ;;)
+(    esac
+)!$1
+       $ext) extra_dep="\$extra_dep
+\$this_target: lib/auto/Cwd/Cwd.\$dlext" ;;
+$2!;
+                      }
+                      return $code;
+                  });
+    }
+}
+if ($major == 7) {
+    # Remove commits 9fec149bb652b6e9 and 5bab1179608f81d8, which add/amend
+    # rules to automatically run regen scripts that rebuild C headers. These
+    # cause problems because a git checkout doesn't preserve relative file
+    # modification times, hence the regen scripts may fire. This will obscure
+    # whether the repository had the correct generated headers checked in.
+    # Also, the dependency rules for running the scripts were not correct,
+    # which could cause spurious re-builds on re-running make, and can cause
+    # complete build failures for a parallel make.
+    if (extract_from_file('Makefile.SH',
+                          qr/Writing it this way gives make a big hint to always run opcode\.pl before/)) {
+        apply_commit('70c6e6715e8fec53');
+    } elsif (extract_from_file('Makefile.SH',
+                               qr/^opcode\.h opnames\.h pp_proto\.h pp\.sym: opcode\.pl$/)) {
+        revert_commit('9fec149bb652b6e9');
+    }
 }
 
-if ($major < 2
-    && !extract_from_file('Configure',
-                          qr/Try to guess additional flags to pick up local libraries/)) {
-    my $mips = extract_from_file('Configure',
-                                 qr!(''\) if (?:\./)?mips; then)!);
-    # This is part of perl-5.001n. It's needed, to add -L/usr/local/lib to the
-    # ld flags if libraries are found there. It shifts the code to set up
-    # libpth earlier, and then adds the code to add libpth entries to ldflags
-    # mips was changed to ./mips in ecfc54246c2a6f42, perl5.000 patch.0g
-    apply_patch(sprintf <<'EOPATCH', $mips);
-diff --git a/Configure b/Configure
-index 53649d5..0635a6e 100755
---- a/Configure
-+++ b/Configure
-@@ -2749,6 +2749,52 @@ EOM
-       ;;
- esac
+# There was a bug in makedepend.SH which was fixed in version 96a8704c.
+# Symptom was './makedepend: 1: Syntax error: Unterminated quoted string'
+# Remove this if you're actually bisecting a problem related to makedepend.SH
+# If you do this, you may need to add in code to correct the output of older
+# makedepends, which don't correctly filter newer gcc output such as <built-in>
+checkout_file('makedepend.SH');
+
+if ($^O eq 'darwin') {
+    if ($major < 8) {
+        my $faking_it;
+        # We can't build on darwin without some of the data in the hints file.
+        foreach ('ext/DynaLoader/dl_dyld.xs') {
+            next if -f $_;
+            ++$faking_it;
+            checkout_file($_, 'f556e5b971932902');
+        }
+        if ($faking_it) {
+            apply_patch(<<'EOPATCH');
+diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs
+--- a/ext/DynaLoader/dl_dyld.xs~       2011-10-11 21:41:27.000000000 +0100
++++ b/ext/DynaLoader/dl_dyld.xs        2011-10-11 21:42:20.000000000 +0100
+@@ -41,6 +41,35 @@
+ #include "perl.h"
+ #include "XSUB.h"
  
-+: Set private lib path
-+case "$plibpth" in
-+'') if ./mips; then
-+              plibpth="$incpath/usr/lib /usr/local/lib /usr/ccs/lib"
-+      fi;;
-+esac
-+case "$libpth" in
-+' ') dlist='';;
-+'') dlist="$plibpth $glibpth";;
-+*) dlist="$libpth";;
-+esac
-+
-+: Now check and see which directories actually exist, avoiding duplicates
-+libpth=''
-+for xxx in $dlist
-+do
-+    if $test -d $xxx; then
-+              case " $libpth " in
-+              *" $xxx "*) ;;
-+              *) libpth="$libpth $xxx";;
-+              esac
-+    fi
-+done
-+$cat <<'EOM'
-+
-+Some systems have incompatible or broken versions of libraries.  Among
-+the directories listed in the question below, please remove any you
-+know not to be holding relevant libraries, and add any that are needed.
-+Say "none" for none.
++#ifndef pTHX
++#  define pTHX                void
++#  define pTHX_
++#endif
++#ifndef aTHX
++#  define aTHX
++#  define aTHX_
++#endif
++#ifndef dTHX
++#  define dTHXa(a)    extern int Perl___notused(void)
++#  define dTHX                extern int Perl___notused(void)
++#endif
 +
-+EOM
-+case "$libpth" in
-+'') dflt='none';;
-+*)
-+      set X $libpth
-+      shift
-+      dflt=${1+"$@"}
-+      ;;
-+esac
-+rp="Directories to use for library searches?"
-+. ./myread
-+case "$ans" in
-+none) libpth=' ';;
-+*) libpth="$ans";;
-+esac
++#ifndef Perl_form_nocontext
++#  define Perl_form_nocontext form
++#endif
 +
- : flags used in final linking phase
- case "$ldflags" in
- '') if ./venix; then
-@@ -2765,6 +2811,23 @@ case "$ldflags" in
-       ;;
- *) dflt="$ldflags";;
- esac
++#ifndef Perl_warn_nocontext
++#  define Perl_warn_nocontext warn
++#endif
 +
-+: Possible local library directories to search.
-+loclibpth="/usr/local/lib /opt/local/lib /usr/gnu/lib"
-+loclibpth="$loclibpth /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib"
++#ifndef PTR2IV
++#  define PTR2IV(p)   (IV)(p)
++#endif
 +
-+: Try to guess additional flags to pick up local libraries.
-+for thislibdir in $libpth; do
-+      case " $loclibpth " in
-+      *" $thislibdir "*)
-+              case "$dflt " in 
-+              "-L$thislibdir ") ;;
-+              *)  dflt="$dflt -L$thislibdir" ;;
-+              esac
-+              ;;
-+      esac
-+done
++#ifndef get_av
++#  define get_av perl_get_av
++#endif
 +
- echo " "
- rp="Any additional ld flags (NOT including libraries)?"
- . ./myread
-@@ -2828,52 +2891,6 @@ n) echo "OK, that should do.";;
- esac
- $rm -f try try.* core
--: Set private lib path
--case "$plibpth" in
--%s
--              plibpth="$incpath/usr/lib /usr/local/lib /usr/ccs/lib"
--      fi;;
--esac
--case "$libpth" in
--' ') dlist='';;
--'') dlist="$plibpth $glibpth";;
--*) dlist="$libpth";;
--esac
--
--: Now check and see which directories actually exist, avoiding duplicates
--libpth=''
--for xxx in $dlist
--do
--    if $test -d $xxx; then
--              case " $libpth " in
--              *" $xxx "*) ;;
--              *) libpth="$libpth $xxx";;
--              esac
--    fi
--done
--$cat <<'EOM'
--
--Some systems have incompatible or broken versions of libraries.  Among
--the directories listed in the question below, please remove any you
--know not to be holding relevant libraries, and add any that are needed.
--Say "none" for none.
--
--EOM
--case "$libpth" in
--'') dflt='none';;
--*)
--      set X $libpth
--      shift
--      dflt=${1+"$@"}
--      ;;
--esac
--rp="Directories to use for library searches?"
--. ./myread
--case "$ans" in
--none) libpth=' ';;
--*) libpth="$ans";;
--esac
--
- : compute shared library extension
- case "$so" in
- '')
-EOPATCH
-}
-
-if ($major < 5 && extract_from_file('Configure',
-                                    qr!if \$cc \$ccflags try\.c -o try >/dev/null 2>&1; then!)) {
-    # Analogous to the more general fix of dfe9444ca7881e71
-    # Without this flags such as -m64 may not be passed to this compile, which
-    # results in a byteorder of '1234' instead of '12345678', which can then
-    # cause crashes.
-    
-    if (extract_from_file('Configure', qr/xxx_prompt=y/)) {
-        # 8e07c86ebc651fe9 or later
-        # ("This is my patch  patch.1n  for perl5.001.")
-        apply_patch(<<'EOPATCH');
-diff --git a/Configure b/Configure
-index 62249dd..c5c384e 100755
---- a/Configure
-+++ b/Configure
-@@ -8247,7 +8247,7 @@ main()
- }
- EOCP
-       xxx_prompt=y
--      if $cc $ccflags try.c -o try >/dev/null 2>&1 && ./try > /dev/null; then
-+      if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1 && ./try > /dev/null; then
-               dflt=`./try`
-               case "$dflt" in
-               [1-4][1-4][1-4][1-4]|12345678|87654321)
-EOPATCH
-    } else {
-        apply_patch(<<'EOPATCH');
-diff --git a/Configure b/Configure
-index 53649d5..f1cd64a 100755
---- a/Configure
-+++ b/Configure
-@@ -6362,7 +6362,7 @@ main()
-       printf("\n");
- }
- EOCP
--      if $cc $ccflags try.c -o try >/dev/null 2>&1 ; then
-+      if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1 ; then
-               dflt=`./try`
-               case "$dflt" in
-               ????|????????) echo "(The test program ran ok.)";;
-EOPATCH
-    }
-}
-
-if ($major < 6 && !extract_from_file('Configure',
-                                     qr!^\t-A\)$!)) {
-    # This adds the -A option to Configure, which is incredibly useful
-    # Effectively this is commits 02e93a22d20fc9a5, 5f83a3e9d818c3ad,
-    # bde6b06b2c493fef, f7c3111703e46e0c and 2 lines of trailing whitespace
-    # removed by 613d6c3e99b9decc, but applied at slightly different locations
-    # to ensure a clean patch back to 5.000
-    # Note, if considering patching to the intermediate revisions to fix bugs
-    # in -A handling, f7c3111703e46e0c is from 2002, and hence $major == 8
-
-    # To add to the fun, early patches add -K and -O options, and it's not
-    # trivial to get patch to put the C<. ./posthint.sh> in the right place
-    edit_file('Configure', sub {
-                  my $code = shift;
-                  $code =~ s/(optstr = ")([^"]+";\s*# getopt-style specification)/$1A:$2/
-                      or die "Substitution failed";
-                  $code =~ s!^(: who configured the system)!
-touch posthint.sh
-. ./posthint.sh
-
-$1!ms
-                      or die "Substitution failed";
-                  return $code;
-              });
-    apply_patch(<<'EOPATCH');
-diff --git a/Configure b/Configure
-index 4b55fa6..60c3c64 100755
---- a/Configure
-+++ b/Configure
-@@ -1150,6 +1150,7 @@ set X `for arg in "$@"; do echo "X$arg"; done |
- eval "set $*"
- shift
- rm -f options.awk
-+rm -f posthint.sh
- : set up default values
- fastread=''
-@@ -1172,6 +1173,56 @@ while test $# -gt 0; do
-       case "$1" in
-       -d) shift; fastread=yes;;
-       -e) shift; alldone=cont;;
-+      -A)
-+          shift
-+          xxx=''
-+          yyy="$1"
-+          zzz=''
-+          uuu=undef
-+          case "$yyy" in
-+            *=*) zzz=`echo "$yyy"|sed 's!=.*!!'`
-+                 case "$zzz" in
-+                 *:*) zzz='' ;;
-+                 *)   xxx=append
-+                      zzz=" "`echo "$yyy"|sed 's!^[^=]*=!!'`
-+                      yyy=`echo "$yyy"|sed 's!=.*!!'` ;;
-+                 esac
-+                 ;;
-+            esac
-+            case "$xxx" in
-+            '')  case "$yyy" in
-+                 *:*) xxx=`echo "$yyy"|sed 's!:.*!!'`
-+                      yyy=`echo "$yyy"|sed 's!^[^:]*:!!'`
-+                      zzz=`echo "$yyy"|sed 's!^[^=]*=!!'`
-+                      yyy=`echo "$yyy"|sed 's!=.*!!'` ;;
-+                 *)   xxx=`echo "$yyy"|sed 's!:.*!!'`
-+                      yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` ;;
-+                 esac
-+                 ;;
-+            esac
-+          case "$xxx" in
-+          append)
-+              echo "$yyy=\"\${$yyy}$zzz\""    >> posthint.sh ;;
-+          clear)
-+              echo "$yyy=''"                  >> posthint.sh ;;
-+          define)
-+              case "$zzz" in
-+              '') zzz=define ;;
-+              esac
-+              echo "$yyy='$zzz'"              >> posthint.sh ;;
-+          eval)
-+              echo "eval \"$yyy=$zzz\""       >> posthint.sh ;;
-+          prepend)
-+              echo "$yyy=\"$zzz\${$yyy}\""    >> posthint.sh ;;
-+          undef)
-+              case "$zzz" in
-+              '') zzz="$uuu" ;;
-+              esac
-+              echo "$yyy=$zzz"                >> posthint.sh ;;
-+            *)  echo "$me: unknown -A command '$xxx', ignoring -A $1" >&2 ;;
-+          esac
-+          shift
-+          ;;
-       -f)
-               shift
-               cd ..
-EOPATCH
-}
-
-if ($major < 8 && !extract_from_file('Configure',
-                                    qr/^\t\tif test ! -t 0; then$/)) {
-    # Before dfe9444ca7881e71, Configure would refuse to run if stdin was not a
-    # tty. With that commit, the tty requirement was dropped for -de and -dE
-    # Commit aaeb8e512e8e9e14 dropped the tty requirement for -S
-    # For those older versions, it's probably easiest if we simply remove the
-    # sanity test.
-    edit_file('Configure', sub {
-                  my $code = shift;
-                  $code =~ s/test ! -t 0/test Perl = rules/;
-                  return $code;
-              });
-}
-
-if ($major == 8 || $major == 9) {
-    # Fix symbol detection to that of commit 373dfab3839ca168 if it's any
-    # intermediate version 5129fff43c4fe08c or later, as the intermediate
-    # versions don't work correctly on (at least) Sparc Linux.
-    # 5129fff43c4fe08c adds the first mention of mistrustnm.
-    # 373dfab3839ca168 removes the last mention of lc=""
-    edit_file('Configure', sub {
-                  my $code = shift;
-                  return $code
-                      if $code !~ /\btc="";/; # 373dfab3839ca168 or later
-                  return $code
-                      if $code !~ /\bmistrustnm\b/; # before 5129fff43c4fe08c
-                  my $fixed = <<'EOC';
-
-: is a C symbol defined?
-csym='tlook=$1;
-case "$3" in
--v) tf=libc.tmp; tdc="";;
--a) tf=libc.tmp; tdc="[]";;
-*) tlook="^$1\$"; tf=libc.list; tdc="()";;
-esac;
-tx=yes;
-case "$reuseval-$4" in
-true-) ;;
-true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;;
-esac;
-case "$tx" in
-yes)
-       tval=false;
-       if $test "$runnm" = true; then
-               if $contains $tlook $tf >/dev/null 2>&1; then
-                       tval=true;
-               elif $test "$mistrustnm" = compile -o "$mistrustnm" = run; then
-                       echo "void *(*(p()))$tdc { extern void *$1$tdc; return &$1; } int main() { if(p()) return(0); else return(1); }"> try.c;
-                       $cc -o try $optimize $ccflags $ldflags try.c >/dev/null 2>&1 $libs && tval=true;
-                       $test "$mistrustnm" = run -a -x try && { $run ./try$_exe >/dev/null 2>&1 || tval=false; };
-                       $rm -f try$_exe try.c core core.* try.core;
-               fi;
-       else
-               echo "void *(*(p()))$tdc { extern void *$1$tdc; return &$1; } int main() { if(p()) return(0); else return(1); }"> try.c;
-               $cc -o try $optimize $ccflags $ldflags try.c $libs >/dev/null 2>&1 && tval=true;
-               $rm -f try$_exe try.c;
-       fi;
-       ;;
-*)
-       case "$tval" in
-       $define) tval=true;;
-       *) tval=false;;
-       esac;
-       ;;
-esac;
-eval "$2=$tval"'
-
-EOC
-                  $code =~ s/\n: is a C symbol defined\?\n.*?\neval "\$2=\$tval"'\n\n/$fixed/sm
-                      or die "substitution failed";
-                  return $code;
-              });
-}
-
-if ($major < 10 && extract_from_file('Configure', qr/^set malloc\.h i_malloc$/)) {
-    # This is commit 01d07975f7ef0e7d, trimmed, with $compile inlined as
-    # prior to bd9b35c97ad661cc Configure had the malloc.h test before the
-    # definition of $compile.
-    apply_patch(<<'EOPATCH');
-diff --git a/Configure b/Configure
-index 3d2e8b9..6ce7766 100755
---- a/Configure
-+++ b/Configure
-@@ -6743,5 +6743,22 @@ set d_dosuid
- : see if this is a malloc.h system
--set malloc.h i_malloc
--eval $inhdr
-+: we want a real compile instead of Inhdr because some systems have a
-+: malloc.h that just gives a compile error saying to use stdlib.h instead
-+echo " "
-+$cat >try.c <<EOCP
-+#include <stdlib.h>
-+#include <malloc.h>
-+int main () { return 0; }
-+EOCP
-+set try
-+if $cc $optimize $ccflags $ldflags -o try $* try.c $libs > /dev/null 2>&1; then
-+    echo "<malloc.h> found." >&4
-+    val="$define"
-+else
-+    echo "<malloc.h> NOT found." >&4
-+    val="$undef"
-+fi
-+$rm -f try.c try
-+set i_malloc
-+eval $setvar
-EOPATCH
-}
-
-# Cwd.xs added in commit 0d2079faa739aaa9. Cwd.pm moved to ext/ 8 years later
-# in commit 403f501d5b37ebf0
-if ($major > 0 && <*/Cwd/Cwd.xs>) {
-    if ($major < 10 && !extract_from_file('Makefile.SH', qr/^extra_dep=''$/)) {
-        # The Makefile.PL for Unicode::Normalize needs
-        # lib/unicore/CombiningClass.pl. Even without a parallel build, we need
-        # a dependency to ensure that it builds. This is a variant of commit
-        # 9f3ef600c170f61e. Putting this for earlier versions gives us a spot
-        # on which to hang the edits below
-        apply_patch(<<'EOPATCH');
-diff --git a/Makefile.SH b/Makefile.SH
-index f61d0db..6097954 100644
---- a/Makefile.SH
-+++ b/Makefile.SH
-@@ -155,10 +155,20 @@ esac
- : Prepare dependency lists for Makefile.
- dynamic_list=' '
-+extra_dep=''
- for f in $dynamic_ext; do
-     : the dependency named here will never exist
-       base=`echo "$f" | sed 's/.*\///'`
--    dynamic_list="$dynamic_list lib/auto/$f/$base.$dlext"
-+    this_target="lib/auto/$f/$base.$dlext"
-+    dynamic_list="$dynamic_list $this_target"
-+
-+    : Parallel makes reveal that we have some interdependencies
-+    case $f in
-+      Math/BigInt/FastCalc) extra_dep="$extra_dep
-+$this_target: lib/auto/List/Util/Util.$dlext" ;;
-+      Unicode/Normalize) extra_dep="$extra_dep
-+$this_target: lib/unicore/CombiningClass.pl" ;;
-+    esac
- done
- static_list=' '
-@@ -987,2 +997,9 @@ n_dummy $(nonxs_ext):      miniperl$(EXE_EXT) preplibrary $(DYNALOADER) FORCE
-       @$(LDLIBPTH) sh ext/util/make_ext nonxs $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
-+!NO!SUBS!
-+
-+$spitshell >>Makefile <<EOF
-+$extra_dep
-+EOF
-+
-+$spitshell >>Makefile <<'!NO!SUBS!'
-EOPATCH
-    }
-    if ($major < 14) {
-        # Commits dc0655f797469c47 and d11a62fe01f2ecb2
-        edit_file('Makefile.SH', sub {
-                      my $code = shift;
-                      foreach my $ext (qw(Encode SDBM_File)) {
-                          next if $code =~ /\b$ext\) extra_dep=/s;
-                          $code =~ s!(\) extra_dep="\$extra_dep
-\$this_target: .*?" ;;)
-(    esac
-)!$1
-       $ext) extra_dep="\$extra_dep
-\$this_target: lib/auto/Cwd/Cwd.\$dlext" ;;
-$2!;
-                      }
-                      return $code;
-                  });
-    }
-}
-if ($major == 7) {
-    # Remove commits 9fec149bb652b6e9 and 5bab1179608f81d8, which add/amend
-    # rules to automatically run regen scripts that rebuild C headers. These
-    # cause problems because a git checkout doesn't preserve relative file
-    # modification times, hence the regen scripts may fire. This will obscure
-    # whether the repository had the correct generated headers checked in.
-    # Also, the dependency rules for running the scripts were not correct,
-    # which could cause spurious re-builds on re-running make, and can cause
-    # complete build failures for a parallel make.
-    if (extract_from_file('Makefile.SH',
-                          qr/Writing it this way gives make a big hint to always run opcode\.pl before/)) {
-        apply_commit('70c6e6715e8fec53');
-    } elsif (extract_from_file('Makefile.SH',
-                               qr/^opcode\.h opnames\.h pp_proto\.h pp\.sym: opcode\.pl$/)) {
-        revert_commit('9fec149bb652b6e9');
-    }
-}
-
-# There was a bug in makedepend.SH which was fixed in version 96a8704c.
-# Symptom was './makedepend: 1: Syntax error: Unterminated quoted string'
-# Remove this if you're actually bisecting a problem related to makedepend.SH
-# If you do this, you may need to add in code to correct the output of older
-# makedepends, which don't correctly filter newer gcc output such as <built-in>
-checkout_file('makedepend.SH');
-
-if ($^O eq 'freebsd') {
-    # There are rather too many version-specific FreeBSD hints fixes to patch
-    # individually. Also, more than once the FreeBSD hints file has been
-    # written in what turned out to be a rather non-future-proof style,
-    # with case statements treating the most recent version as the exception,
-    # instead of treating previous versions' behaviour explicitly and changing
-    # the default to cater for the current behaviour. (As strangely, future
-    # versions inherit the current behaviour.)
-    checkout_file('hints/freebsd.sh');
-} elsif ($^O eq 'darwin') {
-    if ($major < 8) {
-        my $faking_it;
-        # We can't build on darwin without some of the data in the hints file.
-        foreach ('ext/DynaLoader/dl_dyld.xs', 'hints/darwin.sh') {
-            next if -f $_;
-            ++$faking_it;
-            # Probably less surprising to use the earliest version of
-            # hints/darwin.sh and then edit in place just below, than use
-            # blead's version, as that would create a discontinuity at
-            # f556e5b971932902 - before it, hints bugs would be "fixed", after
-            # it they'd resurface. This way, we should give the illusion of
-            # monotonic bug fixing.
-            checkout_file($_, 'f556e5b971932902');
-        }
-        if ($faking_it) {
-            apply_patch(<<'EOPATCH');
-diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs
---- a/ext/DynaLoader/dl_dyld.xs~       2011-10-11 21:41:27.000000000 +0100
-+++ b/ext/DynaLoader/dl_dyld.xs        2011-10-11 21:42:20.000000000 +0100
-@@ -41,6 +41,35 @@
- #include "perl.h"
- #include "XSUB.h"
-+#ifndef pTHX
-+#  define pTHX                void
-+#  define pTHX_
-+#endif
-+#ifndef aTHX
-+#  define aTHX
-+#  define aTHX_
-+#endif
-+#ifndef dTHX
-+#  define dTHXa(a)    extern int Perl___notused(void)
-+#  define dTHX                extern int Perl___notused(void)
-+#endif
-+
-+#ifndef Perl_form_nocontext
-+#  define Perl_form_nocontext form
-+#endif
-+
-+#ifndef Perl_warn_nocontext
-+#  define Perl_warn_nocontext warn
-+#endif
-+
-+#ifndef PTR2IV
-+#  define PTR2IV(p)   (IV)(p)
-+#endif
-+
-+#ifndef get_av
-+#  define get_av perl_get_av
-+#endif
-+
- #define DL_LOADONCEONLY
+ #define DL_LOADONCEONLY
  
  #include "dlutils.c"  /* SaveError() etc      */
 @@ -185,7 +191,7 @@
@@ -1203,198 +743,38 @@ diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs
 +    vasprintf(&retval, pat, &args);
 +    va_end(args);
 +    SAVEFREEPV(retval);
-+    return retval;
-+}
-+
- #define DL_LOADONCEONLY
- #include "dlutils.c"  /* SaveError() etc      */
-EOPATCH
-            }
-        }
-
-        edit_file('hints/darwin.sh', sub {
-                      my $code = shift;
-                      # Part of commit 8f4f83badb7d1ba9, which mostly undoes
-                      # commit 0511a818910f476c.
-                      $code =~ s/^cppflags='-traditional-cpp';$/cppflags="\${cppflags} -no-cpp-precomp"/m;
-                      # commit 14c11978e9b52e08/803bb6cc74d36a3f
-                      # Without this, code in libperl.bundle links against op.o
-                      # in preference to opmini.o on the linker command line,
-                      # and hence miniperl tries to use File::Glob instead of
-                      # csh
-                      $code =~ s/^(lddlflags=)/ldflags="\${ldflags} -flat_namespace"\n$1/m;
-                      # f556e5b971932902 also patches Makefile.SH with some
-                      # special case code to deal with useshrplib for darwin.
-                      # Given that post 5.8.0 the darwin hints default was
-                      # changed to false, and it would be very complex to splice
-                      # in that code in various versions of Makefile.SH back
-                      # to 5.002, lets just turn it off.
-                      $code =~ s/^useshrplib='true'/useshrplib='false'/m
-                          if $faking_it;
-                      return $code;
-                  });
-    }
-} elsif ($^O eq 'netbsd') {
-    if ($major < 6) {
-        # These are part of commit 099685bc64c7dbce
-        edit_file('hints/netbsd.sh', sub {
-                      my $code = shift;
-                      my $fixed = <<'EOC';
-case "$osvers" in
-0.9|0.8*)
-       usedl="$undef"
-       ;;
-*)
-       if [ -f /usr/libexec/ld.elf_so ]; then
-               d_dlopen=$define
-               d_dlerror=$define
-               ccdlflags="-Wl,-E -Wl,-R${PREFIX}/lib $ccdlflags"
-               cccdlflags="-DPIC -fPIC $cccdlflags"
-               lddlflags="--whole-archive -shared $lddlflags"
-       elif [ "`uname -m`" = "pmax" ]; then
-# NetBSD 1.3 and 1.3.1 on pmax shipped an `old' ld.so, which will not work.
-               d_dlopen=$undef
-       elif [ -f /usr/libexec/ld.so ]; then
-               d_dlopen=$define
-               d_dlerror=$define
-               ccdlflags="-Wl,-R${PREFIX}/lib $ccdlflags"
-# we use -fPIC here because -fpic is *NOT* enough for some of the
-# extensions like Tk on some netbsd platforms (the sparc is one)
-               cccdlflags="-DPIC -fPIC $cccdlflags"
-               lddlflags="-Bforcearchive -Bshareable $lddlflags"
-       else
-               d_dlopen=$undef
-       fi
-       ;;
-esac
-EOC
-                      $code =~ s/^case "\$osvers" in\n0\.9\|0\.8.*?^esac\n/$fixed/ms;
-                      return $code;
-                  });
-        if (!extract_from_file('unixish.h',
-                               qr/defined\(NSIG\).*defined\(__NetBSD__\)/)) {
-            apply_patch(<<'EOPATCH')
-diff --git a/unixish.h b/unixish.h
-index 2a6cbcd..eab2de1 100644
---- a/unixish.h
-+++ b/unixish.h
-@@ -89,7 +89,7 @@
-  */
- /* #define ALTERNATE_SHEBANG "#!" / **/
--#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
-+#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) || defined(__NetBSD__)
- # include <signal.h>
- #endif
-EOPATCH
-        }
-    }
-} elsif ($^O eq 'openbsd') {
-    checkout_file('hints/openbsd.sh', '43051805d53a3e4c')
-        unless -f 'hints/openbsd.sh';
-
-    if ($major < 8) {
-        my $which = extract_from_file('hints/openbsd.sh',
-                                      qr/# from (2\.8|3\.1) onwards/,
-                                      '');
-        if ($which eq '') {
-            my $was = extract_from_file('hints/openbsd.sh',
-                                        qr/(lddlflags="(?:-Bforcearchive )?-Bshareable)/);
-            # This is commit 154d43cbcf57271c and parts of 5c75dbfa77b0949c
-            # and 29b5585702e5e025
-            apply_patch(sprintf <<'EOPATCH', $was);
-diff --git a/hints/openbsd.sh b/hints/openbsd.sh
-index a7d8bf2..5b79709 100644
---- a/hints/openbsd.sh
-+++ b/hints/openbsd.sh
-@@ -37,7 +37,25 @@ OpenBSD.alpha|OpenBSD.mips|OpenBSD.powerpc|OpenBSD.vax)
-       # we use -fPIC here because -fpic is *NOT* enough for some of the
-       # extensions like Tk on some OpenBSD platforms (ie: sparc)
-       cccdlflags="-DPIC -fPIC $cccdlflags"
--      %s $lddlflags"
-+      case "$osvers" in
-+      [01].*|2.[0-7]|2.[0-7].*)
-+              lddlflags="-Bshareable $lddlflags"
-+              ;;
-+      2.[8-9]|3.0)
-+              ld=${cc:-cc}
-+              lddlflags="-shared -fPIC $lddlflags"
-+              ;;
-+      *) # from 3.1 onwards
-+              ld=${cc:-cc}
-+              lddlflags="-shared -fPIC $lddlflags"
-+              libswanted=`echo $libswanted | sed 's/ dl / /'`
-+              ;;
-+      esac
-+
-+      # We need to force ld to export symbols on ELF platforms.
-+      # Without this, dlopen() is crippled.
-+      ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__`
-+      test -n "$ELF" && ldflags="-Wl,-E $ldflags"
-       ;;
- esac
-EOPATCH
-        } elsif ($which eq '2.8') {
-            # This is parts of 5c75dbfa77b0949c and 29b5585702e5e025, and
-            # possibly eb9cd59d45ad2908
-            my $was = extract_from_file('hints/openbsd.sh',
-                                        qr/lddlflags="(-shared(?: -fPIC)?) \$lddlflags"/);
-
-            apply_patch(sprintf <<'EOPATCH', $was);
---- a/hints/openbsd.sh 2011-10-21 17:25:20.000000000 +0200
-+++ b/hints/openbsd.sh 2011-10-21 16:58:43.000000000 +0200
-@@ -44,11 +44,21 @@
-       [01].*|2.[0-7]|2.[0-7].*)
-               lddlflags="-Bshareable $lddlflags"
-               ;;
--      *) # from 2.8 onwards
-+      2.[8-9]|3.0)
-               ld=${cc:-cc}
--              lddlflags="%s $lddlflags"
-+              lddlflags="-shared -fPIC $lddlflags"
-+              ;;
-+      *) # from 3.1 onwards
-+              ld=${cc:-cc}
-+              lddlflags="-shared -fPIC $lddlflags"
-+              libswanted=`echo $libswanted | sed 's/ dl / /'`
-               ;;
-       esac
++    return retval;
++}
 +
-+      # We need to force ld to export symbols on ELF platforms.
-+      # Without this, dlopen() is crippled.
-+      ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__`
-+      test -n "$ELF" && ldflags="-Wl,-E $ldflags"
-       ;;
- esac
+ #define DL_LOADONCEONLY
  
+ #include "dlutils.c"  /* SaveError() etc      */
 EOPATCH
-        } elsif ($which eq '3.1'
-                && !extract_from_file('hints/openbsd.sh',
-                                     qr/We need to force ld to export symbols on ELF platforms/)) {
-            # This is part of 29b5585702e5e025
-            apply_patch(<<'EOPATCH');
-diff --git a/hints/openbsd.sh b/hints/openbsd.sh
-index c6b6bc9..4839d04 100644
---- a/hints/openbsd.sh
-+++ b/hints/openbsd.sh
-@@ -54,6 +54,11 @@ alpha-2.[0-8]|mips-*|vax-*|powerpc-2.[0-7]|m88k-*)
-               libswanted=`echo $libswanted | sed 's/ dl / /'`
-               ;;
-       esac
-+
-+      # We need to force ld to export symbols on ELF platforms.
-+      # Without this, dlopen() is crippled.
-+      ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__`
-+      test -n "$ELF" && ldflags="-Wl,-E $ldflags"
-       ;;
- esac
+            }
+        }
+    }
+} elsif ($^O eq 'netbsd') {
+    if ($major < 6) {
+        if (!extract_from_file('unixish.h',
+                               qr/defined\(NSIG\).*defined\(__NetBSD__\)/)) {
+            apply_patch(<<'EOPATCH')
+diff --git a/unixish.h b/unixish.h
+index 2a6cbcd..eab2de1 100644
+--- a/unixish.h
++++ b/unixish.h
+@@ -89,7 +89,7 @@
+  */
+ /* #define ALTERNATE_SHEBANG "#!" / **/
+-#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
++#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) || defined(__NetBSD__)
+ # include <signal.h>
+ #endif
  
 EOPATCH
         }
     }
+} elsif ($^O eq 'openbsd') {
     if ($major < 4) {
         my $bad;
         # Need changes from commit a6e633defa583ad5.
@@ -1575,39 +955,6 @@ index 4608a2a..f0c9d1d 100644
        DIE("POSIX setpgrp can't take an argument");
 EOPATCH
     }
-} elsif ($^O eq 'linux') {
-    if ($major < 1) {
-        # sparc linux seems to need the -Dbool=char -DHAS_BOOL part of
-        # perl5.000 patch.0n: [address Configure and build issues]
-        edit_file('hints/linux.sh', sub {
-                      my $code = shift;
-                      $code =~ s!-I/usr/include/bsd!-Dbool=char -DHAS_BOOL!g;
-                      return $code;
-                  });
-    }
-
-    if ($major <= 9) {
-        if (`uname -sm` =~ qr/^Linux sparc/) {
-            if (extract_from_file('hints/linux.sh', qr/sparc-linux/)) {
-                # Be sure to use -fPIC not -fpic on Linux/SPARC
-                apply_commit('f6527d0ef0c13ad4');
-            } elsif(!extract_from_file('hints/linux.sh', qr/^sparc-linux\)$/)) {
-                my $fh = open_or_die('hints/linux.sh', '>>');
-                print $fh <<'EOT' or die $!;
-
-case "`uname -m`" in
-sparc*)
-       case "$cccdlflags" in
-       *-fpic*) cccdlflags="`echo $cccdlflags|sed 's/-fpic/-fPIC/'`" ;;
-       *)       cccdlflags="$cccdlflags -fPIC" ;;
-       esac
-       ;;
-esac
-EOT
-                close_or_die($fh);
-            }
-        }
-    }
 }
 
 if ($major < 10) {
@@ -1948,248 +1295,928 @@ index 900b491..6251a0b 100644
 EOPATCH
 }
 
-if ($major < 8 && $^O eq 'openbsd'
-    && !extract_from_file('perl.h', qr/include <unistd\.h>/)) {
-    # This is part of commit 3f270f98f9305540, applied at a slightly different
-    # location in perl.h, where the context is stable back to 5.000
-    apply_patch(<<'EOPATCH');
-diff --git a/perl.h b/perl.h
-index 9418b52..b8b1a7c 100644
---- a/perl.h
-+++ b/perl.h
-@@ -496,6 +496,10 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
- #   include <sys/param.h>
- #endif
-+/* If this causes problems, set i_unistd=undef in the hint file.  */
-+#ifdef I_UNISTD
-+#   include <unistd.h>
-+#endif
- /* Use all the "standard" definitions? */
- #if defined(STANDARD_C) && defined(I_STDLIB)
-EOPATCH
+if ($major < 8 && $^O eq 'openbsd'
+    && !extract_from_file('perl.h', qr/include <unistd\.h>/)) {
+    # This is part of commit 3f270f98f9305540, applied at a slightly different
+    # location in perl.h, where the context is stable back to 5.000
+    apply_patch(<<'EOPATCH');
+diff --git a/perl.h b/perl.h
+index 9418b52..b8b1a7c 100644
+--- a/perl.h
++++ b/perl.h
+@@ -496,6 +496,10 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
+ #   include <sys/param.h>
+ #endif
++/* If this causes problems, set i_unistd=undef in the hint file.  */
++#ifdef I_UNISTD
++#   include <unistd.h>
++#endif
+ /* Use all the "standard" definitions? */
+ #if defined(STANDARD_C) && defined(I_STDLIB)
+EOPATCH
+}
+
+if ($major == 4 && extract_from_file('scope.c', qr/\(SV\*\)SSPOPINT/)) {
+    # [PATCH] 5.004_04 +MAINT_TRIAL_1 broken when sizeof(int) != sizeof(void)
+    # Fixes a bug introduced in 161b7d1635bc830b
+    apply_commit('9002cb76ec83ef7f');
+}
+
+if ($major == 4 && extract_from_file('av.c', qr/AvARRAY\(av\) = 0;/)) {
+    # Fixes a bug introduced in 1393e20655efb4bc
+    apply_commit('e1c148c28bf3335b', 'av.c');
+}
+
+if ($major == 4 && $^O eq 'linux') {
+    # Whilst this is fixed properly in f0784f6a4c3e45e1 which provides the
+    # Configure probe, it's easier to back out the problematic changes made in
+    # these previous commits:
+    if (extract_from_file('doio.c',
+                          qr!^/\* XXX REALLY need metaconfig test \*/$!)) {
+        revert_commit('4682965a1447ea44', 'doio.c');
+    }
+    if (my $token = extract_from_file('doio.c',
+                                      qr!^#if (defined\(__sun(?:__)?\)) && defined\(__svr4__\) /\* XXX Need metaconfig test \*/$!)) {
+        my $patch = `git show -R 9b599b2a63d2324d doio.c`;
+        $patch =~ s/defined\(__sun__\)/$token/g;
+        apply_patch($patch);
+    }
+    if (extract_from_file('doio.c',
+                          qr!^/\* linux \(and Solaris2\?\) uses :$!)) {
+        revert_commit('8490252049bf42d3', 'doio.c');
+    }
+    if (extract_from_file('doio.c',
+                          qr/^     unsemds.buf = &semds;$/)) {
+        revert_commit('8e591e46b4c6543e');
+    }
+    if (extract_from_file('doio.c',
+                          qr!^#ifdef __linux__ /\* XXX Need metaconfig test \*/$!)) {
+        # Reverts part of commit 3e3baf6d63945cb6
+        apply_patch(<<'EOPATCH');
+diff --git b/doio.c a/doio.c
+index 62b7de9..0d57425 100644
+--- b/doio.c
++++ a/doio.c
+@@ -1333,9 +1331,6 @@ SV **sp;
+     char *a;
+     I32 id, n, cmd, infosize, getinfo;
+     I32 ret = -1;
+-#ifdef __linux__      /* XXX Need metaconfig test */
+-    union semun unsemds;
+-#endif
+     id = SvIVx(*++mark);
+     n = (optype == OP_SEMCTL) ? SvIVx(*++mark) : 0;
+@@ -1364,29 +1359,11 @@ SV **sp;
+           infosize = sizeof(struct semid_ds);
+       else if (cmd == GETALL || cmd == SETALL)
+       {
+-#ifdef __linux__      /* XXX Need metaconfig test */
+-/* linux uses :
+-   int semctl (int semid, int semnun, int cmd, union semun arg)
+-
+-       union semun {
+-            int val;
+-            struct semid_ds *buf;
+-            ushort *array;
+-       };
+-*/
+-            union semun semds;
+-          if (semctl(id, 0, IPC_STAT, semds) == -1)
+-#else
+           struct semid_ds semds;
+           if (semctl(id, 0, IPC_STAT, &semds) == -1)
+-#endif
+               return -1;
+           getinfo = (cmd == GETALL);
+-#ifdef __linux__      /* XXX Need metaconfig test */
+-          infosize = semds.buf->sem_nsems * sizeof(short);
+-#else
+           infosize = semds.sem_nsems * sizeof(short);
+-#endif
+               /* "short" is technically wrong but much more portable
+                  than guessing about u_?short(_t)? */
+       }
+@@ -1429,12 +1406,7 @@ SV **sp;
+ #endif
+ #ifdef HAS_SEM
+     case OP_SEMCTL:
+-#ifdef __linux__      /* XXX Need metaconfig test */
+-        unsemds.buf = (struct semid_ds *)a;
+-      ret = semctl(id, n, cmd, unsemds);
+-#else
+       ret = semctl(id, n, cmd, (struct semid_ds *)a);
+-#endif
+       break;
+ #endif
+ #ifdef HAS_SHM
+EOPATCH
+    }
+    # Incorrect prototype added as part of 8ac853655d9b7447, fixed as part of
+    # commit dc45a647708b6c54, with at least one intermediate modification.
+    # Correct prototype for gethostbyaddr has socklen_t second. Linux has
+    # uint32_t first for getnetbyaddr.
+    # Easiest just to remove, instead of attempting more complex patching.
+    # Something similar may be needed on other platforms.
+    edit_file('pp_sys.c', sub {
+                  my $code = shift;
+                  $code =~ s/^    struct hostent \*(?:PerlSock_)?gethostbyaddr\([^)]+\);$//m;
+                  $code =~ s/^    struct netent \*getnetbyaddr\([^)]+\);$//m;
+                  return $code;
+              });
+}
+
+if ($major < 10 and -f 'ext/IPC/SysV/SysV.xs') {
+    edit_file('ext/IPC/SysV/SysV.xs', sub {
+                  my $xs = shift;
+                  my $fixed = <<'EOFIX';
+
+#include <sys/types.h>
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#ifndef HAS_SEM
+#   include <sys/ipc.h>
+#endif
+#   ifdef HAS_MSG
+#       include <sys/msg.h>
+#   endif
+#   ifdef HAS_SHM
+#       if defined(PERL_SCO) || defined(PERL_ISC)
+#           include <sys/sysmacros.h>  /* SHMLBA */
+#       endif
+#      include <sys/shm.h>
+#      ifndef HAS_SHMAT_PROTOTYPE
+           extern Shmat_t shmat (int, char *, int);
+#      endif
+#      if defined(HAS_SYSCONF) && defined(_SC_PAGESIZE)
+#          undef  SHMLBA /* not static: determined at boot time */
+#          define SHMLBA sysconf(_SC_PAGESIZE)
+#      elif defined(HAS_GETPAGESIZE)
+#          undef  SHMLBA /* not static: determined at boot time */
+#          define SHMLBA getpagesize()
+#      endif
+#   endif
+#endif
+EOFIX
+                  $xs =~ s!
+#include <sys/types\.h>
+.*
+(#ifdef newCONSTSUB|/\* Required)!$fixed$1!ms;
+                  return $xs;
+              });
+}
+
+if (-f 'ext/POSIX/Makefile.PL'
+    && extract_from_file('ext/POSIX/Makefile.PL',
+                         qr/Explicitly avoid including/)) {
+    # commit 6695a346c41138df, which effectively reverts 170888cff5e2ffb7
+
+    # PERL5LIB is populated by make_ext.pl with paths to the modules we need
+    # to run, don't override this with "../../lib" since that may not have
+    # been populated yet in a parallel build.
+    apply_commit('6695a346c41138df');
+}
+
+# Parallel build for miniperl is safe
+system "make $j miniperl </dev/null";
+
+my $expected = $target =~ /^test/ ? 't/perl'
+    : $target eq 'Fcntl' ? "lib/auto/Fcntl/Fcntl.$Config{so}"
+    : $target;
+my $real_target = $target eq 'Fcntl' ? $expected : $target;
+
+if ($target ne 'miniperl') {
+    # Nearly all parallel build issues fixed by 5.10.0. Untrustworthy before that.
+    $j = '' if $major < 10;
+
+    if ($real_target eq 'test_prep') {
+        if ($major < 8) {
+            # test-prep was added in 5.004_01, 3e3baf6d63945cb6.
+            # renamed to test_prep in 2001 in 5fe84fd29acaf55c.
+            # earlier than that, just make test. It will be fast enough.
+            $real_target = extract_from_file('Makefile.SH',
+                                             qr/^(test[-_]prep):/,
+                                             'test');
+        }
+    }
+
+    system "make $j $real_target </dev/null";
 }
 
-if ($major == 4 && extract_from_file('scope.c', qr/\(SV\*\)SSPOPINT/)) {
-    # [PATCH] 5.004_04 +MAINT_TRIAL_1 broken when sizeof(int) != sizeof(void)
-    # Fixes a bug introduced in 161b7d1635bc830b
-    apply_commit('9002cb76ec83ef7f');
+my $missing_target = $expected =~ /perl$/ ? !-x $expected : !-r $expected;
+
+if ($options{'test-build'}) {
+    report_and_exit($missing_target, 'could build', 'could not build',
+                    $real_target);
+} elsif ($missing_target) {
+    skip("could not build $real_target");
 }
 
-if ($major == 4 && extract_from_file('av.c', qr/AvARRAY\(av\) = 0;/)) {
-    # Fixes a bug introduced in 1393e20655efb4bc
-    apply_commit('e1c148c28bf3335b', 'av.c');
+match_and_exit($real_target) if $match;
+
+if (defined $options{'one-liner'}) {
+    my $exe = $target =~ /^(?:perl$|test)/ ? 'perl' : 'miniperl';
+    unshift @ARGV, "./$exe", '-Ilib', '-e', $options{'one-liner'};
 }
 
-if ($major == 4 && $^O eq 'linux') {
-    # Whilst this is fixed properly in f0784f6a4c3e45e1 which provides the
-    # Configure probe, it's easier to back out the problematic changes made in
-    # these previous commits:
-    if (extract_from_file('doio.c',
-                          qr!^/\* XXX REALLY need metaconfig test \*/$!)) {
-        revert_commit('4682965a1447ea44', 'doio.c');
-    }
-    if (my $token = extract_from_file('doio.c',
-                                      qr!^#if (defined\(__sun(?:__)?\)) && defined\(__svr4__\) /\* XXX Need metaconfig test \*/$!)) {
-        my $patch = `git show -R 9b599b2a63d2324d doio.c`;
-        $patch =~ s/defined\(__sun__\)/$token/g;
-        apply_patch($patch);
-    }
-    if (extract_from_file('doio.c',
-                          qr!^/\* linux \(and Solaris2\?\) uses :$!)) {
-        revert_commit('8490252049bf42d3', 'doio.c');
+# This is what we came here to run:
+
+if (exists $Config{ldlibpthname}) {
+    require Cwd;
+    my $varname = $Config{ldlibpthname};
+    my $cwd = Cwd::getcwd();
+    if (defined $ENV{$varname}) {
+        $ENV{$varname} = $cwd . $Config{path_sep} . $ENV{$varname};
+    } else {
+        $ENV{$varname} = $cwd;
     }
-    if (extract_from_file('doio.c',
-                          qr/^     unsemds.buf = &semds;$/)) {
-        revert_commit('8e591e46b4c6543e');
+}
+
+my $ret = system @ARGV;
+
+report_and_exit($ret, 'zero exit from', 'non-zero exit from', "@ARGV");
+
+sub patch_Configure {
+    if ($major < 1) {
+        if (extract_from_file('Configure',
+                              qr/^\t\t\*=\*\) echo "\$1" >> \$optdef;;$/)) {
+            # This is "        Spaces now allowed in -D command line options.",
+            # part of commit ecfc54246c2a6f42
+            apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 3d3b38d..78ffe16 100755
+--- a/Configure
++++ b/Configure
+@@ -652,7 +777,8 @@ while test $# -gt 0; do
+                       echo "$me: use '-U symbol=', not '-D symbol='." >&2
+                       echo "$me: ignoring -D $1" >&2
+                       ;;
+-              *=*) echo "$1" >> $optdef;;
++              *=*) echo "$1" | \
++                              sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> $optdef;;
+               *) echo "$1='define'" >> $optdef;;
+               esac
+               shift
+EOPATCH
+        }
+
+        if (extract_from_file('Configure', qr/^if \$contains 'd_namlen' \$xinc\b/)) {
+            # Configure's original simple "grep" for d_namlen falls foul of the
+            # approach taken by the glibc headers:
+            # #ifdef _DIRENT_HAVE_D_NAMLEN
+            # # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
+            #
+            # where _DIRENT_HAVE_D_NAMLEN is not defined on Linux.
+            # This is also part of commit ecfc54246c2a6f42
+            apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 3d3b38d..78ffe16 100755
+--- a/Configure
++++ b/Configure
+@@ -3935,7 +4045,8 @@ $rm -f try.c
+ : see if the directory entry stores field length
+ echo " "
+-if $contains 'd_namlen' $xinc >/dev/null 2>&1; then
++$cppstdin $cppflags $cppminus < "$xinc" > try.c
++if $contains 'd_namlen' try.c >/dev/null 2>&1; then
+       echo "Good, your directory entry keeps length information in d_namlen." >&4
+       val="$define"
+ else
+EOPATCH
+        }
     }
-    if (extract_from_file('doio.c',
-                          qr!^#ifdef __linux__ /\* XXX Need metaconfig test \*/$!)) {
-        # Reverts part of commit 3e3baf6d63945cb6
-        apply_patch(<<'EOPATCH');
-diff --git b/doio.c a/doio.c
-index 62b7de9..0d57425 100644
---- b/doio.c
-+++ a/doio.c
-@@ -1333,9 +1331,6 @@ SV **sp;
-     char *a;
-     I32 id, n, cmd, infosize, getinfo;
-     I32 ret = -1;
--#ifdef __linux__      /* XXX Need metaconfig test */
--    union semun unsemds;
--#endif
+
+    if ($major < 2
+        && !extract_from_file('Configure',
+                              qr/Try to guess additional flags to pick up local libraries/)) {
+        my $mips = extract_from_file('Configure',
+                                     qr!(''\) if (?:\./)?mips; then)!);
+        # This is part of perl-5.001n. It's needed, to add -L/usr/local/lib to
+        # theld flags if libraries are found there. It shifts the code to set up
+        # libpth earlier, and then adds the code to add libpth entries to
+        # ldflags
+        # mips was changed to ./mips in ecfc54246c2a6f42, perl5.000 patch.0g
+        apply_patch(sprintf <<'EOPATCH', $mips);
+diff --git a/Configure b/Configure
+index 53649d5..0635a6e 100755
+--- a/Configure
++++ b/Configure
+@@ -2749,6 +2749,52 @@ EOM
+       ;;
+ esac
  
-     id = SvIVx(*++mark);
-     n = (optype == OP_SEMCTL) ? SvIVx(*++mark) : 0;
-@@ -1364,29 +1359,11 @@ SV **sp;
-           infosize = sizeof(struct semid_ds);
-       else if (cmd == GETALL || cmd == SETALL)
-       {
--#ifdef __linux__      /* XXX Need metaconfig test */
--/* linux uses :
--   int semctl (int semid, int semnun, int cmd, union semun arg)
++: Set private lib path
++case "$plibpth" in
++'') if ./mips; then
++              plibpth="$incpath/usr/lib /usr/local/lib /usr/ccs/lib"
++      fi;;
++esac
++case "$libpth" in
++' ') dlist='';;
++'') dlist="$plibpth $glibpth";;
++*) dlist="$libpth";;
++esac
++
++: Now check and see which directories actually exist, avoiding duplicates
++libpth=''
++for xxx in $dlist
++do
++    if $test -d $xxx; then
++              case " $libpth " in
++              *" $xxx "*) ;;
++              *) libpth="$libpth $xxx";;
++              esac
++    fi
++done
++$cat <<'EOM'
++
++Some systems have incompatible or broken versions of libraries.  Among
++the directories listed in the question below, please remove any you
++know not to be holding relevant libraries, and add any that are needed.
++Say "none" for none.
++
++EOM
++case "$libpth" in
++'') dflt='none';;
++*)
++      set X $libpth
++      shift
++      dflt=${1+"$@"}
++      ;;
++esac
++rp="Directories to use for library searches?"
++. ./myread
++case "$ans" in
++none) libpth=' ';;
++*) libpth="$ans";;
++esac
++
+ : flags used in final linking phase
+ case "$ldflags" in
+ '') if ./venix; then
+@@ -2765,6 +2811,23 @@ case "$ldflags" in
+       ;;
+ *) dflt="$ldflags";;
+ esac
++
++: Possible local library directories to search.
++loclibpth="/usr/local/lib /opt/local/lib /usr/gnu/lib"
++loclibpth="$loclibpth /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib"
++
++: Try to guess additional flags to pick up local libraries.
++for thislibdir in $libpth; do
++      case " $loclibpth " in
++      *" $thislibdir "*)
++              case "$dflt " in 
++              "-L$thislibdir ") ;;
++              *)  dflt="$dflt -L$thislibdir" ;;
++              esac
++              ;;
++      esac
++done
++
+ echo " "
+ rp="Any additional ld flags (NOT including libraries)?"
+ . ./myread
+@@ -2828,52 +2891,6 @@ n) echo "OK, that should do.";;
+ esac
+ $rm -f try try.* core
+-: Set private lib path
+-case "$plibpth" in
+-%s
+-              plibpth="$incpath/usr/lib /usr/local/lib /usr/ccs/lib"
+-      fi;;
+-esac
+-case "$libpth" in
+-' ') dlist='';;
+-'') dlist="$plibpth $glibpth";;
+-*) dlist="$libpth";;
+-esac
+-
+-: Now check and see which directories actually exist, avoiding duplicates
+-libpth=''
+-for xxx in $dlist
+-do
+-    if $test -d $xxx; then
+-              case " $libpth " in
+-              *" $xxx "*) ;;
+-              *) libpth="$libpth $xxx";;
+-              esac
+-    fi
+-done
+-$cat <<'EOM'
 -
--       union semun {
--            int val;
--            struct semid_ds *buf;
--            ushort *array;
--       };
--*/
--            union semun semds;
--          if (semctl(id, 0, IPC_STAT, semds) == -1)
--#else
-           struct semid_ds semds;
-           if (semctl(id, 0, IPC_STAT, &semds) == -1)
--#endif
-               return -1;
-           getinfo = (cmd == GETALL);
--#ifdef __linux__      /* XXX Need metaconfig test */
--          infosize = semds.buf->sem_nsems * sizeof(short);
--#else
-           infosize = semds.sem_nsems * sizeof(short);
--#endif
-               /* "short" is technically wrong but much more portable
-                  than guessing about u_?short(_t)? */
-       }
-@@ -1429,12 +1406,7 @@ SV **sp;
- #endif
- #ifdef HAS_SEM
-     case OP_SEMCTL:
--#ifdef __linux__      /* XXX Need metaconfig test */
--        unsemds.buf = (struct semid_ds *)a;
--      ret = semctl(id, n, cmd, unsemds);
--#else
-       ret = semctl(id, n, cmd, (struct semid_ds *)a);
--#endif
-       break;
- #endif
- #ifdef HAS_SHM
+-Some systems have incompatible or broken versions of libraries.  Among
+-the directories listed in the question below, please remove any you
+-know not to be holding relevant libraries, and add any that are needed.
+-Say "none" for none.
+-
+-EOM
+-case "$libpth" in
+-'') dflt='none';;
+-*)
+-      set X $libpth
+-      shift
+-      dflt=${1+"$@"}
+-      ;;
+-esac
+-rp="Directories to use for library searches?"
+-. ./myread
+-case "$ans" in
+-none) libpth=' ';;
+-*) libpth="$ans";;
+-esac
+-
+ : compute shared library extension
+ case "$so" in
+ '')
 EOPATCH
     }
-    # Incorrect prototype added as part of 8ac853655d9b7447, fixed as part of
-    # commit dc45a647708b6c54, with at least one intermediate modification.
-    # Correct prototype for gethostbyaddr has socklen_t second. Linux has
-    # uint32_t first for getnetbyaddr.
-    # Easiest just to remove, instead of attempting more complex patching.
-    # Something similar may be needed on other platforms.
-    edit_file('pp_sys.c', sub {
-                  my $code = shift;
-                  $code =~ s/^    struct hostent \*(?:PerlSock_)?gethostbyaddr\([^)]+\);$//m;
-                  $code =~ s/^    struct netent \*getnetbyaddr\([^)]+\);$//m;
-                  return $code;
-              });
-}
-
-if ($major < 10 and -f 'ext/IPC/SysV/SysV.xs') {
-    edit_file('ext/IPC/SysV/SysV.xs', sub {
-                  my $xs = shift;
-                  my $fixed = <<'EOFIX';
-
-#include <sys/types.h>
-#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
-#ifndef HAS_SEM
-#   include <sys/ipc.h>
-#endif
-#   ifdef HAS_MSG
-#       include <sys/msg.h>
-#   endif
-#   ifdef HAS_SHM
-#       if defined(PERL_SCO) || defined(PERL_ISC)
-#           include <sys/sysmacros.h>  /* SHMLBA */
-#       endif
-#      include <sys/shm.h>
-#      ifndef HAS_SHMAT_PROTOTYPE
-           extern Shmat_t shmat (int, char *, int);
-#      endif
-#      if defined(HAS_SYSCONF) && defined(_SC_PAGESIZE)
-#          undef  SHMLBA /* not static: determined at boot time */
-#          define SHMLBA sysconf(_SC_PAGESIZE)
-#      elif defined(HAS_GETPAGESIZE)
-#          undef  SHMLBA /* not static: determined at boot time */
-#          define SHMLBA getpagesize()
-#      endif
-#   endif
-#endif
-EOFIX
-                  $xs =~ s!
-#include <sys/types\.h>
-.*
-(#ifdef newCONSTSUB|/\* Required)!$fixed$1!ms;
-                  return $xs;
-              });
-}
-
-if (-f 'ext/POSIX/Makefile.PL'
-    && extract_from_file('ext/POSIX/Makefile.PL',
-                         qr/Explicitly avoid including/)) {
-    # commit 6695a346c41138df, which effectively reverts 170888cff5e2ffb7
 
-    # PERL5LIB is populated by make_ext.pl with paths to the modules we need
-    # to run, don't override this with "../../lib" since that may not have
-    # been populated yet in a parallel build.
-    apply_commit('6695a346c41138df');
-}
+    if ($major < 5 && extract_from_file('Configure',
+                                        qr!if \$cc \$ccflags try\.c -o try >/dev/null 2>&1; then!)) {
+        # Analogous to the more general fix of dfe9444ca7881e71
+        # Without this flags such as -m64 may not be passed to this compile,
+        # which results in a byteorder of '1234' instead of '12345678', which
+        # can then cause crashes.
 
-# Parallel build for miniperl is safe
-system "make $j miniperl </dev/null";
+        if (extract_from_file('Configure', qr/xxx_prompt=y/)) {
+            # 8e07c86ebc651fe9 or later
+            # ("This is my patch  patch.1n  for perl5.001.")
+            apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 62249dd..c5c384e 100755
+--- a/Configure
++++ b/Configure
+@@ -8247,7 +8247,7 @@ main()
+ }
+ EOCP
+       xxx_prompt=y
+-      if $cc $ccflags try.c -o try >/dev/null 2>&1 && ./try > /dev/null; then
++      if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1 && ./try > /dev/null; then
+               dflt=`./try`
+               case "$dflt" in
+               [1-4][1-4][1-4][1-4]|12345678|87654321)
+EOPATCH
+        } else {
+            apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 53649d5..f1cd64a 100755
+--- a/Configure
++++ b/Configure
+@@ -6362,7 +6362,7 @@ main()
+       printf("\n");
+ }
+ EOCP
+-      if $cc $ccflags try.c -o try >/dev/null 2>&1 ; then
++      if $cc $ccflags $ldflags try.c -o try >/dev/null 2>&1 ; then
+               dflt=`./try`
+               case "$dflt" in
+               ????|????????) echo "(The test program ran ok.)";;
+EOPATCH
+        }
+    }
 
-my $expected = $target =~ /^test/ ? 't/perl'
-    : $target eq 'Fcntl' ? "lib/auto/Fcntl/Fcntl.$Config{so}"
-    : $target;
-my $real_target = $target eq 'Fcntl' ? $expected : $target;
+    if ($major < 6 && !extract_from_file('Configure',
+                                         qr!^\t-A\)$!)) {
+        # This adds the -A option to Configure, which is incredibly useful
+        # Effectively this is commits 02e93a22d20fc9a5, 5f83a3e9d818c3ad,
+        # bde6b06b2c493fef, f7c3111703e46e0c and 2 lines of trailing whitespace
+        # removed by 613d6c3e99b9decc, but applied at slightly different
+        # locations to ensure a clean patch back to 5.000
+        # Note, if considering patching to the intermediate revisions to fix
+        # bugs in -A handling, f7c3111703e46e0c is from 2002, and hence
+        # $major == 8
+
+        # To add to the fun, early patches add -K and -O options, and it's not
+        # trivial to get patch to put the C<. ./posthint.sh> in the right place
+        edit_file('Configure', sub {
+                      my $code = shift;
+                      $code =~ s/(optstr = ")([^"]+";\s*# getopt-style specification)/$1A:$2/
+                          or die "Substitution failed";
+                      $code =~ s!^(: who configured the system)!
+touch posthint.sh
+. ./posthint.sh
 
-if ($target ne 'miniperl') {
-    # Nearly all parallel build issues fixed by 5.10.0. Untrustworthy before that.
-    $j = '' if $major < 10;
+$1!ms
+                          or die "Substitution failed";
+                      return $code;
+                  });
+        apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 4b55fa6..60c3c64 100755
+--- a/Configure
++++ b/Configure
+@@ -1150,6 +1150,7 @@ set X `for arg in "$@"; do echo "X$arg"; done |
+ eval "set $*"
+ shift
+ rm -f options.awk
++rm -f posthint.sh
+ : set up default values
+ fastread=''
+@@ -1172,6 +1173,56 @@ while test $# -gt 0; do
+       case "$1" in
+       -d) shift; fastread=yes;;
+       -e) shift; alldone=cont;;
++      -A)
++          shift
++          xxx=''
++          yyy="$1"
++          zzz=''
++          uuu=undef
++          case "$yyy" in
++            *=*) zzz=`echo "$yyy"|sed 's!=.*!!'`
++                 case "$zzz" in
++                 *:*) zzz='' ;;
++                 *)   xxx=append
++                      zzz=" "`echo "$yyy"|sed 's!^[^=]*=!!'`
++                      yyy=`echo "$yyy"|sed 's!=.*!!'` ;;
++                 esac
++                 ;;
++            esac
++            case "$xxx" in
++            '')  case "$yyy" in
++                 *:*) xxx=`echo "$yyy"|sed 's!:.*!!'`
++                      yyy=`echo "$yyy"|sed 's!^[^:]*:!!'`
++                      zzz=`echo "$yyy"|sed 's!^[^=]*=!!'`
++                      yyy=`echo "$yyy"|sed 's!=.*!!'` ;;
++                 *)   xxx=`echo "$yyy"|sed 's!:.*!!'`
++                      yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` ;;
++                 esac
++                 ;;
++            esac
++          case "$xxx" in
++          append)
++              echo "$yyy=\"\${$yyy}$zzz\""    >> posthint.sh ;;
++          clear)
++              echo "$yyy=''"                  >> posthint.sh ;;
++          define)
++              case "$zzz" in
++              '') zzz=define ;;
++              esac
++              echo "$yyy='$zzz'"              >> posthint.sh ;;
++          eval)
++              echo "eval \"$yyy=$zzz\""       >> posthint.sh ;;
++          prepend)
++              echo "$yyy=\"$zzz\${$yyy}\""    >> posthint.sh ;;
++          undef)
++              case "$zzz" in
++              '') zzz="$uuu" ;;
++              esac
++              echo "$yyy=$zzz"                >> posthint.sh ;;
++            *)  echo "$me: unknown -A command '$xxx', ignoring -A $1" >&2 ;;
++          esac
++          shift
++          ;;
+       -f)
+               shift
+               cd ..
+EOPATCH
+    }
 
-    if ($real_target eq 'test_prep') {
-        if ($major < 8) {
-            # test-prep was added in 5.004_01, 3e3baf6d63945cb6.
-            # renamed to test_prep in 2001 in 5fe84fd29acaf55c.
-            # earlier than that, just make test. It will be fast enough.
-            $real_target = extract_from_file('Makefile.SH',
-                                             qr/^(test[-_]prep):/,
-                                             'test');
-        }
+    if ($major < 8 && !extract_from_file('Configure',
+                                         qr/^\t\tif test ! -t 0; then$/)) {
+        # Before dfe9444ca7881e71, Configure would refuse to run if stdin was
+        # not a tty. With that commit, the tty requirement was dropped for -de
+        # and -dE
+        # Commit aaeb8e512e8e9e14 dropped the tty requirement for -S
+        # For those older versions, it's probably easiest if we simply remove
+        # the sanity test.
+        edit_file('Configure', sub {
+                      my $code = shift;
+                      $code =~ s/test ! -t 0/test Perl = rules/;
+                      return $code;
+                  });
     }
 
-    system "make $j $real_target </dev/null";
-}
+    if ($major == 8 || $major == 9) {
+        # Fix symbol detection to that of commit 373dfab3839ca168 if it's any
+        # intermediate version 5129fff43c4fe08c or later, as the intermediate
+        # versions don't work correctly on (at least) Sparc Linux.
+        # 5129fff43c4fe08c adds the first mention of mistrustnm.
+        # 373dfab3839ca168 removes the last mention of lc=""
+        edit_file('Configure', sub {
+                      my $code = shift;
+                      return $code
+                          if $code !~ /\btc="";/; # 373dfab3839ca168 or later
+                      return $code
+                          if $code !~ /\bmistrustnm\b/; # before 5129fff43c4fe08c
+                      my $fixed = <<'EOC';
 
-my $missing_target = $expected =~ /perl$/ ? !-x $expected : !-r $expected;
+: is a C symbol defined?
+csym='tlook=$1;
+case "$3" in
+-v) tf=libc.tmp; tdc="";;
+-a) tf=libc.tmp; tdc="[]";;
+*) tlook="^$1\$"; tf=libc.list; tdc="()";;
+esac;
+tx=yes;
+case "$reuseval-$4" in
+true-) ;;
+true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;;
+esac;
+case "$tx" in
+yes)
+       tval=false;
+       if $test "$runnm" = true; then
+               if $contains $tlook $tf >/dev/null 2>&1; then
+                       tval=true;
+               elif $test "$mistrustnm" = compile -o "$mistrustnm" = run; then
+                       echo "void *(*(p()))$tdc { extern void *$1$tdc; return &$1; } int main() { if(p()) return(0); else return(1); }"> try.c;
+                       $cc -o try $optimize $ccflags $ldflags try.c >/dev/null 2>&1 $libs && tval=true;
+                       $test "$mistrustnm" = run -a -x try && { $run ./try$_exe >/dev/null 2>&1 || tval=false; };
+                       $rm -f try$_exe try.c core core.* try.core;
+               fi;
+       else
+               echo "void *(*(p()))$tdc { extern void *$1$tdc; return &$1; } int main() { if(p()) return(0); else return(1); }"> try.c;
+               $cc -o try $optimize $ccflags $ldflags try.c $libs >/dev/null 2>&1 && tval=true;
+               $rm -f try$_exe try.c;
+       fi;
+       ;;
+*)
+       case "$tval" in
+       $define) tval=true;;
+       *) tval=false;;
+       esac;
+       ;;
+esac;
+eval "$2=$tval"'
 
-if ($options{'test-build'}) {
-    report_and_exit($missing_target, 'could build', 'could not build',
-                    $real_target);
-} elsif ($missing_target) {
-    skip("could not build $real_target");
+EOC
+                      $code =~ s/\n: is a C symbol defined\?\n.*?\neval "\$2=\$tval"'\n\n/$fixed/sm
+                          or die "substitution failed";
+                      return $code;
+                  });
+    }
+
+    if ($major < 10
+        && extract_from_file('Configure', qr/^set malloc\.h i_malloc$/)) {
+        # This is commit 01d07975f7ef0e7d, trimmed, with $compile inlined as
+        # prior to bd9b35c97ad661cc Configure had the malloc.h test before the
+        # definition of $compile.
+        apply_patch(<<'EOPATCH');
+diff --git a/Configure b/Configure
+index 3d2e8b9..6ce7766 100755
+--- a/Configure
++++ b/Configure
+@@ -6743,5 +6743,22 @@ set d_dosuid
+ : see if this is a malloc.h system
+-set malloc.h i_malloc
+-eval $inhdr
++: we want a real compile instead of Inhdr because some systems have a
++: malloc.h that just gives a compile error saying to use stdlib.h instead
++echo " "
++$cat >try.c <<EOCP
++#include <stdlib.h>
++#include <malloc.h>
++int main () { return 0; }
++EOCP
++set try
++if $cc $optimize $ccflags $ldflags -o try $* try.c $libs > /dev/null 2>&1; then
++    echo "<malloc.h> found." >&4
++    val="$define"
++else
++    echo "<malloc.h> NOT found." >&4
++    val="$undef"
++fi
++$rm -f try.c try
++set i_malloc
++eval $setvar
+EOPATCH
+    }
 }
 
-match_and_exit($real_target) if $match;
+sub patch_hints {
+    if ($^O eq 'freebsd') {
+        # There are rather too many version-specific FreeBSD hints fixes to
+        # patch individually. Also, more than once the FreeBSD hints file has
+        # been written in what turned out to be a rather non-future-proof style,
+        # with case statements treating the most recent version as the
+        # exception, instead of treating previous versions' behaviour explicitly
+        # and changing the default to cater for the current behaviour. (As
+        # strangely, future versions inherit the current behaviour.)
+        checkout_file('hints/freebsd.sh');
+    } elsif ($^O eq 'darwin') {
+        if ($major < 8) {
+            # We can't build on darwin without some of the data in the hints
+            # file. Probably less surprising to use the earliest version of
+            # hints/darwin.sh and then edit in place just below, than use
+            # blead's version, as that would create a discontinuity at
+            # f556e5b971932902 - before it, hints bugs would be "fixed", after
+            # it they'd resurface. This way, we should give the illusion of
+            # monotonic bug fixing.
+            my $faking_it;
+            if (!-f 'hints/darwin.sh') {
+                checkout_file('hints/darwin.sh', 'f556e5b971932902');
+                ++$faking_it;
+            }
 
-if (defined $options{'one-liner'}) {
-    my $exe = $target =~ /^(?:perl$|test)/ ? 'perl' : 'miniperl';
-    unshift @ARGV, "./$exe", '-Ilib', '-e', $options{'one-liner'};
-}
+            edit_file('hints/darwin.sh', sub {
+                      my $code = shift;
+                      # Part of commit 8f4f83badb7d1ba9, which mostly undoes
+                      # commit 0511a818910f476c.
+                      $code =~ s/^cppflags='-traditional-cpp';$/cppflags="\${cppflags} -no-cpp-precomp"/m;
+                      # commit 14c11978e9b52e08/803bb6cc74d36a3f
+                      # Without this, code in libperl.bundle links against op.o
+                      # in preference to opmini.o on the linker command line,
+                      # and hence miniperl tries to use File::Glob instead of
+                      # csh
+                      $code =~ s/^(lddlflags=)/ldflags="\${ldflags} -flat_namespace"\n$1/m;
+                      # f556e5b971932902 also patches Makefile.SH with some
+                      # special case code to deal with useshrplib for darwin.
+                      # Given that post 5.8.0 the darwin hints default was
+                      # changed to false, and it would be very complex to splice
+                      # in that code in various versions of Makefile.SH back
+                      # to 5.002, lets just turn it off.
+                      $code =~ s/^useshrplib='true'/useshrplib='false'/m
+                          if $faking_it;
+                      return $code;
+                  });
+        }
+    } elsif ($^O eq 'netbsd') {
+        if ($major < 6) {
+            # These are part of commit 099685bc64c7dbce
+            edit_file('hints/netbsd.sh', sub {
+                          my $code = shift;
+                          my $fixed = <<'EOC';
+case "$osvers" in
+0.9|0.8*)
+       usedl="$undef"
+       ;;
+*)
+       if [ -f /usr/libexec/ld.elf_so ]; then
+               d_dlopen=$define
+               d_dlerror=$define
+               ccdlflags="-Wl,-E -Wl,-R${PREFIX}/lib $ccdlflags"
+               cccdlflags="-DPIC -fPIC $cccdlflags"
+               lddlflags="--whole-archive -shared $lddlflags"
+       elif [ "`uname -m`" = "pmax" ]; then
+# NetBSD 1.3 and 1.3.1 on pmax shipped an `old' ld.so, which will not work.
+               d_dlopen=$undef
+       elif [ -f /usr/libexec/ld.so ]; then
+               d_dlopen=$define
+               d_dlerror=$define
+               ccdlflags="-Wl,-R${PREFIX}/lib $ccdlflags"
+# we use -fPIC here because -fpic is *NOT* enough for some of the
+# extensions like Tk on some netbsd platforms (the sparc is one)
+               cccdlflags="-DPIC -fPIC $cccdlflags"
+               lddlflags="-Bforcearchive -Bshareable $lddlflags"
+       else
+               d_dlopen=$undef
+       fi
+       ;;
+esac
+EOC
+                          $code =~ s/^case "\$osvers" in\n0\.9\|0\.8.*?^esac\n/$fixed/ms;
+                          return $code;
+                      });
+        }
+    } elsif ($^O eq 'openbsd') {
+        if ($major < 8) {
+            checkout_file('hints/openbsd.sh', '43051805d53a3e4c')
+                unless -f 'hints/openbsd.sh';
+            my $which = extract_from_file('hints/openbsd.sh',
+                                          qr/# from (2\.8|3\.1) onwards/,
+                                          '');
+            if ($which eq '') {
+                my $was = extract_from_file('hints/openbsd.sh',
+                                            qr/(lddlflags="(?:-Bforcearchive )?-Bshareable)/);
+                # This is commit 154d43cbcf57271c and parts of 5c75dbfa77b0949c
+                # and 29b5585702e5e025
+                apply_patch(sprintf <<'EOPATCH', $was);
+diff --git a/hints/openbsd.sh b/hints/openbsd.sh
+index a7d8bf2..5b79709 100644
+--- a/hints/openbsd.sh
++++ b/hints/openbsd.sh
+@@ -37,7 +37,25 @@ OpenBSD.alpha|OpenBSD.mips|OpenBSD.powerpc|OpenBSD.vax)
+       # we use -fPIC here because -fpic is *NOT* enough for some of the
+       # extensions like Tk on some OpenBSD platforms (ie: sparc)
+       cccdlflags="-DPIC -fPIC $cccdlflags"
+-      %s $lddlflags"
++      case "$osvers" in
++      [01].*|2.[0-7]|2.[0-7].*)
++              lddlflags="-Bshareable $lddlflags"
++              ;;
++      2.[8-9]|3.0)
++              ld=${cc:-cc}
++              lddlflags="-shared -fPIC $lddlflags"
++              ;;
++      *) # from 3.1 onwards
++              ld=${cc:-cc}
++              lddlflags="-shared -fPIC $lddlflags"
++              libswanted=`echo $libswanted | sed 's/ dl / /'`
++              ;;
++      esac
++
++      # We need to force ld to export symbols on ELF platforms.
++      # Without this, dlopen() is crippled.
++      ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__`
++      test -n "$ELF" && ldflags="-Wl,-E $ldflags"
+       ;;
+ esac
+EOPATCH
+            } elsif ($which eq '2.8') {
+                # This is parts of 5c75dbfa77b0949c and 29b5585702e5e025, and
+                # possibly eb9cd59d45ad2908
+                my $was = extract_from_file('hints/openbsd.sh',
+                                            qr/lddlflags="(-shared(?: -fPIC)?) \$lddlflags"/);
 
-# This is what we came here to run:
+                apply_patch(sprintf <<'EOPATCH', $was);
+--- a/hints/openbsd.sh 2011-10-21 17:25:20.000000000 +0200
++++ b/hints/openbsd.sh 2011-10-21 16:58:43.000000000 +0200
+@@ -44,11 +44,21 @@
+       [01].*|2.[0-7]|2.[0-7].*)
+               lddlflags="-Bshareable $lddlflags"
+               ;;
+-      *) # from 2.8 onwards
++      2.[8-9]|3.0)
+               ld=${cc:-cc}
+-              lddlflags="%s $lddlflags"
++              lddlflags="-shared -fPIC $lddlflags"
++              ;;
++      *) # from 3.1 onwards
++              ld=${cc:-cc}
++              lddlflags="-shared -fPIC $lddlflags"
++              libswanted=`echo $libswanted | sed 's/ dl / /'`
+               ;;
+       esac
++
++      # We need to force ld to export symbols on ELF platforms.
++      # Without this, dlopen() is crippled.
++      ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__`
++      test -n "$ELF" && ldflags="-Wl,-E $ldflags"
+       ;;
+ esac
+EOPATCH
+            } elsif ($which eq '3.1'
+                     && !extract_from_file('hints/openbsd.sh',
+                                           qr/We need to force ld to export symbols on ELF platforms/)) {
+                # This is part of 29b5585702e5e025
+                apply_patch(<<'EOPATCH');
+diff --git a/hints/openbsd.sh b/hints/openbsd.sh
+index c6b6bc9..4839d04 100644
+--- a/hints/openbsd.sh
++++ b/hints/openbsd.sh
+@@ -54,6 +54,11 @@ alpha-2.[0-8]|mips-*|vax-*|powerpc-2.[0-7]|m88k-*)
+               libswanted=`echo $libswanted | sed 's/ dl / /'`
+               ;;
+       esac
++
++      # We need to force ld to export symbols on ELF platforms.
++      # Without this, dlopen() is crippled.
++      ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__`
++      test -n "$ELF" && ldflags="-Wl,-E $ldflags"
+       ;;
+ esac
+EOPATCH
+            }
+        }
+    } elsif ($^O eq 'linux') {
+        if ($major < 1) {
+            # sparc linux seems to need the -Dbool=char -DHAS_BOOL part of
+            # perl5.000 patch.0n: [address Configure and build issues]
+            edit_file('hints/linux.sh', sub {
+                          my $code = shift;
+                          $code =~ s!-I/usr/include/bsd!-Dbool=char -DHAS_BOOL!g;
+                          return $code;
+                      });
+        }
 
-if (exists $Config{ldlibpthname}) {
-    require Cwd;
-    my $varname = $Config{ldlibpthname};
-    my $cwd = Cwd::getcwd();
-    if (defined $ENV{$varname}) {
-        $ENV{$varname} = $cwd . $Config{path_sep} . $ENV{$varname};
-    } else {
-        $ENV{$varname} = $cwd;
+        if ($major <= 9) {
+            if (`uname -sm` =~ qr/^Linux sparc/) {
+                if (extract_from_file('hints/linux.sh', qr/sparc-linux/)) {
+                    # Be sure to use -fPIC not -fpic on Linux/SPARC
+                    apply_commit('f6527d0ef0c13ad4');
+                } elsif(!extract_from_file('hints/linux.sh',
+                                           qr/^sparc-linux\)$/)) {
+                    my $fh = open_or_die('hints/linux.sh', '>>');
+                    print $fh <<'EOT' or die $!;
+
+case "`uname -m`" in
+sparc*)
+       case "$cccdlflags" in
+       *-fpic*) cccdlflags="`echo $cccdlflags|sed 's/-fpic/-fPIC/'`" ;;
+       *)       cccdlflags="$cccdlflags -fPIC" ;;
+       esac
+       ;;
+esac
+EOT
+                    close_or_die($fh);
+                }
+            }
+        }
     }
 }
 
-my $ret = system @ARGV;
-
-report_and_exit($ret, 'zero exit from', 'non-zero exit from', "@ARGV");
-
 # Local variables:
 # cperl-indent-level: 4
 # indent-tabs-mode: nil