summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Veller <tove@gentoo.org>2008-05-09 11:04:55 +0000
committerTorsten Veller <tove@gentoo.org>2008-05-09 11:04:55 +0000
commitbe6009bbfcf4129f90ce963585b8839c1a6e5405 (patch)
tree8679986fa7d6d06f3bfc2946a34ea53a97b6b5a5 /sys-devel/libperl
parentVersion bump (diff)
downloadgentoo-2-be6009bbfcf4129f90ce963585b8839c1a6e5405.tar.gz
gentoo-2-be6009bbfcf4129f90ce963585b8839c1a6e5405.tar.bz2
gentoo-2-be6009bbfcf4129f90ce963585b8839c1a6e5405.zip
#219203 - Version bump. Added patch from bug #198196. Apply lib64.patch for ppc64 too like dev-lang/perl-5.8.8 does
(Portage version: 2.1.5_rc7)
Diffstat (limited to 'sys-devel/libperl')
-rw-r--r--sys-devel/libperl/ChangeLog12
-rw-r--r--sys-devel/libperl/files/libperl-5.8.8-CVE-2008-1927.patch256
-rw-r--r--sys-devel/libperl/files/libperl-5.8.8-utf8-boundary.patch57
-rw-r--r--sys-devel/libperl/libperl-5.8.8-r2.ebuild407
4 files changed, 730 insertions, 2 deletions
diff --git a/sys-devel/libperl/ChangeLog b/sys-devel/libperl/ChangeLog
index 39748319c842..c89777a890d1 100644
--- a/sys-devel/libperl/ChangeLog
+++ b/sys-devel/libperl/ChangeLog
@@ -1,6 +1,14 @@
# ChangeLog for sys-devel/libperl
-# Copyright 1999-2007 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-devel/libperl/ChangeLog,v 1.127 2007/08/06 16:34:27 truedfx Exp $
+# Copyright 1999-2008 Gentoo Foundation; Distributed under the GPL v2
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/libperl/ChangeLog,v 1.128 2008/05/09 11:04:54 tove Exp $
+
+*libperl-5.8.8-r2 (09 May 2008)
+
+ 09 May 2008; Torsten Veller <tove@gentoo.org>
+ +files/libperl-5.8.8-CVE-2008-1927.patch,
+ +files/libperl-5.8.8-utf8-boundary.patch, +libperl-5.8.8-r2.ebuild:
+ #219203 - Version bump. Added patch from bug #198196. Apply
+ libperl-5.8.8-lib64.patch for ppc64 too like dev-lang/perl-5.8.8.
06 Aug 2007; <truedfx@gentoo.org>
+files/libperl-5.8.8-makedepend-syntax.patch, libperl-5.8.8-r1.ebuild:
diff --git a/sys-devel/libperl/files/libperl-5.8.8-CVE-2008-1927.patch b/sys-devel/libperl/files/libperl-5.8.8-CVE-2008-1927.patch
new file mode 100644
index 000000000000..470005804f57
--- /dev/null
+++ b/sys-devel/libperl/files/libperl-5.8.8-CVE-2008-1927.patch
@@ -0,0 +1,256 @@
+Fix a double free / segfault with utf8 regexps
+Debian #454792
+[rt.cpan.org #48156]
+[rt.cpan.org #40641]
+upstream change 29204
+
+UTF8_ALLOW_DEFAULT definition in utf8.h picked from upstream change 27688
+
+diff --git a/embed.fnc b/embed.fnc
+index edfbc0e..26524c7 100644
+--- a/embed.fnc
++++ b/embed.fnc
+@@ -1168,6 +1168,7 @@ Es |void |reguni |NN const struct RExC_state_t *state|UV uv|NN char *s|NN STRLE
+ Es |regnode*|regclass |NN struct RExC_state_t *state
+ ERs |I32 |regcurly |NN const char *
+ Es |regnode*|reg_node |NN struct RExC_state_t *state|U8 op
++Es |UV |reg_recode |const char value|NULLOK SV **encp
+ Es |regnode*|regpiece |NN struct RExC_state_t *state|NN I32 *flagp
+ Es |void |reginsert |NN struct RExC_state_t *state|U8 op|NN regnode *opnd
+ Es |void |regoptail |NN struct RExC_state_t *state|NN regnode *p|NN regnode *val
+diff --git a/embed.h b/embed.h
+index 2b38fd5..372b04f 100644
+--- a/embed.h
++++ b/embed.h
+@@ -1234,6 +1234,7 @@
+ #define regclass S_regclass
+ #define regcurly S_regcurly
+ #define reg_node S_reg_node
++#define reg_recode S_reg_recode
+ #define regpiece S_regpiece
+ #define reginsert S_reginsert
+ #define regoptail S_regoptail
+@@ -3277,6 +3278,7 @@
+ #define regclass(a) S_regclass(aTHX_ a)
+ #define regcurly(a) S_regcurly(aTHX_ a)
+ #define reg_node(a,b) S_reg_node(aTHX_ a,b)
++#define reg_recode(a,b) S_reg_recode(aTHX_ a,b)
+ #define regpiece(a,b) S_regpiece(aTHX_ a,b)
+ #define reginsert(a,b,c) S_reginsert(aTHX_ a,b,c)
+ #define regoptail(a,b,c) S_regoptail(aTHX_ a,b,c)
+diff --git a/pod/perldiag.pod b/pod/perldiag.pod
+index 9b3134c..7d95216 100644
+--- a/pod/perldiag.pod
++++ b/pod/perldiag.pod
+@@ -1900,6 +1900,15 @@ recognized by Perl or by a user-supplied handler. See L<attributes>.
+ (W printf) Perl does not understand the given format conversion. See
+ L<perlfunc/sprintf>.
+
++=item Invalid escape in the specified encoding in regex; marked by <-- HERE in m/%s/
++
++(W regexp) The numeric escape (for example C<\xHH>) of value < 256
++didn't correspond to a single character through the conversion
++from the encoding specified by the encoding pragma.
++The escape was replaced with REPLACEMENT CHARACTER (U+FFFD) instead.
++The <-- HERE shows in the regular expression about where the
++escape was discovered.
++
+ =item Invalid [] range "%s" in regex; marked by <-- HERE in m/%s/
+
+ (F) The range specified in a character class had a minimum character
+diff --git a/proto.h b/proto.h
+index 6d185dd..ef6c0cf 100644
+--- a/proto.h
++++ b/proto.h
+@@ -1748,6 +1748,7 @@ STATIC I32 S_regcurly(pTHX_ const char *)
+ __attribute__warn_unused_result__;
+
+ STATIC regnode* S_reg_node(pTHX_ struct RExC_state_t *state, U8 op);
++STATIC UV S_reg_recode(pTHX_ const char value, SV **encp);
+ STATIC regnode* S_regpiece(pTHX_ struct RExC_state_t *state, I32 *flagp);
+ STATIC void S_reginsert(pTHX_ struct RExC_state_t *state, U8 op, regnode *opnd);
+ STATIC void S_regoptail(pTHX_ struct RExC_state_t *state, regnode *p, regnode *val);
+diff --git a/regcomp.c b/regcomp.c
+index 928cf39..98d48dd 100644
+--- a/regcomp.c
++++ b/regcomp.c
+@@ -2791,6 +2791,39 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp)
+ }
+
+ /*
++ * reg_recode
++ *
++ * It returns the code point in utf8 for the value in *encp.
++ * value: a code value in the source encoding
++ * encp: a pointer to an Encode object
++ *
++ * If the result from Encode is not a single character,
++ * it returns U+FFFD (Replacement character) and sets *encp to NULL.
++ */
++STATIC UV
++S_reg_recode(pTHX_ const char value, SV **encp)
++{
++ STRLEN numlen = 1;
++ SV * const sv = sv_2mortal(newSVpvn(&value, numlen));
++ const char * const s = encp && *encp ? sv_recode_to_utf8(sv, *encp)
++ : SvPVX(sv);
++ const STRLEN newlen = SvCUR(sv);
++ UV uv = UNICODE_REPLACEMENT;
++
++ if (newlen)
++ uv = SvUTF8(sv)
++ ? utf8n_to_uvchr((U8*)s, newlen, &numlen, UTF8_ALLOW_DEFAULT)
++ : *(U8*)s;
++
++ if (!newlen || numlen != newlen) {
++ uv = UNICODE_REPLACEMENT;
++ if (encp)
++ *encp = NULL;
++ }
++ return uv;
++}
++
++/*
+ - regatom - the lowest level
+ *
+ * Optimization: gobbles an entire sequence of ordinary characters so that
+@@ -3182,6 +3215,8 @@ tryagain:
+ ender = grok_hex(p, &numlen, &flags, NULL);
+ p += numlen;
+ }
++ if (PL_encoding && ender < 0x100)
++ goto recode_encoding;
+ break;
+ case 'c':
+ p++;
+@@ -3201,6 +3236,17 @@ tryagain:
+ --p;
+ goto loopdone;
+ }
++ if (PL_encoding && ender < 0x100)
++ goto recode_encoding;
++ break;
++ recode_encoding:
++ {
++ SV* enc = PL_encoding;
++ ender = reg_recode((const char)(U8)ender, &enc);
++ if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
++ vWARN(p, "Invalid escape in the specified encoding");
++ RExC_utf8 = 1;
++ }
+ break;
+ case '\0':
+ if (p >= RExC_end)
+@@ -3331,32 +3377,6 @@ tryagain:
+ break;
+ }
+
+- /* If the encoding pragma is in effect recode the text of
+- * any EXACT-kind nodes. */
+- if (PL_encoding && PL_regkind[(U8)OP(ret)] == EXACT) {
+- STRLEN oldlen = STR_LEN(ret);
+- SV *sv = sv_2mortal(newSVpvn(STRING(ret), oldlen));
+-
+- if (RExC_utf8)
+- SvUTF8_on(sv);
+- if (sv_utf8_downgrade(sv, TRUE)) {
+- const char * const s = sv_recode_to_utf8(sv, PL_encoding);
+- const STRLEN newlen = SvCUR(sv);
+-
+- if (SvUTF8(sv))
+- RExC_utf8 = 1;
+- if (!SIZE_ONLY) {
+- DEBUG_r(PerlIO_printf(Perl_debug_log, "recode %*s to %*s\n",
+- (int)oldlen, STRING(ret),
+- (int)newlen, s));
+- Copy(s, STRING(ret), newlen, char);
+- STR_LEN(ret) += newlen - oldlen;
+- RExC_emit += STR_SZ(newlen) - STR_SZ(oldlen);
+- } else
+- RExC_size += STR_SZ(newlen) - STR_SZ(oldlen);
+- }
+- }
+-
+ return(ret);
+ }
+
+@@ -3734,6 +3754,8 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state)
+ value = grok_hex(RExC_parse, &numlen, &flags, NULL);
+ RExC_parse += numlen;
+ }
++ if (PL_encoding && value < 0x100)
++ goto recode_encoding;
+ break;
+ case 'c':
+ value = UCHARAT(RExC_parse++);
+@@ -3741,13 +3763,24 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state)
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+- {
+- I32 flags = 0;
+- numlen = 3;
+- value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
+- RExC_parse += numlen;
+- break;
+- }
++ {
++ I32 flags = 0;
++ numlen = 3;
++ value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
++ RExC_parse += numlen;
++ if (PL_encoding && value < 0x100)
++ goto recode_encoding;
++ break;
++ }
++ recode_encoding:
++ {
++ SV* enc = PL_encoding;
++ value = reg_recode((const char)(U8)value, &enc);
++ if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
++ vWARN(RExC_parse,
++ "Invalid escape in the specified encoding");
++ break;
++ }
+ default:
+ if (!SIZE_ONLY && isALPHA(value) && ckWARN(WARN_REGEXP))
+ vWARN2(RExC_parse,
+diff --git a/t/uni/tr_utf8.t b/t/uni/tr_utf8.t
+index 606a84a..354156a 100755
+--- a/t/uni/tr_utf8.t
++++ b/t/uni/tr_utf8.t
+@@ -31,7 +31,7 @@ BEGIN {
+ }
+
+ use strict;
+-use Test::More tests => 7;
++use Test::More tests => 8;
+
+ use encoding 'utf8';
+
+@@ -67,4 +67,12 @@ is($str, $hiragana, "s/// # hiragana -> katakana");
+ $line =~ tr/bcdeghijklmnprstvwxyz$02578/בצדעגהיײקלמנפּרסטװשכיזשױתײחא/;
+ is($line, "aבצדעfגהיײקלמנoפqּרסuטװשכיזש1ױ34ת6ײח9", "[perl #16843]");
+ }
++
++{
++ # [perl #40641]
++ my $str = qq/Gebääääääääääääääääääääude/;
++ my $reg = qr/Gebääääääääääääääääääääude/;
++ ok($str =~ /$reg/, "[perl #40641]");
++}
++
+ __END__
+diff --git a/utf8.h b/utf8.h
+index 6d63897..3800866 100644
+--- a/utf8.h
++++ b/utf8.h
+@@ -198,6 +198,8 @@ encoded character.
+ UTF8_ALLOW_SURROGATE|UTF8_ALLOW_FFFF)
+ #define UTF8_ALLOW_ANY 0x00FF
+ #define UTF8_CHECK_ONLY 0x0200
++#define UTF8_ALLOW_DEFAULT (ckWARN(WARN_UTF8) ? 0 : \
++ UTF8_ALLOW_ANYUV)
+
+ #define UNICODE_SURROGATE_FIRST 0xD800
+ #define UNICODE_SURROGATE_LAST 0xDFFF
diff --git a/sys-devel/libperl/files/libperl-5.8.8-utf8-boundary.patch b/sys-devel/libperl/files/libperl-5.8.8-utf8-boundary.patch
new file mode 100644
index 000000000000..d0efa3f1c54b
--- /dev/null
+++ b/sys-devel/libperl/files/libperl-5.8.8-utf8-boundary.patch
@@ -0,0 +1,57 @@
+--- regcomp.c 2006-01-08 12:59:27.000000000 -0800
++++ regcomp.c 2007-10-05 12:07:55.000000000 -0700
+@@ -135,7 +135,8 @@
+ I32 extralen;
+ I32 seen_zerolen;
+ I32 seen_evals;
+- I32 utf8;
++ I32 utf8; /* pattern is utf8 or not */
++ I32 orig_utf8; /* pattern was originally utf8 */
+ #if ADD_TO_REGEXEC
+ char *starttry; /* -Dr: where regtry was called. */
+ #define RExC_starttry (pRExC_state->starttry)
+@@ -161,6 +162,7 @@
+ #define RExC_seen_zerolen (pRExC_state->seen_zerolen)
+ #define RExC_seen_evals (pRExC_state->seen_evals)
+ #define RExC_utf8 (pRExC_state->utf8)
++#define RExC_orig_utf8 (pRExC_state->orig_utf8)
+
+ #define ISMULT1(c) ((c) == '*' || (c) == '+' || (c) == '?')
+ #define ISMULT2(s) ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
+@@ -1749,15 +1751,17 @@
+ if (exp == NULL)
+ FAIL("NULL regexp argument");
+
+- RExC_utf8 = pm->op_pmdynflags & PMdf_CMP_UTF8;
++ RExC_orig_utf8 = RExC_utf8 = pm->op_pmdynflags & PMdf_CMP_UTF8;
+
+- RExC_precomp = exp;
+ DEBUG_r({
+ if (!PL_colorset) reginitcolors();
+ PerlIO_printf(Perl_debug_log, "%sCompiling REx%s `%s%*s%s'\n",
+ PL_colors[4],PL_colors[5],PL_colors[0],
+- (int)(xend - exp), RExC_precomp, PL_colors[1]);
++ (int)(xend - exp), exp, PL_colors[1]);
+ });
++
++redo_first_pass:
++ RExC_precomp = exp;
+ RExC_flags = pm->op_pmflags;
+ RExC_sawback = 0;
+
+@@ -1783,6 +1787,17 @@
+ RExC_precomp = Nullch;
+ return(NULL);
+ }
++ if (RExC_utf8 && !RExC_orig_utf8) {
++ STRLEN len = xend-exp;
++ DEBUG_r(PerlIO_printf(Perl_debug_log,
++ "UTF8 mismatch! Converting to utf8 for resizing and compile\n"));
++ exp = (char*)Perl_bytes_to_utf8(aTHX_ (U8*)exp, &len);
++ xend = exp + len;
++ RExC_orig_utf8 = RExC_utf8;
++ SAVEFREEPV(exp);
++ goto redo_first_pass;
++ }
++
+
diff --git a/sys-devel/libperl/libperl-5.8.8-r2.ebuild b/sys-devel/libperl/libperl-5.8.8-r2.ebuild
new file mode 100644
index 000000000000..f930f916e84a
--- /dev/null
+++ b/sys-devel/libperl/libperl-5.8.8-r2.ebuild
@@ -0,0 +1,407 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/libperl/libperl-5.8.8-r2.ebuild,v 1.1 2008/05/09 11:04:54 tove Exp $
+
+# The basic theory based on comments from Daniel Robbins <drobbins@gentoo.org>.
+#
+# We split the perl ebuild into libperl and perl. The layout is as follows:
+#
+# libperl:
+#
+# This is a slotted (SLOT=[0-9]*) ebuild, meaning we should be able to have a
+# few versions that are not binary compadible installed.
+#
+# How we get libperl.so multi-versioned, is by adding to the link command:
+#
+# -Wl,-soname -Wl,libperl.so.`echo $(LIBPERL) | cut -d. -f3`
+#
+# This gives us:
+#
+# $(LIBPERL): $& perl$(OBJ_EXT) $(obj) $(LIBPERLEXPORT)
+# $(LD) -o $@ $(SHRPLDFLAGS) perl$(OBJ_EXT) $(obj) \
+# -Wl,-soname -Wl,libperl.so.`echo $(LIBPERL) | cut -d. -f3`
+#
+# We then configure perl with LIBPERL set to:
+#
+# LIBPERL="libperl.so.${SLOT}.`echo ${PV} | cut -d. -f1,2`"
+#
+# Or with the variables defined in this ebuild:
+#
+# LIBPERL="libperl.so.${PERLSLOT}.${SHORT_PV}"
+#
+# The result is that our 'soname' is 'libperl.so.${PERLSLOT}' (at the time of
+# writing this for perl-5.8.0, 'libperl.so.1'), causing all apps that is linked
+# to libperl to link to 'libperl.so.${PERLSLOT}'.
+#
+# If a new perl version, perl-z.y.z comes out that have a libperl not binary
+# compatible with the previous version, we just keep the previous libperl
+# installed, and all apps linked to it will still be able to use:
+#
+# libperl.so.${PERLSLOT}'
+#
+# while the new ones will link to:
+#
+# libperl.so.$((PERLSLOT+1))'
+#
+# perl:
+#
+# Not much to this one. It compiles with a static libperl.a, and are unslotted
+# (meaning SLOT=0). We thus always have the latest *stable* perl version
+# installed, with corrisponding version of libperl. The perl ebuild will of
+# course DEPEND on libperl.
+#
+# Martin Schlemmer <azarah@gentoo.org> (28 Dec 2002).
+
+IUSE="berkdb debug gdbm ithreads"
+
+inherit eutils flag-o-matic toolchain-funcs multilib
+
+# The slot of this binary compat version of libperl.so
+PERLSLOT="1"
+
+SHORT_PV="${PV%.*}"
+MY_P="perl-${PV/_rc/-RC}"
+S="${WORKDIR}/${MY_P}"
+DESCRIPTION="Larry Wall's Practical Extraction and Reporting Language"
+SRC_URI="mirror://cpan/src/${MY_P}.tar.bz2"
+HOMEPAGE="http://www.perl.org"
+SLOT="${PERLSLOT}"
+LIBPERL="libperl$(get_libname ${PERLSLOT}.${SHORT_PV})"
+LICENSE="|| ( Artistic GPL-2 )"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~sparc-fbsd ~x86 ~x86-fbsd"
+
+# rac 2004.08.06
+
+# i am not kidding here. you will forkbomb yourself out of existence
+# because make check -n wants to make miniperl, which runs itself at
+# the very end to make sure it's working right. this behaves very
+# badly when you -n it, because it won't exist and will therefore try
+# to build itself again ad infinitum.
+
+RESTRICT="test"
+
+DEPEND="berkdb? ( sys-libs/db )
+ gdbm? ( >=sys-libs/gdbm-1.8.0 )
+ elibc_FreeBSD? ( sys-freebsd/freebsd-mk-defs )"
+
+RDEPEND="
+ berkdb? ( sys-libs/db )
+ gdbm? ( >=sys-libs/gdbm-1.8.0 )"
+
+PDEPEND="~dev-lang/perl-${PV}"
+
+pkg_setup() {
+ # I think this should rather be displayed if you *have* 'ithreads'
+ # in USE if it could break things ...
+ if use ithreads
+ then
+ ewarn ""
+ ewarn "PLEASE NOTE: You are compiling perl-5.8 with"
+ ewarn "interpreter-level threading enabled."
+ ewarn "Threading is not supported by all applications "
+ ewarn "that compile against perl. You use threading at "
+ ewarn "your own discretion. "
+ ewarn ""
+ epause 10
+ fi
+}
+
+src_unpack() {
+
+ unpack ${A}
+
+ # Fix the build scripts to create libperl with a soname of ${SLOT}.
+ # We basically add:
+ #
+ # -Wl,-soname -Wl,libperl.so.`echo $(LIBPERL) | cut -d. -f3`
+ #
+ # to the line that links libperl.so, and then set LIBPERL to:
+ #
+ # LIBPERL=libperl.so.${SLOT}.`echo ${PV} | cut -d. -f1,2`
+ #
+ cd "${S}";
+ use userland_Darwin || epatch "${FILESDIR}"/${PN}-create-libperl-soname.patch
+
+ # Configure makes an unwarranted assumption that /bin/ksh is a
+ # good shell. This patch makes it revert to using /bin/sh unless
+ # /bin/ksh really is executable. Should fix bug 42665.
+ # rac 2004.06.09
+ cd "${S}"; epatch "${FILESDIR}"/${PN}-noksh.patch
+
+ # we need the same @INC-inversion magic here we do in perl
+ cd "${S}"; epatch "${FILESDIR}"/${P}-reorder-INC.patch
+
+ # makedepend.SH contains a syntax error which is ignored by bash but causes
+ # dash to abort
+ epatch "${FILESDIR}"/${P}-makedepend-syntax.patch
+
+ # On PA7200, uname -a contains a single quote and we need to
+ # filter it otherwise configure fails. See #125535.
+ epatch "${FILESDIR}"/perl-hppa-pa7200-configure.patch
+
+ use amd64 || use ppc64 && cd "${S}" && epatch "${FILESDIR}"/${P}-lib64.patch
+ [[ ${CHOST} == *-dragonfly* ]] && cd "${S}" && epatch "${FILESDIR}"/${P}-dragonfly-clean.patch
+ [[ ${CHOST} == *-freebsd* ]] && cd "${S}" && epatch "${FILESDIR}"/${P}-fbsdhints.patch
+ cd "${S}"; epatch "${FILESDIR}"/${P}-cplusplus.patch
+ has_version '>=sys-devel/gcc-4.2' && epatch "${FILESDIR}"/${P}-gcc42-command-line.patch
+
+ # patch to fix bug #198196
+ # UTF/Regular expressions boundary error (CVE-2007-5116)
+ epatch "${FILESDIR}"/${P}-utf8-boundary.patch
+
+ # patch to fix bug #219203
+ epatch "${FILESDIR}"/${P}-CVE-2008-1927.patch
+}
+
+myconf() {
+ myconf=( "${myconf[@]}" "$@" )
+}
+
+src_compile() {
+ declare -a myconf
+
+ # Perl has problems compiling with -Os in your flags
+ # some arches and -O do not mix :)
+ use arm && replace-flags -O? -O1
+ use ppc && replace-flags -O? -O1
+ use ia64 && replace-flags -O? -O1
+ # Perl has problems compiling with -Os in your flags with glibc
+ use elibc_uclibc || replace-flags "-Os" "-O2"
+ ( gcc-specs-ssp && use ia64 ) && append-flags -fno-stack-protector
+ # This flag makes compiling crash in interesting ways
+ filter-flags "-malign-double"
+ # Fixes bug #97645
+ use ppc && filter-flags -mpowerpc-gpopt
+ # Fixes bug #143895 on gcc-4.1.1
+ filter-flags "-fsched2-use-superblocks"
+
+ export LC_ALL="C"
+
+ case ${CHOST} in
+ *-freebsd*) osname="freebsd" ;;
+ *-dragonfly*) osname="dragonfly" ;;
+ *-netbsd*) osname="netbsd" ;;
+ *-openbsd*) osname="openbsd" ;;
+ *-darwin*) osname="darwin" ;;
+
+ *) osname="linux" ;;
+ esac
+
+ if use ithreads
+ then
+ einfo "using ithreads"
+ mythreading="-multi"
+ myconf -Dusethreads
+ myarch=${CHOST}
+ myarch="${myarch%%-*}-${osname}-thread"
+ else
+ myarch=${CHOST}
+ myarch="${myarch%%-*}-${osname}"
+ fi
+
+ local inclist=$(for v in $PERL_OLDVERSEN; do echo -n "$v $v/$myarch$mythreading "; done)
+
+ # allow either gdbm to provide ndbm (in <gdbm/ndbm.h>) or db1
+
+ myndbm='U'
+ mygdbm='U'
+ mydb='U'
+
+ if use gdbm
+ then
+ mygdbm='D'
+ myndbm='D'
+ fi
+ if use berkdb
+ then
+ mydb='D'
+ has_version '=sys-libs/db-1*' && myndbm='D'
+ fi
+
+ myconf "-${myndbm}i_ndbm" "-${mygdbm}i_gdbm" "-${mydb}i_db"
+
+ if use mips
+ then
+ # this is needed because gcc 3.3-compiled kernels will hang
+ # the machine trying to run this test - check with `Kumba
+ # <rac@gentoo.org> 2003.06.26
+ myconf -Dd_u32align
+ fi
+
+ if use debug
+ then
+ CFLAGS="${CFLAGS} -g"
+ myconf -DDEBUGGING
+ fi
+
+ if use sparc
+ then
+ myconf -Ud_longdbl
+ fi
+
+ if use alpha && "$(tc-getCC)" == "ccc"
+ then
+ ewarn "Perl will not be built with berkdb support, use gcc if you needed it..."
+ myconf -Ui_db -Ui_ndbm
+ fi
+
+ rm -f config.sh Policy.sh
+
+ [[ -n "${ABI}" ]] && myconf "-Dusrinc=$(get_ml_incdir)"
+
+ [[ ${ELIBC} == "FreeBSD" ]] && myconf "-Dlibc=/usr/$(get_libdir)/libc.a"
+
+ if [[ $(get_libdir) != "lib" ]] ; then
+ myconf "-Dlibpth=/usr/local/$(get_libdir) /$(get_libdir) /usr/$(get_libdir)"
+ fi
+
+ sh Configure -des \
+ -Darchname="${myarch}" \
+ -Dcccdlflags="-fPIC" \
+ -Dccdlflags="-rdynamic" \
+ -Dcc="$(tc-getCC)" \
+ -Dprefix="/usr" \
+ -Dvendorprefix="/usr" \
+ -Dsiteprefix="/usr" \
+ -Dlocincpth=" " \
+ -Doptimize="${CFLAGS}" \
+ -Duselargefiles \
+ -Duseshrplib \
+ -Dman3ext="3pm" \
+ -Dlibperl="${LIBPERL}" \
+ -Dd_dosuid \
+ -Dd_semctl_semun \
+ -Dcf_by="Gentoo" \
+ -Ud_csh \
+ "${myconf[@]}" || die "Unable to configure"
+
+ emake -j1 -f Makefile depend || die "Couldn't make libperl$(get_libname) depends"
+ emake -j1 -f Makefile LIBPERL=${LIBPERL} ${LIBPERL} || die "Unable to make libperl$(get_libname)"
+ mv ${LIBPERL} "${WORKDIR}"
+}
+
+src_install() {
+
+ export LC_ALL="C"
+
+ if [ "${PN}" = "libperl" ]
+ then
+ dolib.so "${WORKDIR}"/${LIBPERL}
+ dosym ${LIBPERL} /usr/$(get_libdir)/libperl$(get_libname ${PERLSLOT})
+ else
+ # Need to do this, else apps do not link to dynamic version of
+ # the library ...
+ local coredir="/usr/$(get_libdir)/perl5/${PV}/${myarch}${mythreading}/CORE"
+ dodir ${coredir}
+ dosym ../../../../../$(get_libdir)/${LIBPERL} ${coredir}/${LIBPERL}
+ dosym ../../../../../$(get_libdir)/${LIBPERL} ${coredir}/libperl$(get_libname ${PERLSLOT})
+ dosym ../../../../../$(get_libdir)/${LIBPERL} ${coredir}/libperl$(get_libname)
+
+ # Fix for "stupid" modules and programs
+ dodir /usr/$(get_libdir)/perl5/site_perl/${PV}/${myarch}${mythreading}
+
+ make DESTDIR="${D}" \
+ INSTALLMAN1DIR="${D}/usr/share/man/man1" \
+ INSTALLMAN3DIR="${D}/usr/share/man/man3" \
+ install || die "Unable to make install"
+
+ cp -f utils/h2ph utils/h2ph_patched
+
+ LD_LIBRARY_PATH=. ./perl -Ilib utils/h2ph_patched \
+ -a -d "${D}"/usr/$(get_libdir)/perl5/${PV}/${myarch}${mythreading} <<EOF
+asm/termios.h
+syscall.h
+syslimits.h
+syslog.h
+sys/ioctl.h
+sys/socket.h
+sys/time.h
+wait.h
+EOF
+
+ # This is to fix a missing c flag for backwards compat
+ for i in `find "${D}"/usr/$(get_libdir)/perl5 -iname "Config.pm"`;do
+ sed -e "s:ccflags=':ccflags='-DPERL5 :" \
+ -e "s:cppflags=':cppflags='-DPERL5 :" \
+ ${i} > ${i}.new &&\
+ mv ${i}.new ${i} || die "Sed failed"
+ done
+
+ # A poor fix for the miniperl issues
+ dosed 's:./miniperl:/usr/bin/perl:' /usr/$(get_libdir)/perl5/${PV}/ExtUtils/xsubpp
+ fperms 0444 /usr/$(get_libdir)/perl5/${PV}/ExtUtils/xsubpp
+ dosed 's:./miniperl:/usr/bin/perl:' /usr/bin/xsubpp
+ fperms 0755 /usr/bin/xsubpp
+
+ ./perl installman \
+ --man1dir="${D}/usr/share/man/man1" --man1ext='1' \
+ --man3dir="${D}/usr/share/man/man3" --man3ext='3'
+
+ # This removes ${D} from Config.pm and .packlist
+ for i in `find "${D}" -iname "Config.pm"` `find "${D}" -iname ".packlist"`;do
+ einfo "Removing ${D} from ${i}..."
+ sed -e "s:${D}::" ${i} > "${i}.new" &&\
+ mv "${i}.new" "${i}" || die "Sed failed"
+ done
+ fi
+
+ dodoc Changes* Artistic Copying README Todo* AUTHORS
+
+ if [ "${PN}" = "perl" ]
+ then
+ # HTML Documentation
+ # We expect errors, warnings, and such with the following.
+
+ dodir /usr/share/doc/${PF}/html
+ ./perl installhtml \
+ --podroot='.' \
+ --podpath='lib:ext:pod:vms' \
+ --recurse \
+ --htmldir="${D}/usr/share/doc/${PF}/html" \
+ --libpods='perlfunc:perlguts:perlvar:perlrun:perlop'
+ fi
+}
+
+pkg_postinst() {
+
+ # Make sure we do not have stale/invalid libperl.so 's ...
+ if [ -f "${ROOT}usr/$(get_libdir)/libperl$(get_libname)" -a ! -L "${ROOT}usr/$(get_libdir)/libperl$(get_libname)" ]
+ then
+ mv -f "${ROOT}usr/$(get_libdir)/libperl$(get_libname)" "${ROOT}usr/$(get_libdir)/libperl$(get_libname).old"
+ fi
+
+ # Next bit is to try and setup the /usr/lib/libperl.so symlink
+ # properly ...
+ local libnumber="`ls -1 "${ROOT}"usr/$(get_libdir)/libperl$(get_libname ?.*) | grep -v '\.old' | wc -l`"
+ if [ "${libnumber}" -eq 1 ]
+ then
+ # Only this version of libperl is installed, so just link libperl.so
+ # to the *soname* version of it ...
+ ln -snf libperl$(get_libname ${PERLSLOT}) "${ROOT}"/usr/$(get_libdir)/libperl$(get_libname)
+ else
+ if [ -x "${ROOT}/usr/bin/perl" ]
+ then
+ # OK, we have more than one version .. first try to figure out
+ # if there are already a perl installed, if so, link libperl.so
+ # to that *soname* version of libperl.so ...
+ local perlversion="`${ROOT}/usr/bin/perl -V:version | cut -d\' -f2 | cut -d. -f1,2`"
+
+ cd "${ROOT}"/usr/$(get_libdir)
+ # Link libperl.so to the *soname* versioned lib ...
+ ln -snf `echo libperl$(get_libname ?.${perlversion}) | cut -d. -f1,2,3` libperl$(get_libname)
+ else
+ local x latest
+
+ # Nope, we are not so lucky ... try to figure out what version
+ # is the latest, and keep fingers crossed ...
+ for x in `ls -1 "${ROOT}"/usr/$(get_libdir)/libperl$(get_libname ?.*)`
+ do
+ latest="${x}"
+ done
+
+ cd "${ROOT}"/usr/$(get_libdir)
+ # Link libperl.so to the *soname* versioned lib ...
+ ln -snf `echo ${latest##*/} | cut -d. -f1,2,3` libperl$(get_libname)
+ fi
+ fi
+}