diff options
Diffstat (limited to 'postgres.eclass')
-rw-r--r-- | postgres.eclass | 177 |
1 files changed, 139 insertions, 38 deletions
diff --git a/postgres.eclass b/postgres.eclass index 77851c1..13483a9 100644 --- a/postgres.eclass +++ b/postgres.eclass @@ -1,58 +1,159 @@ -# Copyright 1999-2013 Gentoo Foundation +# Copyright 1999-2017 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: $ + +inherit user +EXPORT_FUNCTIONS pkg_setup # @ECLASS: postgres.eclass # @MAINTAINER: -# Aaron W. Swenson <titanofold@gentoo.org> -# @BLURB: Functions to aid PostgreSQL-related packages +# PostgreSQL <pgsql-bugs@gentoo.org> +# @AUTHOR: Aaron W. Swenson <titanofold@gentoo.org> +# @BLURB: An eclass for PostgreSQL-related packages # @DESCRIPTION: -# The postgres eclass is a suite that enable ebuilds to build against -# multiple slots, properly add a new daemon user, and query -# PostgreSQL-related information from the system. +# 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 -inherit user -# @FUNCTION: postgres_depend -# @USAGE: postgres_depend [USE,flags] [server] [server,USE,flags] +# @ECLASS-VARIABLE: POSTGRES_COMPAT +# @DEFAULT_UNSET # @DESCRIPTION: -# Called after DEPEND is declared. Takes up to two optional arguments. The 'server' -postgres_depend() { - if [[ -n ${POSTGRES_ONLY} ]] ; then - DEPEND+=" dev-db/postgresql-base:${POSTGRES_ONLY}[${BASE_FLAGS}]" - elif [[ -n ${POSTGRES_MIN} ]] - if [[ -n ${POSTGRES_MAX} ]] ; then +# 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} ) - else - #blarg - fi - elif [[ -n ${POSGRES_MAX} ]] ; then - #blah +# @ECLASS-VARIABLE: POSTGRES_USEDEP +# @DEFAULT_UNSET +# @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 - [[POSTGRES_MAX]] - [[POSTGRES_MIN]] - [[POSTGRES_ONLY]] + eerror "PostgreSQL slot must be set to one of: " + eerror " ${POSTGRES_COMPAT[@]}" + die "Incompatible PostgreSQL slot eselected" fi } -length=$(expr length ${POSTGRES_MAX}) - -pgsql_pkg_setup() { +# @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: pgsql_enewuser -# @USAGE: <user> [uid] [shell] [homedir] +# @FUNCTION: postgres_pkg_setup +# @USAGE: postgres_pkg_setup # @DESCRIPTION: -# Same as enewuser, in fact it uses enewuser, you are not required to -# understand how to properly add a user to the system. The only required -# parameter is the username. Default uid is (pass -1 for this) next -# available, default shell is /bin/false, default homedir is /dev/null, -# and is assigned to the postgres group. -pgsql_new_user() { - local user=$1 uid=$2 shell=$3 home=$4 +# 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 - pgsql_pkg_setup - enewuser $1 $2 $3 $4 postgres + elog "PostgreSQL Target: ${best_slot}" } |