* [gentoo-dev] New eclasses and USE_EXPAND: postgres{,-multi}.eclass
@ 2017-04-21 19:42 Aaron W. Swenson
2017-04-22 19:38 ` Mart Raudsepp
0 siblings, 1 reply; 4+ messages in thread
From: Aaron W. Swenson @ 2017-04-21 19:42 UTC (permalink / raw
To: gentoo-dev
[-- Attachment #1.1: Type: text/plain, Size: 796 bytes --]
I’ve email previously on this, but the eclasses have been through a bit
of a change since then.
postgres.eclass has some common functions and initializes some variables
that are used in many of the PostgreSQL-related packages.
postgres-multi.eclass makes it possible to install one package (e.g.,
dev-db/postgis) to all dev-db/postgresql slots. This will eliminate one
pain point of migrating PostgreSQL (e.g., from 9.6 to 10).
A lot of the packages in my overlay[1] have been modified to use this
eclass, notably dev-db/postgis and dev-db/pgpool2.
Naturally, I’ll want to add a USE_EXPAND for POSTGRES_TARGETS as the
eclasses use postgres_targets* use flags to control which slots to build
for.
1: https://github.com/titanofold/titanofold-gentoo-x86/tree/pgsql-eclass
[-- Attachment #1.2: postgres-multi.eclass --]
[-- Type: text/plain, Size: 6004 bytes --]
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
inherit multibuild postgres
EXPORT_FUNCTIONS pkg_setup src_prepare src_compile src_install src_test
# @ECLASS: postgres-multi
# @MAINTAINER:
# PostgreSQL <pgsql-bugs@gentoo.org>
# @AUTHOR: Aaron W. Swenson <titanofold@gentoo.org>
# @BLURB: An eclass to build PostgreSQL-related packages against multiple slots
# @DESCRIPTION:
# postgres-multi enables ebuilds, particularly PostgreSQL extensions, to
# build and install for one or more PostgreSQL slots as specified by
# POSTGRES_TARGETS use flags.
case ${EAPI:-0} in
5|6) ;;
*) die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;;
esac
# @ECLASS-VARIABLE: POSTGRES_COMPAT
# @REQUIRED
# @DESCRIPTION:
# A Bash array containing a list of compatible PostgreSQL slots as
# defined by the developer. Must be declared before inheriting this
# eclass. Example: POSTGRES_COMPAT=( 9.4 9.{5,6} )
if ! declare -p POSTGRES_COMPAT &>/dev/null; then
die 'Required variable POSTGRES_COMPAT not declared.'
fi
# @ECLASS-VARIABLE: _POSTGRES_INTERSECT_SLOTS
# @INTERNAL
# @DESCRIPTION:
# A Bash array containing the intersect of POSTGRES_TARGETS and
# POSTGRES_COMPAT.
export _POSTGRES_INTERSECT_SLOTS=( )
# @FUNCTION _postgres-multi_multibuild_wrapper
# @INTERNAL
# @USAGE: _postgres-multi_multibuild_wrapper <command> [<arg> ...]
# @DESCRIPTION:
# For the given variant, set the values of the PG_SLOT, PG_CONFIG, and
# PKG_CONFIG_PATH environment variables accordingly and replace any
# appearance of @PG_SLOT@ in the command and arguments with value of
# ${PG_SLOT}.
_postgres-multi_multibuild_wrapper() {
debug-print-function ${FUNCNAME} "${@}"
export PG_SLOT=${MULTIBUILD_VARIANT}
export PG_CONFIG=$(which pg_config${MULTIBUILD_VARIANT//./})
if [[ -n ${PKG_CONFIG_PATH} ]] ; then
PKG_CONFIG_PATH="$(${PG_CONFIG} --libdir)/pkgconfig:${PKG_CONFIG_PATH}"
else
PKG_CONFIG_PATH="$(${PG_CONFIG} --libdir)/pkgconfig"
fi
export PKG_CONFIG_PATH
$(echo "${@}" | sed "s/@PG_SLOT@/${PG_SLOT}/g")
}
# @FUNCTION: postgres-multi_foreach
# @USAGE: postgres-multi_foreach <command> <arg> [<arg> ...]
# @DESCRIPTION:
# Run the given command in the package's build directory for each
# PostgreSQL slot in the intersect of POSTGRES_TARGETS and
# POSTGRES_COMPAT and user-enabled slots. The PG_CONFIG and
# PKG_CONFIG_PATH environment variables are updated on each iteration to
# point to the matching pg_config command and pkg-config metadata files,
# respectively, for the current slot. Any appearance of @PG_SLOT@ in the
# command or arguments will be substituted with the slot (e.g., 9.5) of
# the current iteration.
postgres-multi_foreach() {
local MULTIBUILD_VARIANTS=("${_POSTGRES_INTERSECT_SLOTS[@]}")
multibuild_foreach_variant \
_postgres-multi_multibuild_wrapper run_in_build_dir ${@}
}
# @FUNCTION: postgres-multi_forbest
# @USAGE: postgres-multi_forbest <command> <arg> [<arg> ...]
# @DESCRIPTION:
# Run the given command in the package's build directory for the highest
# slot in the intersect of POSTGRES_COMPAT and POSTGRES_TARGETS. The
# PG_CONFIG and PKG_CONFIG_PATH environment variables are set to the
# matching pg_config command and pkg-config metadata files,
# respectively. Any appearance of @PG_SLOT@ in the command or arguments
# will be substituted with the matching slot (e.g., 9.5).
postgres-multi_forbest() {
# POSTGRES_COMPAT is reverse sorted once in postgres.eclass so
# element 0 has the highest slot version.
local MULTIBUILD_VARIANTS=("${_POSTGRES_INTERSECT_SLOTS[0]}")
multibuild_foreach_variant \
_postgres-multi_multibuild_wrapper run_in_build_dir ${@}
}
# @FUNCTION: postgres-multi_pkg_setup
# @REQUIRED
# @USAGE: postgres-multi_pkg_setup
# @DESCRIPTION:
# Initialize internal environment variable(s). This is required if
# pkg_setup() is declared in the ebuild.
postgres-multi_pkg_setup() {
local user_slot
for user_slot in "${POSTGRES_COMPAT[@]}"; do
use "postgres_targets_postgres${user_slot/\./_}" && \
_POSTGRES_INTERSECT_SLOTS+=( "${user_slot}" )
done
if [[ "${#_POSTGRES_INTERSECT_SLOTS[@]}" -eq "0" ]]; then
die "One of the postgres_targets_postgresSL_OT use flags must be enabled"
fi
einfo "Multibuild variants: ${_POSTGRES_INTERSECT_SLOTS[@]}"
}
# @FUNCTION: postgres-multi_src_prepare
# @REQUIRED
# @USAGE: postgres-multi_src_prepare
# @DESCRIPTION:
# Calls eapply_user then copies ${S} into a build directory for each
# intersect of POSTGRES_TARGETS and POSTGRES_COMPAT.
postgres-multi_src_prepare() {
if [[ "${#_POSTGRES_INTERSECT_SLOTS[@]}" -eq "0" ]]; then
eerror "Internal array _POSTGRES_INTERSECT_SLOTS is empty."
die "Did you forget to call postgres-multi_pkg_setup?"
fi
# Check that the slot has been emerged (Should be prevented by
# Portage, but won't be caught by /usr/bin/ebuild)
local slot
for slot in ${_POSTGRES_INTERSECT_SLOTS[@]} ; do
if [[ -z $(which pg_config${slot/.} 2> /dev/null) ]] ; then
eerror
eerror "postgres_targets_postgres${slot/.} use flag is enabled, but hasn't been emerged."
eerror
die "a postgres_targets use flag is enabled, but not emerged"
fi
done
case ${EAPI:-0} in
0|1|2|3|4|5) epatch_user ;;
6) eapply_user ;;
esac
local MULTIBUILD_VARIANT
local MULTIBUILD_VARIANTS=("${_POSTGRES_INTERSECT_SLOTS[@]}")
multibuild_copy_sources
}
# @FUNCTION: postgres-multi_src_compile
# @USAGE: postgres-multi_src_compile
# @DESCRIPTION:
# Runs `emake' in each build directory
postgres-multi_src_compile() {
postgres-multi_foreach emake
}
# @FUNCTION: postgres-multi_src_install
# @USAGE: postgres-multi_src_install
# @DESCRIPTION:
# Runs `emake install DESTDIR="${D}"' in each build directory.
postgres-multi_src_install() {
postgres-multi_foreach emake install DESTDIR="${D}"
}
# @FUNCTION: postgres-multi_src_test
# @USAGE: postgres-multi_src_test
# @DESCRIPTION:
# Runs `emake installcheck' in each build directory.
postgres-multi_src_test() {
postgres-multi_foreach emake installcheck
}
[-- Attachment #1.3: postgres.eclass --]
[-- Type: text/plain, Size: 5071 bytes --]
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
inherit user
EXPORT_FUNCTIONS pkg_setup
# @ECLASS: postgres
# @MAINTAINER:
# PostgreSQL <pgsql-bugs@gentoo.org>
# @AUTHOR: Aaron W. Swenson <titanofold@gentoo.org>
# @BLURB: An eclass for PostgreSQL-related packages
# @DESCRIPTION:
# This eclass provides common utility functions that many
# PostgreSQL-related packages perform, such as checking that the
# currently selected PostgreSQL slot is within a range, adding a system
# user to the postgres system group, and generating dependencies.
case ${EAPI:-0} in
5|6) ;;
*) die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;;
esac
# @ECLASS-VARIABLE: POSTGRES_COMPAT
# @DESCRIPTION:
# A Bash array containing a list of compatible PostgreSQL slots as
# defined by the developer. If declared, must be declared before
# inheriting this eclass. Example: POSTGRES_COMPAT=( 9.4 9.{5,6} )
# @ECLASS-VARIABLE: POSTGRES_USEDEP
# @DESCRIPTION:
# Add the 2-Style and/or 4-Style use dependencies without brackets to be used
# for POSTGRES_DEP. If declared, must be done before inheriting this eclass.
# @ECLASS-VARIABLE: POSTGRES_DEP
# @DESCRIPTION:
# An automatically generated dependency string suitable for use in
# DEPEND and RDEPEND declarations.
# @ECLASS-VARIABLE: POSTGRES_REQ_USE
# @DESCRIPTION:
# An automatically generated REQUIRED_USE-compatible string built upon
# POSTGRES_COMPAT. REQUIRED_USE="... ${POSTGRES_REQ_USE}" is only
# required if the package must build against one of the PostgreSQL slots
# declared in POSTGRES_COMPAT.
if declare -p POSTGRES_COMPAT &> /dev/null ; then
# Reverse sort the given POSTGRES_COMPAT so that the most recent
# slot is preferred over an older slot.
# -- do we care if dependencies are deterministic by USE flags?
readarray -t POSTGRES_COMPAT < <(printf '%s\n' "${POSTGRES_COMPAT[@]}" | sort -nr)
POSTGRES_DEP=""
POSTGRES_REQ_USE=" || ("
for slot in "${POSTGRES_COMPAT[@]}" ; do
POSTGRES_DEP+=" postgres_targets_postgres${slot/\./_}? ( dev-db/postgresql:${slot}="
declare -p POSTGRES_USEDEP &>/dev/null && \
POSTGRES_DEP+="[${POSTGRES_USEDEP}]"
POSTGRES_DEP+=" )"
IUSE+=" postgres_targets_postgres${slot/\./_}"
POSTGRES_REQ_USE+=" postgres_targets_postgres${slot/\./_}"
done
POSTGRES_REQ_USE+=" )"
else
POSTGRES_DEP="dev-db/postgresql:="
declare -p POSTGRES_USEDEP &>/dev/null && \
POSTGRES_DEP+="[${POSTGRES_USEDEP}]"
fi
# @FUNCTION: postgres_check_slot
# @DESCRIPTION:
# Verify that the currently selected PostgreSQL slot is set to one of
# the slots defined in POSTGRES_COMPAT. Automatically dies unless a
# POSTGRES_COMPAT slot is selected. Should be called in pkg_pretend().
postgres_check_slot() {
if ! declare -p POSTGRES_COMPAT &>/dev/null; then
die 'POSTGRES_COMPAT not declared.'
fi
# Don't die because we can't run postgresql-config during pretend.
[[ "$EBUILD_PHASE" = "pretend" && -z "$(which postgresql-config 2> /dev/null)" ]] \
&& return 0
if has $(postgresql-config show 2> /dev/null) "${POSTGRES_COMPAT[@]}"; then
return 0
else
eerror "PostgreSQL slot must be set to one of: "
eerror " ${POSTGRES_COMPAT[@]}"
die "Incompatible PostgreSQL slot eselected"
fi
}
# @FUNCTION: postgres_new_user
# @DESCRIPTION:
# Creates the "postgres" system group and user -- which is separate from
# the database user -- in addition to the developer defined user. Takes
# the same arguments as "enewuser".
postgres_new_user() {
enewgroup postgres 70
enewuser postgres 70 /bin/bash /var/lib/postgresql postgres
if [[ $# -gt 0 ]] ; then
if [[ "$1" = "postgres" ]] ; then
ewarn "Username 'postgres' implied, skipping"
else
local groups=$5
[[ -n "${groups}" ]] && groups+=",postgres" || groups="postgres"
enewuser "$1" "${2:--1}" "${3:--1}" "${4:--1}" "${groups}"
fi
fi
}
# @FUNCTION: postgres_pkg_setup
# @REQUIRED
# @USAGE: postgres_pkg_setup
# @DESCRIPTION:
# Initialize environment variable(s) according to the best
# installed version of PostgreSQL that is also in POSTGRES_COMPAT. This
# is required if pkg_setup() is declared in the ebuild.
# Exports PG_SLOT, PG_CONFIG, and PKG_CONFIG_PATH.
postgres_pkg_setup() {
debug-print-function ${FUNCNAME} "${@}"
local compat_slot
local best_slot
for compat_slot in "${POSTGRES_COMPAT[@]}"; do
if use "postgres_targets_postgres${compat_slot/\./_}"; then
best_slot="${compat_slot}"
break
fi
done
if [[ -z "${best_slot}" ]]; then
local flags f
for f in "${POSTGRES_COMPAT[@]}"; do
flags+=" postgres${f/./_}"
done
eerror "POSTGRES_TARGETS must contain at least one of:"
eerror " ${flags}"
die "No suitable POSTGRES_TARGETS enabled."
fi
export PG_SLOT=${best_slot}
export PG_CONFIG=$(which pg_config${best_slot//./})
local pg_pkg_config_path="$(${PG_CONFIG} --libdir)/pkgconfig"
if [[ -n "${PKG_CONFIG_PATH}" ]]; then
export PKG_CONFIG_PATH="${pg_pkg_config_path}:${PKG_CONFIG_PATH}"
else
export PKG_CONFIG_PATH="${pg_pkg_config_path}"
fi
elog "PostgreSQL Target: ${best_slot}"
}
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 343 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [gentoo-dev] New eclasses and USE_EXPAND: postgres{,-multi}.eclass
2017-04-21 19:42 [gentoo-dev] New eclasses and USE_EXPAND: postgres{,-multi}.eclass Aaron W. Swenson
@ 2017-04-22 19:38 ` Mart Raudsepp
2017-04-22 20:31 ` Aaron W. Swenson
2017-04-22 21:11 ` Michał Górny
0 siblings, 2 replies; 4+ messages in thread
From: Mart Raudsepp @ 2017-04-22 19:38 UTC (permalink / raw
To: gentoo-dev
I do not believe that DESCRIPTION should have a dot in the end, because
that takes away from this precious nonsensical 80 characters limit,
making it 79 instead. On that note, I believe the limit should be
raised to at least 100 characters.
Oh wait, weren't you going to title this about period mark at the end
of DESCRIPTION...?
Mart
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [gentoo-dev] New eclasses and USE_EXPAND: postgres{,-multi}.eclass
2017-04-22 19:38 ` Mart Raudsepp
@ 2017-04-22 20:31 ` Aaron W. Swenson
2017-04-22 21:11 ` Michał Górny
1 sibling, 0 replies; 4+ messages in thread
From: Aaron W. Swenson @ 2017-04-22 20:31 UTC (permalink / raw
To: gentoo-dev
[-- Attachment #1: Type: text/plain, Size: 523 bytes --]
On 2017-04-22 22:38, Mart Raudsepp wrote:
> I do not believe that DESCRIPTION should have a dot in the end, because
> that takes away from this precious nonsensical 80 characters limit,
> making it 79 instead. On that note, I believe the limit should be
> raised to at least 100 characters.
>
> Oh wait, weren't you going to title this about period mark at the end
> of DESCRIPTION...?
>
>
> Mart
>
I was, but I was afraid I might be tarred and feathered.
And, I’m not cool enough to rock feathers.
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 343 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [gentoo-dev] New eclasses and USE_EXPAND: postgres{,-multi}.eclass
2017-04-22 19:38 ` Mart Raudsepp
2017-04-22 20:31 ` Aaron W. Swenson
@ 2017-04-22 21:11 ` Michał Górny
1 sibling, 0 replies; 4+ messages in thread
From: Michał Górny @ 2017-04-22 21:11 UTC (permalink / raw
To: gentoo-dev
[-- Attachment #1: Type: text/plain, Size: 617 bytes --]
On sob, 2017-04-22 at 22:38 +0300, Mart Raudsepp wrote:
> I do not believe that DESCRIPTION should have a dot in the end, because
> that takes away from this precious nonsensical 80 characters limit,
> making it 79 instead. On that note, I believe the limit should be
> raised to at least 100 characters.
>
> Oh wait, weren't you going to title this about period mark at the end
> of DESCRIPTION...?
Proper sentences end (those with a subject noun and a verb) with a full
stop. The other thingies (sorry, don't know the English name for it) do
not. Simple as that.
--
Best regards,
Michał Górny
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 963 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-04-22 21:12 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-04-21 19:42 [gentoo-dev] New eclasses and USE_EXPAND: postgres{,-multi}.eclass Aaron W. Swenson
2017-04-22 19:38 ` Mart Raudsepp
2017-04-22 20:31 ` Aaron W. Swenson
2017-04-22 21:11 ` Michał Górny
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox