| # Copyright 1999-2018 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| # @ECLASS: preserve-libs.eclass |
| # @MAINTAINER: |
| # base-system@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 |