commit:     28e082bab8a150597abb570f5a4bead7db0ff601
Author:     Michael Orlitzky <mjo <AT> gentoo <DOT> org>
AuthorDate: Sat Jul  9 16:37:07 2016 +0000
Commit:     Michael Orlitzky <mjo <AT> gentoo <DOT> org>
CommitDate: Sat Jul  9 16:37:07 2016 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=28e082ba

php-ext-source-r3.eclass: new revision supporting EAPI=6.

This is a new revision of the php-ext-source eclass that supports
EAPI=6 (only) and cleans up some of the existing code. The list of
user-facing changes is,

  * Support only EAPI=6.

  * PATCHES array/variable support.

  * DOCS array support (bug 512184).

  * Renamed my_conf and PHPSAPILIST variables.

Some refactoring was done, but not in a way that consumers should
notice. A migration guide can be found on the wiki:

https://wiki.gentoo.org/wiki/Project:PHP/Php-ext-source-r3_migration_guide

In addition, a number of improvements were suggested by Michał Górny
on the gentoo-dev mailing list:

https://archives.gentoo.org/gentoo-dev/message/9159cba2eabceb96d8ae16ced6631f1e

Gentoo-Bug: 512184

 eclass/php-ext-source-r3.eclass | 410 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 410 insertions(+)

