diff options
Diffstat (limited to 'Porting')
-rwxr-xr-x | Porting/bisect-runner.pl | 1341 |
1 files changed, 684 insertions, 657 deletions
diff --git a/Porting/bisect-runner.pl b/Porting/bisect-runner.pl index 835688b41f..020fcd50ce 100755 --- a/Porting/bisect-runner.pl +++ b/Porting/bisect-runner.pl @@ -571,453 +571,8 @@ 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 - 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 ($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 - -+: 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' -- --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 -} +patch_Configure(); +patch_hints(); # Cwd.xs added in commit 0d2079faa739aaa9. Cwd.pm moved to ext/ 8 years later # in commit 403f501d5b37ebf0 @@ -1110,28 +665,13 @@ if ($major == 7) { # 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 ($^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') { + foreach ('ext/DynaLoader/dl_dyld.xs') { 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) { @@ -1212,66 +752,9 @@ diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs 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') @@ -1292,109 +775,6 @@ 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 -+ -+ # 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 - } - } 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) { @@ -2190,6 +1537,686 @@ 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 ($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 + ++: 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' +- +-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 + } +} + +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; + } + + 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"/); + + 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 ($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); + } + } + } + } +} + # Local variables: # cperl-indent-level: 4 # indent-tabs-mode: nil |