diff options
Diffstat (limited to 'eclass')
-rw-r--r-- | eclass/Manifest.gz | bin | 37512 -> 37679 bytes | |||
-rw-r--r-- | eclass/app-alternatives.eclass | 84 |
2 files changed, 84 insertions, 0 deletions
diff --git a/eclass/Manifest.gz b/eclass/Manifest.gz Binary files differindex 6b7db0d6e46e..7a15e5a976b7 100644 --- a/eclass/Manifest.gz +++ b/eclass/Manifest.gz diff --git a/eclass/app-alternatives.eclass b/eclass/app-alternatives.eclass new file mode 100644 index 000000000000..c6924bfc6d2a --- /dev/null +++ b/eclass/app-alternatives.eclass @@ -0,0 +1,84 @@ +# Copyright 2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: app-alternatives.eclass +# @MAINTAINER: +# Michał Górny <mgorny@gentoo.org> +# @AUTHOR: +# Michał Górny <mgorny@gentoo.org> +# @SUPPORTED_EAPIS: 8 +# @BLURB: Common logic for app-alternatives/* +# @DESCRIPTION: +# This eclass provides common logic shared by app-alternatives/* +# ebuilds. A global ALTERNATIVES variable needs to be declared +# that lists available options and their respective dependencies. +# HOMEPAGE, S, LICENSE, SLOT, IUSE, REQUIRED_USE and RDEPEND are set. +# A get_alternative() function is provided that determines the selected +# alternative and prints its respective flag name. + +case ${EAPI} in + 8) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} unsupported." +esac + +if [[ ! ${_APP_ALTERNATIVES_ECLASS} ]]; then +_APP_ALTERNATIVES_ECLASS=1 + +# @ECLASS_VARIABLE: ALTERNATIVES +# @PRE_INHERIT +# @REQUIRED +# @DESCRIPTION: +# Array of "flag:dependency" pairs specifying the available +# alternatives. The default provider must be listed first. + +# @FUNCTION: _app-alternatives_set_globals +# @INTERNAL +# @DESCRIPTION: +# Set ebuild metadata variables. +_app-alternatives_set_globals() { + debug-print-function ${FUNCNAME} "${@}" + + if [[ ${ALTERNATIVES@a} != *a* ]]; then + die 'ALTERNATIVES must be an array.' + elif [[ ${#ALTERNATIVES[@]} -eq 0 ]]; then + die 'ALTERNATIVES must not be empty.' + fi + + HOMEPAGE="https://wiki.gentoo.org/wiki/Project:Base/Alternatives" + S=${WORKDIR} + + LICENSE="CC0-1.0" + SLOT="0" + + # yep, that's a cheap hack adding '+' to the first flag + IUSE="+${ALTERNATIVES[*]%%:*}" + REQUIRED_USE="^^ ( ${ALTERNATIVES[*]%%:*} )" + RDEPEND="" + + local flag dep + for flag in "${ALTERNATIVES[@]}"; do + [[ ${flag} != *:* ]] && die "Invalid ALTERNATIVES item: ${flag}" + dep=${flag#*:} + flag=${flag%%:*} + RDEPEND+=" + ${flag}? ( ${dep} ) + " + done +} +_app-alternatives_set_globals + +# @FUNCTION: get_alternative +# @DESCRIPTION: +# Get the flag name for the selected alternative (i.e. the USE flag set). +get_alternative() { + debug-print-function ${FUNCNAME} "${@}" + + local flag + for flag in "${ALTERNATIVES[@]%%:*}"; do + usev "${flag}" && return + done + + die "No selected alternative found (REQUIRED_USE ignored?!)" +} + +fi |