This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
bisect-runner.pl now builds test_prep on OpenBSD back to 5.002
[perl5.git] / Porting / bisect-runner.pl
index 0caa64e..bcd8e07 100755 (executable)
@@ -939,6 +939,292 @@ index 2a6cbcd..eab2de1 100644
 EOPATCH
         }
     }
 EOPATCH
         }
     }
+} elsif ($^O eq 'openbsd') {
+    if (!-f 'hints/openbsd.sh') {
+        system 'git show 43051805d53a3e4c:hints/openbsd.sh > hints/openbsd.sh'
+          and die;
+    }
+
+    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.
+        # Commits c07a80fdfe3926b5 and f82b3d4130164d5f changed the same part
+        # of perl.h
+
+        if (extract_from_file('perl.h',
+                              qr/^#ifdef HAS_GETPGRP2$/)) {
+            $bad = <<'EOBAD';
+***************
+*** 57,71 ****
+  #define TAINT_PROPER(s)      if (tainting) taint_proper(no_security, s)
+  #define TAINT_ENV()  if (tainting) taint_env()
+  
+! #ifdef HAS_GETPGRP2
+! #   ifndef HAS_GETPGRP
+! #    define HAS_GETPGRP
+! #   endif
+! #endif
+! 
+! #ifdef HAS_SETPGRP2
+! #   ifndef HAS_SETPGRP
+! #    define HAS_SETPGRP
+! #   endif
+  #endif
+  
+EOBAD
+        } elsif (extract_from_file('perl.h',
+                                   qr/Gack, you have one but not both of getpgrp2/)) {
+            $bad = <<'EOBAD';
+***************
+*** 56,76 ****
+  #define TAINT_PROPER(s)      if (tainting) taint_proper(no_security, s)
+  #define TAINT_ENV()  if (tainting) taint_env()
+  
+! #if defined(HAS_GETPGRP2) && defined(HAS_SETPGRP2)
+! #   define getpgrp getpgrp2
+! #   define setpgrp setpgrp2
+! #   ifndef HAS_GETPGRP
+! #    define HAS_GETPGRP
+! #   endif
+! #   ifndef HAS_SETPGRP
+! #    define HAS_SETPGRP
+! #   endif
+! #   ifndef USE_BSDPGRP
+! #    define USE_BSDPGRP
+! #   endif
+! #else
+! #   if defined(HAS_GETPGRP2) || defined(HAS_SETPGRP2)
+!      #include "Gack, you have one but not both of getpgrp2() and setpgrp2()."
+! #   endif
+  #endif
+  
+EOBAD
+        } elsif (extract_from_file('perl.h',
+                                   qr/^#ifdef USE_BSDPGRP$/)) {
+            $bad = <<'EOBAD'
+***************
+*** 91,116 ****
+  #define TAINT_PROPER(s)      if (tainting) taint_proper(no_security, s)
+  #define TAINT_ENV()  if (tainting) taint_env()
+  
+! #ifdef USE_BSDPGRP
+! #   ifdef HAS_GETPGRP
+! #       define BSD_GETPGRP(pid) getpgrp((pid))
+! #   endif
+! #   ifdef HAS_SETPGRP
+! #       define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
+! #   endif
+! #else
+! #   ifdef HAS_GETPGRP2
+! #       define BSD_GETPGRP(pid) getpgrp2((pid))
+! #       ifndef HAS_GETPGRP
+! #                define HAS_GETPGRP
+! #            endif
+! #   endif
+! #   ifdef HAS_SETPGRP2
+! #       define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
+! #       ifndef HAS_SETPGRP
+! #                define HAS_SETPGRP
+! #            endif
+! #   endif
+  #endif
+  
+  #ifndef _TYPES_              /* If types.h defines this it's easy. */
+EOBAD
+        }
+        if ($bad) {
+            apply_patch(<<"EOPATCH");
+*** a/perl.h   2011-10-21 09:46:12.000000000 +0200
+--- b/perl.h   2011-10-21 09:46:12.000000000 +0200
+$bad--- 91,144 ----
+  #define TAINT_PROPER(s)      if (tainting) taint_proper(no_security, s)
+  #define TAINT_ENV()  if (tainting) taint_env()
+  
+! /* XXX All process group stuff is handled in pp_sys.c.  Should these 
+!    defines move there?  If so, I could simplify this a lot. --AD  9/96.
+! */
+! /* Process group stuff changed from traditional BSD to POSIX.
+!    perlfunc.pod documents the traditional BSD-style syntax, so we'll
+!    try to preserve that, if possible.
+! */
+! #ifdef HAS_SETPGID
+! #  define BSD_SETPGRP(pid, pgrp)     setpgid((pid), (pgrp))
+! #else
+! #  if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
+! #    define BSD_SETPGRP(pid, pgrp)   setpgrp((pid), (pgrp))
+! #  else
+! #    ifdef HAS_SETPGRP2  /* DG/UX */
+! #      define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
+! #    endif
+! #  endif
+! #endif
+! #if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
+! #  define HAS_SETPGRP  /* Well, effectively it does . . . */
+! #endif
+! 
+! /* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
+!     our life easier :-) so we'll try it.
+! */
+! #ifdef HAS_GETPGID
+! #  define BSD_GETPGRP(pid)           getpgid((pid))
+! #else
+! #  if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
+! #    define BSD_GETPGRP(pid)         getpgrp((pid))
+! #  else
+! #    ifdef HAS_GETPGRP2  /* DG/UX */
+! #      define BSD_GETPGRP(pid)               getpgrp2((pid))
+! #    endif
+! #  endif
+! #endif
+! #if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
+! #  define HAS_GETPGRP  /* Well, effectively it does . . . */
+! #endif
+! 
+! /* These are not exact synonyms, since setpgrp() and getpgrp() may 
+!    have different behaviors, but perl.h used to define USE_BSDPGRP
+!    (prior to 5.003_05) so some extension might depend on it.
+! */
+! #if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
+! #  ifndef USE_BSDPGRP
+! #    define USE_BSDPGRP
+! #  endif
+  #endif
+  
+  #ifndef _TYPES_              /* If types.h defines this it's easy. */
+EOPATCH
+        }
+    }
+    if ($major < 3 && !extract_from_file('pp_sys.c', qr/BSD_GETPGRP/)) {
+        # Part of commit c3293030fd1b7489
+        apply_patch(<<'EOPATCH');
+diff --git a/pp_sys.c b/pp_sys.c
+index 4608a2a..f0c9d1d 100644
+--- a/pp_sys.c
++++ b/pp_sys.c
+@@ -2903,8 +2903,8 @@ PP(pp_getpgrp)
+       pid = 0;
+     else
+       pid = SvIVx(POPs);
+-#ifdef USE_BSDPGRP
+-    value = (I32)getpgrp(pid);
++#ifdef BSD_GETPGRP
++    value = (I32)BSD_GETPGRP(pid);
+ #else
+     if (pid != 0)
+       DIE("POSIX getpgrp can't take an argument");
+@@ -2933,8 +2933,8 @@ PP(pp_setpgrp)
+     }
+     TAINT_PROPER("setpgrp");
+-#ifdef USE_BSDPGRP
+-    SETi( setpgrp(pid, pgrp) >= 0 );
++#ifdef BSD_SETPGRP
++    SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
+ #else
+     if ((pgrp != 0) || (pid != 0)) {
+       DIE("POSIX setpgrp can't take an argument");
+EOPATCH
+    }
 }
 
 if ($major < 10) {
 }
 
 if ($major < 10) {
@@ -1215,6 +1501,29 @@ index 03c4d48..3c814a2 100644
 EOPATCH
 }
 
 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 < 10 and -f 'ext/IPC/SysV/SysV.xs') {
     edit_file('ext/IPC/SysV/SysV.xs', sub {
                   my $xs = shift;
 if ($major < 10 and -f 'ext/IPC/SysV/SysV.xs') {
     edit_file('ext/IPC/SysV/SysV.xs', sub {
                   my $xs = shift;