blob: 003ac46a4129f2b8bc8a2ce2ef03f1fc1afcdc61 [file] [log] [blame]
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/depend.php.eclass,v 1.25 2008/02/26 16:26:08 armin76 Exp $
# Author: Stuart Herbert <stuart@gentoo.org>
# Author: Luca Longinotti <chtekk@gentoo.org>
# Author: Jakub Moc <jakub@gentoo.org> (documentation)
# @ECLASS: depend.php.eclass
# @MAINTAINER:
# Gentoo PHP team <php-bugs@gentoo.org>
# @BLURB: Functions to allow ebuilds to depend on php[45] and check for specific features.
# @DESCRIPTION:
# This eclass provides functions that allow ebuilds to depend on php[45] and check
# for specific PHP features, SAPIs etc. Also provides dodoc-php wrapper to install
# documentation for PHP packages to php-specific location.
inherit eutils phpconfutils
# PHP4-only depend functions
# @FUNCTION: need_php4_cli
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP4
# with cli SAPI.
need_php4_cli() {
DEPEND="${DEPEND} =virtual/php-4*"
RDEPEND="${RDEPEND} =virtual/php-4*"
PHP_VERSION="4"
}
# @FUNCTION: need_php4_httpd
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP4
# with either cgi or apache2 SAPI.
need_php4_httpd() {
DEPEND="${DEPEND} =virtual/httpd-php-4*"
RDEPEND="${RDEPEND} =virtual/httpd-php-4*"
PHP_VERSION="4"
}
# @FUNCTION: need_php4
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP4
# (with any SAPI).
need_php4() {
DEPEND="${DEPEND} =dev-lang/php-4*"
RDEPEND="${RDEPEND} =dev-lang/php-4*"
PHP_VERSION="4"
PHP_SHARED_CAT="php4"
}
# common settings go in here
uses_php4() {
# cache this
libdir=$(get_libdir)
PHPIZE="/usr/${libdir}/php4/bin/phpize"
PHPCONFIG="/usr/${libdir}/php4/bin/php-config"
PHPCLI="/usr/${libdir}/php4/bin/php"
PHPCGI="/usr/${libdir}/php4/bin/php-cgi"
PHP_PKG="$(best_version =dev-lang/php-4*)"
PHPPREFIX="/usr/${libdir}/php4"
EXT_DIR="$(${PHPCONFIG} --extension-dir 2>/dev/null)"
einfo
einfo "Using ${PHP_PKG}"
einfo
}
# PHP5-only depend functions
# @FUNCTION: need_php5_cli
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP5
# with cli SAPI.
need_php5_cli() {
DEPEND="${DEPEND} =virtual/php-5*"
RDEPEND="${RDEPEND} =virtual/php-5*"
PHP_VERSION="5"
}
# @FUNCTION: need_php5_httpd
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP5
# with either cgi or apache2 SAPI.
need_php5_httpd() {
DEPEND="${DEPEND} =virtual/httpd-php-5*"
RDEPEND="${RDEPEND} =virtual/httpd-php-5*"
PHP_VERSION="5"
}
# @FUNCTION: need_php5
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP5
# (with any SAPI).
need_php5() {
DEPEND="${DEPEND} =dev-lang/php-5*"
RDEPEND="${RDEPEND} =dev-lang/php-5*"
PHP_VERSION="5"
PHP_SHARED_CAT="php5"
}
# common settings go in here
uses_php5() {
# cache this
libdir=$(get_libdir)
PHPIZE="/usr/${libdir}/php5/bin/phpize"
PHPCONFIG="/usr/${libdir}/php5/bin/php-config"
PHPCLI="/usr/${libdir}/php5/bin/php"
PHPCGI="/usr/${libdir}/php5/bin/php-cgi"
PHP_PKG="$(best_version =dev-lang/php-5*)"
PHPPREFIX="/usr/${libdir}/php5"
EXT_DIR="$(${PHPCONFIG} --extension-dir 2>/dev/null)"
einfo
einfo "Using ${PHP_PKG}"
einfo
}
# general PHP depend functions
# @FUNCTION: need_php_cli
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP
# (any version) with cli SAPI.
need_php_cli() {
DEPEND="${DEPEND} virtual/php"
RDEPEND="${RDEPEND} virtual/php"
}
# @FUNCTION: need_php_httpd
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP
# (any version) with either cgi or apache2 SAPI.
need_php_httpd() {
DEPEND="${DEPEND} virtual/httpd-php"
RDEPEND="${RDEPEND} virtual/httpd-php"
}
# @FUNCTION: need_php
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild if the ebuild requires PHP
# (any version with any SAPI).
need_php() {
DEPEND="${DEPEND} dev-lang/php"
RDEPEND="${RDEPEND} dev-lang/php"
PHP_SHARED_CAT="php"
}
# @FUNCTION: need_php_by_category
# @DESCRIPTION:
# Set this after setting DEPEND/RDEPEND in your ebuild to depend on PHP version
# determined by ${CATEGORY} - any PHP version, PHP4 or PHP5 for dev-php, dev-php4 and
# dev-php5, respectively.
need_php_by_category() {
case "${CATEGORY}" in
dev-php) need_php ;;
dev-php4) need_php4 ;;
dev-php5) need_php5 ;;
*) die "Version of PHP required by packages in category ${CATEGORY} unknown"
esac
}
# @FUNCTION: has_php
# @DESCRIPTION:
# Call this function from your pkg_setup, src_compile, src_install etc. if you
# need to know which PHP version is being used and where the PHP binaries/data
# are installed.
has_php() {
# Detect which PHP version we have installed
if has_version '=dev-lang/php-5*' ; then
PHP_VERSION="5"
elif has_version '=dev-lang/php-4*' ; then
PHP_VERSION="4"
else
die "Unable to find an installed dev-lang/php package"
fi
# If we get here, then PHP_VERSION tells us which version of PHP we
# want to use
uses_php${PHP_VERSION}
}
# @FUNCTION: require_php_sapi_from
# @USAGE: <list of SAPIs>
# @DESCRIPTION:
# Call this function from pkg_setup if your package only works with
# specific SAPI(s) and specify a list of PHP SAPI USE flags that are
# required (one or more from cli, cgi, apache2) as arguments.
# Returns if any of the listed SAPIs have been installed, dies if none
# of them is available.
#
# Unfortunately, if you want to be really sure that the required SAPI is
# provided by PHP, you will have to use this function or similar ones (like
# require_php_cli or require_php_cgi) in pkg_setup until we are able to
# depend on USE flags being enabled. The above described need_php[45]_cli
# and need_php[45]_httpd functions cannot guarantee these requirements.
# See Bug 2272 for details.
require_php_sapi_from() {
has_php
local has_sapi="0"
local x
einfo "Checking for compatible SAPI(s)"
for x in $@ ; do
if built_with_use =${PHP_PKG} ${x} || phpconfutils_built_with_use =${PHP_PKG} ${x} ; then
einfo " Discovered compatible SAPI ${x}"
has_sapi="1"
fi
done
if [[ "${has_sapi}" == "1" ]] ; then
return
fi
eerror
eerror "${PHP_PKG} needs to be re-installed with one of the following"
eerror "USE flags enabled:"
eerror
eerror " $@"
eerror
die "No compatible PHP SAPIs found"
}
# @FUNCTION: require_php_with_use
# @USAGE: <list of USE flags>
# @DESCRIPTION:
# Call this function from pkg_setup if your package requires PHP compiled
# with specific USE flags. Returns if all of the listed USE flags are enabled.
# Dies if any of the listed USE flags are disabled.
# @VARIABLE: PHPCHECKNODIE
# @DESCRIPTION:
# You can set PHPCHECKNODIE to non-empty value in your ebuild to chain multiple
# require_php_with_(any)_use checks without making the ebuild die on every failure.
# This is useful in cases when certain PHP features are only required if specific
# USE flag(s) are enabled for that ebuild.
# @CODE
# Example:
#
# local flags="pcre session snmp sockets wddx"
# use mysql && flags="${flags} mysql"
# use postgres && flags="${flags} postgres"
# if ! PHPCHECKNODIE="yes" require_php_with_use ${flags} \
# || ! PHPCHECKNODIE="yes" require_php_with_any_use gd gd-external ; then
# die "Re-install ${PHP_PKG} with ${flags} and either gd or gd-external"
# fi
# @CODE
require_php_with_use() {
has_php
local missing_use=""
local x
einfo "Checking for required PHP feature(s) ..."
for x in $@ ; do
if ! built_with_use =${PHP_PKG} ${x} && ! phpconfutils_built_with_use =${PHP_PKG} ${x} ; then
einfo " Discovered missing USE flag: ${x}"
missing_use="${missing_use} ${x}"
fi
done
if [[ -z "${missing_use}" ]] ; then
if [[ -z "${PHPCHECKNODIE}" ]] ; then
return
else
return 0
fi
fi
if [[ -z "${PHPCHECKNODIE}" ]] ; then
eerror
eerror "${PHP_PKG} needs to be re-installed with all of the following"
eerror "USE flags enabled:"
eerror
eerror " $@"
eerror
die "Missing PHP USE flags found"
else
return 1
fi
}
# @FUNCTION: require_php_with_any_use
# @USAGE: <list of USE flags>
# @DESCRIPTION:
# Call this function from pkg_setup if your package requires PHP compiled with
# any of specified USE flags. Returns if any of the listed USE flags are enabled.
# Dies if all of the listed USE flags are disabled.
require_php_with_any_use() {
has_php
local missing_use=""
local x
einfo "Checking for required PHP feature(s) ..."
for x in $@ ; do
if built_with_use =${PHP_PKG} ${x} || phpconfutils_built_with_use =${PHP_PKG} ${x} ; then
einfo " USE flag ${x} is enabled, ok ..."
return
else
missing_use="${missing_use} ${x}"
fi
done
if [[ -z "${missing_use}" ]] ; then
if [[ -z "${PHPCHECKNODIE}" ]] ; then
return
else
return 0
fi
fi
if [[ -z "${PHPCHECKNODIE}" ]] ; then
eerror
eerror "${PHP_PKG} needs to be re-installed with any of the following"
eerror "USE flags enabled:"
eerror
eerror " $@"
eerror
die "Missing PHP USE flags found"
else
return 1
fi
}
# ========================================================================
# has_*() functions
#
# These functions return 0 if the condition is satisfied, 1 otherwise
# ========================================================================
# @FUNCTION: has_zts
# @DESCRIPTION:
# Check if our PHP was compiled with ZTS (Zend Thread Safety) enabled.
# @RETURN: 0 if true, 1 otherwise
has_zts() {
has_php
if built_with_use =${PHP_PKG} apache2 threads || phpconfutils_built_with_use =${PHP_PKG} apache2 threads ; then
return 0
fi
return 1
}
# @FUNCTION: has_debug
# @DESCRIPTION:
# Check if our PHP was built with debug support enabled.
# @RETURN: 0 if true, 1 otherwise
has_debug() {
has_php
if built_with_use =${PHP_PKG} debug || phpconfutils_built_with_use =${PHP_PKG} debug ; then
return 0
fi
return 1
}
# @FUNCTION: has_concurrentmodphp
# @DESCRIPTION:
# Check if our PHP was built with the concurrentmodphp support enabled.
# @RETURN: 0 if true, 1 otherwise
has_concurrentmodphp() {
has_php
if built_with_use =${PHP_PKG} apache2 concurrentmodphp || phpconfutils_built_with_use =${PHP_PKG} apache2 concurrentmodphp ; then
return 0
fi
return 1
}
# ========================================================================
# require_*() functions
#
# These functions die() if PHP was built without the required features
# ========================================================================
# @FUNCTION: require_pdo
# @DESCRIPTION:
# Require a PHP built with PDO support (PHP5 only).
# This function is now redundant and DEPRECATED since
# pdo-external use flag and pecl-pdo-* ebuilds were removed.
# You should use require_php_with_use pdo instead now.
# @RETURN: die if feature is missing
require_pdo() {
has_php
# Do we have PHP5 installed?
if [[ "${PHP_VERSION}" == "4" ]] ; then
eerror
eerror "This package requires PDO."
eerror "PDO is only available for PHP 5."
eerror "You must install >=dev-lang/php-5.1 with USE=\"pdo\"."
eerror "pdo USE flags turned on."
eerror
die "PHP 5 not installed"
fi
# Was PHP5 compiled with internal PDO support?
if built_with_use =${PHP_PKG} pdo || phpconfutils_built_with_use =${PHP_PKG} pdo ; then
return
else
eerror
eerror "No PDO extension for PHP found."
eerror "Please note that PDO only exists for PHP 5."
eerror "Please install a PDO extension for PHP 5."
eerror "You must install >=dev-lang/php-5.1 with USE=\"pdo\"."
eerror
die "No PDO extension for PHP 5 found"
fi
}
# @FUNCTION: require_php_cli
# @DESCRIPTION:
# Determines which installed PHP version has the CLI SAPI enabled.
# Useful for PEAR stuff, or anything which needs to run PHP script
# depending on the CLI SAPI.
# @RETURN: die if feature is missing
require_php_cli() {
# If PHP_PKG is set, then we have remembered our PHP settings
# from last time
if [[ -n ${PHP_PKG} ]] ; then
return
fi
local PHP_PACKAGE_FOUND=""
# Detect which PHP version we have installed
if has_version '=dev-lang/php-4*' ; then
PHP_PACKAGE_FOUND="1"
pkg="$(best_version '=dev-lang/php-4*')"
if built_with_use =${pkg} cli || phpconfutils_built_with_use =${pkg} cli ; then
PHP_VERSION="4"
fi
fi
if has_version '=dev-lang/php-5*' ; then
PHP_PACKAGE_FOUND="1"
pkg="$(best_version '=dev-lang/php-5*')"
if built_with_use =${pkg} cli || phpconfutils_built_with_use =${pkg} cli ; then
PHP_VERSION="5"
fi
fi
if [[ -z ${PHP_PACKAGE_FOUND} ]] ; then
die "Unable to find an installed dev-lang/php package"
fi
if [[ -z ${PHP_VERSION} ]] ; then
die "No PHP CLI installed. Re-emerge dev-lang/php with USE=cli."
fi
# If we get here, then PHP_VERSION tells us which version of PHP we
# want to use
uses_php${PHP_VERSION}
}
# @FUNCTION: require_php_cgi
# @DESCRIPTION:
# Determines which installed PHP version has the CGI SAPI enabled.
# Useful for anything which needs to run PHP scripts depending on the CGI SAPI.
# @RETURN: die if feature is missing
require_php_cgi() {
# If PHP_PKG is set, then we have remembered our PHP settings
# from last time
if [[ -n ${PHP_PKG} ]] ; then
return
fi
local PHP_PACKAGE_FOUND=""
# Detect which PHP version we have installed
if has_version '=dev-lang/php-4*' ; then
PHP_PACKAGE_FOUND="1"
pkg="$(best_version '=dev-lang/php-4*')"
if built_with_use =${pkg} cgi || phpconfutils_built_with_use =${pkg} cgi ; then
PHP_VERSION="4"
fi
fi
if has_version '=dev-lang/php-5*' ; then
PHP_PACKAGE_FOUND="1"
pkg="$(best_version '=dev-lang/php-5*')"
if built_with_use =${pkg} cgi || phpconfutils_built_with_use =${pkg} cgi ; then
PHP_VERSION="5"
fi
fi
if [[ -z ${PHP_PACKAGE_FOUND} ]] ; then
die "Unable to find an installed dev-lang/php package"
fi
if [[ -z ${PHP_VERSION} ]] ; then
die "No PHP CGI installed. Re-emerge dev-lang/php with USE=cgi."
fi
# If we get here, then PHP_VERSION tells us which version of PHP we
# want to use
uses_php${PHP_VERSION}
}
# @FUNCTION: require_sqlite
# @DESCRIPTION:
# Require a PHP built with SQLite support
# @RETURN: die if feature is missing
require_sqlite() {
has_php
# Has our PHP been built with SQLite support?
if built_with_use =${PHP_PKG} sqlite || phpconfutils_built_with_use =${PHP_PKG} sqlite ; then
return
fi
# Do we have pecl-sqlite installed for PHP4?
if [[ "${PHP_VERSION}" == "4" ]] ; then
if has_version 'dev-php4/pecl-sqlite' ; then
return
fi
fi
# If we get here, then we don't have any SQLite support for PHP installed
eerror
eerror "No SQLite extension for PHP found."
eerror "Please install an SQLite extension for PHP,"
eerror "this is done best by simply adding the"
eerror "'sqlite' USE flag when emerging dev-lang/php."
eerror
die "No SQLite extension for PHP found"
}
# @FUNCTION: require_gd
# @DESCRIPTION:
# Require a PHP built with GD support
# @RETURN: die if feature is missing
require_gd() {
has_php
# Do we have the internal GD support installed?
if built_with_use =${PHP_PKG} gd || phpconfutils_built_with_use =${PHP_PKG} gd ; then
return
fi
# Ok, maybe GD was built using the external library support?
if built_with_use =${PHP_PKG} gd-external || phpconfutils_built_with_use =${PHP_PKG} gd-external ; then
return
fi
# If we get here, then we have no GD support
eerror
eerror "No GD support for PHP found."
eerror "Please install the GD support for PHP,"
eerror "you must install dev-lang/php with either"
eerror "the 'gd' or the 'gd-external' USE flags"
eerror "turned on."
eerror
die "No GD support found for PHP"
}
# ========================================================================
# Misc functions
#
# These functions provide miscellaneous checks and functionality.
# ========================================================================
# @FUNCTION: php_binary_extension
# @DESCRIPTION:
# Executes some checks needed when installing a binary PHP extension.
php_binary_extension() {
has_php
local PUSE_ENABLED=""
# Binary extensions do not support the change of PHP
# API version, so they can't be installed when USE flags
# are enabled which change the PHP API version, they also
# don't provide correctly versioned symbols for our use
if has_debug ; then
eerror
eerror "You cannot install binary PHP extensions"
eerror "when the 'debug' USE flag is enabled!"
eerror "Please reemerge dev-lang/php with the"
eerror "'debug' USE flag turned off."
eerror
PUSE_ENABLED="1"
fi
if has_concurrentmodphp ; then
eerror
eerror "You cannot install binary PHP extensions when"
eerror "the 'concurrentmodphp' USE flag is enabled!"
eerror "Please reemerge dev-lang/php with the"
eerror "'concurrentmodphp' USE flag turned off."
eerror
PUSE_ENABLED="1"
fi
if [[ -n ${PUSE_ENABLED} ]] ; then
die "'debug' and/or 'concurrentmodphp' USE flags turned on!"
fi
}
# @FUNCTION: dodoc-php
# @USAGE: <list of docs>
# @DESCRIPTION:
# Alternative to dodoc function for use in our PHP eclasses and ebuilds.
# Stored here because depend.php gets always sourced everywhere in the PHP
# ebuilds and eclasses. It simply is dodoc with a changed path to the docs.
# NOTE: No support for docinto is provided!
dodoc-php() {
if [[ $# -lt 1 ]] ; then
echo "$0: at least one argument needed" 1>&2
exit 1
fi
phpdocdir="/usr/share/doc/${CATEGORY}/${PF}/"
for x in $@ ; do
if [[ -s "${x}" ]] ; then
insinto "${phpdocdir}"
doins "${x}"
gzip -f -9 "${D}/${phpdocdir}/${x##*/}"
elif [[ ! -e "${x}" ]] ; then
echo "dodoc-php: ${x} does not exist" 1>&2
fi
done
}
# @FUNCTION: dohtml-php
# @USAGE: <list of html docs>
# @DESCRIPTION:
# Alternative to dohtml function for use in our PHP eclasses and ebuilds.
# Stored here because depend.php gets always sourced everywhere in the PHP
# ebuilds and eclasses. It simply is dohtml with a changed path to the docs.
# NOTE: No support for [-a|-A|-p|-x] options is provided!
dohtml-php() {
if [[ $# -lt 1 ]] ; then
echo "$0: at least one argument needed" 1>&2
exit 1
fi
phphtmldir="/usr/share/doc/${CATEGORY}/${PF}/html"
for x in $@ ; do
if [[ -s "${x}" ]] ; then
insinto "${phphtmldir}"
doins "${x}"
elif [[ ! -e "${x}" ]] ; then
echo "dohtml-php: ${x} does not exist" 1>&2
fi
done
}