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

Reply via email to