aboutsummaryrefslogtreecommitdiff
path: root/lang/perl5.10/files
diff options
context:
space:
mode:
authorMark Linimon <linimon@FreeBSD.org>2012-03-11 23:49:09 +0000
committerMark Linimon <linimon@FreeBSD.org>2012-03-11 23:49:09 +0000
commit7047959f240813dd8e23b0962c0e5e605cd1d142 (patch)
tree691b175a94411098f1a16b6804d31984c2464863 /lang/perl5.10/files
parent09e8089e23d89a4f2d22e036428a55ebf57870c6 (diff)
downloadports-7047959f240813dd8e23b0962c0e5e605cd1d142.tar.gz
ports-7047959f240813dd8e23b0962c0e5e605cd1d142.zip
Notes
Diffstat (limited to 'lang/perl5.10/files')
-rw-r--r--lang/perl5.10/files/patch-Configure21
-rw-r--r--lang/perl5.10/files/patch-INST_PREFIX.t20
-rw-r--r--lang/perl5.10/files/patch-MM_Any.pm18
-rw-r--r--lang/perl5.10/files/patch-bug6997395
-rw-r--r--lang/perl5.10/files/patch-bug7195246
-rw-r--r--lang/perl5.10/files/patch-freebsd.sh51
-rw-r--r--lang/perl5.10/files/patch-freebsd.sh-freebsd1030
-rw-r--r--lang/perl5.10/files/patch-perl.c61
-rw-r--r--lang/perl5.10/files/perl-after-upgrade603
-rw-r--r--lang/perl5.10/files/perl-man.conf2
-rw-r--r--lang/perl5.10/files/use.perl157
11 files changed, 1104 insertions, 0 deletions
diff --git a/lang/perl5.10/files/patch-Configure b/lang/perl5.10/files/patch-Configure
new file mode 100644
index 000000000000..21ccd2c8c62e
--- /dev/null
+++ b/lang/perl5.10/files/patch-Configure
@@ -0,0 +1,21 @@
+--- Configure.orig 2010-07-14 15:28:45.000000000 +0000
++++ Configure 2010-07-14 15:29:23.000000000 +0000
+@@ -4798,7 +4798,7 @@
+ libpth=''
+ for xxx in $dlist
+ do
+- if $test -d $xxx; then
++ if $test -d $xxx || [ $xxx = $prefix/lib ]; then
+ case " $libpth " in
+ *" $xxx "*) ;;
+ *) libpth="$libpth $xxx";;
+@@ -9125,8 +9125,7 @@
+
+ : determine where add-on public executable scripts go
+ case "$sitescript" in
+-'') dflt=$siteprefix/script
+- $test -d $dflt || dflt=$sitebin ;;
++'') dflt=$sitebin ;;
+ *) dflt="$sitescript" ;;
+ esac
+ fn=d~+
diff --git a/lang/perl5.10/files/patch-INST_PREFIX.t b/lang/perl5.10/files/patch-INST_PREFIX.t
new file mode 100644
index 000000000000..9520ef26890c
--- /dev/null
+++ b/lang/perl5.10/files/patch-INST_PREFIX.t
@@ -0,0 +1,20 @@
+--- lib/ExtUtils/t/INST_PREFIX.t.orig Wed Feb 15 12:46:31 2006
++++ lib/ExtUtils/t/INST_PREFIX.t Wed Feb 15 12:46:52 2006
+@@ -16,7 +16,7 @@ BEGIN {
+ }
+
+ use strict;
+-use Test::More tests => 52;
++use Test::More tests => 51;
+ use MakeMaker::Test::Utils;
+ use MakeMaker::Test::Setup::BFD;
+ use ExtUtils::MakeMaker;
+@@ -62,7 +62,7 @@ like( $stdout->read, qr{
+ Writing\ $Makefile\ for\ Big::Dummy\n
+ }x );
+
+-is( $mm->{PREFIX}, '$(SITEPREFIX)', 'PREFIX set based on INSTALLDIRS' );
++## is( $mm->{PREFIX}, '$(SITEPREFIX)', 'PREFIX set based on INSTALLDIRS' );
+
+ isa_ok( $mm, 'ExtUtils::MakeMaker' );
+
diff --git a/lang/perl5.10/files/patch-MM_Any.pm b/lang/perl5.10/files/patch-MM_Any.pm
new file mode 100644
index 000000000000..4e50627b00a8
--- /dev/null
+++ b/lang/perl5.10/files/patch-MM_Any.pm
@@ -0,0 +1,18 @@
+--- lib/ExtUtils/MM_Any.pm.orig Wed Feb 15 12:20:43 2006
++++ lib/ExtUtils/MM_Any.pm Wed Feb 15 12:22:29 2006
+@@ -1069,13 +1069,14 @@ sub init_INSTALL_from_PREFIX {
+ ('$(PREFIX)') x 3;
+ }
+ else {
++ $self->{PREFIX} ||= $iprefix;
+ $self->{PERLPREFIX} ||= $iprefix;
+ $self->{SITEPREFIX} ||= $sprefix;
+ $self->{VENDORPREFIX} ||= $vprefix;
+
+ # Lots of MM extension authors like to use $(PREFIX) so we
+ # put something sensible in there no matter what.
+- $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
++ #$self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
+ }
+
+ my $arch = $Config{archname};
diff --git a/lang/perl5.10/files/patch-bug69973 b/lang/perl5.10/files/patch-bug69973
new file mode 100644
index 000000000000..fe2119fe42a1
--- /dev/null
+++ b/lang/perl5.10/files/patch-bug69973
@@ -0,0 +1,95 @@
+# http://rt.perl.org/rt3//Public/Bug/Display.html?id=69973
+# http://perl5.git.perl.org/perl.git/commitdiff_plain/0abd0d78a73da1c4d13b1c700526b7e5d03b32d4?hp=fe88edf0c4ada4230b84bdb5417029b8f766694a
+diff --git a/ext/re/t/regop.t b/ext/re/t/regop.t
+index 9118bf6..46e6ec0 100644
+--- ext/re/t/regop.t
++++ ext/re/t/regop.t
+@@ -231,12 +231,12 @@ anchored "ABC" at 0
+ #Freeing REx: "(\\.COM|\\.EXE|\\.BAT|\\.CMD|\\.VBS|\\.VBE|\\.JS|\\.JSE|\\."......
+ %MATCHED%
+ floating ""$ at 3..4 (checking floating)
+-1:1[1] 3:2[1] 5:2[64] 45:83[1] 47:84[1] 48:85[0]
+-stclass EXACTF <.> minlen 3
+-Found floating substr ""$ at offset 30...
+-Does not contradict STCLASS...
+-Guessed: match at offset 26
+-Matching stclass EXACTF <.> against ".exe"
++#1:1[1] 3:2[1] 5:2[64] 45:83[1] 47:84[1] 48:85[0]
++#stclass EXACTF <.> minlen 3
++#Found floating substr ""$ at offset 30...
++#Does not contradict STCLASS...
++#Guessed: match at offset 26
++#Matching stclass EXACTF <.> against ".exe"
+ ---
+ #Compiling REx "[q]"
+ #size 12 nodes Got 100 bytes for offset annotations.
+diff --git a/regcomp.c b/regcomp.c
+index 6e9fa26..eb5f12f 100644
+--- regcomp.c
++++ regcomp.c
+@@ -2833,13 +2833,18 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
+ }
+ } else {
+ /*
+- Currently we assume that the trie can handle unicode and ascii
+- matches fold cased matches. If this proves true then the following
+- define will prevent tries in this situation.
+-
+- #define TRIE_TYPE_IS_SAFE (UTF || optype==EXACT)
+-*/
++ Currently we do not believe that the trie logic can
++ handle case insensitive matching properly when the
++ pattern is not unicode (thus forcing unicode semantics).
++
++ If/when this is fixed the following define can be swapped
++ in below to fully enable trie logic.
++
+ #define TRIE_TYPE_IS_SAFE 1
++
++*/
++#define TRIE_TYPE_IS_SAFE (UTF || optype==EXACT)
++
+ if ( last && TRIE_TYPE_IS_SAFE ) {
+ make_trie( pRExC_state,
+ startbranch, first, cur, tail, count,
+diff --git a/regexec.c b/regexec.c
+index 402ede3..ec09c28 100644
+--- regexec.c
++++ regexec.c
+@@ -1105,16 +1105,15 @@ Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV *sv, char *strpos,
+
+ #define REXEC_TRIE_READ_CHAR(trie_type, trie, widecharmap, uc, uscan, len, \
+ uvc, charid, foldlen, foldbuf, uniflags) STMT_START { \
+- UV uvc_unfolded = 0; \
+ switch (trie_type) { \
+ case trie_utf8_fold: \
+ if ( foldlen>0 ) { \
+- uvc_unfolded = uvc = utf8n_to_uvuni( uscan, UTF8_MAXLEN, &len, uniflags ); \
++ uvc = utf8n_to_uvuni( uscan, UTF8_MAXLEN, &len, uniflags ); \
+ foldlen -= len; \
+ uscan += len; \
+ len=0; \
+ } else { \
+- uvc_unfolded = uvc = utf8n_to_uvuni( (U8*)uc, UTF8_MAXLEN, &len, uniflags ); \
++ uvc = utf8n_to_uvuni( (U8*)uc, UTF8_MAXLEN, &len, uniflags ); \
+ uvc = to_uni_fold( uvc, foldbuf, &foldlen ); \
+ foldlen -= UNISKIP( uvc ); \
+ uscan = foldbuf + UNISKIP( uvc ); \
+@@ -1140,7 +1139,6 @@ uvc, charid, foldlen, foldbuf, uniflags) STMT_START { \
+ uvc = (UV)*uc; \
+ len = 1; \
+ } \
+- \
+ if (uvc < 256) { \
+ charid = trie->charmap[ uvc ]; \
+ } \
+@@ -1153,9 +1151,6 @@ uvc, charid, foldlen, foldbuf, uniflags) STMT_START { \
+ charid = (U16)SvIV(*svpp); \
+ } \
+ } \
+- if (!charid && trie_type == trie_utf8_fold && !UTF) { \
+- charid = trie->charmap[uvc_unfolded]; \
+- } \
+ } STMT_END
+
+ #define REXEC_FBC_EXACTISH_CHECK(CoNd) \
diff --git a/lang/perl5.10/files/patch-bug71952 b/lang/perl5.10/files/patch-bug71952
new file mode 100644
index 000000000000..c36c7d721edb
--- /dev/null
+++ b/lang/perl5.10/files/patch-bug71952
@@ -0,0 +1,46 @@
+# http://rt.perl.org/rt3/Public/Bug/Display.html?id=71952
+# http://perl5.git.perl.org/perl.git/commitdiff_plain/1f15e670edb515b744e9021b4a42a7955da83093?hp=1f730e6c11736bad913e605b064200a67117e898
+diff --git a/sv.c b/sv.c
+index 4e80e18..a3eb187 100644
+--- sv.c
++++ sv.c
+@@ -5664,7 +5664,8 @@ Perl_sv_clear(pTHX_ register SV *const sv)
+ && !CvCONST(destructor)
+ /* Don't bother calling an empty destructor */
+ && (CvISXSUB(destructor)
+- || CvSTART(destructor)->op_next->op_type != OP_LEAVESUB))
++ || (CvSTART(destructor)
++ && (CvSTART(destructor)->op_next->op_type != OP_LEAVESUB))))
+ {
+ SV* const tmpref = newRV(sv);
+ SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
+diff --git a/t/op/method.t b/t/op/method.t
+index afa8cfb..b602ca2 100644
+--- t/op/method.t
++++ t/op/method.t
+@@ -10,7 +10,7 @@ BEGIN {
+ require "test.pl";
+ }
+
+-print "1..78\n";
++print "1..79\n";
+
+ @A::ISA = 'B';
+ @B::ISA = 'C';
+@@ -292,3 +292,16 @@ EOT
+ "check if UNIVERSAL::AUTOLOAD works",
+ );
+ }
++
++# Test for #71952: crash when looking for a nonexistent destructor
++# Regression introduced by fbb3ee5af3d4
++{
++ fresh_perl_is(<<'EOT',
++sub M::DESTROY; bless {}, "M" ; print "survived\n";
++EOT
++ "survived",
++ {},
++ "no crash with a declared but missing DESTROY method"
++ );
++}
++
diff --git a/lang/perl5.10/files/patch-freebsd.sh b/lang/perl5.10/files/patch-freebsd.sh
new file mode 100644
index 000000000000..4587e5338e7f
--- /dev/null
+++ b/lang/perl5.10/files/patch-freebsd.sh
@@ -0,0 +1,51 @@
+--- hints/freebsd.sh
++++ hints/freebsd.sh
+@@ -88,6 +88,8 @@
+ esac
+ libswanted=`echo $libswanted | sed 's/ malloc / /'`
+ libswanted=`echo $libswanted | sed 's/ bind / /'`
++ libswanted=`echo $libswanted | sed 's/ dl / /'`
++ libswanted=`echo $libswanted | sed 's/ c / /'`
+ # iconv gone in Perl 5.8.1, but if someone compiles 5.8.0 or earlier.
+ libswanted=`echo $libswanted | sed 's/ iconv / /'`
+ d_setregid='define'
+@@ -102,6 +104,10 @@
+ ;;
+ esac
+ libswanted=`echo $libswanted | sed 's/ malloc / /'`
++ libswanted=`echo $libswanted | sed 's/ bind / /'`
++ libswanted=`echo $libswanted | sed 's/ dl / /'`
++ libswanted=`echo $libswanted | sed 's/ iconv / /'`
++ libswanted=`echo $libswanted | sed 's/ c / /'`
+ ;;
+ esac
+
+@@ -125,7 +131,7 @@
+ else
+ libpth="/usr/lib /usr/local/lib"
+ glibpth="/usr/lib /usr/local/lib"
+- ldflags="-Wl,-E "
++ ldflags="%%PTHREAD_LIBS%% -Wl,-E "
+ lddlflags="-shared "
+ fi
+ cccdlflags='-DPIC -fPIC'
+@@ -136,7 +142,7 @@
+ 0*|1*|2*|3*) ;;
+
+ *)
+- ccflags="${ccflags} -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H"
++ ccflags="${ccflags} %%PTHREAD_CFLAGS%% -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H"
+ if /usr/bin/file -L /usr/lib/libc.so | /usr/bin/grep -vq "not stripped" ; then
+ usenm=false
+ fi
+@@ -183,7 +189,9 @@
+
+ # This script UU/usethreads.cbu will get 'called-back' by Configure
+ # after it has prompted the user for whether to use threads.
+-cat > UU/usethreads.cbu <<'EOCBU'
++## not quite - modern FreeBSD perl port is supposed to take care of that
++## we just add extra libraries and cflags nowadays
++cat > /dev/null <<'EOCBU'
+ case "$usethreads" in
+ $define|true|[yY]*)
+ lc_r=`/sbin/ldconfig -r|grep ':-lc_r'|awk '{print $NF}'|sed -n '$p'`
diff --git a/lang/perl5.10/files/patch-freebsd.sh-freebsd10 b/lang/perl5.10/files/patch-freebsd.sh-freebsd10
new file mode 100644
index 000000000000..8d9ec63d4235
--- /dev/null
+++ b/lang/perl5.10/files/patch-freebsd.sh-freebsd10
@@ -0,0 +1,30 @@
+--- hints/freebsd.sh.orig2 2011-10-09 13:30:37.000000000 +0000
++++ hints/freebsd.sh 2011-10-09 14:12:48.000000000 +0000
+@@ -116,7 +116,8 @@
+ case "$osvers" in
+ 0.*|1.0*) ;;
+
+-1*|2*) cccdlflags='-DPIC -fpic'
++1.*|2.*)
++ cccdlflags='-DPIC -fpic'
+ lddlflags="-Bshareable $lddlflags"
+ ;;
+
+@@ -139,7 +140,7 @@
+ esac
+
+ case "$osvers" in
+-0*|1*|2*|3*) ;;
++0.*|1.*|2.*|3.*) ;;
+
+ *)
+ ccflags="${ccflags} -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H"
+@@ -196,7 +197,7 @@
+ $define|true|[yY]*)
+ lc_r=`/sbin/ldconfig -r|grep ':-lc_r'|awk '{print $NF}'|sed -n '$p'`
+ case "$osvers" in
+- 0*|1*|2.0*|2.1*) cat <<EOM >&4
++ 0.*|1.*|2.0*|2.1*) cat <<EOM >&4
+ I did not know that FreeBSD $osvers supports POSIX threads.
+
+ Feel free to tell perlbug@perl.org otherwise. \ No newline at end of file
diff --git a/lang/perl5.10/files/patch-perl.c b/lang/perl5.10/files/patch-perl.c
new file mode 100644
index 000000000000..2f3753750e72
--- /dev/null
+++ b/lang/perl5.10/files/patch-perl.c
@@ -0,0 +1,61 @@
+--- perl.c
++++ perl.c
+ #else /* IAMSUID */
+@@ -4882,6 +4882,28 @@
+ incpush(APPLLIB_EXP, TRUE, TRUE, TRUE, TRUE);
+ #endif
+
++#ifdef SITEARCH_EXP
++ /* sitearch is always relative to sitelib on Windows for
++ * DLL-based path intuition to work correctly */
++# if !defined(WIN32)
++ incpush(SITEARCH_EXP, FALSE, FALSE, TRUE, TRUE);
++# endif
++#endif
++
++#ifdef SITELIB_EXP
++# if defined(WIN32)
++ /* this picks up sitearch as well */
++ incpush(SITELIB_EXP, TRUE, FALSE, TRUE, TRUE);
++# else
++ incpush(SITELIB_EXP, FALSE, FALSE, TRUE, TRUE);
++# endif
++#endif
++
++#if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
++ /* Search for version-specific dirs below here */
++ incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE);
++#endif
++
+ #ifdef ARCHLIB_EXP
+ incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE, TRUE);
+ #endif
+@@ -4915,28 +4937,6 @@
+ incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE, TRUE);
+ #endif
+
+-#ifdef SITEARCH_EXP
+- /* sitearch is always relative to sitelib on Windows for
+- * DLL-based path intuition to work correctly */
+-# if !defined(WIN32)
+- incpush(SITEARCH_EXP, FALSE, FALSE, TRUE, TRUE);
+-# endif
+-#endif
+-
+-#ifdef SITELIB_EXP
+-# if defined(WIN32)
+- /* this picks up sitearch as well */
+- incpush(SITELIB_EXP, TRUE, FALSE, TRUE, TRUE);
+-# else
+- incpush(SITELIB_EXP, FALSE, FALSE, TRUE, TRUE);
+-# endif
+-#endif
+-
+-#if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
+- /* Search for version-specific dirs below here */
+- incpush(SITELIB_STEM, FALSE, TRUE, TRUE, TRUE);
+-#endif
+-
+ #ifdef PERL_VENDORARCH_EXP
+ /* vendorarch is always relative to vendorlib on Windows for
+ * DLL-based path intuition to work correctly */
diff --git a/lang/perl5.10/files/perl-after-upgrade b/lang/perl5.10/files/perl-after-upgrade
new file mode 100644
index 000000000000..2cd3c3fe8b21
--- /dev/null
+++ b/lang/perl5.10/files/perl-after-upgrade
@@ -0,0 +1,603 @@
+#! %%PERL%% -w
+# ----------------------------------------------------------------------------
+# "THE BEER-WARE LICENSE" (Revision 42)
+# <tobez@FreeBSD.org> wrote this file. As long as you retain this notice you
+# can do whatever you want with this stuff. If we meet some day, and you think
+# this stuff is worth it, you can buy me a beer in return. Anton Berezin
+# ----------------------------------------------------------------------------
+#
+# $FreeBSD$
+# $Id: perl-after-upgrade,v 1.11 2005/06/23 19:39:00 tobez Exp $
+#
+=pod
+
+=head1 NAME
+
+perl-after-upgrade -- fixup FreeBSD packages that depend on perl
+
+=head1 SYNOPSIS
+
+ perl-after-upgrade
+ perl-after-upgrade -f [-d] [-q]
+ perl-after-upgrade -v
+
+=head1 DESCRIPTION
+
+The standard procedure after a perl port (lang/perl5.X) upgrade is to
+basically reinstall all other packages that depend on perl.
+This is always a painful exercise. The perl-after-upgrade utility makes
+this process mostly unnecessary.
+
+The tool goes through the list of installed packages, looks for those
+that depend on perl, moves files around, modifies shebang lines in those
+scripts in which it is necessary to do so, tries its best to adjust
+dynamically linked binaries that link with libperl.so in the old path,
+and updates the package database.
+
+After installation of the new perl is complete, either by hand from the
+ports collection, or from a package, or via portupgrade, do the
+following:
+
+=over 4
+
+=item o go root;
+
+=item o run perl-after-upgrade utility.
+
+Do not specify any arguments at first, so it does nothing destructive.
+Pay attention to the produced output and especially to errorlist at the
+end, if any;
+
+=item o run the utility again, with B<-f> command line option.
+
+This will actually do the work. Again, pay attention to the output
+produced;
+
+=item o fix any reported errors;
+
+=item o reinstall required packages:
+
+The utility will tell you what packages that depend on perl it could not
+handle. It will also tell you why it happened (for example, they were
+compiled against a binary incompatible perl). If you want such packages
+to remain operational, you will have to reinstall then by hand or via
+portupgrade.
+
+=item o review the files left in the older perl installation.
+
+This is typically /usr/local/lib/perl5/site_perl/5.X.Y/. There should
+be very little, if any, files in that directory and its subdirectories,
+excepting a number of .ph files;
+
+=item o check that things work as they should;
+
+=item o remove backup files from the package database.
+
+Those will be /var/db/pkg/*/+CONTENTS.bak;
+
+=item o that's all.
+
+=back
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2005 by Anton Berezin
+
+ "THE BEER-WARE LICENSE" (Revision 42)
+ <tobez@FreeBSD.org> wrote this module. As long as you retain this
+ notice you can do whatever you want with this stuff. If we meet some
+ day, and you think this stuff is worth it, you can buy me a beer in
+ return.
+
+ Anton Berezin
+
+NO WARRANTY OF ANY KIND, USE AT YOUR OWN RISK.
+
+=head1 HISTORY
+
+The first version of this utility was not bundled with perl package on
+FreeBSD. It was dumber than the current version in several important
+areas. It was faster.
+
+=head1 CREDITS
+
+Thanks to Mathieu Arnold for discussion.
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
+
+use strict;
+use warnings;
+use 5.0100;
+
+our $debug = 0;
+
+# |/-\
+my $pchar = "|";
+my $do_progress = -t *STDOUT;
+sub progress
+{
+ if ($do_progress) {
+ print STDERR "$pchar";
+ $pchar =~ tr<|/\\-><-|/\\>;
+ }
+}
+
+package FreeBSD::Package;
+use strict;
+use warnings;
+
+use IO::File;
+use File::Copy;
+
+sub new
+{
+ my ($pkg, %p) = @_;
+ my $pkgdir = $p{pkgdir} || return undef;
+ my $name = $pkgdir;
+ $name =~ s|.*/||;
+ main::progress();
+ my $c = IO::File->new("< $pkgdir/+CONTENTS");
+ return undef unless $c;
+ my @lines;
+ while (<$c>) {
+ chomp;
+ push @lines, $_;
+ }
+ my $me = bless {
+ pkgdir => $pkgdir,
+ lines => \@lines,
+ name => $name,
+ }, $pkg;
+ return $me;
+}
+
+sub name
+{
+ return $_[0]->{name};
+}
+
+sub lines
+{
+ my $me = shift;
+ if (@_ && @_ == 1 && ref(@_) eq 'ARRAY') {
+ $me->{lines} = [@{$_[0]}];
+ $me->{changed} = 1;
+ } elsif (@_) {
+ $me->{lines} = [@_];
+ $me->{changed} = 1;
+ } else {
+ return @{$me->{lines}};
+ }
+}
+
+sub write_back
+{
+ my ($me) = @_;
+
+ return unless $me->{changed};
+ main::progress();
+ my $file = "$me->{pkgdir}/+CONTENTS";
+ copy($file, "$file.bak");
+ my $c = IO::File->new("> $file");
+ return unless $c;
+ for (@{$me->{lines}}) {
+ print $c "$_\n";
+ }
+}
+
+package FreeBSD::Package::DB;
+use strict;
+use warnings;
+
+sub new
+{
+ my ($pkg, %p) = @_;
+ my $me = bless {
+ dbdir => $p{dbdir} || $ENV{PKG_DBDIR} || "/var/db/pkg",
+ }, $pkg;
+ $me->{packages} = [ grep { -d } glob "$me->{dbdir}/*" ];
+ $me->reset;
+ return $me;
+}
+
+sub next
+{
+ my ($me) = @_;
+ while (1) {
+ $me->{current}++;
+ if ($me->{current} >= @{$me->{packages}}) {
+ $me->reset;
+ return undef;
+ }
+ my $pkg = FreeBSD::Package->new(pkgdir => $me->{packages}->[$me->{current}]);
+ return $pkg if $pkg;
+ }
+}
+
+sub reset
+{
+ my ($me) = @_;
+ $me->{current} = -1;
+}
+
+package main;
+use strict;
+use warnings;
+
+use File::Temp qw/tempfile/;
+use File::Copy;
+
+our $dry_run = 1;
+our $quiet = 0;
+my @tmpl;
+our $VERSION = "1.4";
+
+while (@ARGV) {
+ my $opt = shift;
+ if ($opt eq "-f") {
+ $dry_run = 0;
+ } elsif ($opt eq "-d") {
+ $debug = 1;
+ } elsif ($opt eq "-q") {
+ $quiet = 1;
+ } elsif ($opt eq "-v") {
+ $_ = $0;
+ s|.*/||;
+ print "$_ version $VERSION\n";
+ exit 0;
+ } elsif ($opt =~ /^-/) {
+ $_ = $0;
+ s|.*/||;
+ print "Unknown option `$opt'\n";
+ print "Usage:\n";
+ print "\t$_\n\t$_ -v\n\t$_ -f\n";
+ exit 1;
+ } else {
+ push @tmpl, $opt;
+ }
+}
+
+our $PERL_VERSION = '%%PERL_VERSION%%';
+our $PERL_PKGNAME = '%%PKGNAME%%';
+
+our $PERL_VERSION_REGEX = qr/5\.10\.\d+/;
+print STDERR "- Fuzzy source re: <$PERL_VERSION_REGEX>\n" if $debug;
+
+our @errors;
+our @notes;
+
+sub fix_script
+{
+ my ($file) = @_;
+
+ main::progress();
+ return 1 if $dry_run;
+ my $sf = IO::File->new("< $file");
+ return "" unless $sf;
+ my $line = <$sf>;
+ my $md5 = "";
+ if ($line && $line =~ s|^(\s*#!\s*[\w/]+perl)$PERL_VERSION_REGEX\b|$1$PERL_VERSION|) {
+ my $dir = $file;
+ $dir =~ s|/[^/]+$||;
+ my ($fh, $fn) = tempfile(DIR=> $dir);
+ if ($fh) {
+ print $fh $line;
+ while (<$sf>) {
+ print $fh $_;
+ }
+ close $fh;
+ $md5 = `/sbin/md5 -q $fn`;
+ chomp $md5;
+ my $mode = (stat($file))[2] & 07777;
+ unlink $file or do {
+ push @errors, "Failed to unlink $file: $!";
+ unlink $fn;
+ return "";
+ };
+ rename $fn, $file or do {
+ push @errors, "Failed to rename $fn to $file: $!";
+ return "";
+ };
+ chmod $mode, $file;
+ } else {
+ push @errors, "Failed to modify $file: $!";
+ }
+ }
+ return $md5;
+}
+
+sub fix_binary
+{
+ my ($file) = @_;
+
+ main::progress();
+ my $sf = IO::File->new("< $file");
+ return "" unless $sf;
+ my $was = $dry_run ? "would be" : "was";
+ push @notes, "The $file binary $was modified, make sure it works";
+ return 1 if $dry_run;
+ my $md5 = "";
+
+ my $dir = $file;
+ $dir =~ s|/[^/]+$||;
+ my ($fh, $fn) = tempfile(DIR=> $dir);
+ unless ($fn) {
+ push @errors, "Failed to modify $file: $!";
+ return "";
+ }
+
+ while (<$sf>) {
+ s|/lib/perl5/$PERL_VERSION_REGEX/mach/CORE|/lib/perl5/$PERL_VERSION/mach/CORE|g;
+ print $fh $_;
+ }
+ close $fh;
+ $md5 = `/sbin/md5 -q $fn`;
+ chomp $md5;
+ my $mode = (stat($file))[2] & 07777;
+ unlink $file or do {
+ push @errors, "Failed to unlink $file: $!";
+ unlink $fn;
+ return "";
+ };
+ rename $fn, $file or do {
+ push @errors, "Failed to rename $fn to $file: $!";
+ return "";
+ };
+ chmod $mode, $file;
+ return $md5;
+}
+
+sub mkdir_recur
+{
+ my ($dir) = @_;
+
+ main::progress();
+ $dir =~ s|/+$||;
+ my $orig = $dir;
+ if ($dir =~ m|^$|) {
+ return 1;
+ } else {
+ $dir =~ s|/[^/]+$||;
+ my $r = mkdir_recur($dir);
+ return $r unless $r;
+ mkdir $orig, 0777;
+ my $e = $!;
+ unless (-d $orig) {
+ push @errors, "Could not create directory $orig: $e";
+ return 0;
+ }
+ return 1;
+ }
+}
+
+sub might_need_to_fix
+{
+ my ($pkg) = @_;
+ my $pkg_name = $pkg->name;
+
+ main::progress();
+ if ($pkg_name =~ /^bsdpan-/) {
+ return 1;
+ }
+ for ($pkg->lines) {
+ if (/^\@pkgdep\s+perl-(threaded-)?($PERL_VERSION_REGEX)\S*\s*$/) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+sub fixable_binary
+{
+ my ($file, $name) = @_;
+
+ main::progress();
+ my $fixable = 0;
+ for (`/usr/bin/ldd $file 2>&1`) {
+ if (/^\s+libperl\.so\s+=>/) {
+ my $found;
+ for (`strings $file`) {
+ if (m</lib/perl5/($PERL_VERSION_REGEX)/mach/CORE>) {
+ $found++;
+ if (length($1) != length($PERL_VERSION)) {
+ push @notes, "$name cannot be fixed up (and has to be reinstalled): cannot patch $file due to length difference";
+ print STDERR "- Skipping $name: cannot patch $file due to length difference\n" if $debug;
+ return undef;
+ }
+ print STDERR "- $name: fixable binary $file\n" if $debug && $found < 2;
+ $fixable = 1 if $1 ne $PERL_VERSION;
+ }
+ }
+ if (!$found) {
+ push @notes, "$name cannot be fixed up (and has to be reinstalled): $file is using unknown libperl";
+ print STDERR "- Skipping $name: $file is using unknown libperl\n" if $debug;
+ return undef;
+ }
+ }
+ }
+ return $fixable;
+}
+
+sub fixable_shared_lib
+{
+ my ($file, $name) = @_;
+
+ main::progress();
+ my ($old);
+ for (`strings $file`) {
+ if (/^perl_get_sv$/) {
+ push @notes, "$name cannot be fixed up (and has to be reinstalled): $file uses an old perl API";
+ print STDERR "- Skipping $name: $file uses an old perl API\n" if $debug;
+ return 0;
+ }
+ }
+ return 1;
+}
+
+sub cannot_be_fixed
+{
+ my ($pkg, $binaries, $scripts) = @_;
+ my $pkg_name = $pkg->name;
+ my $prefix = "";
+
+ main::progress();
+
+ for ($pkg->lines) {
+ if (/^\@cwd\s+(\S+)\s*$/) {
+ $prefix = $1;
+ next;
+ }
+ my $file = "$prefix/$_";
+ next if -l $file;
+ next if $file =~ /\.gz$/;
+ next if $file =~ /\.bz2$/;
+ my $sf = IO::File->new("< $file");
+ next unless $sf;
+ my $line;
+ sysread $sf, $line, 256;
+
+ # binary executable
+ if ($line && $line =~ /^\177ELF.\x01.\x09.{8}\x02\0/) {
+ my $fixable = fixable_binary($file, $pkg_name);
+ return 0 unless defined $fixable;
+ push @$binaries, $file if $fixable;
+ # shared library - can prevent us from being able to upgrade
+ } elsif ($line && $line =~ /^\177ELF.\x01.\x09.{8}\x03\0/) {
+ return 0 unless fixable_shared_lib($file, $pkg_name);
+ } elsif ($line && $line =~ m<^\s*#!\s*[\w/]+perl($PERL_VERSION_REGEX)\b>) {
+ print STDERR "- $pkg_name: fixable script $file\n" if $debug;
+ push @$scripts, $file if $1 ne $PERL_VERSION;
+ }
+ main::progress();
+ }
+}
+
+#
+my $db = FreeBSD::Package::DB->new;
+my ($fixed, $skipped, $tot_moved, $tot_modified) = (0,0,0,0);
+while (my $pkg = $db->next) {
+ my @lines;
+ my $new_md5;
+ my ($adjusted, $moved, $modified) = (0,0,0);
+
+ my $pkg_name = $pkg->name;
+ if (@tmpl) {
+ my $ok;
+ for (@tmpl) {
+ if ($pkg_name =~ /^$_/) {
+ $ok = 1;
+ last;
+ }
+ }
+ next unless $ok;
+ }
+
+ unless (might_need_to_fix($pkg)) {
+ $skipped++;
+ print STDERR "- Skipping $pkg_name, it does not depend on perl\n" if $debug;
+ next;
+ }
+
+ my (@binaries_to_fix, @scripts_to_fix);
+ if (cannot_be_fixed($pkg, \@binaries_to_fix, \@scripts_to_fix)) {
+ $skipped++;
+ next;
+ }
+ if ($debug) {
+ print STDERR "- $pkg_name: ", scalar(@binaries_to_fix), " binaries to fix\n" if @binaries_to_fix;
+ print STDERR "- $pkg_name: ", scalar(@scripts_to_fix), " scripts to fix\n" if @scripts_to_fix;
+ }
+ my %binaries = map { $_ => 1 } @binaries_to_fix;
+ my %scripts = map { $_ => 1 } @scripts_to_fix;
+
+ my $prefix = "";
+ my $pcnt = 0;
+ for ($pkg->lines) {
+ if (/^([^@]\S+)\s*$/) {
+ my $from = "$prefix/$_";
+ local $_; # we'll need it later
+ $new_md5 = "";
+ unless (-l $from) { # skip symlinks
+ if ($binaries{$from}) {
+ $new_md5 = fix_binary($from);
+ } elsif ($scripts{$from}) {
+ $new_md5 = fix_script($from);
+ }
+ $modified++ if $new_md5;
+ }
+ my $to = $from;
+ if ($to =~ s|(/perl5/(?:site_perl/)?)$PERL_VERSION_REGEX|$1$PERL_VERSION|g) {
+ if ($to ne $from) {
+ my $dir = $to;
+ $dir =~ s|/[^/]+$||;
+ main::progress();
+ unless ($dry_run) {
+ if (mkdir_recur($dir)) {
+ move($from, $to);
+ } else {
+ push @errors, " could not move $from to $to";
+ }
+ }
+ $moved++;
+ print STDERR "- move: $from => $to\n" if $debug;
+ }
+ }
+ } elsif (/^\@comment\s+MD5:[\da-f]+\s*$/ && $new_md5) {
+ s|MD5:(\S+)|MD5:$new_md5|;
+ $new_md5 = "";
+ } else {
+ $new_md5 = "";
+ }
+ if (/^\@cwd\s+(\S+)\s*$/) {
+ $prefix = $1;
+ } elsif (/^\@pkgdep\s+perl-(threaded-)?($PERL_VERSION_REGEX)\S*\s*$/) {
+ if ($PERL_VERSION ne $2) {
+ my $perlver = $2;
+ s|perl-(threaded-)?\Q$perlver\E\S*|$PERL_PKGNAME|;
+ }
+ }
+ my $old = $_;
+ if (s|(/perl5/(?:site_perl/)?)$PERL_VERSION_REGEX|$1$PERL_VERSION|g) {
+ if ($old ne $_) {
+ $adjusted++;
+ print STDERR "- adjust: $_\n" if $debug;
+ }
+ }
+ push @lines, $_;
+ main::progress() if $pcnt++ % 250 == 0;
+ }
+ unless ($dry_run) {
+ $pkg->lines(@lines);
+ $pkg->write_back;
+ }
+ $fixed++ if $moved || $modified || $adjusted;
+ $tot_modified += $modified;
+ $tot_moved += $moved;
+ say "$pkg_name: $moved moved, $modified modified, $adjusted adjusted"
+ if !$quiet || ($moved || $modified || $adjusted);
+}
+print "\n---\n";
+print "Fixed $fixed packages ($tot_moved files moved, $tot_modified files modified)\n";
+print "Skipped $skipped packages\n";
+if (@errors) {
+ print "\n**** The script has encountered following problems:\n";
+ for (@errors) {
+ print "$_\n";
+ }
+ print "\n--- Repeating summary:\n";
+ print "Fixed $fixed packages ($tot_moved files moved, $tot_modified files modified)\n";
+ print "Skipped $skipped packages\n";
+}
+if (@notes) {
+ print "\n**** In addition, please pay attention to the following:\n";
+ for (@notes) {
+ print "$_\n";
+ }
+ print "\n--- Repeating summary:\n";
+ print "Fixed $fixed packages ($tot_moved files moved, $tot_modified files modified)\n";
+ print "Skipped $skipped packages\n";
+}
diff --git a/lang/perl5.10/files/perl-man.conf b/lang/perl5.10/files/perl-man.conf
new file mode 100644
index 000000000000..95187b5b3c55
--- /dev/null
+++ b/lang/perl5.10/files/perl-man.conf
@@ -0,0 +1,2 @@
+MANPATH %%PREFIX%%/lib/perl5/%%PERL_VERSION%%/man
+MANPATH %%PREFIX%%/lib/perl5/%%PERL_VERSION%%/perl/man
diff --git a/lang/perl5.10/files/use.perl b/lang/perl5.10/files/use.perl
new file mode 100644
index 000000000000..23a5ae48a62e
--- /dev/null
+++ b/lang/perl5.10/files/use.perl
@@ -0,0 +1,157 @@
+#!/bin/sh
+
+# $FreeBSD$
+
+this=`echo -n $0 | /usr/bin/sed -e 's!^.*/!!'`
+PERL_VERSION="%%PERL_VERSION%%"
+MAKE_CONF=%%MAKE_CONF%%
+banner=`date +"%F %T"`
+banner="# added by use.perl $banner"
+if [ -z "${OSVERSION}" ]; then
+ if [ -f /sbin/sysctl -a -x /sbin/sysctl ] ; then
+ osreldate=`/sbin/sysctl -n kern.osreldate`
+ else
+ osreldate=`/usr/sbin/sysctl -n kern.osreldate`
+ fi
+else
+ osreldate=${OSVERSION}
+fi
+
+if [ "$2" = "POST-INSTALL" ] ; then
+ need_remove_links=%%LINK_USRBIN%%
+ need_create_links=%%LINK_USRBIN%%
+ need_cleanup_make_conf=yes
+ need_spam_make_conf=yes
+ need_post_install=yes
+ if [ "${osreldate}" -lt 900022 ]; then
+ need_cleanup_manpath=yes
+ need_spam_manpath=yes
+ fi
+elif [ "$2" = "POST-DEINSTALL" ] ; then
+ need_remove_links=%%LINK_USRBIN%%
+ need_cleanup_make_conf=yes
+ if [ "${osreldate}" -lt 900022 ]; then
+ need_cleanup_manpath=yes
+ fi
+else
+ exit 0;
+fi
+
+special_link_list="
+ perl
+ perl5"
+
+do_remove_links()
+{
+ echo "Removing stale symlinks from /usr/bin..."
+ for binary in $special_link_list
+ do
+ if [ -L "/usr/bin/$binary" ] ; then
+ echo " Removing /usr/bin/$binary"
+ /bin/rm -f "/usr/bin/$binary"
+ else
+ echo " Skipping /usr/bin/$binary"
+ fi
+ done
+ bins=`/bin/ls /usr/bin/*perl*5.* ${PKG_PREFIX}/bin/*perl*5.* 2>/dev/null`
+ for binary in $bins
+ do
+ if [ -L "$binary" ] ; then
+ echo " Removing $binary installed by an older perl port"
+ /bin/rm -f "$binary"
+ fi
+ done
+ echo "Done."
+}
+
+do_create_links()
+{
+ echo "Creating various symlinks in /usr/bin..."
+ for binary in $special_link_list
+ do
+ if [ -f "/usr/bin/$binary" ] ; then
+ echo " Backing up /usr/bin/$binary as /usr/bin/$binary.freebsd"
+ /bin/mv -f "/usr/bin/$binary" "/usr/bin/$binary.freebsd"
+ fi
+ bin=`echo $binary | /usr/bin/sed -e 's!perl5!perl!'`
+ if [ -e "/usr/bin/$binary" ] ; then
+ echo " *** /usr/bin/$binary is still there, which should not happen"
+ elif [ -e "$PKG_PREFIX/bin/${bin}%%PERL_VERSION%%" ] ; then
+ echo " Symlinking $PKG_PREFIX/bin/${bin}%%PERL_VERSION%% to /usr/bin/$binary"
+ /bin/ln -sf "$PKG_PREFIX/bin/${bin}%%PERL_VERSION%%" "/usr/bin/$binary"
+ else
+ echo " *** $PKG_PREFIX/bin/${bin}%%PERL_VERSION%% is not there, a symlink won't do any good"
+ fi
+ done
+ echo "Done."
+}
+
+do_post_install()
+{
+ INCLUDEDIR=/usr/include
+ install -d ${PKG_PREFIX}/lib/perl5/site_perl/%%PERL_VERSION%%/%%PERL_ARCH%%/auto
+ install -d ${PKG_PREFIX}/lib/perl5/site_perl/%%PERL_VERSION%%/auto
+ install -d ${PKG_PREFIX}/lib/perl5/%%PERL_VERSION%%/man/man3
+ cd ${INCLUDEDIR} && ${PKG_PREFIX}/bin/h2ph *.h machine/*.h sys/*.h >/dev/null
+}
+
+do_cleanup_make_conf()
+{
+ echo -n "Cleaning up ${MAKE_CONF}..."
+ if [ -f ${MAKE_CONF} ] ; then
+ /usr/bin/awk 's=0;
+ /^#.*use.perl/ { s=1; mode=1 }
+ /^#/ { s=1; if (mode != 1) { mode=0 } }
+ /.*PERL.*=/ { s=1; if (mode == 1) { mode=2 } }
+ /^$/ { s=1; if (mode != 2) { mode = 0 } }
+ { if (s != 1) { mode = 0 } if (mode == 0) print }' ${MAKE_CONF} >${MAKE_CONF}.new
+ /bin/mv ${MAKE_CONF} ${MAKE_CONF}.bak
+ /bin/mv ${MAKE_CONF}.new ${MAKE_CONF}
+ fi
+ echo " Done."
+}
+
+do_cleanup_manpath()
+{
+ if [ -f /etc/manpath.config ] ; then
+ echo -n "Cleaning up /etc/manpath.config..."
+ /usr/bin/awk 's=0;
+ /^#.*use.perl/ { s=1; mode=1 }
+ /^#/ { s=1; if (mode != 1) { mode=0 } }
+ /^OPTIONAL_MANPATH.*perl5/ { s=1; if (mode == 1) { mode=2 } }
+ /^$/ { s=1; if (mode != 2) { mode = 0 } }
+ { if (s != 1) { mode = 0 } if (mode == 0) print }' /etc/manpath.config >/etc/manpath.config.new
+ /bin/mv /etc/manpath.config /etc/manpath.config.bak
+ /bin/mv /etc/manpath.config.new /etc/manpath.config
+ echo " Done."
+ fi
+}
+
+do_spam_make_conf()
+{
+ echo -n "Spamming ${MAKE_CONF}..."
+ echo "$banner" >>${MAKE_CONF}
+ echo "PERL_VERSION=%%PERL_VERSION%%" >>${MAKE_CONF}
+ echo " Done."
+}
+
+do_spam_manpath()
+{
+ if [ -f /etc/manpath.config ] ; then
+ echo -n "Spamming /etc/manpath.config..."
+ echo "$banner" >>/etc/manpath.config
+ echo "OPTIONAL_MANPATH ${PKG_PREFIX}/lib/perl5/%%PERL_VERSION%%/man" >>/etc/manpath.config
+ echo "OPTIONAL_MANPATH ${PKG_PREFIX}/lib/perl5/%%PERL_VERSION%%/perl/man" >>/etc/manpath.config
+ echo " Done."
+ fi
+}
+
+[ "$need_remove_links" = "yes" ] && do_remove_links
+[ "$need_create_links" = "yes" ] && do_create_links
+[ "$need_post_install" = "yes" ] && do_post_install
+[ "$need_cleanup_make_conf" = "yes" ] && do_cleanup_make_conf
+[ "$need_spam_make_conf" = "yes" ] && do_spam_make_conf
+[ "$need_cleanup_manpath" = "yes" ] && do_cleanup_manpath
+[ "$need_spam_manpath" = "yes" ] && do_spam_manpath
+
+exit 0