-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512
Hi all, before we even start implementing EAPI=6 stuff, Perl support will be reorganized a little bit. TL;DR: No need to do anything. :) Longer version: We're going to split all helper functions out of perl-module.eclass into a new eclass, perl-functions.eclass. * perl-functions will export no phases and keep all global variable meddling to a minimum. If you need perl support in a package that has a non-perl build system, this is what you may want to use in the future to get some helpers. * perl-module.eclass will inherit perl-functions, and all things exported by perl-functions are explicitly also part of the API of perl-module (documented in the eclass), so you dont have to explicitly inherit perl-functions in your ebuild as well. perl-module.eclass is the "ready-made solution for CPAN", exporting all required phases. We are only splitting the code into two parts now, but not really changing anything. So, because of abovementioned inheritance all ebuilds should just keep working as usual. Some changes will come later with the introduction of EAPI=6 support. (Boring) Patch attached for completeness. Cheers, Andreas - -- Andreas K. Huettel Gentoo Linux developer [email protected] http://www.akhuettel.de/ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.1 iQJ8BAEBCgBmBQJWWPSJXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w ZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQ0RkJDMzI0NjNBOTIwMDY5MTQ2NkMzNDBF MTM4NkZEN0VGNEI1Nzc5AAoJEOE4b9fvS1d5WIEQALg9JnpzEZ0bhyRitwVkICsb m6ZWBjdQaOIt+QJh530rhprOWUVtmCepIm4zMhbeKGZ9TdGxK0lE7tDn8dYIjiRM ZeMbnixNM502xspQUHZeEW7qsoBHCNfTQb7QpLHq74/qv7HWtPNqGcEOcwnL+9q+ Vbkt8H6iX3IBlXGbsR3G00uXmnBCAKNuno4GImdV6woEDjGewFnmrTQ0d76lAi9K /wm/oNi6p64ibOU+NIQFvVa6CnXy+Tzmk/djgkJUrnoyJkVogm0l3ygDwjnIWk4T lssw6cLQgjqLLiGpcSeV801z2TC7bWBxuZJm5+pIdBFoFd316zcfGUA/cxrbOOkK vlBnmFLG90hU4JmHHZ+voGUB7ZLl3boLVjRv/2zLGxeWPU72dlyr06zWGhOvDChq QHiRATJ0JLlWhqTfdqClAMaUOB6tEA2LXwXZHPenI9eBalC551ywKzaasVTy6Umv 1t+9puTn4Vi+H4eTYg/IAb6jbY6pQe2uXoFScsA0KkC1OHyiqBNvz6LYeUv8N1tS jbgI2jNvA+XggF2WSfmAnz/u0ND0Vg3tNLj/hmjof7iTAneSUjejwvXemptYx4CQ YRwxE167ZbawtXHT+HVJGbT6mQN9g0sdvD7rekRguW1mpCfluq/WPPF2AO76rA1q mTcqAZDgM+G0wBdf1N+m =nyGO -----END PGP SIGNATURE-----
From 8a697f9fc2040571df94b5403c4892d7a103b204 Mon Sep 17 00:00:00 2001 From: "Andreas K. Huettel (dilfridge)" <[email protected]> Date: Sun, 22 Nov 2015 21:52:23 +0100 Subject: [PATCH] perl-modules.eclass: Separate phases and helpers into two eclasses --- eclass/perl-functions.eclass | 252 +++++++++++++++++++++++++++++++++++++++++++ eclass/perl-module.eclass | 230 +-------------------------------------- 2 files changed, 256 insertions(+), 226 deletions(-) create mode 100644 eclass/perl-functions.eclass diff --git a/eclass/perl-functions.eclass b/eclass/perl-functions.eclass new file mode 100644 index 0000000..7ba47d1 --- /dev/null +++ b/eclass/perl-functions.eclass @@ -0,0 +1,252 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +# @ECLASS: perl-functions.eclass +# @MAINTAINER: +# [email protected] +# @AUTHOR: +# Seemant Kulleen <[email protected]> +# Andreas K. Huettel <[email protected]> +# @BLURB: helper functions eclass for perl modules +# @DESCRIPTION: +# The perl-functions eclass is designed to allow easier installation of perl +# modules, and their incorporation into the Gentoo Linux system. +# It provides helper functions, no phases or variable manipulation in +# global scope. + +[[ ${CATEGORY} == "perl-core" ]] && inherit alternatives + +case "${EAPI:-0}" in + 5) + ;; + *) + die "EAPI=${EAPI} is not supported by perl-functions.eclass" + ;; +esac + +perlinfo_done=false + +# @FUNCTION: perl_set_version +# @USAGE: perl_set_version +# @DESCRIPTION: +# Extract version information and installation paths from the current Perl +# interpreter. +# +# This sets the following variables: PERL_VERSION, SITE_ARCH, SITE_LIB, +# ARCH_LIB, VENDOR_LIB, VENDOR_ARCH +# +# This function used to be called perlinfo as well. +perl_set_version() { + debug-print-function $FUNCNAME "$@" + debug-print "$FUNCNAME: perlinfo_done=${perlinfo_done}" + ${perlinfo_done} && return 0 + perlinfo_done=true + + local f version install{{site,vendor}{arch,lib},archlib} + eval "$(perl -V:{version,install{{site,vendor}{arch,lib},archlib}} )" + PERL_VERSION=${version} + SITE_ARCH=${installsitearch} + SITE_LIB=${installsitelib} + ARCH_LIB=${installarchlib} + VENDOR_LIB=${installvendorlib} + VENDOR_ARCH=${installvendorarch} +} + +# @FUNCTION: perl_delete_localpod +# @USAGE: perl_delete_localpod +# @DESCRIPTION: +# Remove stray perllocal.pod files in the temporary install directory D. +# +# This function used to be called fixlocalpod as well. +perl_delete_localpod() { + debug-print-function $FUNCNAME "$@" + + find "${D}" -type f -name perllocal.pod -delete + find "${D}" -depth -mindepth 1 -type d -empty -delete +} + +# @FUNCTION: perl_fix_osx_extra +# @USAGE: perl_fix_osx_extra +# @DESCRIPTION: +# Look through ${S} for AppleDouble encoded files and get rid of them. +perl_fix_osx_extra() { + debug-print-function $FUNCNAME "$@" + + local f + find "${S}" -type f -name "._*" -print0 | while read -rd '' f ; do + einfo "Removing AppleDouble encoded Macintosh file: ${f#${S}/}" + rm -f "${f}" + f=${f#${S}/} + grep -q "${f}" "${S}"/MANIFEST && \ + elog "AppleDouble encoded Macintosh file in MANIFEST: ${f#${S}/}" + done +} + +# @FUNCTION: perl_delete_module_manpages +# @USAGE: perl_delete_module_manpages +# @DESCRIPTION: +# Bump off manpages installed by the current module such as *.3pm files as well +# as empty directories. +perl_delete_module_manpages() { + debug-print-function $FUNCNAME "$@" + + if [[ -d "${ED}"/usr/share/man ]] ; then + find "${ED}"/usr/share/man -type f -name "*.3pm" -delete + find "${ED}"/usr/share/man -depth -type d -empty -delete + fi +} + +# @FUNCTION: perl_delete_packlist +# @USAGE: perl_delete_packlist +# @DESCRIPTION: +# Look through ${D} for .packlist files, empty .bs files and empty directories, +# and get rid of items found. +perl_delete_packlist() { + debug-print-function $FUNCNAME "$@" + perl_set_version + if [[ -d ${D}/${VENDOR_ARCH} ]] ; then + find "${D}/${VENDOR_ARCH}" -type f -a \( -name .packlist \ + -o \( -name '*.bs' -a -empty \) \) -delete + find "${D}" -depth -mindepth 1 -type d -empty -delete + fi +} + +# @FUNCTION: perl_remove_temppath +# @USAGE: perl_remove_temppath +# @DESCRIPTION: +# Look through ${D} for text files containing the temporary installation +# folder (i.e. ${D}). If the pattern is found (i.e. " text"), replace it with `/'. +perl_remove_temppath() { + debug-print-function $FUNCNAME "$@" + + find "${D}" -type f -not -name '*.so' -print0 | while read -rd '' f ; do + if file "${f}" | grep -q -i " text" ; then + grep -q "${D}" "${f}" && ewarn "QA: File contains a temporary path ${f}" + sed -i -e "s:${D}:/:g" "${f}" + fi + done +} + +# @FUNCTION: perl_rm_files +# @USAGE: perl_rm_files "file_1" "file_2" +# @DESCRIPTION: +# Remove certain files from a Perl release and remove them from the MANIFEST +# while we're there. +# +# Most useful in src_prepare for nuking bad tests, and is highly recommended +# for any tests like 'pod.t', 'pod-coverage.t' or 'kwalitee.t', as what they +# test is completely irrelevant to end users, and frequently fail simply +# because the authors of Test::Pod... changed their recommendations, and thus +# failures are only useful feedback to Authors, not users. +# +# Removing from MANIFEST also avoids needless log messages warning +# users about files "missing from their kit". +perl_rm_files() { + debug-print-function $FUNCNAME "$@" + local skipfile="${T}/.gentoo_makefile_skip" + local manifile="${S}/MANIFEST" + local manitemp="${T}/.gentoo_manifest_temp" + oldifs="$IFS" + IFS="\n" + for filename in "$@"; do + einfo "Removing un-needed ${filename}"; + # Remove the file + rm -f "${S}/${filename}" + [[ -e "${manifile}" ]] && echo "${filename}" >> "${skipfile}" + done + if [[ -e "${manifile}" && -e "${skipfile}" ]]; then + einfo "Fixing Manifest" + grep -v -F -f "${skipfile}" "${manifile}" > "${manitemp}" + mv -f -- "${manitemp}" "${manifile}" + rm -- "${skipfile}"; + fi + IFS="$oldifs" +} + +# @FUNCTION: perl_link_duallife_scripts +# @USAGE: perl_link_duallife_scripts +# @DESCRIPTION: +# Moves files and generates symlinks so dual-life packages installing scripts do not +# lead to file collisions. Mainly for use in pkg_postinst and pkg_postrm, and makes +# only sense for perl-core packages. +perl_link_duallife_scripts() { + debug-print-function $FUNCNAME "$@" + if [[ ${CATEGORY} != perl-core ]] || ! has_version ">=dev-lang/perl-5.8.8-r8" ; then + return 0 + fi + + local i ff + if has "${EBUILD_PHASE:-none}" "postinst" "postrm" ; then + for i in "${DUALLIFESCRIPTS[@]}" ; do + alternatives_auto_makesym "/${i}" "/${i}-[0-9]*" + done + for i in "${DUALLIFEMAN[@]}" ; do + ff=`echo "${EROOT}"/${i%.1}-${PV}-${P}.1*` + ff=${ff##*.1} + alternatives_auto_makesym "/${i}${ff}" "/${i%.1}-[0-9]*" + done + else + pushd "${ED}" > /dev/null + for i in $(find usr/bin -maxdepth 1 -type f 2>/dev/null) ; do + mv ${i}{,-${PV}-${P}} || die + #DUALLIFESCRIPTS[${#DUALLIFESCRIPTS[*]}]=${i##*/} + DUALLIFESCRIPTS[${#DUALLIFESCRIPTS[*]}]=${i} + done + for i in $(find usr/share/man/man1 -maxdepth 1 -type f 2>/dev/null) ; do + mv ${i} ${i%.1}-${PV}-${P}.1 || die + DUALLIFEMAN[${#DUALLIFEMAN[*]}]=${i} + done + popd > /dev/null + fi +} + +# @FUNCTION: perl_check_env +# @USAGE: perl_check_env +# @DESCRIPTION: +# Checks a blacklist of known-suspect ENV values that can be accidentally set by users +# doing personal perl work, which may accidentally leak into portage and break the +# system perl installaton. +# Dies if any of the suspect fields are found, and tell the user what needs to be unset. +# There's a workaround, but you'll have to read the code for it. +perl_check_env() { + local errored value; + + for i in PERL_MM_OPT PERL5LIB PERL5OPT PERL_MB_OPT PERL_CORE PERLPREFIX; do + # Next unless match + [ -v $i ] || continue; + + # Warn only once, and warn only when one of the bad values are set. + # record failure here. + if [ ${errored:-0} == 0 ]; then + if [ -n "${I_KNOW_WHAT_I_AM_DOING}" ]; then + elog "perl-module.eclass: Suspicious environment values found."; + else + eerror "perl-module.eclass: Suspicious environment values found."; + fi + fi + errored=1 + + # Read ENV Value + eval "value=\$$i"; + + # Print ENV name/value pair + if [ -n "${I_KNOW_WHAT_I_AM_DOING}" ]; then + elog " $i=\"$value\""; + else + eerror " $i=\"$value\""; + fi + done + + # Return if there were no failures + [ ${errored:-0} == 0 ] && return; + + # Return if user knows what they're doing + if [ -n "${I_KNOW_WHAT_I_AM_DOING}" ]; then + elog "Continuing anyway, seems you know what you're doing." + return + fi + + eerror "Your environment settings may lead to undefined behavior and/or build failures." + die "Please fix your environment ( ~/.bashrc, package.env, ... ), see above for details." +} diff --git a/eclass/perl-module.eclass b/eclass/perl-module.eclass index 341fa89..5a476d2 100644 --- a/eclass/perl-module.eclass +++ b/eclass/perl-module.eclass @@ -7,13 +7,15 @@ # [email protected] # @AUTHOR: # Seemant Kulleen <[email protected]> +# Andreas K. Huettel <[email protected]> # @BLURB: eclass for perl modules # @DESCRIPTION: # The perl-module eclass is designed to allow easier installation of perl # modules, and their incorporation into the Gentoo Linux system. +# All exported functions from perl-functions.eclass (inherited here) +# explicitly also belong to the interface of perl-module.eclass. -inherit eutils multiprocessing unpacker -[[ ${CATEGORY} == "perl-core" ]] && inherit alternatives +inherit eutils multiprocessing unpacker perl-functions PERL_EXPF="src_unpack src_prepare src_configure src_compile src_test src_install" @@ -321,227 +323,3 @@ perl-module_pkg_postrm() { fi perl_link_duallife_scripts } - -# @FUNCTION: perl_set_version -# @USAGE: perl_set_version -# @DESCRIPTION: -# Extract version information and installation paths from the current Perl -# interpreter. -# -# This sets the following variables: PERL_VERSION, SITE_ARCH, SITE_LIB, -# ARCH_LIB, VENDOR_LIB, VENDOR_ARCH -# -# This function used to be called perlinfo as well. -perl_set_version() { - debug-print-function $FUNCNAME "$@" - debug-print "$FUNCNAME: perlinfo_done=${perlinfo_done}" - ${perlinfo_done} && return 0 - perlinfo_done=true - - local f version install{{site,vendor}{arch,lib},archlib} - eval "$(perl -V:{version,install{{site,vendor}{arch,lib},archlib}} )" - PERL_VERSION=${version} - SITE_ARCH=${installsitearch} - SITE_LIB=${installsitelib} - ARCH_LIB=${installarchlib} - VENDOR_LIB=${installvendorlib} - VENDOR_ARCH=${installvendorarch} -} - -# @FUNCTION: perl_delete_localpod -# @USAGE: perl_delete_localpod -# @DESCRIPTION: -# Remove stray perllocal.pod files in the temporary install directory D. -# -# This function used to be called fixlocalpod as well. -perl_delete_localpod() { - debug-print-function $FUNCNAME "$@" - - find "${D}" -type f -name perllocal.pod -delete - find "${D}" -depth -mindepth 1 -type d -empty -delete -} - -# @FUNCTION: perl_fix_osx_extra -# @USAGE: perl_fix_osx_extra -# @DESCRIPTION: -# Look through ${S} for AppleDouble encoded files and get rid of them. -perl_fix_osx_extra() { - debug-print-function $FUNCNAME "$@" - - local f - find "${S}" -type f -name "._*" -print0 | while read -rd '' f ; do - einfo "Removing AppleDouble encoded Macintosh file: ${f#${S}/}" - rm -f "${f}" - f=${f#${S}/} - grep -q "${f}" "${S}"/MANIFEST && \ - elog "AppleDouble encoded Macintosh file in MANIFEST: ${f#${S}/}" - done -} - -# @FUNCTION: perl_delete_module_manpages -# @USAGE: perl_delete_module_manpages -# @DESCRIPTION: -# Bump off manpages installed by the current module such as *.3pm files as well -# as empty directories. -perl_delete_module_manpages() { - debug-print-function $FUNCNAME "$@" - - if [[ -d "${ED}"/usr/share/man ]] ; then - find "${ED}"/usr/share/man -type f -name "*.3pm" -delete - find "${ED}"/usr/share/man -depth -type d -empty -delete - fi -} - -# @FUNCTION: perl_delete_packlist -# @USAGE: perl_delete_packlist -# @DESCRIPTION: -# Look through ${D} for .packlist files, empty .bs files and empty directories, -# and get rid of items found. -perl_delete_packlist() { - debug-print-function $FUNCNAME "$@" - perl_set_version - if [[ -d ${D}/${VENDOR_ARCH} ]] ; then - find "${D}/${VENDOR_ARCH}" -type f -a \( -name .packlist \ - -o \( -name '*.bs' -a -empty \) \) -delete - find "${D}" -depth -mindepth 1 -type d -empty -delete - fi -} - -# @FUNCTION: perl_remove_temppath -# @USAGE: perl_remove_temppath -# @DESCRIPTION: -# Look through ${D} for text files containing the temporary installation -# folder (i.e. ${D}). If the pattern is found (i.e. " text"), replace it with `/'. -perl_remove_temppath() { - debug-print-function $FUNCNAME "$@" - - find "${D}" -type f -not -name '*.so' -print0 | while read -rd '' f ; do - if file "${f}" | grep -q -i " text" ; then - grep -q "${D}" "${f}" && ewarn "QA: File contains a temporary path ${f}" - sed -i -e "s:${D}:/:g" "${f}" - fi - done -} - -# @FUNCTION: perl_rm_files -# @USAGE: perl_rm_files "file_1" "file_2" -# @DESCRIPTION: -# Remove certain files from a Perl release and remove them from the MANIFEST -# while we're there. -# -# Most useful in src_prepare for nuking bad tests, and is highly recommended -# for any tests like 'pod.t', 'pod-coverage.t' or 'kwalitee.t', as what they -# test is completely irrelevant to end users, and frequently fail simply -# because the authors of Test::Pod... changed their recommendations, and thus -# failures are only useful feedback to Authors, not users. -# -# Removing from MANIFEST also avoids needless log messages warning -# users about files "missing from their kit". -perl_rm_files() { - debug-print-function $FUNCNAME "$@" - local skipfile="${T}/.gentoo_makefile_skip" - local manifile="${S}/MANIFEST" - local manitemp="${T}/.gentoo_manifest_temp" - oldifs="$IFS" - IFS="\n" - for filename in "$@"; do - einfo "Removing un-needed ${filename}"; - # Remove the file - rm -f "${S}/${filename}" - [[ -e "${manifile}" ]] && echo "${filename}" >> "${skipfile}" - done - if [[ -e "${manifile}" && -e "${skipfile}" ]]; then - einfo "Fixing Manifest" - grep -v -F -f "${skipfile}" "${manifile}" > "${manitemp}" - mv -f -- "${manitemp}" "${manifile}" - rm -- "${skipfile}"; - fi - IFS="$oldifs" -} - -# @FUNCTION: perl_link_duallife_scripts -# @USAGE: perl_link_duallife_scripts -# @DESCRIPTION: -# Moves files and generates symlinks so dual-life packages installing scripts do not -# lead to file collisions. Mainly for use in pkg_postinst and pkg_postrm, and makes -# only sense for perl-core packages. -perl_link_duallife_scripts() { - debug-print-function $FUNCNAME "$@" - if [[ ${CATEGORY} != perl-core ]] || ! has_version ">=dev-lang/perl-5.8.8-r8" ; then - return 0 - fi - - local i ff - if has "${EBUILD_PHASE:-none}" "postinst" "postrm" ; then - for i in "${DUALLIFESCRIPTS[@]}" ; do - alternatives_auto_makesym "/${i}" "/${i}-[0-9]*" - done - for i in "${DUALLIFEMAN[@]}" ; do - ff=`echo "${EROOT}"/${i%.1}-${PV}-${P}.1*` - ff=${ff##*.1} - alternatives_auto_makesym "/${i}${ff}" "/${i%.1}-[0-9]*" - done - else - pushd "${ED}" > /dev/null - for i in $(find usr/bin -maxdepth 1 -type f 2>/dev/null) ; do - mv ${i}{,-${PV}-${P}} || die - #DUALLIFESCRIPTS[${#DUALLIFESCRIPTS[*]}]=${i##*/} - DUALLIFESCRIPTS[${#DUALLIFESCRIPTS[*]}]=${i} - done - for i in $(find usr/share/man/man1 -maxdepth 1 -type f 2>/dev/null) ; do - mv ${i} ${i%.1}-${PV}-${P}.1 || die - DUALLIFEMAN[${#DUALLIFEMAN[*]}]=${i} - done - popd > /dev/null - fi -} - -# @FUNCTION: perl_check_env -# @USAGE: perl_check_env -# @DESCRIPTION: -# Checks a blacklist of known-suspect ENV values that can be accidentally set by users -# doing personal perl work, which may accidentally leak into portage and break the -# system perl installaton. -# Dies if any of the suspect fields are found, and tell the user what needs to be unset. -# There's a workaround, but you'll have to read the code for it. -perl_check_env() { - local errored value; - - for i in PERL_MM_OPT PERL5LIB PERL5OPT PERL_MB_OPT PERL_CORE PERLPREFIX; do - # Next unless match - [ -v $i ] || continue; - - # Warn only once, and warn only when one of the bad values are set. - # record failure here. - if [ ${errored:-0} == 0 ]; then - if [ -n "${I_KNOW_WHAT_I_AM_DOING}" ]; then - elog "perl-module.eclass: Suspicious environment values found."; - else - eerror "perl-module.eclass: Suspicious environment values found."; - fi - fi - errored=1 - - # Read ENV Value - eval "value=\$$i"; - - # Print ENV name/value pair - if [ -n "${I_KNOW_WHAT_I_AM_DOING}" ]; then - elog " $i=\"$value\""; - else - eerror " $i=\"$value\""; - fi - done - - # Return if there were no failures - [ ${errored:-0} == 0 ] && return; - - # Return if user knows what they're doing - if [ -n "${I_KNOW_WHAT_I_AM_DOING}" ]; then - elog "Continuing anyway, seems you know what you're doing." - return - fi - - eerror "Your environment settings may lead to undefined behavior and/or build failures." - die "Please fix your environment ( ~/.bashrc, package.env, ... ), see above for details." -} -- 2.6.3
