commit: b0c939c07feb8d0158925dce14735a5c8439d7e4 Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Fri Dec 2 19:10:34 2022 +0000 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org> CommitDate: Mon Dec 5 19:13:19 2022 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=b0c939c0
app-alternatives.eclass: New eclass to streamline app-alternatives/* Signed-off-by: Michał Górny <mgorny <AT> gentoo.org> eclass/app-alternatives.eclass | 84 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) 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 <mgo...@gentoo.org> +# @AUTHOR: +# Michał Górny <mgo...@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