diff --git a/eclass/php-ext-source-r3.eclass b/eclass/php-ext-source-r3.eclass
new file mode 100644
index 0000000..3372a4b
--- /dev/null
+++ b/eclass/php-ext-source-r3.eclass
@@ -0,0 +1,410 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+# @ECLASS: php-ext-source-r3.eclass
+# @MAINTAINER:
+# Gentoo PHP team <php-b...@gentoo.org>
+# @BLURB: Compile and install standalone PHP extensions.
+# @DESCRIPTION:
+# A unified interface for compiling and installing standalone PHP
+# extensions.
+
+inherit autotools
+
+EXPORT_FUNCTIONS src_unpack src_prepare src_configure src_compile src_install
+
+case ${EAPI} in
+       6) ;;
+       *)
+               die "${ECLASS} is not compatible with EAPI=${EAPI}"
+esac
+
+# @ECLASS-VARIABLE: PHP_EXT_NAME
+# @REQUIRED
+# @DESCRIPTION:
+# The extension name. This must be set, otherwise the eclass dies.
+# Only automagically set by php-ext-pecl-r3.eclass, so unless your ebuild
+# inherits that eclass, you must set this manually before inherit.
+[[ -z "${PHP_EXT_NAME}" ]] && \
+       die "no extension name specified for the php-ext-source-r3 eclass"
+
+# @ECLASS-VARIABLE: PHP_EXT_INI
+# @DESCRIPTION:
+# Controls whether or not to add a line to php.ini for the extension.
+# Defaults to "yes" and should not be changed in most cases.
+[[ -z "${PHP_EXT_INI}" ]] && PHP_EXT_INI="yes"
+
+# @ECLASS-VARIABLE: PHP_EXT_ZENDEXT
+# @DESCRIPTION:
+# Controls whether the extension is a ZendEngine extension or not.
+# Defaults to "no". If you don't know what this is, you don't need it.
+[[ -z "${PHP_EXT_ZENDEXT}" ]] && PHP_EXT_ZENDEXT="no"
+
+# @ECLASS-VARIABLE: USE_PHP
+# @REQUIRED
+# @DESCRIPTION:
+# Lists the PHP slots compatible the extension is compatible with.
+# Example:
+# @CODE
+# USE_PHP="php5-6 php7-0"
+# @CODE
+[[ -z "${USE_PHP}" ]] && \
+       die "USE_PHP is not set for the php-ext-source-r3 eclass"
+
+# @ECLASS-VARIABLE: PHP_EXT_OPTIONAL_USE
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# If set, all of the dependencies added by this eclass will be
+# conditional on USE=${PHP_EXT_OPTIONAL_USE}. This is needed when
+# ebuilds have to inherit this eclass unconditionally, but only
+# actually use it when (for example) the user has USE=php.
+
+# @ECLASS-VARIABLE: PHP_EXT_S
+# @DESCRIPTION:
+# The relative location of the temporary build directory for the PHP
+# extension within the source package. This is useful for packages that
+# bundle the PHP extension. Defaults to ${S}.
+[[ -z "${PHP_EXT_S}" ]] && PHP_EXT_S="${S}"
+
+# @ECLASS-VARIABLE: PHP_EXT_SAPIS
+# @DESCRIPTION:
+# A list of SAPIs for which we will install this extension. Formerly
+# called PHPSAPILIST. The default includes every SAPI currently used in
+# the tree.
+[[ -z "${PHP_EXT_SAPIS}" ]] && PHP_EXT_SAPIS="apache2 cli cgi fpm embed phpdbg"
+
+
+# Make sure at least one target is installed. First, start a USE
+# conditional like "php?", but only when PHP_EXT_OPTIONAL_USE is
+# non-null. The option group "|| (..." is always started here.
+REQUIRED_USE="${PHP_EXT_OPTIONAL_USE}${PHP_EXT_OPTIONAL_USE:+? ( }|| ( "
+for _php_target in ${USE_PHP}; do
+       # Now loop through each USE_PHP target and add the corresponding
+       # dev-lang/php slot to PHPDEPEND.
+       IUSE+=" php_targets_${_php_target}"
+       REQUIRED_USE+="php_targets_${_php_target} "
+       _php_slot=${_php_target/php}
+       _php_slot=${_php_slot/-/.}
+       PHPDEPEND+=" php_targets_${_php_target}? ( dev-lang/php:${_php_slot} )"
+done
+
+# Don't pollute the environment with our loop variables.
+unset _php_slot _php_target
+
+# Finally, end the optional group that we started before the loop. Close
+# the USE-conditional if PHP_EXT_OPTIONAL_USE is non-null.
+REQUIRED_USE+=") ${PHP_EXT_OPTIONAL_USE:+ )}"
+
+RDEPEND="${RDEPEND}
+       ${PHP_EXT_OPTIONAL_USE}${PHP_EXT_OPTIONAL_USE:+? ( }
+       ${PHPDEPEND}
+       ${PHP_EXT_OPTIONAL_USE:+ )}"
+
+DEPEND="${DEPEND}
+       sys-devel/m4
+       sys-devel/libtool
+       ${PHP_EXT_OPTIONAL_USE}${PHP_EXT_OPTIONAL_USE:+? ( }
+       ${PHPDEPEND}
+       ${PHP_EXT_OPTIONAL_USE:+ )}
+"
+
+# @ECLASS-VARIABLE: PHP_EXT_SKIP_PHPIZE
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# By default, we run "phpize" in php-ext-source-r3_src_unpack(). Set
+# PHP_EXT_SKIP_PHPIZE="yes" in your ebuild if you do not want to run
+# phpize (and the autoreconf that becomes necessary afterwards).
+
+# @FUNCTION: php-ext-source-r3_src_unpack
+# @DESCRIPTION:
+# Runs the default src_unpack and then makes a copy for each PHP slot.
+php-ext-source-r3_src_unpack() {
+       default
+
+       local slot orig_s="${PHP_EXT_S}"
+       for slot in $(php_get_slots); do
+               cp --recursive --preserve "${orig_s}" "${WORKDIR}/${slot}" || \
+                       die "failed to copy sources from ${orig_s} to 
${WORKDIR}/${slot}"
+       done
+}
+
+
+# @FUNCTION: php-ext-source-r3_src_prepare
+# @DESCRIPTION:
+# For each PHP slot, we initialize the environment, run the default
+# src_prepare() for PATCHES/eapply_user support, and then call
+# php-ext-source-r3_phpize.
+php-ext-source-r3_src_prepare() {
+       for slot in $(php_get_slots); do
+               php_init_slot_env "${slot}"
+               default
+               php-ext-source-r3_phpize
+       done
+}
+
+# @FUNCTION: php-ext-source-r3_phpize
+# @DESCRIPTION:
+# Subject to PHP_EXT_SKIP_PHPIZE, this function runs phpize and
+# autoreconf in a manner that avoids warnings.
+php-ext-source-r3_phpize() {
+       if [[ "${PHP_EXT_SKIP_PHPIZE}" != 'yes' ]] ; then
+               # Create configure out of config.m4. We use autotools_run_tool
+               # to avoid some warnings about WANT_AUTOCONF and
+               # WANT_AUTOMAKE (see bugs #329071 and #549268).
+               autotools_run_tool "${PHPIZE}"
+
+               # Force libtoolize to run and regenerate autotools files (bug
+               # #220519).
+               rm aclocal.m4 || die "failed to remove aclocal.m4"
+               eautoreconf
+       fi
+}
+
+
+# @ECLASS-VARIABLE: PHP_EXT_ECONF_ARGS
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Set this in the ebuild to pass additional configure options to
+# econf. Formerly called my_conf. Either a string or an array of
+# --flag=value parameters is supported.
+
+# @FUNCTION: php-ext-source-r3_src_configure
+# @DESCRIPTION:
+# Takes care of standard configure for PHP extensions (modules).
+php-ext-source-r3_src_configure() {
+       # net-snmp creates these, bug #385403.
+       addpredict /usr/share/snmp/mibs/.index
+       addpredict /var/lib/net-snmp/mib_indexes
+
+       # Support either a string or an array for PHP_EXT_ECONF_ARGS.
+       local econf_args
+       if [[ $(declare -p PHP_EXT_ECONF_ARGS) == "declare -a"* ]]; then
+               econf_args=( "${PHP_EXT_ECONF_ARGS[@]}" )
+       else
+               econf_args=( ${PHP_EXT_ECONF_ARGS} )
+       fi
+
+       local slot
+       for slot in $(php_get_slots); do
+               php_init_slot_env "${slot}"
+               econf --with-php-config="${PHPCONFIG}" "${econf_args[@]}"
+       done
+}
+
+# @FUNCTION: php-ext-source-r3_src_compile
+# @DESCRIPTION:
+# Compile a standard standalone PHP extension.
+php-ext-source-r3_src_compile() {
+       # net-snmp creates these, bug #324739.
+       addpredict /usr/share/snmp/mibs/.index
+       addpredict /var/lib/net-snmp/mib_indexes
+
+       # shm extension creates a semaphore file, bug #173574.
+       addpredict /session_mm_cli0.sem
+       local slot
+       for slot in $(php_get_slots); do
+               php_init_slot_env "${slot}"
+               emake
+       done
+}
+
+# @FUNCTION: php-ext-source-r3_src_install
+# @DESCRIPTION:
+# Install a standard standalone PHP extension. Uses einstalldocs()
+# to support the DOCS variable/array.
+php-ext-source-r3_src_install() {
+       local slot
+       for slot in $(php_get_slots); do
+               php_init_slot_env "${slot}"
+
+               # Strip $EPREFIX from $EXT_DIR before calling doexe (which
+               # handles EPREFIX itself). Shared libs are +x by convention,
+               # although nothing seems to depend on that.
+               exeinto "${EXT_DIR#$EPREFIX}"
+               doexe "modules/${PHP_EXT_NAME}.so"
+
+               INSTALL_ROOT="${D}" emake install-headers
+       done
+       einstalldocs
+       php-ext-source-r3_createinifiles
+}
+
+# @FUNCTION: php_get_slots
+# @DESCRIPTION:
+# Get a list of PHP slots contained in both the ebuild's USE_PHP and the
+# user's PHP_TARGETS.
+php_get_slots() {
+       local s=""
+       local slot
+       for slot in ${USE_PHP}; do
+               use php_targets_${slot} && s+=" ${slot/-/.}"
+       done
+       echo $s
+}
+
+# @FUNCTION: php_init_slot_env
+# @USAGE: <slot>
+# @DESCRIPTION:
+# Takes a slot name, and initializes some global variables to values
+# corresponding to that slot. For example, it sets the path to the "php"
+# and "phpize" binaries, which will differ for each slot. This function
+# is intended to be called while looping through a list of slots
+# obtained from php_get_slots().
+#
+# Calling this function will change the working directory to the
+# temporary build directory for the given slot.
+php_init_slot_env() {
+       local libdir=$(get_libdir)
+       local slot="${1}"
+
+       PHPPREFIX="${EPREFIX}/usr/${libdir}/${slot}"
+       PHPIZE="${PHPPREFIX}/bin/phpize"
+       PHPCONFIG="${PHPPREFIX}/bin/php-config"
+       PHPCLI="${PHPPREFIX}/bin/php"
+       PHPCGI="${PHPPREFIX}/bin/php-cgi"
+       PHP_PKG="$(best_version =dev-lang/php-${1:3}*)"
+
+       EXT_DIR="$(${PHPCONFIG} --extension-dir 2>/dev/null)"
+       PHP_CURRENTSLOT=${1:3}
+
+       PHP_EXT_S="${WORKDIR}/${slot}"
+       cd "${PHP_EXT_S}" || die "failed to change directory to ${PHP_EXT_S}"
+}
+
+# @FUNCTION: php_slot_ini_files
+# @USAGE: <slot>
+# @INTERNAL
+# @DESCRIPTION:
+# Output a list of relative paths to INI files for the given
+# slot. Usually there will be one INI file per SAPI.
+php_slot_ini_files() {
+       local slot_ini_files=""
+       local x
+       for x in ${PHP_EXT_SAPIS} ; do
+               if [[ -f "${EPREFIX}/etc/php/${x}-${1}/php.ini" ]] ; then
+                       slot_ini_files+=" 
etc/php/${x}-${1}/ext/${PHP_EXT_NAME}.ini"
+               fi
+       done
+
+       echo "${slot_ini_files}"
+}
+
+# @FUNCTION: php-ext-source-r3_createinifiles
+# @DESCRIPTION:
+# Builds INI files for every enabled slot and SAPI.
+php-ext-source-r3_createinifiles() {
+       local slot
+       for slot in $(php_get_slots); do
+               php_init_slot_env "${slot}"
+
+               local file
+               for file in $(php_slot_ini_files "${slot}") ; do
+                       if [[ "${PHP_EXT_INI}" = "yes" ]] ; then
+                               # Add the needed lines to the <ext>.ini files
+                               php-ext-source-r3_addextension 
"${PHP_EXT_NAME}.so" "${file}"
+                       fi
+
+                       if [[ -n "${PHP_EXT_INIFILE}" ]] ; then
+                               cat "${FILESDIR}/${PHP_EXT_INIFILE}" >> 
"${ED}/${file}" \
+                                       || die "failed to append to 
${ED}/${file}"
+
+                               einfo "Added contents of 
${FILESDIR}/${PHP_EXT_INIFILE}" \
+                                         "to ${file}"
+                       fi
+                       inidir="${file/${PHP_EXT_NAME}.ini/}"
+                       inidir="${inidir/ext/ext-active}"
+                       dodir "/${inidir}"
+                       dosym "/${file}" "/${file/ext/ext-active}"
+               done
+       done
+
+       # A location where PHP code for this extension can be stored,
+       # independent of the PHP or extension versions. This will be part of
+       # PHP's include_path, configured in php.ini. For example, pecl-apcu
+       # installs an "apc.php" file which you are supposed to load with
+       #
+       #   require('apcu/apc.php');
+       #
+       PHP_EXT_SHARED_DIR="${EPREFIX}/usr/share/php/${PHP_EXT_NAME}"
+}
+
+# @FUNCTION: php-ext-source-r3_addextension
+# @USAGE: <extension-path> <ini-file>
+# @INTERNAL
+# @DESCRIPTION:
+# Add a line to an INI file that will enable the given extension. The
+# first parameter is the path to the extension (.so) file, and the
+# second parameter is the name of the INI file in which it should be
+# loaded. This function determines the setting name (either
+# "extension=..." or "zend_extension=...") and then calls
+# php-ext-source-r3_addtoinifile to do the actual work.
+php-ext-source-r3_addextension() {
+       local ext_type="extension"
+       local ext_file="${1}"
+
+       if [[ "${PHP_EXT_ZENDEXT}" = "yes" ]] ; then
+               ext_type="zend_extension"
+               ext_file="${EXT_DIR}/${1}" # Zend extensions need the path...
+       fi
+
+       php-ext-source-r3_addtoinifile "${2}" "${ext_type}" "${ext_file}"
+}
+
+# @FUNCTION: php-ext-source-r3_addtoinifile
+# @USAGE: <relative-ini-path> <setting-or-section-name> [setting-value]
+# @INTERNAL
+# @DESCRIPTION:
+# Add a setting=value to one INI file. The first argument is the
+# relative path to the INI file. The second argument is the setting
+# name, and the third argument is its value.
+#
+# You can also pass "[Section]" as the second parameter, to create a new
+# section in the INI file. In that case, the third parameter (which
+# would otherwise be the value of the setting) is ignored.
+php-ext-source-r3_addtoinifile() {
+       local inifile="${WORKDIR}/${1}"
+       local inidir="${inifile%/*}"
+
+       mkdir -p "${inidir}" || die "failed to create INI directory ${inidir}"
+
+       # Are we adding the name of a section? Assume not by default.
+       local my_added="${2}=${3}"
+       if [[ ${2:0:1} == "[" ]] ; then
+               # Ok, it's a section name.
+               my_added="${2}"
+       fi
+       echo "${my_added}" >> "${inifile}" || die "failed to append to 
${inifile}"
+       einfo "Added '${my_added}' to /${1}"
+
+       insinto "/${1%/*}"
+       doins "${inifile}"
+}
+
+# @FUNCTION: php-ext-source-r3_addtoinifiles
+# @USAGE: <setting-or-section-name> [setting-value] [message]
+# @DESCRIPTION:
+# Add settings to every php.ini file installed by this extension.
+# You can also add new [Section]s -- see the example below.
+#
+# @CODE
+# Add some settings for the extension:
+#
+# php-ext-source-r3_addtoinifiles "zend_optimizer.optimization_level" "15"
+# php-ext-source-r3_addtoinifiles "zend_optimizer.enable_loader" "0"
+# php-ext-source-r3_addtoinifiles "zend_optimizer.disable_licensing" "0"
+#
+# Adding values to a section in php.ini file installed by the extension:
+#
+# php-ext-source-r3_addtoinifiles "[Debugger]"
+# php-ext-source-r3_addtoinifiles "debugger.enabled" "on"
+# php-ext-source-r3_addtoinifiles "debugger.profiler_enabled" "on"
+# @CODE
+php-ext-source-r3_addtoinifiles() {
+       local slot
+       for slot in $(php_get_slots); do
+               for file in $(php_slot_ini_files "${slot}") ; do
+                       php-ext-source-r3_addtoinifile "${file}" "${1}" "${2}"
+               done
+       done
+}

Reply via email to