diff options
author | Mark Linimon <linimon@FreeBSD.org> | 2012-03-11 23:49:09 +0000 |
---|---|---|
committer | Mark Linimon <linimon@FreeBSD.org> | 2012-03-11 23:49:09 +0000 |
commit | 7047959f240813dd8e23b0962c0e5e605cd1d142 (patch) | |
tree | 691b175a94411098f1a16b6804d31984c2464863 /lang/perl5.10/files | |
parent | 09e8089e23d89a4f2d22e036428a55ebf57870c6 (diff) | |
download | ports-7047959f240813dd8e23b0962c0e5e605cd1d142.tar.gz ports-7047959f240813dd8e23b0962c0e5e605cd1d142.zip |
Notes
Diffstat (limited to 'lang/perl5.10/files')
-rw-r--r-- | lang/perl5.10/files/patch-Configure | 21 | ||||
-rw-r--r-- | lang/perl5.10/files/patch-INST_PREFIX.t | 20 | ||||
-rw-r--r-- | lang/perl5.10/files/patch-MM_Any.pm | 18 | ||||
-rw-r--r-- | lang/perl5.10/files/patch-bug69973 | 95 | ||||
-rw-r--r-- | lang/perl5.10/files/patch-bug71952 | 46 | ||||
-rw-r--r-- | lang/perl5.10/files/patch-freebsd.sh | 51 | ||||
-rw-r--r-- | lang/perl5.10/files/patch-freebsd.sh-freebsd10 | 30 | ||||
-rw-r--r-- | lang/perl5.10/files/patch-perl.c | 61 | ||||
-rw-r--r-- | lang/perl5.10/files/perl-after-upgrade | 603 | ||||
-rw-r--r-- | lang/perl5.10/files/perl-man.conf | 2 | ||||
-rw-r--r-- | lang/perl5.10/files/use.perl | 157 |
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 |