From dfdd3c3edd0a71195eb5104dbb2dcc416c41e046 Mon Sep 17 00:00:00 2001 From: Micha Glave Date: Tue, 27 Apr 2021 10:38:25 +0200 Subject: [PATCH] restored upstream php:7.2. For legacy systems. --- dev-lang/php/Manifest | 10 + dev-lang/php/files/20php5-envd | 2 + .../php-7.2.13-intl-use-icu-namespace.patch | 379 +++++++++ .../php-7.2.34-use-after-free-bug76047.patch | 174 ++++ dev-lang/php/files/php-fpm_at-simple.service | 13 + dev-lang/php/files/php-fpm_at.service | 14 + dev-lang/php/files/php-freetype-2.9.1.patch | 233 ++++++ .../php/files/php-iodbc-header-location.patch | 14 + dev-lang/php/metadata.xml | 70 ++ dev-lang/php/php-7.2.34-r2.ebuild | 764 ++++++++++++++++++ 10 files changed, 1673 insertions(+) create mode 100644 dev-lang/php/Manifest create mode 100644 dev-lang/php/files/20php5-envd create mode 100644 dev-lang/php/files/php-7.2.13-intl-use-icu-namespace.patch create mode 100644 dev-lang/php/files/php-7.2.34-use-after-free-bug76047.patch create mode 100644 dev-lang/php/files/php-fpm_at-simple.service create mode 100644 dev-lang/php/files/php-fpm_at.service create mode 100644 dev-lang/php/files/php-freetype-2.9.1.patch create mode 100644 dev-lang/php/files/php-iodbc-header-location.patch create mode 100644 dev-lang/php/metadata.xml create mode 100644 dev-lang/php/php-7.2.34-r2.ebuild diff --git a/dev-lang/php/Manifest b/dev-lang/php/Manifest new file mode 100644 index 0000000..4b53c72 --- /dev/null +++ b/dev-lang/php/Manifest @@ -0,0 +1,10 @@ +AUX 20php5-envd 145 BLAKE2B 06476b8fc04d1e835496b417ac752f0834ddbe8584e4fddc6db0aa5e6845b82cdea0a1355c77125375dcdd0f0a3c19de5f3a8a64ee93950f96c437a16f971567 SHA512 581aa86479e3cd584ee1bc6dc6d4a135fe8ec343fe5519566d728d81f7018cfb23658bd0c0368951d380982c75adbb4f45acf3c146868aaf4e4ec8e9f2fad1ce +AUX php-7.2.13-intl-use-icu-namespace.patch 11499 BLAKE2B 0dca597d5afd0309595499e3ff860e2d83183e570d02f202a1e2966d430606f09b8dc7427c4007e791914c8ee093a2e7cbf7372baa7896ac06d1912f2e707c09 SHA512 1332eb76feda2100685e319ae046512cf12b55a0d2be537c2172ccf035b547d851f84fb7941389882d7e3d674d91441e018c7b8f1e3f0d4cced05c314d5821fe +AUX php-7.2.34-use-after-free-bug76047.patch 5542 BLAKE2B ccdabbe7a45f10f7a6666afabf27f2ab18ed011989447d950debe703e5f210d86a728c11bf883c74dc4ce88d634a8f10d1c9130a6e2dfb486ab92ebc1fb15e3c SHA512 8e2cc3dab0e3f3d7ba9b4a8cf4a16daa9cd908a5c1dc42ee1dfc44be82b4faffbb46b5bb0a88d15252edf4c95e05b4877c94aeaa05e9c511f3a49adafbc62c73 +AUX php-fpm_at-simple.service 316 BLAKE2B 0ba10f3e3b004fbf14956e1e4f04f59b8a127e6717fe6b92c09b9f931033a11551c75fbbee9010f6b694c5a8758ca0eec9eed457ae304ba0dea8f2c256c3b8d4 SHA512 7367a3f8d3874f8e0c76f331ba613a0250db02f60ad9f87affaf448dcb5bc34bcecb91d88f415764a12b24b46ae3d1b738a002af9f77a4b707e916e83a0021fd +AUX php-fpm_at.service 317 BLAKE2B f13fc38fcc0575a8517ee8d07b120efda37eabd2355061d0fdc303604c6b02ad42d7301180d86c977d5e585f5dd685343c592e37a6e0f44933707be79e0b77e0 SHA512 27982f9e2d958bfa75c89c7d3531e48d17fc388b1cdcbc8e09051b236b1184ee2baabdfcc567c19d9fcd067d4b3b86f171015616d8da42fccdabd89432d865e8 +AUX php-freetype-2.9.1.patch 7667 BLAKE2B efc8f829bbad11b3e7b654d0882213ecb9aae766060d51f93446a6293a2f607339faba484c7b0b2f9318a5c5442da3c09e25aeda20dbc5e3258bf1009f8625b4 SHA512 0a06189f6fb3513cd2dcf9ddb590360475e2dd9a7aa8b13ab66c389c1ed40ce2361681f017cd3c6219f5b40a0a9d4978e57ca3ee4bacb7657db3285136fd2875 +AUX php-iodbc-header-location.patch 481 BLAKE2B 9ea6a5d529dc7a8c78eeee800900372bc14309a05e352b2838da32e1384b61b507fdb623c9400094aa5b637eb1a87da92c72600eff79b18b8989ef90af56a0fa SHA512 86469f657d8807f005c28fd2149770c881add8f243fdfea087956c7987277597fe400a7af23f624f26da270356604717ed9cd04771154d7cf2ffe7237972372b +DIST php-7.2.34.tar.xz 12309432 BLAKE2B 50522786d39296bc7411931c4f357d53c7a25da264192a6a6e7f7594f3dee108e22974e00a4bdc4d3af269ab63d07b28045ff6b4f4f0c79672ed059882647b93 SHA512 7ecc3de3b5db41ec4ff6a5ce6c7e77dc330753c6f3fd87db4d07d6bb763a0b047e83afeef2251b4c6a5d2ff53fd9f3d7e99d091ef2e2c6ab8f18db7447d8a97d +EBUILD php-7.2.34-r2.ebuild 22872 BLAKE2B 041fd990f7c2e89ad83476bf66644321cad0c6132d6db5c88c07cbc44fc6246d012c2b0ea6553cfd886665bd8b34e300c986ed8c3de9b7e43bd4e0e0d9620525 SHA512 1b546d9911fc81bf306af751b0571efee65063388fe9d879da360bab61231bb321fb69c3c494c8bda5ccc2cc871308fd17e4a413e7654293640b00fdecb0a4ac +MISC metadata.xml 3268 BLAKE2B 4abc96d858186ab5bc6f0797fb3f1cf7f5aaa0b07a4652dcc16aa65e197bd73803f6bac717084c0c9a194e7da5b6632523105205011a0d39221aabc16ade8e2e SHA512 1413edb5293cb93ad8f94376f11b9952ca6369b667ae23baed56d9cbaa68cb9cfa5a80da7dd7184ba84f08d5a4054068da1c10daca81d1730e7b6edebba8b29f diff --git a/dev-lang/php/files/20php5-envd b/dev-lang/php/files/20php5-envd new file mode 100644 index 0000000..f6033ae --- /dev/null +++ b/dev-lang/php/files/20php5-envd @@ -0,0 +1,2 @@ +MANPATH="/usr/lib/php5/man/" +CONFIG_PROTECT_MASK="/etc/php/cli-php5/ext-active/ /etc/php/cgi-php5/ext-active/ /etc/php/apache2-php5/ext-active/" diff --git a/dev-lang/php/files/php-7.2.13-intl-use-icu-namespace.patch b/dev-lang/php/files/php-7.2.13-intl-use-icu-namespace.patch new file mode 100644 index 0000000..b5d2b47 --- /dev/null +++ b/dev-lang/php/files/php-7.2.13-intl-use-icu-namespace.patch @@ -0,0 +1,379 @@ +Based on the following upstream commits: + +https://github.com/php/php-src/commit/8d35a423838eb462cd39ee535c5d003073cc5f22 +https://github.com/php/php-src/commit/d8200e48857aeaf09f7127751efc5632ef7660a7 +https://github.com/php/php-src/commit/9a8e7b571896f39f83cb000fdb7c466b6d328d52 + +--- a/ext/intl/breakiterator/breakiterator_class.cpp ++++ b/ext/intl/breakiterator/breakiterator_class.cpp +@@ -38,6 +38,7 @@ extern "C" { + } + + using PHP::CodePointBreakIterator; ++using icu::RuleBasedBreakIterator; + + /* {{{ Global variables */ + zend_class_entry *BreakIterator_ce_ptr; +--- a/ext/intl/breakiterator/breakiterator_class.h ++++ b/ext/intl/breakiterator/breakiterator_class.h +@@ -26,6 +26,8 @@ + + #ifndef USE_BREAKITERATOR_POINTER + typedef void BreakIterator; ++#else ++using icu::BreakIterator; + #endif + + typedef struct { +--- a/ext/intl/breakiterator/breakiterator_methods.cpp ++++ b/ext/intl/breakiterator/breakiterator_methods.cpp +@@ -32,6 +32,8 @@ extern "C" { + } + + using PHP::CodePointBreakIterator; ++using icu::BreakIterator; ++using icu::Locale; + + U_CFUNC PHP_METHOD(BreakIterator, __construct) + { +--- a/ext/intl/breakiterator/codepointiterator_internal.cpp ++++ b/ext/intl/breakiterator/codepointiterator_internal.cpp +@@ -33,6 +33,8 @@ typedef union { + + using namespace PHP; + ++using icu::UCharCharacterIterator; ++ + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CodePointBreakIterator); + + CodePointBreakIterator::CodePointBreakIterator() +--- a/ext/intl/breakiterator/codepointiterator_internal.h ++++ b/ext/intl/breakiterator/codepointiterator_internal.h +@@ -18,8 +18,11 @@ + #define CODEPOINTITERATOR_INTERNAL_H + + #include ++#include + +-using U_ICU_NAMESPACE::BreakIterator; ++using icu::BreakIterator; ++using icu::CharacterIterator; ++using icu::UnicodeString; + + namespace PHP { + +--- a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp ++++ b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp +@@ -26,6 +26,9 @@ extern "C" { + #include "../intl_convertcpp.h" + #include "../intl_common.h" + ++using icu::RuleBasedBreakIterator; ++using icu::Locale; ++ + static inline RuleBasedBreakIterator *fetch_rbbi(BreakIterator_object *bio) { + return (RuleBasedBreakIterator*)bio->biter; + } +--- a/ext/intl/calendar/calendar_class.cpp ++++ b/ext/intl/calendar/calendar_class.cpp +@@ -34,6 +34,9 @@ extern "C" { + #include + } + ++using icu::GregorianCalendar; ++using icu::Locale; ++ + /* {{{ Global variables */ + zend_class_entry *Calendar_ce_ptr; + zend_class_entry *GregorianCalendar_ce_ptr; +--- a/ext/intl/calendar/calendar_class.h ++++ b/ext/intl/calendar/calendar_class.h +@@ -26,6 +26,8 @@ + + #ifndef USE_CALENDAR_POINTER + typedef void Calendar; ++#else ++using icu::Calendar; + #endif + + typedef struct { +--- a/ext/intl/calendar/calendar_methods.cpp ++++ b/ext/intl/calendar/calendar_methods.cpp +@@ -40,6 +40,8 @@ extern "C" { + } + #include "../common/common_enum.h" + ++using icu::Locale; ++ + U_CFUNC PHP_METHOD(IntlCalendar, __construct) + { + zend_throw_exception( NULL, +--- a/ext/intl/calendar/gregoriancalendar_methods.cpp ++++ b/ext/intl/calendar/gregoriancalendar_methods.cpp +@@ -23,6 +23,8 @@ + #include + #include + #include ++#include ++ + extern "C" { + #include "../php_intl.h" + #include "../intl_common.h" +@@ -34,6 +36,11 @@ extern "C" { + #include "zend_exceptions.h" + } + ++using icu::GregorianCalendar; ++using icu::Locale; ++using icu::UnicodeString; ++using icu::StringPiece; ++ + static inline GregorianCalendar *fetch_greg(Calendar_object *co) { + return (GregorianCalendar*)co->ucal; + } +--- a/ext/intl/common/common_date.cpp ++++ b/ext/intl/common/common_date.cpp +@@ -27,6 +27,9 @@ extern "C" { + + #include "zend_portability.h" + ++using icu::TimeZone; ++using icu::UnicodeString; ++ + /* {{{ timezone_convert_datetimezone + * The timezone in DateTime and DateTimeZone is not unified. */ + U_CFUNC TimeZone *timezone_convert_datetimezone(int type, +--- a/ext/intl/common/common_date.h ++++ b/ext/intl/common/common_date.h +@@ -28,6 +28,8 @@ U_CDECL_END + + #include + ++using icu::TimeZone; ++ + U_CFUNC TimeZone *timezone_convert_datetimezone(int type, void *object, int is_datetime, intl_error *outside_error, const char *func); + U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz, + intl_error *err, const char *func); +--- a/ext/intl/common/common_enum.h ++++ b/ext/intl/common/common_enum.h +@@ -75,6 +75,7 @@ U_CFUNC zval *zoi_with_current_get_current_data(zend_object_iterator *iter); + U_CFUNC void zoi_with_current_invalidate_current(zend_object_iterator *iter); + + #ifdef __cplusplus ++using icu::StringEnumeration; + U_CFUNC void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *object); + #endif + +--- a/ext/intl/converter/converter.c ++++ b/ext/intl/converter/converter.c +@@ -18,6 +18,8 @@ + #include "zend_exceptions.h" + + #include ++#include ++#include + #include + #include + +--- a/ext/intl/dateformat/dateformat_format_object.cpp ++++ b/ext/intl/dateformat/dateformat_format_object.cpp +@@ -33,6 +33,12 @@ extern "C" { + #include "../common/common_date.h" + } + ++using icu::Locale; ++using icu::DateFormat; ++using icu::GregorianCalendar; ++using icu::StringPiece; ++using icu::SimpleDateFormat; ++ + static const DateFormat::EStyle valid_styles[] = { + DateFormat::kNone, + DateFormat::kFull, +--- a/ext/intl/dateformat/dateformat_helpers.cpp ++++ b/ext/intl/dateformat/dateformat_helpers.cpp +@@ -28,6 +28,8 @@ extern "C" { + #include "../calendar/calendar_class.h" + } + ++using icu::GregorianCalendar; ++ + int datefmt_process_calendar_arg(zval* calendar_zv, + Locale const& locale, + const char *func_name, +--- a/ext/intl/dateformat/dateformat_helpers.h ++++ b/ext/intl/dateformat/dateformat_helpers.h +@@ -22,11 +22,16 @@ + #endif + + #include ++#include + + extern "C" { + #include "../php_intl.h" + } + ++using icu::Locale; ++using icu::Calendar; ++using icu::DateFormat; ++ + int datefmt_process_calendar_arg(zval* calendar_zv, + Locale const& locale, + const char *func_name, +--- a/ext/intl/grapheme/grapheme_string.c ++++ b/ext/intl/grapheme/grapheme_string.c +@@ -24,6 +24,7 @@ + #include "grapheme_util.h" + + #include ++#include + #include + #include + #include +@@ -834,10 +835,10 @@ PHP_FUNCTION(grapheme_extract) + pstr = str + start; + + /* just in case pstr points in the middle of a character, move forward to the start of the next char */ +- if ( !UTF8_IS_SINGLE(*pstr) && !U8_IS_LEAD(*pstr) ) { +- char *str_end = str + str_len; ++ if ( !U8_IS_SINGLE(*pstr) && !U8_IS_LEAD(*pstr) ) { ++ unsigned char *str_end = str + str_len; + +- while ( !UTF8_IS_SINGLE(*pstr) && !U8_IS_LEAD(*pstr) ) { ++ while ( !U8_IS_SINGLE(*pstr) && !U8_IS_LEAD(*pstr) ) { + pstr++; + if ( pstr >= str_end ) { + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, +--- a/ext/intl/intl_convertcpp.h ++++ b/ext/intl/intl_convertcpp.h +@@ -26,6 +26,8 @@ + #include + #include + ++using icu::UnicodeString; ++ + int intl_stringFromChar(UnicodeString &ret, char *str, size_t str_len, UErrorCode *status); + + zend_string* intl_charFromString(const UnicodeString &from, UErrorCode *status); +--- a/ext/intl/msgformat/msgformat_helpers.cpp ++++ b/ext/intl/msgformat/msgformat_helpers.cpp +@@ -78,6 +78,16 @@ MessageFormatAdapter::getMessagePattern(MessageFormat* m) { + #endif + U_NAMESPACE_END + ++using icu::Formattable; ++using icu::Format; ++using icu::DateFormat; ++using icu::MessageFormat; ++#ifdef HAS_MESSAGE_PATTERN ++using icu::MessagePattern; ++#endif ++using icu::MessageFormatAdapter; ++using icu::FieldPosition; ++ + U_CFUNC int32_t umsg_format_arg_count(UMessageFormat *fmt) + { + int32_t fmt_count = 0; +@@ -229,15 +239,16 @@ static HashTable *umsg_parse_format(MessageFormatter_object *mfo, + UnicodeString typeString = mp.getSubstring(type_part); + /* This is all based on the rules in the docs for MessageFormat + * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html */ +- if (typeString == "number") { ++#define ASCII_LITERAL(s) UNICODE_STRING(s, sizeof(s)-1) ++ if (typeString == ASCII_LITERAL("number")) { + MessagePattern::Part style_part = mp.getPart(i + 1); /* Not advancing i */ + if (style_part.getType() == UMSGPAT_PART_TYPE_ARG_STYLE) { + UnicodeString styleString = mp.getSubstring(style_part); +- if (styleString == "integer") { ++ if (styleString == ASCII_LITERAL("integer")) { + type = Formattable::kInt64; +- } else if (styleString == "currency") { ++ } else if (styleString == ASCII_LITERAL("currency")) { + type = Formattable::kDouble; +- } else if (styleString == "percent") { ++ } else if (styleString == ASCII_LITERAL("percent")) { + type = Formattable::kDouble; + } else { /* some style invalid/unknown to us */ + type = Formattable::kDouble; +@@ -245,12 +256,13 @@ static HashTable *umsg_parse_format(MessageFormatter_object *mfo, + } else { // if missing style, part, make it a double + type = Formattable::kDouble; + } +- } else if ((typeString == "date") || (typeString == "time")) { ++ } else if ((typeString == ASCII_LITERAL("date")) || (typeString == ASCII_LITERAL("time"))) { + type = Formattable::kDate; +- } else if ((typeString == "spellout") || (typeString == "ordinal") +- || (typeString == "duration")) { ++ } else if ((typeString == ASCII_LITERAL("spellout")) || (typeString == ASCII_LITERAL("ordinal")) ++ || (typeString == ASCII_LITERAL("duration"))) { + type = Formattable::kDouble; + } ++#undef ASCII_LITERAL + } else { + /* If there's no UMSGPAT_PART_TYPE_ARG_TYPE right after a + * UMSGPAT_ARG_TYPE_SIMPLE argument, then the pattern +--- a/ext/intl/normalizer/normalizer_normalize.c ++++ b/ext/intl/normalizer/normalizer_normalize.c +@@ -24,6 +24,7 @@ + #include "normalizer_class.h" + #include "normalizer_normalize.h" + #include "intl_convert.h" ++#include + + /* {{{ proto string Normalizer::normalize( string $input [, string $form = FORM_C] ) + * Normalize a string. }}} */ +--- a/ext/intl/timezone/timezone_class.cpp ++++ b/ext/intl/timezone/timezone_class.cpp +@@ -37,6 +37,8 @@ extern "C" { + #include + } + ++using icu::Calendar; ++ + /* {{{ Global variables */ + U_CDECL_BEGIN + zend_class_entry *TimeZone_ce_ptr = NULL; +--- a/ext/intl/timezone/timezone_class.h ++++ b/ext/intl/timezone/timezone_class.h +@@ -29,6 +29,8 @@ + + #ifndef USE_TIMEZONE_POINTER + typedef void TimeZone; ++#else ++using icu::TimeZone; + #endif + + typedef struct { +--- a/ext/intl/timezone/timezone_methods.cpp ++++ b/ext/intl/timezone/timezone_methods.cpp +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + #include "intl_convertcpp.h" + + #include "../common/common_date.h" +@@ -37,6 +38,9 @@ extern "C" { + } + #include "common/common_enum.h" + ++using icu::Locale; ++using icu::Calendar; ++ + U_CFUNC PHP_METHOD(IntlTimeZone, __construct) + { + zend_throw_exception( NULL, +--- a/ext/intl/uchar/uchar.c ++++ b/ext/intl/uchar/uchar.c +@@ -3,6 +3,7 @@ + #include "intl_convert.h" + + #include ++#include + + #define IC_METHOD(mname) PHP_METHOD(IntlChar, mname) + +-- +2.19.2 + diff --git a/dev-lang/php/files/php-7.2.34-use-after-free-bug76047.patch b/dev-lang/php/files/php-7.2.34-use-after-free-bug76047.patch new file mode 100644 index 0000000..b3a864e --- /dev/null +++ b/dev-lang/php/files/php-7.2.34-use-after-free-bug76047.patch @@ -0,0 +1,174 @@ +Backport of https://git.php.net/?p=php-src.git;a=commit;h=ef1e4891b47949c8dc0f9482eef9454a0ecdfa1d + +--- a/Zend/tests/bug52361.phpt ++++ b/Zend/tests/bug52361.phpt +@@ -25,9 +25,8 @@ try { + --EXPECTF-- + 1. Exception: aaa in %sbug52361.php:5 + Stack trace: +-#0 %sbug52361.php(13): aaa->__destruct() +-#1 %sbug52361.php(16): bbb() +-#2 {main} ++#0 %sbug52361.php(16): aaa->__destruct() ++#1 {main} + 2. Exception: bbb in %sbug52361.php:13 + Stack trace: + #0 %sbug52361.php(16): bbb() +--- /dev/null ++++ b/Zend/tests/bug76047.phpt +@@ -0,0 +1,68 @@ ++--TEST-- ++Bug #76047: Use-after-free when accessing already destructed backtrace arguments ++--FILE-- ++a); ++ $backtrace = (new Exception)->getTrace(); ++ var_dump($backtrace); ++ } ++} ++ ++function test($arg) { ++ $arg = str_shuffle(str_repeat('A', 79)); ++ $vuln = new Vuln(); ++ $vuln->a = $arg; ++} ++ ++function test2($arg) { ++ $$arg = 1; // Trigger symbol table ++ $arg = str_shuffle(str_repeat('A', 79)); ++ $vuln = new Vuln(); ++ $vuln->a = $arg; ++} ++ ++test('x'); ++test2('x'); ++ ++?> ++--EXPECTF-- ++array(1) { ++ [0]=> ++ array(6) { ++ ["file"]=> ++ string(%d) "%s" ++ ["line"]=> ++ int(%d) ++ ["function"]=> ++ string(10) "__destruct" ++ ["class"]=> ++ string(4) "Vuln" ++ ["type"]=> ++ string(2) "->" ++ ["args"]=> ++ array(0) { ++ } ++ } ++} ++array(1) { ++ [0]=> ++ array(6) { ++ ["file"]=> ++ string(%d) "%s" ++ ["line"]=> ++ int(%d) ++ ["function"]=> ++ string(10) "__destruct" ++ ["class"]=> ++ string(4) "Vuln" ++ ["type"]=> ++ string(2) "->" ++ ["args"]=> ++ array(0) { ++ } ++ } ++} +--- a/Zend/zend_vm_def.h ++++ b/Zend/zend_vm_def.h +@@ -2366,9 +2366,9 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) + uint32_t call_info = EX_CALL_INFO(); + + if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) { ++ EG(current_execute_data) = EX(prev_execute_data); + i_free_compiled_variables(execute_data); + +- EG(current_execute_data) = EX(prev_execute_data); + if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) { + zend_object *object = Z_OBJ(execute_data->This); + #if 0 +@@ -2394,12 +2394,12 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) + LOAD_NEXT_OPLINE(); + ZEND_VM_LEAVE(); + } else if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP)) == 0)) { ++ EG(current_execute_data) = EX(prev_execute_data); + i_free_compiled_variables(execute_data); + + if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) { + zend_clean_and_cache_symbol_table(EX(symbol_table)); + } +- EG(current_execute_data) = EX(prev_execute_data); + + /* Free extra args before releasing the closure, + * as that may free the op_array. */ +@@ -2449,6 +2449,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) + ZEND_VM_LEAVE(); + } else { + if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) { ++ EG(current_execute_data) = EX(prev_execute_data); + i_free_compiled_variables(execute_data); + if (UNEXPECTED(call_info & (ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS))) { + if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) { +@@ -2456,7 +2457,6 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) + } + zend_vm_stack_free_extra_args_ex(call_info, execute_data); + } +- EG(current_execute_data) = EX(prev_execute_data); + if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { + OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype); + } +--- a/Zend/zend_vm_execute.h ++++ b/Zend/zend_vm_execute.h +@@ -434,9 +434,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_ + uint32_t call_info = EX_CALL_INFO(); + + if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) { ++ EG(current_execute_data) = EX(prev_execute_data); + i_free_compiled_variables(execute_data); + +- EG(current_execute_data) = EX(prev_execute_data); + if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) { + zend_object *object = Z_OBJ(execute_data->This); + #if 0 +@@ -462,12 +462,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_ + LOAD_NEXT_OPLINE(); + ZEND_VM_LEAVE(); + } else if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP)) == 0)) { ++ EG(current_execute_data) = EX(prev_execute_data); + i_free_compiled_variables(execute_data); + + if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) { + zend_clean_and_cache_symbol_table(EX(symbol_table)); + } +- EG(current_execute_data) = EX(prev_execute_data); + + /* Free extra args before releasing the closure, + * as that may free the op_array. */ +@@ -517,6 +517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_ + ZEND_VM_LEAVE(); + } else { + if (EXPECTED((call_info & ZEND_CALL_CODE) == 0)) { ++ EG(current_execute_data) = EX(prev_execute_data); + i_free_compiled_variables(execute_data); + if (UNEXPECTED(call_info & (ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS))) { + if (UNEXPECTED(call_info & ZEND_CALL_HAS_SYMBOL_TABLE)) { +@@ -524,7 +525,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_ + } + zend_vm_stack_free_extra_args_ex(call_info, execute_data); + } +- EG(current_execute_data) = EX(prev_execute_data); + if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { + OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype); + } + diff --git a/dev-lang/php/files/php-fpm_at-simple.service b/dev-lang/php/files/php-fpm_at-simple.service new file mode 100644 index 0000000..5f0482e --- /dev/null +++ b/dev-lang/php/files/php-fpm_at-simple.service @@ -0,0 +1,13 @@ +[Unit] +Description=The PHP FastCGI Process Manager +After=network.target + +[Service] +Type=simple +PIDFile=/run/php-fpm/php-fpm-%I.pid +ExecStart=/usr/libexec/php-fpm-launcher php%I -y /etc/php/fpm-php%I/php-fpm.conf --nodaemonize +ExecReload=/bin/kill -USR2 $MAINPID +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/dev-lang/php/files/php-fpm_at.service b/dev-lang/php/files/php-fpm_at.service new file mode 100644 index 0000000..152c1ab --- /dev/null +++ b/dev-lang/php/files/php-fpm_at.service @@ -0,0 +1,14 @@ +[Unit] +Description=The PHP FastCGI Process Manager +After=network.target + +[Service] +Type=notify +PIDFile=/run/php-fpm/php-fpm-%I.pid +ExecStart=/usr/libexec/php-fpm-launcher php%I -y /etc/php/fpm-php%I/php-fpm.conf --nodaemonize +ExecReload=/bin/kill -USR2 $MAINPID +PrivateTmp=true + +[Install] +WantedBy=multi-user.target + diff --git a/dev-lang/php/files/php-freetype-2.9.1.patch b/dev-lang/php/files/php-freetype-2.9.1.patch new file mode 100644 index 0000000..02dfd9c --- /dev/null +++ b/dev-lang/php/files/php-freetype-2.9.1.patch @@ -0,0 +1,233 @@ +--- a/ext/gd/config.m4 2018-04-24 11:09:54.000000000 -0400 ++++ b/ext/gd/config.m4 2018-05-04 15:18:49.867283889 -0400 +@@ -186,21 +186,36 @@ + AC_DEFUN([PHP_GD_FREETYPE2],[ + if test "$PHP_FREETYPE_DIR" != "no"; then + +- for i in $PHP_FREETYPE_DIR /usr/local /usr; do +- if test -f "$i/bin/freetype-config"; then +- FREETYPE2_DIR=$i +- FREETYPE2_CONFIG="$i/bin/freetype-config" +- break ++ AC_PATH_PROG(PKG_CONFIG, pkg-config, no) ++ AC_MSG_CHECKING(for freetype2) ++ ++ if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists freetype2 ; then ++ ++ FREETYPE2_CFLAGS=`$PKG_CONFIG --cflags freetype2` ++ FREETYPE2_LIBS=`$PKG_CONFIG --libs freetype2` ++ FREETYPE2_VERSION=`$PKG_CONFIG --modversion freetype2` ++ FREETYPE2_DIR="found" ++ ++ AC_MSG_RESULT(from pkgconfig: version $FREETYPE2_VERSION found) ++ else ++ ++ for i in $PHP_FREETYPE_DIR /usr/local /usr; do ++ if test -f "$i/bin/freetype-config"; then ++ FREETYPE2_DIR=$i ++ FREETYPE2_CONFIG="$i/bin/freetype-config" ++ break ++ fi ++ done ++ ++ if test -z "$FREETYPE2_DIR"; then ++ AC_MSG_ERROR([freetype-config not found.]) + fi +- done + +- if test -z "$FREETYPE2_DIR"; then +- AC_MSG_ERROR([freetype-config not found.]) ++ FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` ++ FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` ++ AC_MSG_RESULT(found via freetype-config) + fi + +- FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` +- FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` +- + PHP_EVAL_INCLINE($FREETYPE2_CFLAGS) + PHP_EVAL_LIBLINE($FREETYPE2_LIBS, GD_SHARED_LIBADD) + AC_DEFINE(HAVE_LIBFREETYPE,1,[ ]) +--- a/configure 2018-04-24 11:10:05.000000000 -0400 ++++ b/configure 2018-05-04 15:18:45.626367913 -0400 +@@ -34348,21 +34348,79 @@ + + if test "$PHP_FREETYPE_DIR" != "no"; then + +- for i in $PHP_FREETYPE_DIR /usr/local /usr; do +- if test -f "$i/bin/freetype-config"; then +- FREETYPE2_DIR=$i +- FREETYPE2_CONFIG="$i/bin/freetype-config" +- break ++ # Extract the first word of "pkg-config", so it can be a program name with args. ++set dummy pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" ++ ;; ++esac ++fi ++PKG_CONFIG=$ac_cv_path_PKG_CONFIG ++if test -n "$PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 ++$as_echo "$PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype2" >&5 ++$as_echo_n "checking for freetype2... " >&6; } ++ ++ ++ if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists freetype2 ; then ++ ++ FREETYPE2_CFLAGS=`$PKG_CONFIG --cflags freetype2` ++ FREETYPE2_LIBS=`$PKG_CONFIG --libs freetype2` ++ FREETYPE2_VERSION=`$PKG_CONFIG --modversion freetype2` ++ FREETYPE2_DIR="found" ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: from pkgconfig: version $FREETYPE2_VERSION found" >&5 ++$as_echo "from pkgconfig: version $FREETYPE2_VERSION found" >&6; } ++ else ++ ++ for i in $PHP_FREETYPE_DIR /usr/local /usr; do ++ if test -f "$i/bin/freetype-config"; then ++ FREETYPE2_DIR=$i ++ FREETYPE2_CONFIG="$i/bin/freetype-config" ++ break ++ fi ++ done ++ ++ if test -z "$FREETYPE2_DIR"; then ++ as_fn_error $? "freetype-config not found." "$LINENO" 5 + fi +- done + +- if test -z "$FREETYPE2_DIR"; then +- as_fn_error $? "freetype-config not found." "$LINENO" 5 ++ FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` ++ FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found via freetype-config" >&5 ++$as_echo "found via freetype-config" >&6; } + fi + +- FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` +- FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` +- + + for ac_i in $FREETYPE2_CFLAGS; do + case $ac_i in +@@ -36019,21 +36076,78 @@ + + if test "$PHP_FREETYPE_DIR" != "no"; then + +- for i in $PHP_FREETYPE_DIR /usr/local /usr; do +- if test -f "$i/bin/freetype-config"; then +- FREETYPE2_DIR=$i +- FREETYPE2_CONFIG="$i/bin/freetype-config" +- break ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype2" >&5 ++$as_echo_n "checking for freetype2... " >&6; } ++ # Extract the first word of "pkg-config", so it can be a program name with args. ++set dummy pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" ++ ;; ++esac ++fi ++PKG_CONFIG=$ac_cv_path_PKG_CONFIG ++if test -n "$PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 ++$as_echo "$PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++ ++ if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists freetype2 ; then ++ ++ FREETYPE2_CFLAGS=`$PKG_CONFIG --cflags freetype2` ++ FREETYPE2_LIBS=`$PKG_CONFIG --libs freetype2` ++ FREETYPE2_VERSION=`$PKG_CONFIG --modversion freetype2` ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: from pkgconfig: version $FREETYPE_VERSON found" >&5 ++$as_echo "from pkgconfig: version $FREETYPE_VERSON found" >&6; } ++ else ++ ++ for i in $PHP_FREETYPE_DIR /usr/local /usr; do ++ if test -f "$i/bin/freetype-config"; then ++ FREETYPE2_DIR=$i ++ FREETYPE2_CONFIG="$i/bin/freetype-config" ++ break ++ fi ++ done ++ ++ if test -z "$FREETYPE2_DIR"; then ++ as_fn_error $? "freetype-config not found." "$LINENO" 5 + fi +- done + +- if test -z "$FREETYPE2_DIR"; then +- as_fn_error $? "freetype-config not found." "$LINENO" 5 ++ FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` ++ FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found via freetype-config" >&5 ++$as_echo "found via freetype-config" >&6; } + fi + +- FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags` +- FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs` +- + + for ac_i in $FREETYPE2_CFLAGS; do + case $ac_i in diff --git a/dev-lang/php/files/php-iodbc-header-location.patch b/dev-lang/php/files/php-iodbc-header-location.patch new file mode 100644 index 0000000..e34f09b --- /dev/null +++ b/dev-lang/php/files/php-iodbc-header-location.patch @@ -0,0 +1,14 @@ +diff -aurN a/ext/pdo_odbc/config.m4 b/ext/pdo_odbc/config.m4 +--- a/ext/pdo_odbc/config.m4 2019-11-26 15:13:39.000000000 -0500 ++++ b/ext/pdo_odbc/config.m4 2019-12-06 10:39:56.296658492 -0500 +@@ -85,6 +85,10 @@ + PDO_ODBC_LIBDIR="$pdo_odbc_def_libdir" + fi + ++ if test "$pdo_odbc_def_lib" = "iodbc" ; then ++ PDO_ODBC_INCDIR="$PDO_ODBC_INCDIR/iodbc" ++ fi ++ + AC_MSG_RESULT([$pdo_odbc_flavour + libs $PDO_ODBC_LIBDIR, + headers $PDO_ODBC_INCDIR]) diff --git a/dev-lang/php/metadata.xml b/dev-lang/php/metadata.xml new file mode 100644 index 0000000..7f13fad --- /dev/null +++ b/dev-lang/php/metadata.xml @@ -0,0 +1,70 @@ + + + + + php-bugs@gentoo.org + PHP + + + mjo@gentoo.org + Michael Orlitzky + + + Enable password hashing algorithm from app-crypt/argon2 + Add support for libbcmath + Enable CLI SAPI + + Include gcov symbols for test coverage and lcov reports. Only + useful for extension developers, and requires GCC. + + Enable ctype functions + Enable embed SAPI + Add supports Enchant spelling library. + Add foreign function interface (ffi extension) support + Add fileinfo extension support + Add filter extension support + Add dbm support for flat files + Enable the FastCGI Process Manager SAPI + Adds support for gd (bundled with PHP) + Enable the hash extension + Add dbm support for .ini files + Enable PCRE JIT support + Enable JSON support + Add SASL support for the PHP LDAP extension + Enable support for dev-db/lmdb db backend + + Enables the intl extension for extended internalization support + + + Enables built-in opcode cache, replacing pecl-apc et al. + + Add support for process creation functions + Enable the bundled PDO extensions + + Enables the phar extension to provide phar archive support + + + Enable the PHP Debug Command Line SAPI (like gdb for php) + + + Include dev-libs/mm support for session storage + + Add support for shared memory use + Support for SimpleXML + + Enable support for crypto through dev-libs/libsodium + + + Support for System V-compatible inter-process communication + + Add support for the PHP file parser + + Enable support for dev-db/tokyocabinet db backend + Enable XMLReader support + Enable XMLWriter support + Enable the XSL extension + Add support for Web Distributed Data eXchange + Enable webp support for GD in php-7.x + Enable ZIP file encryption from dev-libs/libzip + + diff --git a/dev-lang/php/php-7.2.34-r2.ebuild b/dev-lang/php/php-7.2.34-r2.ebuild new file mode 100644 index 0000000..643a737 --- /dev/null +++ b/dev-lang/php/php-7.2.34-r2.ebuild @@ -0,0 +1,764 @@ +# Copyright 1999-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI="7" + +inherit flag-o-matic systemd autotools toolchain-funcs + +DESCRIPTION="The PHP language runtime engine" +HOMEPAGE="https://www.php.net/" +SRC_URI="https://www.php.net/distributions/${P}.tar.xz" + +LICENSE="PHP-3.01 + BSD + Zend-2.0 + bcmath? ( LGPL-2.1+ ) + fpm? ( BSD-2 ) + gd? ( gd ) + unicode? ( BSD-2 LGPL-2.1 )" + +SLOT="$(ver_cut 1-2)" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos" + +# We can build the following SAPIs in the given order +SAPIS="embed cli cgi fpm apache2 phpdbg" + +# SAPIs and SAPI-specific USE flags (cli SAPI is default on): +IUSE="${IUSE} + ${SAPIS/cli/+cli} + threads" + +IUSE="${IUSE} acl argon2 bcmath berkdb bzip2 calendar cdb cjk + coverage +ctype curl debug + enchant exif +fileinfo +filter firebird + +flatfile ftp gd gdbm gmp +hash +iconv imap inifile + intl iodbc ipv6 +json kerberos ldap ldap-sasl libedit libressl lmdb + mhash mssql mysql mysqli nls + oci8-instant-client odbc +opcache pcntl pdo +phar +posix postgres qdbm + readline recode selinux +session session-mm sharedmem + +simplexml snmp soap sockets sodium spell sqlite ssl + sysvipc systemd test tidy +tokenizer tokyocabinet truetype unicode wddx webp + +xml xmlreader xmlwriter xmlrpc xpm xslt zip zip-encryption zlib" + +# The supported (that is, autodetected) versions of BDB are listed in +# the ./configure script. Other versions *work*, but we need to stick to +# the ones that can be detected to avoid a repeat of bug #564824. +COMMON_DEPEND=" + >=app-eselect/eselect-php-0.9.1[apache2?,fpm?] + >=dev-libs/libpcre-8.32[unicode] + fpm? ( acl? ( sys-apps/acl ) ) + apache2? ( www-servers/apache[apache2_modules_unixd(+),threads=] ) + argon2? ( app-crypt/argon2:= ) + berkdb? ( || ( sys-libs/db:5.3 + sys-libs/db:5.1 + sys-libs/db:4.8 + sys-libs/db:4.7 + sys-libs/db:4.6 + sys-libs/db:4.5 ) ) + bzip2? ( app-arch/bzip2:0= ) + cdb? ( || ( dev-db/cdb dev-db/tinycdb ) ) + coverage? ( dev-util/lcov ) + curl? ( >=net-misc/curl-7.10.5 ) + enchant? ( =virtual/jpeg-0-r3:0 media-libs/libpng:0= sys-libs/zlib ) + gdbm? ( >=sys-libs/gdbm-1.8.0:0= ) + gmp? ( dev-libs/gmp:0= ) + iconv? ( virtual/libiconv ) + imap? ( >=virtual/imap-c-client-2[kerberos=,ssl=] ) + intl? ( dev-libs/icu:= ) + iodbc? ( dev-db/libiodbc ) + kerberos? ( virtual/krb5 ) + ldap? ( >=net-nds/openldap-1.2.11 ) + ldap-sasl? ( dev-libs/cyrus-sasl >=net-nds/openldap-1.2.11 ) + libedit? ( dev-libs/libedit ) + lmdb? ( dev-db/lmdb:= ) + mssql? ( dev-db/freetds[mssql] ) + nls? ( sys-devel/gettext ) + oci8-instant-client? ( dev-db/oracle-instantclient-basic ) + odbc? ( >=dev-db/unixODBC-1.8.13 ) + postgres? ( dev-db/postgresql:* ) + qdbm? ( dev-db/qdbm ) + readline? ( sys-libs/readline:0= ) + recode? ( app-text/recode:0= ) + session-mm? ( dev-libs/mm ) + simplexml? ( >=dev-libs/libxml2-2.6.8 ) + snmp? ( >=net-analyzer/net-snmp-5.2 ) + soap? ( >=dev-libs/libxml2-2.6.8 ) + sodium? ( dev-libs/libsodium:= ) + spell? ( >=app-text/aspell-0.50 ) + sqlite? ( >=dev-db/sqlite-3.7.6.3 ) + ssl? ( + !libressl? ( dev-libs/openssl:0= ) + libressl? ( dev-libs/libressl:0= ) + ) + tidy? ( || ( app-text/tidy-html5 app-text/htmltidy ) ) + tokyocabinet? ( dev-db/tokyocabinet ) + truetype? ( =media-libs/freetype-2* ) + unicode? ( dev-libs/oniguruma:= ) + wddx? ( >=dev-libs/libxml2-2.6.8 ) + webp? ( media-libs/libwebp:0= ) + xml? ( >=dev-libs/libxml2-2.6.8 ) + xmlrpc? ( >=dev-libs/libxml2-2.6.8 virtual/libiconv ) + xmlreader? ( >=dev-libs/libxml2-2.6.8 ) + xmlwriter? ( >=dev-libs/libxml2-2.6.8 ) + xpm? ( x11-libs/libXpm ) + xslt? ( dev-libs/libxslt >=dev-libs/libxml2-2.6.8 ) + zip? ( sys-libs/zlib:0= ) + zip-encryption? ( >=dev-libs/libzip-1.2.0:= ) + zlib? ( sys-libs/zlib:0= ) +" + +RDEPEND="${COMMON_DEPEND} + virtual/mta + fpm? ( + selinux? ( sec-policy/selinux-phpfpm ) + systemd? ( sys-apps/systemd ) )" + +# Bison isn't actually needed when building from a release tarball +# However, the configure script will warn if it's absent or if you +# have an incompatible version installed. See bug 593278. +DEPEND="${COMMON_DEPEND} + app-arch/xz-utils + >=sys-devel/bison-3.0.1" + +BDEPEND="virtual/pkgconfig" + +# Without USE=readline or libedit, the interactive "php -a" CLI will hang. +REQUIRED_USE=" + || ( cli cgi fpm apache2 embed phpdbg ) + cli? ( ^^ ( readline libedit ) ) + truetype? ( gd zlib ) + webp? ( gd zlib ) + cjk? ( gd zlib ) + exif? ( gd zlib ) + xpm? ( gd zlib ) + gd? ( zlib ) + simplexml? ( xml ) + soap? ( xml ) + wddx? ( xml ) + xmlrpc? ( || ( xml iconv ) ) + xmlreader? ( xml ) + xslt? ( xml ) + ldap-sasl? ( ldap ) + mhash? ( hash ) + phar? ( hash ) + qdbm? ( !gdbm ) + readline? ( !libedit ) + recode? ( !imap !mysqli !mysql ) + session-mm? ( session !threads ) + mysql? ( hash || ( mysqli pdo ) ) + mysqli? ( hash ) + zip-encryption? ( zip ) +" + +RESTRICT="!test? ( test )" + +PATCHES=( + "${FILESDIR}/php-freetype-2.9.1.patch" + "${FILESDIR}/php-7.2.13-intl-use-icu-namespace.patch" + "${FILESDIR}/php-7.2.34-use-after-free-bug76047.patch" +) + +PHP_MV="$(ver_cut 1)" + +php_install_ini() { + local phpsapi="${1}" + + # work out where we are installing the ini file + php_set_ini_dir "${phpsapi}" + + # Always install the production INI file, bug 611214. + local phpinisrc="php.ini-production-${phpsapi}" + cp php.ini-production "${phpinisrc}" || die + + # default to /tmp for save_path, bug #282768 + sed -e 's|^;session.save_path .*$|session.save_path = "'"${EPREFIX}"'/tmp"|g' -i "${phpinisrc}" || die + + # Set the extension dir + sed -e "s|^extension_dir .*$|extension_dir = ${extension_dir}|g" \ + -i "${phpinisrc}" || die + + # Set the include path to point to where we want to find PEAR packages + sed -e 's|^;include_path = ".:/php/includes".*|include_path = ".:'"${EPREFIX}"'/usr/share/php'${PHP_MV}':'"${EPREFIX}"'/usr/share/php"|' -i "${phpinisrc}" || die + + insinto "${PHP_INI_DIR#${EPREFIX}}" + newins "${phpinisrc}" php.ini + + elog "Installing php.ini for ${phpsapi} into ${PHP_INI_DIR#${EPREFIX}}" + elog + + dodir "${PHP_EXT_INI_DIR#${EPREFIX}}" + dodir "${PHP_EXT_INI_DIR_ACTIVE#${EPREFIX}}" + + if use opcache; then + elog "Adding opcache to $PHP_EXT_INI_DIR" + echo "zend_extension=${PHP_DESTDIR}/$(get_libdir)/opcache.so" >> \ + "${D}/${PHP_EXT_INI_DIR}"/opcache.ini + dosym "../ext/opcache.ini" \ + "${PHP_EXT_INI_DIR_ACTIVE#${EPREFIX}}/opcache.ini" + fi + + # SAPI-specific handling + if [[ "${sapi}" == "fpm" ]] ; then + einfo "Installing FPM config files php-fpm.conf and www.conf" + insinto "${PHP_INI_DIR#${EPREFIX}}" + doins sapi/fpm/php-fpm.conf + insinto "${PHP_INI_DIR#${EPREFIX}}/fpm.d" + doins sapi/fpm/www.conf + fi + + dodoc php.ini-{development,production} +} + +php_set_ini_dir() { + PHP_INI_DIR="${EPREFIX}/etc/php/${1}-php${SLOT}" + PHP_EXT_INI_DIR="${PHP_INI_DIR}/ext" + PHP_EXT_INI_DIR_ACTIVE="${PHP_INI_DIR}/ext-active" +} + +src_prepare() { + default + + # In php-7.x, the FPM pool configuration files have been split off + # of the main config. By default the pool config files go in + # e.g. /etc/php-fpm.d, which isn't slotted. So here we move the + # include directory to a subdirectory "fpm.d" of $PHP_INI_DIR. Later + # we'll install the pool configuration file "www.conf" there. + php_set_ini_dir fpm + sed -i "s~^include=.*$~include=${PHP_INI_DIR}/fpm.d/*.conf~" \ + sapi/fpm/php-fpm.conf.in \ + || die 'failed to move the include directory in php-fpm.conf' + + # Bug 669566 - necessary so that build tools are updated for commands like pecl + # Force rebuilding aclocal.m4 + rm -f aclocal.m4 || die "failed to remove aclocal.m4 in src_prepare" + eautoreconf +} + +src_configure() { + addpredict /usr/share/snmp/mibs/.index #nowarn + addpredict /var/lib/net-snmp/mib_indexes #nowarn + + # Fix building against >=ICU-68, https://bugs.php.net/80310 + append-cflags -DU_DEFINE_FALSE_AND_TRUE=1 + append-cxxflags -DU_DEFINE_FALSE_AND_TRUE=1 + + PHP_DESTDIR="${EPREFIX}/usr/$(get_libdir)/php${SLOT}" + + # The php-fpm config file wants localstatedir to be ${EPREFIX}/var + # and not the Gentoo default ${EPREFIX}/var/lib. See bug 572002. + local our_conf=( + --prefix="${PHP_DESTDIR}" + --mandir="${PHP_DESTDIR}/man" + --infodir="${PHP_DESTDIR}/info" + --libdir="${PHP_DESTDIR}/lib" + --with-libdir="$(get_libdir)" + --localstatedir="${EPREFIX}/var" + --without-pear + $(use_enable threads maintainer-zts) + ) + + our_conf+=( + $(use_with argon2 password-argon2 "${EPREFIX}/usr") + $(use_enable bcmath bcmath) + $(use_with bzip2 bz2 "${EPREFIX}/usr") + $(use_enable calendar calendar) + $(use_enable coverage gcov) + $(use_enable ctype ctype) + $(use_with curl curl "${EPREFIX}/usr") + $(use_enable xml dom) + $(use_with enchant enchant "${EPREFIX}/usr") + $(use_enable exif exif) + $(use_enable fileinfo fileinfo) + $(use_enable filter filter) + $(use_enable ftp ftp) + $(use_with nls gettext "${EPREFIX}/usr") + $(use_with gmp gmp "${EPREFIX}/usr") + $(use_enable hash hash) + $(use_with mhash mhash "${EPREFIX}/usr") + $(use_with iconv iconv \ + $(use elibc_glibc || use elibc_musl || use elibc_FreeBSD || echo "${EPREFIX}/usr")) + $(use_enable intl intl) + $(use_enable ipv6 ipv6) + $(use_enable json json) + $(use_with kerberos kerberos "${EPREFIX}/usr") + $(use_enable xml libxml) + $(use_with xml libxml-dir "${EPREFIX}/usr") + $(use_enable unicode mbstring) + $(use_with unicode onig "${EPREFIX}/usr") + $(use_with ssl openssl "${EPREFIX}/usr") + $(use_with ssl openssl-dir "${EPREFIX}/usr") + $(use_enable pcntl pcntl) + $(use_enable phar phar) + $(use_enable pdo pdo) + $(use_enable opcache opcache) + $(use_with postgres pgsql "${EPREFIX}/usr") + $(use_enable posix posix) + $(use_with spell pspell "${EPREFIX}/usr") + $(use_with recode recode "${EPREFIX}/usr") + $(use_enable simplexml simplexml) + $(use_enable sharedmem shmop) + $(use_with snmp snmp "${EPREFIX}/usr") + $(use_enable soap soap) + $(use_enable sockets sockets) + $(use_with sodium sodium "${EPREFIX}/usr") + $(use_with sqlite sqlite3 "${EPREFIX}/usr") + $(use_enable sysvipc sysvmsg) + $(use_enable sysvipc sysvsem) + $(use_enable sysvipc sysvshm) + $(use_with tidy tidy "${EPREFIX}/usr") + $(use_enable tokenizer tokenizer) + $(use_enable wddx wddx) + $(use_enable xml xml) + $(use_enable xmlreader xmlreader) + $(use_enable xmlwriter xmlwriter) + $(use_with xmlrpc xmlrpc) + $(use_with xslt xsl "${EPREFIX}/usr") + $(use_enable zip zip) + $(use_with zip-encryption libzip "${EPREFIX}/usr") + $(use_with zlib zlib "${EPREFIX}/usr") + $(use_enable debug debug) + ) + + # DBA support + if use cdb || use berkdb || use flatfile || use gdbm || use inifile \ + || use qdbm || use lmdb || use tokyocabinet ; then + our_conf+=( "--enable-dba${shared}" ) + fi + + # DBA drivers support + our_conf+=( + $(use_with cdb cdb) + $(use_with berkdb db4 "${EPREFIX}/usr") + $(use_enable flatfile flatfile) + $(use_with gdbm gdbm "${EPREFIX}/usr") + $(use_enable inifile inifile) + $(use_with qdbm qdbm "${EPREFIX}/usr") + $(use_with lmdb lmdb "${EPREFIX}/usr") + ) + + # Support for the GD graphics library + our_conf+=( + $(use_with truetype freetype-dir "${EPREFIX}/usr") + $(use_enable cjk gd-jis-conv) + $(use_with gd jpeg-dir "${EPREFIX}/usr") + $(use_with gd png-dir "${EPREFIX}/usr") + $(use_with xpm xpm-dir "${EPREFIX}/usr") + ) + if use webp; then + our_conf+=( --with-webp-dir="${EPREFIX}/usr" ) + fi + # enable gd last, so configure can pick up the previous settings + our_conf+=( $(use_with gd gd) ) + + # IMAP support + if use imap ; then + our_conf+=( + $(use_with imap imap "${EPREFIX}/usr") + $(use_with ssl imap-ssl "${EPREFIX}/usr") + ) + fi + + # Interbase/firebird support + our_conf+=( $(use_with firebird interbase "${EPREFIX}/usr") ) + + # LDAP support + if use ldap ; then + our_conf+=( + $(use_with ldap ldap "${EPREFIX}/usr") + $(use_with ldap-sasl ldap-sasl "${EPREFIX}/usr") + ) + fi + + # MySQL support + local mysqllib="mysqlnd" + local mysqlilib="mysqlnd" + + our_conf+=( $(use_with mysqli mysqli "${mysqlilib}") ) + + local mysqlsock="${EPREFIX}/var/run/mysqld/mysqld.sock" + if use mysql || use mysqli ; then + our_conf+=( $(use_with mysql mysql-sock "${mysqlsock}") ) + fi + + # ODBC support + our_conf+=( + $(use_with odbc unixODBC "${EPREFIX}/usr") + $(use_with iodbc iodbc "${EPREFIX}/usr") + ) + + # Oracle support + our_conf+=( $(use_with oci8-instant-client oci8) ) + + # PDO support + if use pdo ; then + our_conf+=( + $(use_with mssql pdo-dblib "${EPREFIX}/usr") + $(use_with mysql pdo-mysql "${mysqllib}") + $(use_with postgres pdo-pgsql) + $(use_with sqlite pdo-sqlite "${EPREFIX}/usr") + $(use_with firebird pdo-firebird "${EPREFIX}/usr") + $(use_with odbc pdo-odbc "unixODBC,${EPREFIX}/usr") + $(use_with oci8-instant-client pdo-oci) + ) + fi + + # readline/libedit support + our_conf+=( + $(use_with readline readline "${EPREFIX}/usr") + $(use_with libedit libedit "${EPREFIX}/usr") + ) + + # Session support + if use session ; then + our_conf+=( $(use_with session-mm mm "${EPREFIX}/usr") ) + else + our_conf+=( $(use_enable session session) ) + fi + + # Use pic for shared modules such as apache2's mod_php + our_conf+=( --with-pic ) + + # we use the system copy of pcre + # --with-pcre-regex affects ext/pcre + # --with-pcre-dir affects ext/filter and ext/zip + # --with-pcre-valgrind cannot be enabled with system pcre + # Many arches don't support pcre-jit + our_conf+=( + --with-pcre-regex="${EPREFIX}/usr" + --with-pcre-dir="${EPREFIX}/usr" + --without-pcre-valgrind + --without-pcre-jit + ) + + # Catch CFLAGS problems + # Fixes bug #14067. + # Changed order to run it in reverse for bug #32022 and #12021. + replace-cpu-flags "k6*" "i586" + + # Cache the ./configure test results between SAPIs. + our_conf+=( --cache-file="${T}/config.cache" ) + + # Support user-passed configuration parameters + our_conf+=( ${EXTRA_ECONF:-} ) + + # Support the Apache2 extras, they must be set globally for all + # SAPIs to work correctly, especially for external PHP extensions + + local one_sapi + local sapi + mkdir -p "${WORKDIR}/sapis-build" || die + for one_sapi in $SAPIS ; do + use "${one_sapi}" || continue + php_set_ini_dir "${one_sapi}" + + # The BUILD_DIR variable is used to determine where to output + # the files that autotools creates. This was all originally + # based on the autotools-utils eclass. + BUILD_DIR="${WORKDIR}/sapis-build/${one_sapi}" + cp -a "${S}" "${BUILD_DIR}" || die + cd "${BUILD_DIR}" || die + + local sapi_conf=( + --with-config-file-path="${PHP_INI_DIR}" + --with-config-file-scan-dir="${PHP_EXT_INI_DIR_ACTIVE}" + ) + + for sapi in $SAPIS ; do + case "$sapi" in + cli|cgi|embed|fpm|phpdbg) + if [[ "${one_sapi}" == "${sapi}" ]] ; then + sapi_conf+=( "--enable-${sapi}" ) + if [[ "fpm" == "${sapi}" ]] ; then + sapi_conf+=( + $(use_with acl fpm-acl) + $(use_with systemd fpm-systemd) + ) + fi + else + sapi_conf+=( "--disable-${sapi}" ) + fi + ;; + + apache2) + if [[ "${one_sapi}" == "${sapi}" ]] ; then + sapi_conf+=( --with-apxs2="${EPREFIX}/usr/bin/apxs" ) + else + sapi_conf+=( --without-apxs2 ) + fi + ;; + esac + done + + # Construct the $myeconfargs array by concatenating $our_conf + # (the common args) and $sapi_conf (the SAPI-specific args). + local myeconfargs=( "${our_conf[@]}" ) + myeconfargs+=( "${sapi_conf[@]}" ) + + pushd "${BUILD_DIR}" > /dev/null || die + econf "${myeconfargs[@]}" + popd > /dev/null || die + done +} + +src_compile() { + # snmp seems to run during src_compile, too (bug #324739) + addpredict /usr/share/snmp/mibs/.index #nowarn + addpredict /var/lib/net-snmp/mib_indexes #nowarn + + local sapi + for sapi in ${SAPIS} ; do + if use "${sapi}"; then + cd "${WORKDIR}/sapis-build/$sapi" || \ + die "Failed to change dir to ${WORKDIR}/sapis-build/$1" + emake + fi + done +} + +src_install() { + # see bug #324739 for what happens when we don't have that + addpredict /usr/share/snmp/mibs/.index #nowarn + + # grab the first SAPI that got built and install common files from there + local first_sapi="",sapi="" + for sapi in $SAPIS ; do + if use $sapi ; then + first_sapi=$sapi + break + fi + done + + # Makefile forgets to create this before trying to write to it... + dodir "${PHP_DESTDIR#${EPREFIX}}/bin" + + # Install php environment (without any sapis) + cd "${WORKDIR}/sapis-build/$first_sapi" || die + emake INSTALL_ROOT="${D}" \ + install-build install-headers install-programs + + local extension_dir="$("${ED}/${PHP_DESTDIR#${EPREFIX}}/bin/php-config" --extension-dir)" + + # Create the directory where we'll put version-specific php scripts + keepdir "/usr/share/php${PHP_MV}" + + local file="" + local sapi_list="" + + for sapi in ${SAPIS}; do + if use "${sapi}" ; then + einfo "Installing SAPI: ${sapi}" + cd "${WORKDIR}/sapis-build/${sapi}" || die + + if [[ "${sapi}" == "apache2" ]] ; then + # We're specifically not using emake install-sapi as libtool + # may cause unnecessary relink failures (see bug #351266) + insinto "${PHP_DESTDIR#${EPREFIX}}/apache2/" + newins ".libs/libphp${PHP_MV}$(get_libname)" \ + "libphp${PHP_MV}$(get_libname)" + keepdir "/usr/$(get_libdir)/apache2/modules" + else + # needed each time, php_install_ini would reset it + local dest="${PHP_DESTDIR#${EPREFIX}}" + into "${dest}" + case "$sapi" in + cli) + source="sapi/cli/php" + # Install the "phar" archive utility. + if use phar ; then + emake INSTALL_ROOT="${D}" install-pharcmd + dosym "..${dest#/usr}/bin/phar" "/usr/bin/phar${SLOT}" + fi + ;; + cgi) + source="sapi/cgi/php-cgi" + ;; + fpm) + source="sapi/fpm/php-fpm" + ;; + embed) + source="libs/libphp${PHP_MV}$(get_libname)" + ;; + phpdbg) + source="sapi/phpdbg/phpdbg" + ;; + *) + die "unhandled sapi in src_install" + ;; + esac + + if [[ "${source}" == *"$(get_libname)" ]]; then + dolib.so "${source}" + else + dobin "${source}" + local name="$(basename ${source})" + dosym "..${dest#/usr}/bin/${name}" "/usr/bin/${name}${SLOT}" + fi + fi + + php_install_ini "${sapi}" + + # construct correct SAPI string for php-config + # thanks to ferringb for the bash voodoo + if [[ "${sapi}" == "apache2" ]]; then + sapi_list="${sapi_list:+${sapi_list} }apache2handler" + else + sapi_list="${sapi_list:+${sapi_list} }${sapi}" + fi + fi + done + + # Installing opcache module + if use opcache ; then + into "${PHP_DESTDIR#${EPREFIX}}" + dolib.so "modules/opcache$(get_libname)" + fi + + # Install env.d files + newenvd "${FILESDIR}/20php5-envd" "20php${SLOT}" + sed -e "s|/lib/|/$(get_libdir)/|g" -i "${ED}/etc/env.d/20php${SLOT}" || die + sed -e "s|php5|php${SLOT}|g" -i "${ED}/etc/env.d/20php${SLOT}" || die + + # set php-config variable correctly (bug #278439) + sed -e "s:^\(php_sapis=\)\".*\"$:\1\"${sapi_list}\":" -i \ + "${ED}/usr/$(get_libdir)/php${SLOT}/bin/php-config" || die + + if use fpm ; then + if use systemd; then + systemd_newunit "${FILESDIR}/php-fpm_at.service" \ + "php-fpm@${SLOT}.service" + else + systemd_newunit "${FILESDIR}/php-fpm_at-simple.service" \ + "php-fpm@${SLOT}.service" + fi + fi +} + +src_test() { + echo ">>> Test phase [test]: ${CATEGORY}/${PF}" + PHP_BIN="${WORKDIR}/sapis-build/cli/sapi/cli/php" + if [[ ! -x "${PHP_BIN}" ]] ; then + ewarn "Test phase requires USE=cli, skipping" + return + else + export TEST_PHP_EXECUTABLE="${PHP_BIN}" + fi + + if [[ -x "${WORKDIR}/sapis-build/cgi/sapi/cgi/php-cgi" ]] ; then + export TEST_PHP_CGI_EXECUTABLE="${WORKDIR}/sapis-build/cgi/sapi/cgi/php-cgi" + fi + + if [[ -x "${WORKDIR}/sapis-build/phpdbg/sapi/phpdbg/phpdbg" ]] ; then + export TEST_PHPDBG_EXECUTABLE="${WORKDIR}/sapis-build/phpdbg/sapi/phpdbg/phpdbg" + fi + + REPORT_EXIT_STATUS=1 "${TEST_PHP_EXECUTABLE}" -n -d \ + "session.save_path=${T}" \ + "${WORKDIR}/sapis-build/cli/run-tests.php" -n -q -d \ + "session.save_path=${T}" + + for name in ${EXPECTED_TEST_FAILURES}; do + mv "${name}.out" "${name}.out.orig" 2>/dev/null || die + done + + local failed="$(find -name '*.out')" + if [[ ${failed} != "" ]] ; then + ewarn "The following test cases failed unexpectedly:" + for name in ${failed}; do + ewarn " ${name/.out/}" + done + else + einfo "No unexpected test failures, all fine" + fi + + if [[ ${PHP_SHOW_UNEXPECTED_TEST_PASS} == "1" ]] ; then + local passed="" + for name in ${EXPECTED_TEST_FAILURES}; do + [[ -f "${name}.diff" ]] && continue + passed="${passed} ${name}" + done + if [[ ${passed} != "" ]] ; then + einfo "The following test cases passed unexpectedly:" + for name in ${passed}; do + ewarn " ${passed}" + done + else + einfo "None of the known-to-fail tests passed, all fine" + fi + fi +} + +pkg_postinst() { + # Output some general info to the user + if use apache2 ; then + elog + elog "To enable PHP in apache, you will need to add \"-D PHP\" to" + elog "your apache2 command. OpenRC users can append that string to" + elog "APACHE2_OPTS in /etc/conf.d/apache2." + elog + elog "The apache module configuration file 70_mod_php.conf is" + elog "provided (and maintained) by eselect-php." + elog + fi + + # Create the symlinks for php + local m + for m in ${SAPIS}; do + [[ ${m} == 'embed' ]] && continue; + if use $m ; then + local ci=$(eselect php show $m) + if [[ -z $ci ]]; then + eselect php set $m php${SLOT} || die + einfo "Switched ${m} to use php:${SLOT}" + einfo + elif [[ $ci != "php${SLOT}" ]] ; then + elog "To switch $m to use php:${SLOT}, run" + elog " eselect php set $m php${SLOT}" + elog + fi + fi + done + + # Remove dead symlinks for SAPIs that were just disabled. For + # example, if the user has the cgi SAPI enabled, then he has an + # eselect-php symlink for it. If he later reinstalls PHP with + # USE="-cgi", that symlink will break. This call to eselect is + # supposed to remove that dead link per bug 572436. + eselect php cleanup || die + + if ! has "php${SLOT/./-}" ${PHP_TARGETS}; then + elog "To build extensions for this version of PHP, you will need to" + elog "add php${SLOT/./-} to your PHP_TARGETS USE_EXPAND variable." + elog + fi + + # Warn about the removal of PHP_INI_VERSION if the user has it set. + if [[ -n "${PHP_INI_VERSION}" ]]; then + ewarn 'The PHP_INI_VERSION variable has been phased out. You may' + ewarn 'remove it from your configuration at your convenience. See' + ewarn + ewarn ' https://bugs.gentoo.org/611214' + ewarn + ewarn 'for more information.' + fi + + elog "For details on how version slotting works, please see" + elog "the wiki:" + elog + elog " https://wiki.gentoo.org/wiki/PHP" + elog +} + +pkg_postrm() { + # This serves two purposes. First, if we have just removed the last + # installed version of PHP, then this will remove any dead symlinks + # belonging to eselect-php. Second, if a user upgrades slots from + # (say) 5.6 to 7.0 and depcleans the old slot, then this will update + # his existing symlinks to point to the new 7.0 installation. The + # latter is bug 432962. + # + # Note: the eselect-php package may not be installed at this point, + # so we can't die() if this command fails. + eselect php cleanup +}