public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Kent Fredric" <kentnl@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-lang/perl/, dev-lang/perl/files/
Date: Sat, 20 Jun 2020 13:06:45 +0000 (UTC)	[thread overview]
Message-ID: <1592658385.80bf6a8420ffc005391f048f093679ac417bf5c5.kentnl@gentoo> (raw)

commit:     80bf6a8420ffc005391f048f093679ac417bf5c5
Author:     Kent Fredric <kentnl <AT> gentoo <DOT> org>
AuthorDate: Sat Jun 20 13:04:43 2020 +0000
Commit:     Kent Fredric <kentnl <AT> gentoo <DOT> org>
CommitDate: Sat Jun 20 13:06:25 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=80bf6a84

dev-lang/perl: Add unkeyworded -r2 version with WIP features

This is a work in-progress experiment, hence, it is unkeyworded until
I can get more eyes on the changes, and fully test the consequences at
scale.

Important Changes:
- Convert to EAPI7
- Remove inherit on eutils
- Replace calls to "epatch" to "eapply", but resulting in a loss of
  nice output
- Add new hidden feature PERL_SINGLE_SLOT, which, when set, installs
  perl into a directory named after SUBSLOT (eg: 5.30) as opposed to one
  following the explicit name (eg: 5.30.2), which aims to pre-emptively
  solve (in both direction) the problem faced by shipping binpkg's,
  where the built perl has only one set of INC dirs (eg: 5.30.2), but a
  binpkg was built with a different, but compatible perl (eg: 5.30.1),
  and subsequently, installs to an @INC dir that is not visible to the
  built perl. Instead, all perl's that are defined to be
  inter-compatible share the same directory for both arch-dependent and
  arch-independent code, so binpkg's only need to be regenerated when:
  - Upgrading/downgrading between major revisions
  - Flipping USE="debug" or USE="ithreads".
  Under PERL_SINGLE_SLOT, directories that should be compatible, and are
  available, but built under the previous scheme, are also inhaled into
  @INC for ease of transition.
  The name of this flag is subject to change, and may become a USE flag.
- Add a new hidden feature PERL_SUPPORT_SINGLE_SLOT, which builds perl
  the same way as in previous versions, but also probes for version'd
  directories generated by installing packages on perl's built with
  PERL_SINGLE_SLOT, as a fallback mechaism for transitioning away from a
  perl built with PERL_SINGLE_SLOT.
  The name of this flag is subject to change, and may become a USE flag
- Add a patch to various parts of Configure, perl.c, and friends, to
  facilitate the above, which exposes itself as -Dgentoolibdirs=, and
  has the same syntax as -Dotherlibdirs, but doesn't pollute everything
  by adding its own arch-dirs when they weren't asked for. This patch
  may also later help facilitate building perl's without
  PERL_SINGLE_SLOT, but with other @INC dirs forced into place, for the
  same purpose, but implemented differently, as the previous mechanism,
  -Dinc_version_list is limited in that it:
    - Excludes internally directories that don't exist
    - Mangles directories sometimes trashing @INC entirely, throwing
      away litterally all the versions you passed.

- Fixed a very embarrasing typo in the einfo code, ${EROO%/T} ...
- Restructured the @INC discovery/cleanup logic into dedicated functions
- Add more error handling in the discovery path, especially adding loud
  error output if directories that *need* to be traversed for compat
  discovery cannot be traversed, due to misconfigured permissions.
- Fix an embarrasing bug in @INC list stripping, that due to inherently
  being a *substring* match, not a *fullstring* match, could have
  excluded 5.30.20 from the @INC path for 5.30.2, even though they're
  intercompatible. This became more obvious, when one was trying to
  strip '5.30' from a list that contained '5.30.1', '5.30.2', because it
  just ate everything!

Questions:
- Why do we have bzip2 in RDEPEND? Surely, that should be BDEPEND-only
- Are we even using bzip2 anymore?
- Should we migrate the patch ball to being a more-common-these-days set
  of numerically ordered patches, and potentially reduce the handling
  complexity in the ebuild as a result?

Package-Manager: Portage-2.3.100, Repoman-2.3.22
Signed-off-by: Kent Fredric <kentnl <AT> gentoo.org>

 .../perl/files/perl-5.30.3-gentoo-libdirs.patch    | 135 ++++
 dev-lang/perl/perl-5.30.3-r2.ebuild                | 752 +++++++++++++++++++++
 2 files changed, 887 insertions(+)

