>>>>> On Sat, 03 Dec 2022, Michał Górny wrote: > --- /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 prints the determines
Grammar? > +# the selected alternative and prints its respective flag name. > + > +case ${EAPI} in > + 8) ;; > + *) die "${ECLASS}: EAPI ${EAPI} unsupported." ${EAPI:-0} here? > +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 [[ $(declare -p ALTERNATIVES) != "declare -a"* ]]; then The more modern (and presumably, more reliable) check would be: if [[ ${ALTERNATIVES@a} != *a* ]]; then Since the eclass supports EAPI 8 only, bash-5.0 is guaranteed, so the feature will be available. > + 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} ) > + " Why two newlines? A single space should be enough. > + done > +} > +_app-alternatives_set_globals > + > +# @FUNCTION: get_alternative > +# @DESCRIPTION: > +# Get the flag name for the selected alterantive (i.e. the USE flag set). Typo. > +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