El mié, 03-01-2018 a las 17:13 +0100, Ulrich Müller escribió:
> Split off functions preserve_old_lib and preserve_old_lib_notify from
> eutils.eclass into a dedicated preserve-libs.eclass. These functions
> are rarely used and are independent of the rest of eutils, therefore
> moving them into their own eclass will help clarifying eclass
> inheritance in ebuilds.
> 
> For backwards compatibility, eutils inherits the new eclass in
> existing EAPIs.
> ---
>  eclass/eutils.eclass        | 65 ++-------------------------------------
>  eclass/preserve-libs.eclass | 74
> +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 76 insertions(+), 63 deletions(-)
>  create mode 100644 eclass/preserve-libs.eclass
> 
> diff --git a/eclass/eutils.eclass b/eclass/eutils.eclass
> index 7d4193e76b51..91d329e99c9e 100644
> --- a/eclass/eutils.eclass
> +++ b/eclass/eutils.eclass
> @@ -1,4 +1,4 @@
> -# Copyright 1999-2017 Gentoo Foundation
> +# Copyright 1999-2018 Gentoo Foundation
>  # Distributed under the terms of the GNU General Public License v2
>  
>  # @ECLASS: eutils.eclass
> @@ -20,7 +20,7 @@ _EUTILS_ECLASS=1
>  # implicitly inherited (now split) eclasses
>  case ${EAPI:-0} in
>  0|1|2|3|4|5|6)
> -     inherit desktop epatch estack ltprune multilib toolchain-funcs
> +     inherit desktop epatch estack ltprune multilib preserve-libs
> toolchain-funcs
>       ;;
>  esac
>  
> @@ -172,67 +172,6 @@ _eutils_eprefix_init() {
>       has "${EAPI:-0}" 0 1 2 && : ${ED:=${D}} ${EPREFIX:=}
> ${EROOT:=${ROOT}}
>  }
>  
> -# @FUNCTION: preserve_old_lib
> -# @USAGE: <libs to preserve> [more libs]
> -# @DESCRIPTION:
> -# These functions are useful when a lib in your package changes ABI SONAME.
> -# An example might be from libogg.so.0 to libogg.so.1.  Removing libogg.so.0
> -# would break packages that link against it.  Most people get around this
> -# by using the portage SLOT mechanism, but that is not always a relevant
> -# solution, so instead you can call this from pkg_preinst.  See also the
> -# preserve_old_lib_notify function.
> -preserve_old_lib() {
> -     _eutils_eprefix_init
> -     if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
> -             eerror "preserve_old_lib() must be called from pkg_preinst()
> only"
> -             die "Invalid preserve_old_lib() usage"
> -     fi
> -     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve>
> [more libraries to preserve]"
> -
> -     # let portage worry about it
> -     has preserve-libs ${FEATURES} && return 0
> -
> -     local lib dir
> -     for lib in "$@" ; do
> -             [[ -e ${EROOT}/${lib} ]] || continue
> -             dir=${lib%/*}
> -             dodir ${dir} || die "dodir ${dir} failed"
> -             cp "${EROOT}"/${lib} "${ED}"/${lib} || die "cp ${lib} failed"
> -             touch "${ED}"/${lib}
> -     done
> -}
> -
> -# @FUNCTION: preserve_old_lib_notify
> -# @USAGE: <libs to notify> [more libs]
> -# @DESCRIPTION:
> -# Spit helpful messages about the libraries preserved by preserve_old_lib.
> -preserve_old_lib_notify() {
> -     if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
> -             eerror "preserve_old_lib_notify() must be called from
> pkg_postinst() only"
> -             die "Invalid preserve_old_lib_notify() usage"
> -     fi
> -
> -     # let portage worry about it
> -     has preserve-libs ${FEATURES} && return 0
> -
> -     _eutils_eprefix_init
> -
> -     local lib notice=0
> -     for lib in "$@" ; do
> -             [[ -e ${EROOT}/${lib} ]] || continue
> -             if [[ ${notice} -eq 0 ]] ; then
> -                     notice=1
> -                     ewarn "Old versions of installed libraries were
> detected on your system."
> -                     ewarn "In order to avoid breaking packages that
> depend on these old libs,"
> -                     ewarn "the libraries are not being removed.  You need
> to run revdep-rebuild"
> -                     ewarn "in order to remove these old dependencies.  If
> you do not have this"
> -                     ewarn "helper program, simply emerge the 'gentoolkit'
> package."
> -                     ewarn
> -             fi
> -             ewarn "  # revdep-rebuild --library '${lib}' && rm '${lib}'"
> -     done
> -}
> -
>  # @FUNCTION: built_with_use
>  # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE
> flags>
>  # @DESCRIPTION:
> diff --git a/eclass/preserve-libs.eclass b/eclass/preserve-libs.eclass
> new file mode 100644
> index 000000000000..548c6411fcf0
> --- /dev/null
> +++ b/eclass/preserve-libs.eclass
> @@ -0,0 +1,74 @@
> +# Copyright 1999-2018 Gentoo Foundation
> +# Distributed under the terms of the GNU General Public License v2
> +
> +# @ECLASS: preserve-libs.eclass
> +# @MAINTAINER:
> +# base-sys...@gentoo.org
> +# @BLURB: preserve libraries after SONAME changes
> +
> +if [[ -z ${_PRESERVE_LIBS_ECLASS} ]]; then
> +_PRESERVE_LIBS_ECLASS=1
> +
> +# @FUNCTION: preserve_old_lib
> +# @USAGE: <libs to preserve> [more libs]
> +# @DESCRIPTION:
> +# These functions are useful when a lib in your package changes ABI SONAME.
> +# An example might be from libogg.so.0 to libogg.so.1.  Removing libogg.so.0
> +# would break packages that link against it.  Most people get around this
> +# by using the portage SLOT mechanism, but that is not always a relevant
> +# solution, so instead you can call this from pkg_preinst.  See also the
> +# preserve_old_lib_notify function.
> +preserve_old_lib() {
> +     if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
> +             eerror "preserve_old_lib() must be called from pkg_preinst()
> only"
> +             die "Invalid preserve_old_lib() usage"
> +     fi
> +     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve>
> [more libraries to preserve]"
> +
> +     # let portage worry about it
> +     has preserve-libs ${FEATURES} && return 0
> +
> +     has "${EAPI:-0}" 0 1 2 && local ED=${D} EROOT=${ROOT}
> +
> +     local lib dir
> +     for lib in "$@" ; do
> +             [[ -e ${EROOT}/${lib} ]] || continue
> +             dir=${lib%/*}
> +             dodir ${dir} || die "dodir ${dir} failed"
> +             cp "${EROOT}"/${lib} "${ED}"/${lib} || die "cp ${lib} failed"
> +             touch "${ED}"/${lib}
> +     done
> +}
> +
> +# @FUNCTION: preserve_old_lib_notify
> +# @USAGE: <libs to notify> [more libs]
> +# @DESCRIPTION:
> +# Spit helpful messages about the libraries preserved by preserve_old_lib.
> +preserve_old_lib_notify() {
> +     if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
> +             eerror "preserve_old_lib_notify() must be called from
> pkg_postinst() only"
> +             die "Invalid preserve_old_lib_notify() usage"
> +     fi
> +
> +     # let portage worry about it
> +     has preserve-libs ${FEATURES} && return 0
> +
> +     has "${EAPI:-0}" 0 1 2 && local EROOT=${ROOT}
> +
> +     local lib notice=0
> +     for lib in "$@" ; do
> +             [[ -e ${EROOT}/${lib} ]] || continue
> +             if [[ ${notice} -eq 0 ]] ; then
> +                     notice=1
> +                     ewarn "Old versions of installed libraries were
> detected on your system."
> +                     ewarn "In order to avoid breaking packages that
> depend on these old libs,"
> +                     ewarn "the libraries are not being removed.  You need
> to run revdep-rebuild"
> +                     ewarn "in order to remove these old dependencies.  If
> you do not have this"
> +                     ewarn "helper program, simply emerge the 'gentoolkit'
> package."
> +                     ewarn
> +             fi
> +             ewarn "  # revdep-rebuild --library '${lib}' && rm '${lib}'"
> +     done
> +}
> +
> +fi

I have seen this is only used by:
app-arch/xz-utils
dev-libs/gmp
dev-libs/libpcre
dev-libs/mpc
dev-libs/mpfr
net-nds/openldap
sys-libs/gdbm
sys-libs/ncurses
sys-libs/readline
sys-process/audit

Maybe we could deprecate it and try to drop it in the future :/

Reply via email to