diff --git a/dev-lang/perl/files/perl-5.30.3-gentoo-libdirs.patch b/dev-lang/perl/files/perl-5.30.3-gentoo-libdirs.patch
new file mode 100644
index 00000000000..b9e36223a94
--- /dev/null
+++ b/dev-lang/perl/files/perl-5.30.3-gentoo-libdirs.patch
@@ -0,0 +1,135 @@
+From 7572be1afb16621a537e9da02f96cf04cb10b655 Mon Sep 17 00:00:00 2001
+From: Kent Fredric <kentnl@gentoo.org>
+Date: Sat, 20 Jun 2020 22:14:22 +1200
+Subject: Add support for -Dgentoolibdirs
+
+Which just adds the libdirs verbatim in the right place without
+having perl molest it in the process.
+---
+ Configure        | 26 ++++++++++++++++++++++++++
+ config_h.SH      |  5 +++++
+ perl.c           |  1 +
+ perl_inc_macro.h |  8 ++++++++
+ uconfig.sh       |  1 +
+ 5 files changed, 41 insertions(+)
+
+diff --git a/Configure b/Configure
+index cef8c3c078..77258e8f43 100755
+--- a/Configure
++++ b/Configure
+@@ -1181,6 +1181,8 @@ orderlib=''
+ ranlib=''
+ d_perl_otherlibdirs=''
+ otherlibdirs=''
++gentoolibdirs=''
++d_gentoolibdirs=''
+ package=''
+ spackage=''
+ pager=''
+@@ -8101,6 +8103,28 @@ esac
+ set d_perl_otherlibdirs
+ eval $setvar
+ 
++case "$gentoolibdirs" in
++''|' ') dflt='none' ;;
++*) dflt="$gentoolibdirs" ;;
++esac
++$cat <<EOM
++Enter a colon-seperated list of explicit gentoo paths to stuff in @INC
++unmolested, or enter 'none' for no extra paths
++
++EOM
++rp='Colon-seperated list of gentoo-specific perl library search dirs?'
++. ./myread
++case "$ans" in
++' '|''|none) gentoolibdirs=' ';;
++*) gentoolibdirs="$ans" ;;
++esac
++case "$gentoolibdirs" in
++' ') val=$undef ;;
++*) val=$define ;;
++esac
++set d_gentoolibdirs
++eval $setvar
++
+ : DTrace support
+ dflt_dtrace='/usr/sbin/dtrace'
+ $test -x /usr/bin/dtrace && dflt_dtrace='/usr/bin/dtrace'
+@@ -24402,6 +24426,7 @@ d_openat='$d_openat'
+ d_pathconf='$d_pathconf'
+ d_pause='$d_pause'
+ d_perl_otherlibdirs='$d_perl_otherlibdirs'
++d_gentoolibdirs='$d_gentoolibdirs'
+ d_phostname='$d_phostname'
+ d_pipe2='$d_pipe2'
+ d_pipe='$d_pipe'
+@@ -24937,6 +24962,7 @@ orderlib='$orderlib'
+ osname='$osname'
+ osvers='$osvers'
+ otherlibdirs='$otherlibdirs'
++gentoolibdirs='$gentoolibdirs'
+ package='$package'
+ pager='$pager'
+ passcat='$passcat'
+diff --git a/config_h.SH b/config_h.SH
+index 08c5923ef8..5563082969 100755
+--- a/config_h.SH
++++ b/config_h.SH
+@@ -1308,6 +1308,11 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
+  */
+ #$d_perl_otherlibdirs PERL_OTHERLIBDIRS "$otherlibdirs"		/**/
+ 
++/* GENTOO_LIBDIRS:
++ * Like PERL_OTHERLIBDIRS, but doesn't stuff ARCH dirs in when not wanted
++ */
++#$d_gentoolibdirs GENTOO_LIBDIRS "$gentoolibdirs"		/**/
++
+ /* PRIVLIB:
+  *	This symbol contains the name of the private library for this package.
+  *	The library is private in the sense that it needn't be in anyone's
+diff --git a/perl.c b/perl.c
+index 2013a76026..62e67cfaa2 100644
+--- a/perl.c
++++ b/perl.c
+@@ -4750,6 +4750,7 @@ S_init_perllib(pTHX)
+     INCPUSH_ARCHLIB_EXP
+     INCPUSH_PRIVLIB_EXP
+     INCPUSH_PERL_OTHERLIBDIRS
++    INCPUSH_GENTOO_LIBDIRS
+     INCPUSH_PERL5LIB
+     INCPUSH_APPLLIB_OLD_EXP
+     INCPUSH_SITELIB_STEM
+diff --git a/perl_inc_macro.h b/perl_inc_macro.h
+index 5a2f20dfae..4b69b39199 100644
+--- a/perl_inc_macro.h
++++ b/perl_inc_macro.h
+@@ -143,6 +143,14 @@
+ 		      INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
+ #endif
+ 
++#ifdef GENTOO_LIBDIRS
++# define INCPUSH_GENTOO_LIBDIRS S_incpush_use_sep(aTHX_ STR_WITH_LEN(GENTOO_LIBDIRS), \
++    INCPUSH_ADD_OLD_VERS|INCPUSH_CAN_RELOCATE);
++#endif
++#ifndef INCPUSH_GENTOO_LIBDIRS
++# define INCPUSH_GENTOO_LIBDIRS
++#endif
++
+ #ifdef PERL_OTHERLIBDIRS
+ #	define INCPUSH_PERL_OTHERLIBDIRS_ARCHONLY  S_incpush_use_sep(aTHX_ STR_WITH_LEN(PERL_OTHERLIBDIRS), \
+ 		      INCPUSH_ADD_OLD_VERS|INCPUSH_ADD_ARCHONLY_SUB_DIRS|INCPUSH_CAN_RELOCATE);
+diff --git a/uconfig.sh b/uconfig.sh
+index 1d4a0f4a57..fba825acad 100644
+--- a/uconfig.sh
++++ b/uconfig.sh
+@@ -185,6 +185,7 @@ d_futimes='undef'
+ d_gai_strerror='undef'
+ d_gdbm_ndbm_h_uses_prototypes='undef'
+ d_gdbmndbm_h_uses_prototypes='undef'
++d_gentoolibdirs='undef'
+ d_getaddrinfo='undef'
+ d_getcwd='undef'
+ d_getespwnam='undef'
+-- 
+2.27.0
+

diff --git a/dev-lang/perl/perl-5.30.3-r2.ebuild b/dev-lang/perl/perl-5.30.3-r2.ebuild
new file mode 100644
index 00000000000..2483914929e
--- /dev/null
+++ b/dev-lang/perl/perl-5.30.3-r2.ebuild
@@ -0,0 +1,752 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit alternatives flag-o-matic toolchain-funcs multilib multiprocessing
+
+PATCH_VER=1
+CROSS_VER=1.3.4
+PATCH_BASE="perl-5.30.0-patches-${PATCH_VER}"
+PATCH_DEV=dilfridge
+
+DIST_AUTHOR=XSAWYERX
+
+# Greatest first, don't include yourself
+# Devel point-releases are not ABI-intercompatible, but stable point releases are
+# BIN_OLDVERSEN is contains only C-ABI-intercompatible versions
+PERL_BIN_OLDVERSEN="5.30.0 5.30.1 5.30.2"
+
+if [[ "${PV##*.}" == "9999" ]]; then
+	DIST_VERSION=5.30.0
+else
+	DIST_VERSION="${PV/_rc/-RC}"
+fi
+SHORT_PV="${DIST_VERSION%.*}"
+# Even numbered major versions are ABI intercompatible
+# Odd numbered major versions are not
+if [[ $(( ${SHORT_PV#*.} % 2 )) == 1 ]]; then
+	SUBSLOT="${DIST_VERSION%-RC*}"
+else
+	SUBSLOT="${DIST_VERSION%.*}"
+fi
+# Used only in tar paths
+MY_P="perl-${DIST_VERSION}"
+# Used in library paths
+MY_PV="${DIST_VERSION%-RC*}"
+
+DESCRIPTION="Larry Wall's Practical Extraction and Report Language"
+
+SRC_URI="
+	mirror://cpan/src/5.0/${MY_P}.tar.xz
+	mirror://cpan/authors/id/${DIST_AUTHOR:0:1}/${DIST_AUTHOR:0:2}/${DIST_AUTHOR}/${MY_P}.tar.xz
+	https://github.com/gentoo-perl/perl-patchset/releases/download/${PATCH_BASE}/${PATCH_BASE}.tar.xz
+	mirror://gentoo/${PATCH_BASE}.tar.xz
+	https://dev.gentoo.org/~${PATCH_DEV}/distfiles/${PATCH_BASE}.tar.xz
+	https://github.com/arsv/perl-cross/releases/download/${CROSS_VER}/perl-cross-${CROSS_VER}.tar.gz
+"
+HOMEPAGE="https://www.perl.org/"
+
+LICENSE="|| ( Artistic GPL-1+ )"
+SLOT="0/${SUBSLOT}"
+
+if [[ "${PV##*.}" != "9999" ]] && [[ "${PV/rc//}" == "${PV}" ]] ; then
+# SOMEWHAT EXPERIMENTAL CODE, DO NOT USE WITHOUT AN ADULT PRESENT, CHECK CHANGELOG
+# FOR DETAILS
+KEYWORDS=""
+# KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~ppc-aix ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+fi
+
+IUSE="berkdb debug doc gdbm ithreads"
+
+RDEPEND="
+	berkdb? ( sys-libs/db:= )
+	gdbm? ( >=sys-libs/gdbm-1.8.3:= )
+	app-arch/bzip2
+	sys-libs/zlib
+"
+DEPEND="${RDEPEND}"
+BDEPEND="${RDEPEND}"
+
+PDEPEND="
+	>=app-admin/perl-cleaner-2.5
+	>=virtual/perl-File-Temp-0.230.400-r2
+	>=virtual/perl-Data-Dumper-2.154.0
+	virtual/perl-Test-Harness
+"
+# bug 390719, bug 523624
+# virtual/perl-Test-Harness is here for the bundled ExtUtils::MakeMaker
+
+S="${WORKDIR}/${MY_P}"
+
+dual_scripts() {
+	src_remove_dual      perl-core/Archive-Tar        2.320.0       ptar ptardiff ptargrep
+	src_remove_dual      perl-core/CPAN               2.220.0       cpan
+	src_remove_dual      perl-core/Digest-SHA         6.20.0        shasum
+	src_remove_dual      perl-core/Encode             3.10.0        enc2xs piconv
+	src_remove_dual      perl-core/ExtUtils-MakeMaker 7.340.0       instmodsh
+	src_remove_dual      perl-core/ExtUtils-ParseXS   3.400.0       xsubpp
+	src_remove_dual      perl-core/IO-Compress        2.84.0        zipdetails
+	src_remove_dual      perl-core/JSON-PP            4.20.0        json_pp
+	src_remove_dual      perl-core/Module-CoreList    5.202.6.13.0_rc corelist
+	src_remove_dual      perl-core/Pod-Parser         1.630.0       pod2usage podchecker podselect
+	src_remove_dual      perl-core/Pod-Perldoc        3.280.100     perldoc
+	src_remove_dual      perl-core/Test-Harness       3.420.0       prove
+	src_remove_dual      perl-core/podlators          4.110.0       pod2man pod2text
+	src_remove_dual_man  perl-core/podlators          4.110.0       /usr/share/man/man1/perlpodstyle.1
+}
+
+check_rebuild() {
+	# Fresh install
+	if [[ -z "${REPLACING_VERSIONS}" ]]; then
+		return 0;
+	# Major Upgrade
+	# doesn't matter if there's multiple copies, it still needs a rebuild
+	# if the string is anything other than "5.CURRENTMAJOR"
+	elif [[ "${REPLACING_VERSIONS%.*}" != "${PV%.*}" ]]; then
+		echo ""
+		ewarn "UPDATE THE PERL MODULES:"
+		ewarn "After updating dev-lang/perl the installed Perl modules"
+		ewarn "have to be re-installed. In most cases, this is done automatically"
+		ewarn "by the package manager, but subsequent steps are still recommended"
+		ewarn "to ensure system consistency."
+		ewarn
+		ewarn "You should start with a depclean to remove any unused perl dependencies"
+		ewarn "that may confuse portage in future. Regular depcleans are also encouraged"
+		ewarn "as part of your regular update cycle, as that will keep perl upgrades working."
+		ewarn "Recommended: emerge --depclean -va"
+		ewarn
+		ewarn "You should then call perl-cleaner to clean up any old files and trigger any"
+		ewarn "remaining rebuilds portage may have missed."
+		ewarn "Use: perl-cleaner --all"
+		return 0;
+
+	# Reinstall w/ USE Change
+	elif (   use ithreads && ! has_version dev-lang/perl[ithreads] ) || \
+		 ( ! use ithreads &&   has_version dev-lang/perl[ithreads] ) || \
+		 (   use debug    && ! has_version dev-lang/perl[debug]    ) || \
+		 ( ! use debug    &&   has_version dev-lang/perl[debug]    ) ; then
+		echo ""
+		ewarn "TOGGLED USE-FLAGS WARNING:"
+		ewarn "You changed one of the use-flags ithreads or debug."
+		ewarn "You must rebuild all perl-modules installed."
+		ewarn "Use: perl-cleaner --modules ; perl-cleaner --force --libperl"
+	fi
+}
+
+pkg_setup() {
+	case ${CHOST} in
+		*-freebsd*)   osname="freebsd" ;;
+		*-dragonfly*) osname="dragonfly" ;;
+		*-netbsd*)    osname="netbsd" ;;
+		*-openbsd*)   osname="openbsd" ;;
+		*-darwin*)    osname="darwin" ;;
+		*-solaris*)   osname="solaris" ;;
+		*-interix*)   osname="interix" ;;
+		*-aix*)       osname="aix" ;;
+		*-cygwin*)    osname="cygwin" ;;
+		*)            osname="linux" ;;
+	esac
+
+	myarch="${CHOST%%-*}-${osname}"
+	if use debug ; then
+		myarch+="-debug"
+	fi
+	if use ithreads ; then
+		mythreading="-multi"
+		myarch+="-thread"
+	fi
+
+	PRIV_BASE="/usr/$(get_libdir)/perl5"
+	SITE_BASE="/usr/local/$(get_libdir)/perl5"
+	VENDOR_BASE="/usr/$(get_libdir)/perl5/vendor_perl"
+
+	LIBPERL="libperl$(get_libname ${MY_PV} )"
+
+	# This ENV var tells perl to build with a directory like "5.30"
+	# regardless of its patch version. This is for experts only
+	# at this point.
+	if [[ -z "${PERL_SINGLE_SLOT}" ]]; then
+		PRIV_LIB="${PRIV_BASE}/${MY_PV}"
+		ARCH_LIB="${PRIV_BASE}/${MY_PV}/${myarch}${mythreading}"
+		SITE_LIB="${SITE_BASE}/${MY_PV}"
+		SITE_ARCH="${SITE_BASE}/${MY_PV}/${myarch}${mythreading}"
+		VENDOR_LIB="${VENDOR_BASE}/${MY_PV}"
+		VENDOR_ARCH="${VENDOR_BASE}/${MY_PV}/${myarch}${mythreading}"
+	else
+		PRIV_LIB="${PRIV_BASE}/${SUBSLOT}"
+		ARCH_LIB="${PRIV_BASE}/${SUBSLOT}/${myarch}${mythreading}"
+		SITE_LIB="${SITE_BASE}/${SUBSLOT}"
+		SITE_ARCH="${SITE_BASE}/${SUBSLOT}/${myarch}${mythreading}"
+		VENDOR_LIB="${VENDOR_BASE}/${SUBSLOT}"
+		VENDOR_ARCH="${VENDOR_BASE}/${SUBSLOT}/${myarch}${mythreading}"
+	fi
+
+	dual_scripts
+}
+
+src_remove_dual_file() {
+	local i pkg ver
+	pkg="$1"
+	ver="$2"
+	shift 2
+	case "${EBUILD_PHASE:-none}" in
+		postinst|postrm)
+			for i in "$@" ; do
+				alternatives_auto_makesym "${i}" "${i}-[0-9]*"
+			done
+			;;
+		setup)
+			for i in "$@" ; do
+				if [[ -f ${EROOT}${i} && ! -h ${EROOT}${i} ]] ; then
+					has_version ${pkg} && ewarn "You must reinstall ${pkg} !"
+					break
+				fi
+			done
+			;;
+		install)
+			for i in "$@" ; do
+				if ! [[ -f "${ED}"${i} ]] ; then
+					ewarn "${i} does not exist!"
+					continue
+				fi
+				mv "${ED}"${i}{,-${ver}-${P}} || die
+			done
+			;;
+	esac
+}
+
+src_remove_dual_man() {
+	local i pkg ver ff
+	pkg="$1"
+	ver="$2"
+	shift 2
+	case "${EBUILD_PHASE:-none}" in
+		postinst|postrm)
+			for i in "$@" ; do
+				ff=`echo "${EROOT}${i%.[0-9]}-${ver}-${P}${i#${i%.[0-9]}}"*`
+				ff=${ff##*${i#${i%.[0-9]}}}
+				alternatives_auto_makesym "${i}${ff}" "${i%.[0-9]}-[0-9]*"
+			done
+			;;
+		install)
+			for i in "$@" ; do
+				if ! [[ -f "${ED}"${i} ]] ; then
+					ewarn "${i} does not exist!"
+					continue
+				fi
+				mv "${ED}"${i} "${ED}"${i%.[0-9]}-${ver}-${P}${i#${i%.[0-9]}} || die
+			done
+			;;
+	esac
+}
+
+src_remove_dual() {
+	local i pkg ver
+	pkg="$1"
+	ver="$2"
+	shift 2
+	for i in "$@" ; do
+		src_remove_dual_file  "${pkg}" "${ver}" "/usr/bin/${i}"
+		src_remove_dual_man   "${pkg}" "${ver}" "/usr/share/man/man1/${i}.1"
+	done
+}
+
+src_prepare_update_patchlevel_h() {
+	# Copied and modified from debian:
+	# Copyright 2011 Niko Tyni
+	# This program is free software; you can redistribute it and/or modify
+	# it under the same terms as Perl itself.
+	local patchdir="${WORKDIR}/patches"
+	local prefix
+	local patchoutput="patchlevel-gentoo.h"
+
+	[[ -f ${patchdir}/series ]] || return 0
+
+while read patch
+do
+	patchname=$(echo $patch | sed 's/\.diff$//')
+	< $patchdir/$patch sed -e '/^Subject:/ { N; s/\n / / }' | sed -n -e '
+
+	# massage the patch headers
+	s|^Bug: .*https\?://rt\.perl\.org/.*id=\(.*\).*|[perl #\1]|; tprepend;
+	s|^Bug: .*https\?://rt\.cpan\.org/.*id=\(.*\).*|[rt.cpan.org #\1]|; tprepend;
+	s|^Bug-Gentoo: ||; tprepend;
+	s/^\(Subject\|Description\): //; tappend;
+	s|^Origin: .*http://perl5\.git\.perl\.org/perl\.git/commit\(diff\)\?/\(.......\).*|[\2]|; tprepend;
+
+	# post-process at the end of input
+	$ { x;
+		# include the version number in the patchlevel.h description (if available)
+		s/List packaged patches/&'" for ${PF}(#${PATCH_VER})"'/;
+
+		# escape any backslashes and double quotes
+		s|\\|\\\\|g; s|"|\\"|g;
+
+		# add a prefix
+		s|^|\t,"'"$prefix$patchname"' - |;
+		# newlines away
+		s/\n/ /g; s/  */ /g;
+		# add a suffix
+		s/ *$/"/; p
+	};
+	# stop all processing
+	d;
+	# label: append to the hold space
+	:append H; d;
+	# label: prepend to the hold space
+	:prepend x; H; d;
+	'
+done < "${WORKDIR}"/patches/series > "${S}/${patchoutput}"
+echo "${patchoutput}" >> "${S}/MANIFEST"
+}
+
+src_prepare_perlcross() {
+	cp -a ../perl-cross-${CROSS_VER}/* . || die
+
+	# bug 604072
+	MAKEOPTS+=" -j1"
+	export MAKEOPTS
+}
+src_prepare_dynamic() {
+	ln -s ${LIBPERL} libperl$(get_libname ${SHORT_PV}) || die
+	ln -s ${LIBPERL} libperl$(get_libname ) || die
+}
+
+src_prepare() {
+	local patch
+
+	if use hppa ; then
+		eapply "${FILESDIR}/${PN}-5.26.2-hppa.patch" # bug 634162
+	fi
+
+	if [[ ${CHOST} == *-solaris* ]] ; then
+		# do NOT mess with nsl, on Solaris this is always necessary,
+		# when -lsocket is used e.g. to get h_errno
+		sed -i '/gentoo\/no-nsl-cl\.patch/d' "${WORKDIR}/patches/series" || die
+	fi
+
+	einfo "[ Applying patches from ${PATCH_BASE} ]"
+	while read patch ; do
+		eapply "${WORKDIR}"/patches/${patch}
+	done < "${WORKDIR}"/patches/series
+	einfo "[ Done with ${PATCH_BASE} ]"
+
+	eapply "${FILESDIR}/${PN}-5.30.3-gentoo-libdirs.patch"
+
+	src_prepare_update_patchlevel_h
+
+	tc-is-cross-compiler && src_prepare_perlcross
+
+	tc-is-static-only || src_prepare_dynamic
+
+	if use gdbm; then
+		sed -i "s:INC => .*:INC => \"-I${EROOT}usr/include/gdbm\":g" \
+			ext/NDBM_File/Makefile.PL || die
+	fi
+
+	# Use errno.h from prefix rather than from host system, bug #645804
+	if use prefix && [[ -e "${EPREFIX}"/usr/include/errno.h ]] ; then
+		sed -i "/my..sysroot/s:'':'${EPREFIX}':" ext/Errno/Errno_pm.PL || die
+	fi
+
+	if [[ ${CHOST} == *-solaris* ]] ; then
+		# set a soname, fix linking against just built libperl
+		sed -i -e 's/netbsd\*/netbsd*|solaris*/' Makefile.SH || die
+	fi
+
+	if [[ ${CHOST} == *-darwin* ]] ; then
+		# fix install_name (soname) not to reference $D
+		sed -i -e '/install_name `pwd/s/`pwd`/\\$(shrpdir)/' Makefile.SH || die
+	fi
+
+	default
+}
+
+myconf() {
+	# the myconf array is declared in src_configure
+	myconf=( "${myconf[@]}" "$@" )
+}
+
+# Outputs a list of versions which have been seen in any of the
+# primary perl @INC prefix paths, such as:
+#  /usr/lib64/perl5/<NUMBER>
+#  /usr/local/lib64/perl5/<NUMBER>
+#  /usr/lib64/perl5/vendor_perl/<NUMBER>
+#
+# All values of NUMBER must be like "5.x.y", unless PERL_SUPPORT_SINGLE_SLOT
+# is enabled, where it will also allow numbers like "5.x"
+#
+# PERL_SUPPORT_SINGLE_SLOT should only be used to transition *away* from PERL_SINGLE_SLOT
+# if you used that.
+find_candidate_inc_versions() {
+	local regex='.*/5[.][0-9]+[.][0-9]+$';
+	if [[ ! -z "${PERL_SUPPORT_SINGLE_SLOT}" || ! -z "${PERL_SINGLE_SLOT}" ]]; then
+		regex='.*/5[.][0-9]+\([.][0-9]+\|\)$'
+	fi
+	local dirs=(
+		"${EROOT%/}${PRIV_BASE}"
+		"${EROOT%/}${SITE_BASE}"
+		"${EROOT%/}${VENDOR_BASE}"
+	)
+	for dir in "${dirs[@]}"; do
+		if [[ ! -e "${dir}" ]]; then
+			continue
+		fi
+		# Without access to readdir() on these dirs, find will not be able
+		# to reveal any @INC directories inside them, and will subsequently prune
+		# them from the built perl's @INC support, breaking our compatiblity options
+		# entirely.
+		if [[ ! -r "${dir}" || ! -x "${dir}" ]]; then
+			eerror "Bad permissions on ${dir}, this will probably break things"
+			eerror "Ensure ${dir} is +rx for at least uid=$EUID"
+			eerror "Recommended permission is +rx for all"
+			eerror "> chmod o+rx ${dir}"
+		fi
+	done
+	einfo "Scanning for old @INC dirs matching '$regex' in: ${dirs[*]}"
+	find "${dirs[@]}" -maxdepth 1 -mindepth 1 -type d -regex "${regex}" -printf "%f "  2>/dev/null
+}
+# Sort versions passed versiony-ly, remove self-version if present
+# dedup. Takes each version as an argument
+sanitize_inc_versions() {
+	local vexclude="${DIST_VERSION%-RC}"
+	if [[ ! -z "${PERL_SINGLE_SLOT}" ]]; then
+		vexclude="${SUBSLOT}"
+	fi
+	einfo "Normalizing/Sorting candidate list: $*"
+	einfo " to remove '${vexclude}'"
+	# Note, general numeric sort has to be used
+	# for the last component, or unique will convert
+	#  5.30.0 + 5.30 into just 5.30
+	printf "%s\n" "$@" |\
+		grep -vxF "${vexclude}" |\
+		sort -u -nr -t'.' -k1,1rn -k2,2rn -k3,3rg
+}
+
+versions_to_inclist() {
+	local oldv="${PERL_BIN_OLDVERSEN}"
+	if [[ ! -z "${PERL_SINGLE_SLOT}" ]]; then
+		oldv="${DIST_VERSION%-RC} ${PERL_BIN_OLDVERSEN}"
+	fi
+	for v;	do
+			has "${v}" ${oldv} && echo -n "${v}/${myarch}${mythreading}/ ";
+			echo -n "${v}/ ";
+	done
+}
+versions_to_gentoolibdirs() {
+	local oldv="${PERL_BIN_OLDVERSEN}"
+	local root
+	local v
+	if [[ ! -z "${PERL_SINGLE_SLOT}" ]]; then
+		oldv="${DIST_VERSION%-RC} ${PERL_BIN_OLDVERSEN}"
+	fi
+	for v;	do
+		for root in "${PRIV_BASE}" "${VENDOR_BASE}" "${SITE_BASE}"; do
+			local fullpath="${EROOT%/}${root}/${v}"
+			if [[ -e "${fullpath}" ]]; then
+				has "${v}" ${oldv} && printf "%s:" "${fullpath}/${myarch}${mythreading}";
+				printf "%s:" "${fullpath}"
+			fi
+		done
+	done
+}
+
+src_configure() {
+	declare -a myconf
+
+	export LC_ALL="C"
+	[[ ${COLUMNS:-1} -ge 1 ]] || unset COLUMNS # bug #394091
+
+	# Perl has problems compiling with -Os in your flags with glibc
+	use elibc_uclibc || replace-flags "-Os" "-O2"
+
+	# xlocale.h is going away in glibc-2.26, so it's counterproductive
+	# if we use it and include it in CORE/perl.h ... Perl builds just
+	# fine with glibc and locale.h only.
+	# However, the darwin prefix people have no locale.h ...
+	use elibc_glibc && myconf -Ui_xlocale
+
+	# This flag makes compiling crash in interesting ways
+	filter-flags "-malign-double"
+
+	# Generic LTO broken since 5.28, triggers EUMM failures
+	filter-flags "-flto"
+
+	use sparc && myconf -Ud_longdbl
+
+	export BUILD_BZIP2=0
+	export BZIP2_INCLUDE=${EROOT}/usr/include
+	export BZIP2_LIB=${EROOT}/usr/$(get_libdir)
+
+	export BUILD_ZLIB=False
+	export ZLIB_INCLUDE=${EROOT}/usr/include
+	export ZLIB_LIB=${EROOT}/usr/$(get_libdir)
+
+	# allow either gdbm to provide ndbm (in <gdbm/ndbm.h>) or db1
+	myndbm='U'
+	mygdbm='U'
+	mydb='U'
+	if use gdbm ; then
+		mygdbm='D'
+		if use berkdb ; then
+			myndbm='D'
+		fi
+	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 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
+
+	use ithreads && myconf -Dusethreads
+
+	if use debug ; then
+		append-cflags "-g"
+		myconf -DDEBUGGING
+	elif [[ ${CFLAGS} == *-g* ]] ; then
+		myconf -DDEBUGGING=-g
+	else
+		myconf -DDEBUGGING=none
+	fi
+
+	# Autodiscover all old version directories, some of them will even be newer
+	# if you downgrade
+	if [[ -z ${PERL_OLDVERSEN} ]]; then
+		PERL_OLDVERSEN="$( find_candidate_inc_versions )"
+	fi
+
+	# Fixup versions, removing self match, fixing order and dupes
+	PERL_OLDVERSEN="$( sanitize_inc_versions ${PERL_OLDVERSEN} )"
+
+	# Experts who want a "Pure" install can set PERL_OLDVERSEN to an empty string
+	if [[ -n "${PERL_OLDVERSEN// }" ]]; then
+		local inclist="$( versions_to_inclist ${PERL_OLDVERSEN} )"
+		einfo "This version of perl may partially support modules previously"
+		einfo "installed in any of the following paths:"
+		for incpath in ${inclist}; do
+			[[ -e "${EROOT%/}${VENDOR_BASE}/${incpath}" ]] && einfo " ${EROOT%/}${VENDOR_BASE}/${incpath}"
+			[[ -e "${EROOT%/}${PRIV_BASE}/${incpath}"   ]] && einfo " ${EROOT%/}${PRIV_BASE}/${incpath}"
+			[[ -e "${EROOT%/}${SITE_BASE}/${incpath}"   ]] && einfo " ${EROOT%/}${SITE_BASE}/${incpath}"
+		done
+		einfo "This is a temporary measure and you should aim to cleanup these paths"
+		einfo "via world updates and perl-cleaner"
+		# myconf -Dinc_version_list="${inclist}"
+		myconf -Dgentoolibdirs="$( versions_to_gentoolibdirs ${PERL_OLDVERSEN} )"
+	fi
+
+	[[ ${ELIBC} == "FreeBSD" ]] && myconf "-Dlibc=/usr/$(get_libdir)/libc.a"
+
+	# Make sure we can do the final link #523730, need to set deployment
+	# target to override hardcoded 10.3 which breaks on modern OSX
+	[[ ${CHOST} == *-darwin* ]] && \
+		myconf "-Dld=env MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} $(tc-getCC)"
+
+	# Older macOS with non-Apple GCC chokes on inline in system headers
+	# using c89 mode as injected by cflags.SH
+	[[ ${CHOST} == *-darwin* && ${CHOST##*darwin} -le 9 ]] && tc-is-gcc && \
+		append-cflags -Dinline=__inline__
+
+	# fix unaligned access misdetection
+	# https://rt.perl.org/Public/Bug/Display.html?id=133495
+	# https://rt.perl.org/Public/Bug/Display.html?id=133803
+	# bug #676062, bug #688432
+	use hppa || use sparc || [[ ${CHOST} == sparc*-solaris* ]] || \
+		[[ ${CHOST} == armv5tel* ]] \
+			&& myconf "-Dd_u32align='define'"
+
+	# Prefix: the host system needs not to follow Gentoo multilib stuff, and in
+	# Prefix itself we don't do multilib either, so make sure perl can find
+	# something compatible.
+	if use prefix ; then
+		# Set a hook to check for each detected library whether it actually works.
+		export libscheck="
+			( echo 'main(){}' > '${T}'/conftest.c &&
+			  $(tc-getCC) -o '${T}'/conftest '${T}'/conftest.c -l\$thislib >/dev/null 2>/dev/null
+			) || xxx=/dev/null"
+
+		# Use all host paths that might contain useful stuff, the hook above will filter out bad choices.
+		local paths="/lib/*-linux-gnu /usr/lib/*-linux-gnu /lib64 /lib/64 /usr/lib64 /usr/lib/64 /lib32 /usr/lib32 /lib /usr/lib"
+		myconf "-Dlibpth=${EPREFIX}/$(get_libdir) ${EPREFIX}/usr/$(get_libdir) ${paths}"
+	elif [[ $(get_libdir) != "lib" ]] ; then
+		# We need to use " and not ', as the written config.sh use ' ...
+		myconf "-Dlibpth=/usr/local/$(get_libdir) /$(get_libdir) /usr/$(get_libdir)"
+	fi
+
+	# don't try building ODBM, bug #354453
+	disabled_extensions="ODBM_File"
+
+	if ! use gdbm ; then
+		# workaround for bug #157774: don't try building GDBM related stuff with USE="-gdbm"
+		disabled_extensions="${disabled_extensions} GDBM_File NDBM_File"
+	fi
+
+	myconf -Dnoextensions="${disabled_extensions}"
+
+	[[ "${PV##*.}" == "9999" ]] && myconf -Dusedevel -Uversiononly
+
+	[[ -n "${EXTRA_ECONF}" ]] && ewarn During Perl build, EXTRA_ECONF=${EXTRA_ECONF}
+	# allow fiddling via EXTRA_ECONF, bug 558070
+	eval "local -a EXTRA_ECONF=(${EXTRA_ECONF})"
+
+	# setting -Dld= to tc-getLD breaks perl and all perl things
+	# https://github.com/Perl/perl5/issues/17791#issuecomment-630145202
+	myconf \
+		-Duseshrplib \
+		-Darchname="${myarch}" \
+		-Dcc="$(tc-getCC)" \
+		-Dar="$(tc-getAR)" \
+		-Dnm="$(tc-getNM)" \
+		-Dcpp="$(tc-getCPP)" \
+		-Dranlib="$(tc-getRANLIB)" \
+		-Doptimize="${CFLAGS}" \
+		-Dldflags="${LDFLAGS}" \
+		-Dprefix="${EPREFIX}"'/usr' \
+		-Dsiteprefix="${EPREFIX}"'/usr/local' \
+		-Dvendorprefix="${EPREFIX}"'/usr' \
+		-Dscriptdir="${EPREFIX}"'/usr/bin' \
+		-Dprivlib="${EPREFIX}${PRIV_LIB}" \
+		-Darchlib="${EPREFIX}${ARCH_LIB}" \
+		-Dsitelib="${EPREFIX}${SITE_LIB}" \
+		-Dsitearch="${EPREFIX}${SITE_ARCH}" \
+		-Dvendorlib="${EPREFIX}${VENDOR_LIB}" \
+		-Dvendorarch="${EPREFIX}${VENDOR_ARCH}" \
+		-Dman1dir="${EPREFIX}"/usr/share/man/man1 \
+		-Dman3dir="${EPREFIX}"/usr/share/man/man3 \
+		-Dsiteman1dir="${EPREFIX}"/usr/local/man/man1 \
+		-Dsiteman3dir="${EPREFIX}"/usr/local/man/man3 \
+		-Dvendorman1dir="${EPREFIX}"/usr/share/man/man1 \
+		-Dvendorman3dir="${EPREFIX}"/usr/share/man/man3 \
+		-Dman1ext='1' \
+		-Dman3ext='3pm' \
+		-Dlibperl="${LIBPERL}" \
+		-Dlocincpth="${EPREFIX}"'/usr/include ' \
+		-Dglibpth="${EPREFIX}/$(get_libdir) ${EPREFIX}/usr/$(get_libdir)"' ' \
+		-Duselargefiles \
+		-Dd_semctl_semun \
+		-Dcf_by='Gentoo' \
+		-Dmyhostname='localhost' \
+		-Dperladmin='root@localhost' \
+		-Ud_csh \
+		-Dsh="${EPREFIX}"/bin/sh \
+		-Dtargetsh="${EPREFIX}"/bin/sh \
+		-Uusenm \
+		"${myconf[@]}" \
+		"${EXTRA_ECONF[@]}"
+
+	if tc-is-cross-compiler; then
+		./configure \
+			--target="${CHOST}" \
+			--build="${CBUILD}" \
+			-Dinstallprefix='' \
+			-Dinstallusrbinperl='undef' \
+			-Dusevendorprefix='define' \
+			"${myconf[@]}" \
+			|| die "Unable to configure"
+	else
+		sh Configure \
+			-des \
+			-Dinstallprefix="${EPREFIX}"'/usr' \
+			-Dinstallusrbinperl='n' \
+			"${myconf[@]}" \
+			|| die "Unable to configure"
+	fi
+}
+
+src_test() {
+	export NO_GENTOO_NETWORK_TESTS=1;
+	export GENTOO_ASSUME_SANDBOXED="${GENTOO_ASSUME_SANDBOXED:-1}"
+	export GENTOO_NO_PORTING_TESTS="${GENTOO_NO_PORTING_TESTS:-1}"
+	if [[ ${EUID} == 0 ]] ; then
+		ewarn "Test fails with a sandbox error (#328793) if run as root. Skipping tests..."
+		return 0
+	fi
+	use elibc_uclibc && export MAKEOPTS+=" -j1"
+	TEST_JOBS="$(makeopts_jobs)" make test_harness || die "test failed"
+}
+
+src_install() {
+	local i
+	local coredir="${ARCH_LIB}/CORE"
+
+	emake DESTDIR="${D}" install
+
+	rm -f "${ED}/usr/bin/perl${MY_PV}"
+	ln -s perl "${ED}"/usr/bin/perl${MY_PV} || die
+
+	if ! tc-is-static-only ; then
+		dolib.so "${ED}"${coredir}/${LIBPERL}
+		rm -f "${ED}"${coredir}/${LIBPERL}
+		ln -sf ${LIBPERL} "${ED}"/usr/$(get_libdir)/libperl$(get_libname ${SHORT_PV}) || die
+		ln -sf ${LIBPERL} "${ED}"/usr/$(get_libdir)/libperl$(get_libname) || die
+
+		ln -sf ../../../../${LIBPERL} "${ED}"${coredir}/${LIBPERL} || die
+		ln -sf ../../../../${LIBPERL} "${ED}"${coredir}/libperl$(get_libname ${SHORT_PV}) || die
+		ln -sf ../../../../${LIBPERL} "${ED}"${coredir}/libperl$(get_libname) || die
+	fi
+
+	rm -rf "${ED}"/usr/share/man/man3 || die "Unable to remove module man pages"
+
+	# This removes ${D} from Config.pm
+	for i in $(find "${D}" -iname "Config.pm" ) ; do
+		einfo "Removing ${D} from ${i}..."
+		sed -i -e "s:${D}::" "${i}" || die "Sed failed"
+	done
+
+	dodoc Changes* README AUTHORS
+
+	if use doc ; then
+		# HTML Documentation
+		# We expect errors, warnings, and such with the following.
+
+		dodir /usr/share/doc/${PF}/html
+		LD_LIBRARY_PATH=. ./perl installhtml \
+			--podroot='.' \
+			--podpath='lib:ext:pod:vms' \
+			--recurse \
+			--htmldir="${ED}/usr/share/doc/${PF}/html"
+	fi
+
+	[[ -d ${ED}/usr/local ]] && rm -r "${ED}"/usr/local
+
+	dual_scripts
+}
+
+pkg_preinst() {
+	check_rebuild
+}
+
+pkg_postinst() {
+	dual_scripts
+
+	if [[ "${ROOT}" = "/" ]] ; then
+		local INC DIR file
+		INC=$(perl -e 'for $line (@INC) { next if $line eq "."; next if $line =~ m/'${SHORT_PV}'|etc|local|perl$/; print "$line\n" }')
+		einfo "Removing old .ph files"
+		for DIR in ${INC} ; do
+			if [[ -d "${DIR}" ]] ; then
+				for file in $(find "${DIR}" -name "*.ph" -type f ) ; do
+					rm -f "${file}"
+					einfo "<< ${file}"
+				done
+			fi
+		done
+		# Silently remove the now empty dirs
+		for DIR in ${INC} ; do
+			if [[ -d "${DIR}" ]] ; then
+				find "${DIR}" -depth -type d -print0 | xargs -0 -r rmdir &> /dev/null
+			fi
+		done
+
+	fi
+}
+
+pkg_postrm() {
+	dual_scripts
+}


             reply	other threads:[~2020-06-20 13:06 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-20 13:06 Kent Fredric [this message]
  -- strict thread matches above, loose matches on Subject: below --
2020-12-26 13:37 [gentoo-commits] repo/gentoo:master commit in: dev-lang/perl/, dev-lang/perl/files/ Fabian Groffen
2021-07-19 21:20 Andreas K. Hüttel
2021-10-28  3:53 Sam James
2023-05-25 21:52 Sam James
2024-09-11 18:54 Sam James
2024-12-07  2:59 Sam James
2025-10-03 20:42 Sam James

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1592658385.80bf6a8420ffc005391f048f093679ac417bf5c5.kentnl@gentoo \
    --to=kentnl@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox