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 <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 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.
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 <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 prints the determines
+# the selected alternative and prints its respective flag name.
+
+case ${EAPI} in
+ 8) ;;
+ *) die "${ECLASS}: EAPI ${EAPI} 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 [[ $(declare -p ALTERNATIVES) != "declare -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 alterantive (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
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 475 |
Nodes: | 16 (2 / 14) |
Uptime: | 16:34:27 |
Calls: | 9,487 |
Calls today: | 6 |
Files: | 13,615 |
Messages: | 6,121,086 |