From 4f2d7949f03e1c198bc888f2d05f421d35c57e21 Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Mon, 9 Oct 2017 18:53:29 +0100 Subject: reinit the tree, so we can have metadata --- eclass/php-ext-source-r3.eclass | 422 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 422 insertions(+) create mode 100644 eclass/php-ext-source-r3.eclass (limited to 'eclass/php-ext-source-r3.eclass') diff --git a/eclass/php-ext-source-r3.eclass b/eclass/php-ext-source-r3.eclass new file mode 100644 index 000000000000..bc6751562a54 --- /dev/null +++ b/eclass/php-ext-source-r3.eclass @@ -0,0 +1,422 @@ +# Copyright 1999-2016 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: php-ext-source-r3.eclass +# @MAINTAINER: +# Gentoo PHP team +# @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 src_test + +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-ext-source-r3_src_test +# @DESCRIPTION: +# Run tests delivered with the standalone PHP extension. Phpize will have generated +# a run-tests.php file to be executed by `make test`. We only need to +# force the test suite to run in non-interactive mode. +php-ext-source-r3_src_test() { + local slot + for slot in $(php_get_slots); do + php_init_slot_env "${slot}" + NO_INTERACTION="yes" emake test + done +} + +# @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: +# @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: +# @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 .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: +# @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: [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-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 +} -- cgit v1.2.3