Skip to content

Commit

Permalink
Initial commit postgres{,-multi}.eclass
Browse files Browse the repository at this point in the history
postgres.eclass provides convenience functions that are commonly
performed in most packages that require PostgreSQL.

postgres-multi.eclass enables packages to build against all selected
PostgreSQL slots.

Added POSTGRES_TARGETS as a new USE_EXPAND variable to select which
slots are depended upon and built against.
  • Loading branch information
titanofold committed Jul 10, 2017
1 parent 59a1d9f commit 9d03d59
Show file tree
Hide file tree
Showing 5 changed files with 355 additions and 2 deletions.
178 changes: 178 additions & 0 deletions eclass/postgres-multi.eclass
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# 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 <[email protected]>
# @AUTHOR: Aaron W. Swenson <[email protected]>
# @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
}
159 changes: 159 additions & 0 deletions eclass/postgres.eclass
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# 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 <[email protected]>
# @AUTHOR: Aaron W. Swenson <[email protected]>
# @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}"
}
6 changes: 5 additions & 1 deletion profiles/base/make.defaults
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ USE_EXPAND_VALUES_USERLAND="BSD GNU"

# Env vars to expand into USE vars. Modifying this requires prior
# discussion on [email protected].
USE_EXPAND="ABI_MIPS ABI_PPC ABI_S390 ABI_X86 ALSA_CARDS APACHE2_MODULES APACHE2_MPMS CALLIGRA_FEATURES CALLIGRA_EXPERIMENTAL_FEATURES CAMERAS COLLECTD_PLUGINS CPU_FLAGS_ARM CPU_FLAGS_X86 CROSSCOMPILE_OPTS CURL_SSL ELIBC ENLIGHTENMENT_MODULES FFTOOLS GPSD_PROTOCOLS GRUB_PLATFORMS INPUT_DEVICES KERNEL L10N LCD_DEVICES LIBREOFFICE_EXTENSIONS LINGUAS LIRC_DEVICES LLVM_TARGETS MONKEYD_PLUGINS NETBEANS_MODULES NGINX_MODULES_HTTP NGINX_MODULES_MAIL NGINX_MODULES_STREAM OFED_DRIVERS OFFICE_IMPLEMENTATION OPENMPI_FABRICS OPENMPI_OFED_FEATURES OPENMPI_RM PHP_TARGETS PYTHON_SINGLE_TARGET PYTHON_TARGETS QEMU_SOFTMMU_TARGETS QEMU_USER_TARGETS ROS_MESSAGES RUBY_TARGETS SANE_BACKENDS USERLAND UWSGI_PLUGINS VIDEO_CARDS VOICEMAIL_STORAGE XFCE_PLUGINS XTABLES_ADDONS"
USE_EXPAND="ABI_MIPS ABI_PPC ABI_S390 ABI_X86 ALSA_CARDS APACHE2_MODULES APACHE2_MPMS CALLIGRA_FEATURES CALLIGRA_EXPERIMENTAL_FEATURES CAMERAS COLLECTD_PLUGINS CPU_FLAGS_ARM CPU_FLAGS_X86 CROSSCOMPILE_OPTS CURL_SSL ELIBC ENLIGHTENMENT_MODULES FFTOOLS GPSD_PROTOCOLS GRUB_PLATFORMS INPUT_DEVICES KERNEL L10N LCD_DEVICES LIBREOFFICE_EXTENSIONS LINGUAS LIRC_DEVICES LLVM_TARGETS MONKEYD_PLUGINS NETBEANS_MODULES NGINX_MODULES_HTTP NGINX_MODULES_MAIL NGINX_MODULES_STREAM OFED_DRIVERS OFFICE_IMPLEMENTATION OPENMPI_FABRICS OPENMPI_OFED_FEATURES OPENMPI_RM PHP_TARGETS POSTGRES_TARGETS PYTHON_SINGLE_TARGET PYTHON_TARGETS QEMU_SOFTMMU_TARGETS QEMU_USER_TARGETS ROS_MESSAGES RUBY_TARGETS SANE_BACKENDS USERLAND UWSGI_PLUGINS VIDEO_CARDS VOICEMAIL_STORAGE XFCE_PLUGINS XTABLES_ADDONS"

