On Wed,  1 Jun 2016 12:53:37 -0400
Michael Orlitzky <m...@gentoo.org> wrote:

> 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
> 
> Gentoo-Bug: 512184
> ---
>  eclass/php-ext-source-r3.eclass | 387 
> ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 387 insertions(+)
>  create mode 100644 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 0000000..f3af823
> --- /dev/null
> +++ b/eclass/php-ext-source-r3.eclass
> @@ -0,0 +1,387 @@
> +# 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:
> +# A unified interface for compiling and installing 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
> +
> +DEPEND=">=sys-devel/m4-1.4.3  
> +             >=sys-devel/libtool-1.5.18"
> +RDEPEND=""

Please move all of this below EAPI check. And I think *DEPEND would be
better set in one place.

> +
> +case ${EAPI} in
> +     6) ;;
> +     *)
> +             die "php-ext-source-r3 is not compatible with EAPI=${EAPI}"

I think you can use ${ECLASS} here btw.

> +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 compatibile the extension is compatibile with

typo: compatible, and also appears twice ;-).

> +# 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
> +# @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'll install this extension. Formerly
> +# called PHPSAPILIST.
> +[[ -z "${PHP_EXT_SAPIS}" ]] && PHP_EXT_SAPIS="apache2 cli cgi fpm embed 
> phpdbg"

Is this default something that might get extended in the future? I
think it might be worth noting that here.

> +
> +
> +# 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 target in ${USE_PHP}; do

Environment pollution! unset target, or make this local.

> +     # Now loop through each USE_PHP target and add the corresponding
> +     # dev-lang/php slot to PHPDEPEND.
> +     IUSE="${IUSE} php_targets_${target}"

Any reason not to use += here as well?

> +     # Strip "+" characters from USE_PHP???
> +     # target=${target/+}
> +     REQUIRED_USE+="php_targets_${target} "
> +     slot=${target/php}
> +     slot=${slot/-/.}
> +     PHPDEPEND="${PHPDEPEND}
> +     php_targets_${target}? ( dev-lang/php:${slot} )"
> +done
> +# 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}
> +     ${PHP_EXT_OPTIONAL_USE}${PHP_EXT_OPTIONAL_USE:+? ( }
> +     ${PHPDEPEND}
> +     ${PHP_EXT_OPTIONAL_USE:+ )}
> +"
> +
> +# @ECLASS-VARIABLE: PHP_EXT_SKIP_PHPIZE
> +# @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_src_unpack
> +
> +     local slot orig_s="${PHP_EXT_S}"
> +     for slot in $(php_get_slots); do
> +             cp -r "${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_EXTRA_ECONF
> +# @DESCRIPTION:
> +# Set this in the ebuild to pass configure options to econf. Formerly
> +# called my_conf.

Please don't name this *EXTRA_ECONF. EXTRA_ECONF is a Portage variable
that's meant to be set by user in make.conf/env, and not ebuilds.

> +# @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
> +
> +     local slot
> +     for slot in $(php_get_slots); do
> +             php_init_slot_env "${slot}"
> +             # Set the correct config options
> +             econf --with-php-config=${PHPCONFIG} ${PHP_EXT_EXTRA_ECONF}
> +     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}"
> +
> +             # Let's put the default module away. Strip $EPREFIX from
> +             # $EXT_DIR before calling newins (which handles EPREFIX itself).
> +             insinto "${EXT_DIR#$EPREFIX}"
> +             newins "modules/${PHP_EXT_NAME}.so" "${PHP_EXT_NAME}.so"

Wouldn't it be more appropriate to use exeinto/doexe to have the shared
libs +x?

> +
> +             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
> +# @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().

Please make it explicit that it changes working directory.

