On Thu, 2018-01-04 at 10:43 +0000, M. J. Everitt wrote: > On 04/01/18 10:23, Pacho Ramos wrote: > > 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 :/ > > > > Bear in mind several of these packages are in base-system and are > stuck > around the EAPI3/4 mark and may not be using some of the new EAPI > 'features' yet ... > > Best not kill them off just yet or there'll be no stages to install > from > .. and releng have only just got the catalyst-3 transition working, > with > 17.0 profiles to come next .. > > :] >
Never mind that this has 0 to do with EAPI3/4 or with newer EAPI 'features' and is all about the fact that FEATURES=preserve-libs is only implemented in Portage, without comparable functionality in paludis or pkgcore. When you don't know why the function exists, prefer not to give advice on how to proceed.