| # Copyright 1999-2017 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| # @ECLASS: prefix.eclass |
| # @MAINTAINER: |
| # Feel free to contact the Prefix team through <prefix@gentoo.org> if |
| # you have problems, suggestions or questions. |
| # @BLURB: Eclass to provide Prefix functionality |
| # @DESCRIPTION: |
| # Gentoo Prefix allows users to install into a self defined offset |
| # located somewhere in the filesystem. Prefix ebuilds require |
| # additional functions and variables which are defined by this eclass. |
| |
| # @ECLASS-VARIABLE: EPREFIX |
| # @DESCRIPTION: |
| # The offset prefix of a Gentoo Prefix installation. When Gentoo Prefix |
| # is not used, ${EPREFIX} should be "". Prefix Portage sets EPREFIX, |
| # hence this eclass has nothing to do here in that case. |
| # Note that setting EPREFIX in the environment with Prefix Portage sets |
| # Portage into cross-prefix mode. |
| if [[ ! ${EPREFIX+set} ]]; then |
| export EPREFIX='' |
| fi |
| |
| |
| # @FUNCTION: eprefixify |
| # @USAGE: <list of to be eprefixified files> |
| # @DESCRIPTION: |
| # replaces @GENTOO_PORTAGE_EPREFIX@ with ${EPREFIX} for the given files, |
| # dies if no arguments are given, a file does not exist, or changing a |
| # file failed. |
| eprefixify() { |
| [[ $# -lt 1 ]] && die "at least one argument required" |
| |
| einfo "Adjusting to prefix ${EPREFIX:-/}" |
| local x |
| for x in "$@" ; do |
| if [[ -e ${x} ]] ; then |
| ebegin " ${x##*/}" |
| sed -i -e "s|@GENTOO_PORTAGE_EPREFIX@|${EPREFIX}|g" "${x}" |
| eend $? || die "failed to eprefixify ${x}" |
| else |
| die "${x} does not exist" |
| fi |
| done |
| |
| return 0 |
| } |
| |
| # @FUNCTION: hprefixify |
| # @USAGE: [ -w <line match> ] [ -e <extended regex> ] [ -q <quotation char> ] <list of files> |
| # @DESCRIPTION: |
| # Tries a set of heuristics to prefixify the given files. Dies if no |
| # arguments are given, a file does not exist, or changing a file failed. |
| # |
| # Additional extended regular expression can be passed by -e or |
| # environment variable PREFIX_EXTRA_REGEX. The default heuristics can |
| # be constrained to lines that match a sed expression passed by -w or |
| # environment variable PREFIX_LINE_MATCH. Quotation characters can be |
| # specified by -q or environment variable PREFIX_QUOTE_CHAR, unless |
| # EPREFIX is empty. |
| # |
| # @EXAMPLE: |
| # Only prefixify the 30th line, |
| # hprefixify -w 30 configure |
| # Only prefixify lines that contain "PATH", |
| # hprefixify -w "/PATH/" configure |
| # Also delete all the /opt/gnu search paths, |
| # hprefixify -e "/\/opt\/gnu/d" configure |
| # Quote the inserted EPREFIX |
| # hprefixify -q '"' etc/profile |
| hprefixify() { |
| use prefix || return 0 |
| |
| local xl=() x |
| while [[ $# -gt 0 ]]; do |
| case $1 in |
| -e) local PREFIX_EXTRA_REGEX="$2" |
| shift |
| ;; |
| -w) local PREFIX_LINE_MATCH="$2" |
| shift |
| ;; |
| -q) local PREFIX_QUOTE_CHAR="${EPREFIX:+$2}" |
| shift |
| ;; |
| *) |
| xl+=( "$1" ) |
| ;; |
| esac |
| shift |
| done |
| local dirs="/(usr|lib(|[onx]?32|n?64)|etc|bin|sbin|var|opt|run)" \ |
| eprefix="${PREFIX_QUOTE_CHAR}${EPREFIX}${PREFIX_QUOTE_CHAR}" |
| |
| [[ ${#xl[@]} -lt 1 ]] && die "at least one file operand is required" |
| einfo "Adjusting to prefix ${EPREFIX:-/}" |
| for x in "${xl[@]}" ; do |
| if [[ -e ${x} ]] ; then |
| ebegin " ${x##*/}" |
| sed -r \ |
| -e "${PREFIX_LINE_MATCH}s,([^[:alnum:]}\)\.])${dirs},\1${eprefix}/\2,g" \ |
| -e "${PREFIX_LINE_MATCH}s,^${dirs},${eprefix}/\1," \ |
| -e "${PREFIX_EXTRA_REGEX}" \ |
| -i "${x}" |
| eend $? || die "failed to prefixify ${x}" |
| else |
| die "${x} does not exist" |
| fi |
| done |
| } |
| |
| # @FUNCTION: prefixify_ro |
| # @USAGE: prefixify_ro <file>. |
| # @DESCRIPTION: |
| # prefixify a read-only file. |
| # copies the files to ${T}, prefixies it, echos the new file. |
| # @EXAMPLE: |
| # doexe "$(prefixify_ro "${FILESDIR}"/fix_libtool_files.sh)" |
| # epatch "$(prefixify_ro "${FILESDIR}"/${PN}-4.0.2-path.patch)" |
| prefixify_ro() { |
| if [[ -e $1 ]] ; then |
| local f=${1##*/} |
| cp "$1" "${T}" || die "failed to copy file" |
| local x="${T}"/${f} |
| # redirect to stderr because stdout is used to |
| # return the prefixified file. |
| if grep -qs @GENTOO_PORTAGE_EPREFIX@ "${x}" ; then |
| eprefixify "${T}"/${f} 1>&2 |
| else |
| hprefixify "${T}"/${f} 1>&2 |
| fi |
| echo "${x}" |
| else |
| die "$1 does not exist" |
| fi |
| } |
| # vim: tw=72: |