> +php_init_slot_env() {
> +     local libdir=$(get_libdir)
> +
> +     PHPIZE="${EPREFIX}/usr/${libdir}/${1}/bin/phpize"
> +     PHPCONFIG="${EPREFIX}/usr/${libdir}/${1}/bin/php-config"
> +     PHPCLI="${EPREFIX}/usr/${libdir}/${1}/bin/php"
> +     PHPCGI="${EPREFIX}/usr/${libdir}/${1}/bin/php-cgi"
> +     PHP_PKG="$(best_version =dev-lang/php-${1:3}*)"
> +     PHPPREFIX="${EPREFIX}/usr/${libdir}/${slot}"
> +     EXT_DIR="$(${PHPCONFIG} --extension-dir 2>/dev/null)"
> +     PHP_CURRENTSLOT=${1:3}
> +
> +     PHP_EXT_S="${WORKDIR}/${1}"
> +     cd "${PHP_EXT_S}" || die "failed to change directory to ${PHP_EXT_S}"
> +}
> +
> +# @FUNCTION: php_slot_ini_files
> +# @INTERNAL
> +# @DESCRIPTION:
> +# Output a list of relative paths to INI files for the given
> +# slot. Usually there will be one INI file per SAPI.

Please add @USAGE to make clear what ${1} is. In fact, many functions
seem to miss @USAGE.

> +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

> +                             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
> +
> +             # Add support for installing PHP files into a version dependent
> +             # directory
> +             PHP_EXT_SHARED_DIR="${EPREFIX}/usr/share/php/${PHP_EXT_NAME}"

Should this be repeated inside the loop?

> +     done
> +}
> +
> +# @FUNCTION: php-ext-source-r3_addextension
> +# @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() {
> +     if [[ "${PHP_EXT_ZENDEXT}" = "yes" ]] ; then
> +             ext_type="zend_extension"
> +             ext_file="${EXT_DIR}/${1}" # Zend extensions need the path...
> +     else
> +             ext_type="extension"
> +             ext_file="${1}"
> +     fi

I think you want those variables local.

> +
> +     php-ext-source-r3_addtoinifile "${2}" "${ext_type}" "${ext_file}"
> +}
> +
> +# @FUNCTION: php-ext-source-r3_addtoinifile
> +# @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 first parameter, to create a new
> +# section in the INI file. In that case, the second parameter (which
> +# would otherwise be the value of the setting) is ignored.
> +php-ext-source-r3_addtoinifile() {
> +     local inifile="${WORKDIR}/${1}"
> +     local inidir="$(dirname ${inifile})"

I would suggest avoiding external tools like dirname when simple bash
subst can do the work (e.g. ${inifile%/*}).

> +     if [[ ! -d "${inidir}" ]] ; then
> +             mkdir -p "${inidir}" || die "failed to create INI directory 
> ${inidir}"

'mkdir -p' is safe to call when the directory exists, so I don't think
you need the conditional.

> +     fi
> +
> +     # Are we adding the name of a section?
> +     if [[ ${2:0:1} == "[" ]] ; then
> +             echo "${2}" >> "${inifile}"

|| die

> +             my_added="${2}"

Again, missing local.

> +     else
> +             echo "${2}=${3}" >> "${inifile}"

|| die

> +             my_added="${2}=${3}"
> +     fi

All above considered, wouldn't it be simpler to set my_added first,
and then just echo it to the file outside the conditional?

> +
> +     einfo "Added '${my_added}' to /${1}"
> +
> +     insinto /$(dirname "${1}")
> +     doins "${inifile}"
> +}
> +
> +# @FUNCTION: php-ext-source-r3_addtoinifiles
> +# @USAGE: <setting name> <setting value> [message to output]; or just 
> [section name]

I think you are mixing '[]' meaning optional and meaning literal '[]'
here.

> +# @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"

Hmm... just to make it clear... is there any reason you use two
arguments instead of the more obvious 'foo=15'?

> +#
> +# 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
> +}



-- 
Best regards,
Michał Górny
<http://dev.gentoo.org/~mgorny/>

Attachment: pgpfpmTlUetVA.pgp
Description: OpenPGP digital signature

Reply via email to