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 :/