# USE_EXPAND variables whose contents are not shown in package manager
# output. Changes need discussion on gentoo-dev.
Expand Down Expand Up @@ -141,3 +141,7 @@ LC_MESSAGES="C"
# disable twisted's plugin cache update to prevent access violations
# call /usr/bin/twisted-regen-cache in pkg_postinst()
TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1"

# Aaron W. Swenson <[email protected]> (9 Jul 2017)
# Default target(s) for postgres{,-multi}.eclass
POSTGRES_TARGETS="postgres9_5"
12 changes: 12 additions & 0 deletions profiles/desc/postgres_targets.desc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Copyright 1999-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# This file contains descriptions of POSTGRES_TARGETS USE_EXPAND flags.

postgres9_2 - Build against PostgreSQL 9.2
postgres9_3 - Build against PostgreSQL 9.3
postgres9_4 - Build against PostgreSQL 9.4
postgres9_5 - Build against PostgreSQL 9.5
postgres9_6 - Build against PostgreSQL 9.6
postgres10 - Build against PostgreSQL 10
postgres11 - Build against PostgreSQL 11
2 changes: 1 addition & 1 deletion profiles/embedded/make.defaults
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ USE_EXPAND_VALUES_USERLAND="BSD GNU"

# Env vars to expand into USE vars. Modifying this requires prior
# discussion on [email protected].
USE_EXPAND="ABI_MIPS ABI_PPC ABI_S390 ABI_X86 ALSA_CARDS APACHE2_MODULES APACHE2_MPMS CALLIGRA_FEATURES CAMERAS COLLECTD_PLUGINS CPU_FLAGS_ARM CPU_FLAGS_X86 CROSSCOMPILE_OPTS CURL_SSL ELIBC ENLIGHTENMENT_MODULES FFTOOLS GPSD_PROTOCOLS GRUB_PLATFORMS INPUT_DEVICES KERNEL L10N LCD_DEVICES LIBREOFFICE_EXTENSIONS LINGUAS LIRC_DEVICES LLVM_TARGETS MONKEYD_PLUGINS NETBEANS_MODULES NGINX_MODULES_HTTP NGINX_MODULES_MAIL NGINX_MODULES_STREAM OFED_DRIVERS OFFICE_IMPLEMENTATION OPENMPI_FABRICS OPENMPI_OFED_FEATURES OPENMPI_RM PHP_TARGETS PYTHON_SINGLE_TARGET PYTHON_TARGETS QEMU_SOFTMMU_TARGETS QEMU_USER_TARGETS ROS_MESSAGES RUBY_TARGETS SANE_BACKENDS USERLAND UWSGI_PLUGINS VIDEO_CARDS VOICEMAIL_STORAGE XFCE_PLUGINS XTABLES_ADDONS"
USE_EXPAND="ABI_MIPS ABI_PPC ABI_S390 ABI_X86 ALSA_CARDS APACHE2_MODULES APACHE2_MPMS CALLIGRA_FEATURES CAMERAS COLLECTD_PLUGINS CPU_FLAGS_ARM CPU_FLAGS_X86 CROSSCOMPILE_OPTS CURL_SSL ELIBC ENLIGHTENMENT_MODULES FFTOOLS GPSD_PROTOCOLS GRUB_PLATFORMS INPUT_DEVICES KERNEL L10N LCD_DEVICES LIBREOFFICE_EXTENSIONS LINGUAS LIRC_DEVICES LLVM_TARGETS MONKEYD_PLUGINS NETBEANS_MODULES NGINX_MODULES_HTTP NGINX_MODULES_MAIL NGINX_MODULES_STREAM OFED_DRIVERS OFFICE_IMPLEMENTATION OPENMPI_FABRICS OPENMPI_OFED_FEATURES OPENMPI_RM PHP_TARGETS POSTGRES_TARGETS PYTHON_SINGLE_TARGET PYTHON_TARGETS QEMU_SOFTMMU_TARGETS QEMU_USER_TARGETS ROS_MESSAGES RUBY_TARGETS SANE_BACKENDS USERLAND UWSGI_PLUGINS VIDEO_CARDS VOICEMAIL_STORAGE XFCE_PLUGINS XTABLES_ADDONS"

# USE_EXPAND variables whose contents are not shown in package manager
# output. Changes need discussion on gentoo-dev.
Expand Down

0 comments on commit 9d03d59

Please sign in to comment.