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 @@
+ 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.
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) {
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