From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 105BD139694 for ; Fri, 21 Apr 2017 19:42:53 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 8791DE0D30; Fri, 21 Apr 2017 19:42:38 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 2E0EFE0CB0 for ; Fri, 21 Apr 2017 19:42:38 +0000 (UTC) Received: from localhost (unknown [63.142.135.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: titanofold) by smtp.gentoo.org (Postfix) with ESMTPSA id E7E64340AC7 for ; Fri, 21 Apr 2017 19:42:36 +0000 (UTC) Received: by localhost (Postfix, from userid 1000) id 151714FE997B; Fri, 21 Apr 2017 15:42:34 -0400 (EDT) Date: Fri, 21 Apr 2017 15:42:33 -0400 From: "Aaron W. Swenson" To: gentoo-dev@lists.gentoo.org Subject: [gentoo-dev] New eclasses and USE_EXPAND: postgres{,-multi}.eclass Message-ID: <20170421194233.GB2578@gengoff> Mail-Followup-To: gentoo-dev@lists.gentoo.org Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="uh9ZiVrAOUUm9fzH" Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Archives-Salt: 87981d81-4f63-4db7-a343-833dbf109bdc X-Archives-Hash: a39d24da8475103d5c242e1f6f2b314a --uh9ZiVrAOUUm9fzH Content-Type: multipart/mixed; boundary="WhfpMioaduB5tiZL" Content-Disposition: inline --WhfpMioaduB5tiZL Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable I=E2=80=99ve 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=E2=80=99ll 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 --WhfpMioaduB5tiZL Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="postgres-multi.eclass" # 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 # @AUTHOR: Aaron W. Swenson # @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 [ ...] # @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 [ ...] # @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 [ ...] # @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 } --WhfpMioaduB5tiZL Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="postgres.eclass" # 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 # @AUTHOR: Aaron W. Swenson # @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}" } --WhfpMioaduB5tiZL-- --uh9ZiVrAOUUm9fzH Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iL4EAREKAGYFAlj6YKZfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3Bl bnBncC5maWZ0aGhvcnNlbWFuLm5ldDRGNEVENDM2QzYzRDAwQTdCNDYzQTQwMDI4 OTc2MzczNjFENjJENUQACgkQKJdjc2HWLV3ibQD/XNbEF4aQDiBqIkxNef5E7R7c OZ3ASM/Dzwp6/4P9jG0A/3Sn7lGjUhu0x1ubz6EM5EexA+/2TbKz9AYPVXH3QOze =Fb51 -----END PGP SIGNATURE----- --uh9ZiVrAOUUm9fzH--