From 0b99ab2119db5b45214a04103075ae1033dcc121 Mon Sep 17 00:00:00 2001 From: soheil khaledabadi Date: Fri, 5 Jun 2026 19:18:31 +0330 Subject: [PATCH] feat(docker): update Docker configuration for Arvan Cloud registry and add API documentation generation --- Dockerfile | 30 +- docker-compose.yml | 4 + docker/apt/configure-arvan-mirror.sh | 16 + docker/daemon.json.example | 3 + docker/entrypoint.sh | 5 + docker/php/install-php-extensions | 5736 ++++++++++++++++++++ resources/views/vendor/l5-swagger/.gitkeep | 0 7 files changed, 5785 insertions(+), 9 deletions(-) create mode 100644 docker/apt/configure-arvan-mirror.sh create mode 100644 docker/daemon.json.example create mode 100755 docker/php/install-php-extensions create mode 100644 resources/views/vendor/l5-swagger/.gitkeep diff --git a/Dockerfile b/Dockerfile index 07d4986..151e3f8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,13 @@ -# syntax=docker/dockerfile:1.7 +# syntax=docker.arvancloud.ir/docker/dockerfile:1.7 +ARG DOCKER_REGISTRY=docker.arvancloud.ir ARG PHP_VERSION=8.4 -FROM composer:2 AS composer - -FROM node:24-alpine AS assets +FROM ${DOCKER_REGISTRY}/node:24-alpine AS assets WORKDIR /app +RUN sed -i 's|https://dl-cdn.alpinelinux.org|https://mirror.arvancloud.ir/alpine|g' /etc/apk/repositories + COPY package.json package-lock.json ./ RUN npm ci @@ -15,14 +16,20 @@ COPY public ./public COPY vite.config.js ./ RUN npm run build -FROM php:${PHP_VERSION}-fpm-bookworm AS app +ARG DOCKER_REGISTRY +ARG PHP_VERSION +FROM ${DOCKER_REGISTRY}/php:${PHP_VERSION}-fpm-bookworm AS app WORKDIR /var/www/html ENV COMPOSER_ALLOW_SUPERUSER=1 -ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/install-php-extensions +COPY docker/php/install-php-extensions /usr/local/bin/install-php-extensions +COPY docker/apt/configure-arvan-mirror.sh /tmp/configure-arvan-mirror.sh -RUN apt-get update \ +RUN chmod +x /tmp/configure-arvan-mirror.sh \ + && /tmp/configure-arvan-mirror.sh \ + && rm /tmp/configure-arvan-mirror.sh \ + && apt-get -o Acquire::Check-Valid-Until=false update \ && apt-get install -y --no-install-recommends \ curl \ default-mysql-client \ @@ -38,12 +45,12 @@ RUN apt-get update \ xml \ xmlreader \ zip \ + && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ && apt-get purge -y --auto-remove \ && rm -rf /var/lib/apt/lists/* COPY docker/php/php.ini /usr/local/etc/php/conf.d/99-production.ini COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/99-opcache.ini -COPY --from=composer /usr/bin/composer /usr/bin/composer COPY composer.json composer.lock ./ RUN composer install \ @@ -59,12 +66,14 @@ COPY --from=assets /app/public/build ./public/build RUN composer dump-autoload --no-dev --optimize --no-scripts \ && php artisan package:discover --ansi \ + && APP_KEY=base64:dGVtcG9yYXJ5a2V5Zm9yZG9ja2VyYnVpbGRvbmx5= php artisan l5-swagger:generate --no-interaction \ && mkdir -p \ storage/app/public \ storage/framework/cache/data \ storage/framework/sessions \ storage/framework/views \ storage/logs \ + storage/api-docs \ bootstrap/cache \ && rm -rf public/storage \ && ln -s ../storage/app/public public/storage \ @@ -78,7 +87,10 @@ EXPOSE 9000 ENTRYPOINT ["docker-entrypoint"] CMD ["php-fpm"] -FROM nginx:1.27-alpine AS nginx +ARG DOCKER_REGISTRY +FROM ${DOCKER_REGISTRY}/nginx:1.27-alpine AS nginx + +RUN sed -i 's|https://dl-cdn.alpinelinux.org|https://mirror.arvancloud.ir/alpine|g' /etc/apk/repositories COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf COPY --from=app /var/www/html/public /var/www/html/public diff --git a/docker-compose.yml b/docker-compose.yml index 59ff9bd..bd457be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,8 @@ services: build: context: . target: app + args: + DOCKER_REGISTRY: docker.arvancloud.ir image: hoshpoint-backend-app:production restart: unless-stopped env_file: @@ -25,6 +27,8 @@ services: build: context: . target: nginx + args: + DOCKER_REGISTRY: docker.arvancloud.ir image: hoshpoint-backend-nginx:production restart: unless-stopped depends_on: diff --git a/docker/apt/configure-arvan-mirror.sh b/docker/apt/configure-arvan-mirror.sh new file mode 100644 index 0000000..4e06bb9 --- /dev/null +++ b/docker/apt/configure-arvan-mirror.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env sh +set -eu + +sources="/etc/apt/sources.list.d/debian.sources" + +if [ ! -f "$sources" ]; then + exit 0 +fi + +sed -i \ + -e 's|https\?://deb\.debian\.org/debian|http://mirror.arvancloud.ir/debian|g' \ + -e 's|https\?://security\.debian\.org/debian-security|http://mirror.arvancloud.ir/debian|g' \ + -e 's| bookworm-updates||g' \ + "$sources" + +sed -i '/mirror\.arvancloud\.ir\/debian-security/d' "$sources" diff --git a/docker/daemon.json.example b/docker/daemon.json.example new file mode 100644 index 0000000..445ceb2 --- /dev/null +++ b/docker/daemon.json.example @@ -0,0 +1,3 @@ +{ + "registry-mirrors": ["https://docker.arvancloud.ir"] +} diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 4dc0dda..baa4dbc 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -7,6 +7,7 @@ mkdir -p \ storage/framework/sessions \ storage/framework/views \ storage/logs \ + storage/api-docs \ bootstrap/cache if [ ! -L public/storage ]; then @@ -25,6 +26,10 @@ if [ -z "${APP_KEY:-}" ]; then fi if [ "${APP_ENV:-production}" = "production" ]; then + if php artisan list --raw 2>/dev/null | grep -q '^l5-swagger:generate'; then + php artisan l5-swagger:generate --no-interaction + fi + php artisan config:cache --no-interaction php artisan event:cache --no-interaction php artisan view:cache --no-interaction diff --git a/docker/php/install-php-extensions b/docker/php/install-php-extensions new file mode 100755 index 0000000..8c3f8eb --- /dev/null +++ b/docker/php/install-php-extensions @@ -0,0 +1,5736 @@ +#!/bin/sh + +# This script wraps docker-php-ext-install, properly configuring the system. +# +# Copyright (c) Michele Locati, 2018-2023 +# +# Source: https://github.com/mlocati/docker-php-extension-installer +# +# License: MIT - see https://github.com/mlocati/docker-php-extension-installer/blob/master/LICENSE + +# Let's set a sane environment +set -o errexit +set -o nounset + +if test "${IPE_DEBUG:-}" = "1"; then + set -x +fi + +if ! which docker-php-ext-configure >/dev/null || ! which docker-php-ext-enable >/dev/null || ! which docker-php-ext-install >/dev/null || ! which docker-php-source >/dev/null; then + printf 'The script %s is meant to be used with official Docker PHP Images - https://hub.docker.com/_/php\n' "$0" >&2 + exit 1 +fi + +IPE_VERSION=2.11.1 + +StandWithUkraine() { + if test -t 1 && ! grep -Eq '^VERSION=.*jessie' /etc/os-release; then + printf '\e[37;44m#StandWith\e[30;43mUkraine\e[0m\n' + else + printf '#StandWithUkraine\n' + fi +} + +if test "$IPE_VERSION" = master && test "${CI:-}" != true; then + cat <&2 + exit 1 + fi + DISTRO="$(cat /etc/os-release | grep -E ^ID= | cut -d = -f 2)" + DISTRO_VERSION_NUMBER="$(cat /etc/os-release | grep -E ^VERSION_ID= | cut -d = -f 2 | cut -d '"' -f 2 | cut -d . -f 1,2)" + DISTRO_VERSION="$(printf '%s@%s' $DISTRO $DISTRO_VERSION_NUMBER)" + DISTRO_MAJMIN_VERSION="$(echo "$DISTRO_VERSION_NUMBER" | awk -F. '{print $1*100+$2}')" +} + +# Set: +# - PHP_MAJMIN_VERSION: Major-Minor version, format MMmm (example 800 for PHP 8.0.1) +# - PHP_MAJDOTMIN_VERSION: Major-Minor version, format M.m (example 8.0 for PHP 8.0.1) +# - PHP_MAJMINPAT_VERSION: Major-Minor-Patch version, format MMmmpp (example 80001 for PHP 8.0.1) variables containing integers value +# - PHP_MAJDOTMINDOTPAT_VERSION: Major-Minor-Patch version, format M.m.p (example 8.0.1 for PHP 8.0.1) +# - PHP_THREADSAFE: 1 if PHP is thread-safe (TS), 0 if not thread-safe (NTS) +# - PHP_DEBUGBUILD: 1 if PHP is debug build (configured with "--enable-debug"), 0 otherwise +# - PHP_BITS: 32 if PHP is compiled for 32-bit, 64 if 64-bit +# - PHP_EXTDIR: the absolute path where the PHP extensions reside +setPHPVersionVariables() { + PHP_MAJDOTMINDOTPAT_VERSION="$(php-config --version)" + PHP_MAJMIN_VERSION=$(printf '%s' "$PHP_MAJDOTMINDOTPAT_VERSION" | awk -F. '{print $1*100+$2}') + PHP_MAJDOTMIN_VERSION=$(printf '%s' "$PHP_MAJDOTMINDOTPAT_VERSION" | cut -d. -f1-2) + PHP_MAJMINPAT_VERSION=$(printf '%s' "$PHP_MAJDOTMINDOTPAT_VERSION" | awk -F. '{print $1*10000+$2*100+$3}') + PHP_THREADSAFE=$(php -n -r 'echo ZEND_THREAD_SAFE ? 1 : 0;') + PHP_DEBUGBUILD=$(php -n -r 'echo ZEND_DEBUG_BUILD ? 1 : 0;') + PHP_BITS=$(php -n -r 'echo PHP_INT_SIZE * 8;') + PHP_EXTDIR="$(php -d display_errors=stderr -r 'echo realpath(ini_get("extension_dir"));')" +} + +# Fix apt-get being very slow on Debian Jessie +# See https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1332440 +fixMaxOpenFiles() { + fixMaxOpenFiles_cur=$(ulimit -n 2>/dev/null || echo 0) + if test "$fixMaxOpenFiles_cur" -gt 10000; then + ulimit -n 10000 + fi +} + +# Get the directory containing the compiled PHP extensions +# +# Output: +# The absolute path of the extensions dir +getPHPExtensionsDir() { + php -i | grep -E '^extension_dir' | head -n1 | tr -s '[:space:]*=>[:space:]*' '|' | cut -d'|' -f2 +} + +# Normalize the name of a PHP extension +# +# Arguments: +# $1: the name of the module to be normalized +# +# Output: +# The normalized module name +normalizePHPModuleName() { + normalizePHPModuleName_name="$1" + case "$normalizePHPModuleName_name" in + *A* | *B* | *C* | *D* | *E* | *F* | *G* | *H* | *I* | *J* | *K* | *L* | *M* | *N* | *O* | *P* | *Q* | *R* | *S* | *T* | *U* | *V* | *W* | *X* | *Y* | *Z*) + normalizePHPModuleName_name="$(LC_CTYPE=C printf '%s' "$normalizePHPModuleName_name" | tr '[:upper:]' '[:lower:]')" + ;; + esac + case "$normalizePHPModuleName_name" in + datadog_trace) + normalizePHPModuleName_name=ddtrace + ;; + ioncube | ioncube\ loader) + normalizePHPModuleName_name='ioncube_loader' + ;; + pecl_http) + normalizePHPModuleName_name='http' + ;; + zend\ opcache) + normalizePHPModuleName_name='opcache' + ;; + libsodium) + if test $PHP_MAJMIN_VERSION -ge 700; then + normalizePHPModuleName_name='sodium' + fi + ;; + saxonc) + normalizePHPModuleName_name=saxon + ;; + sodium) + if test $PHP_MAJMIN_VERSION -lt 700; then + normalizePHPModuleName_name='libsodium' + fi + ;; + *\ *) + printf '### WARNING Unrecognized module name: %s ###\n' "$1" >&2 + ;; + esac + printf '%s' "$normalizePHPModuleName_name" +} + +# Get the PECL name of PHP extension +# +# Arguments: +# $1: the name of the extension +# +# Output: +# The PECL name of the extension +getPeclModuleName() { + normalizePHPModuleName_name="$1" + case "$normalizePHPModuleName_name" in + ddtrace) + normalizePHPModuleName_name=datadog_trace + ;; + http) + normalizePHPModuleName_name=pecl_http + ;; + sodium) + normalizePHPModuleName_name=libsodium + ;; + esac + printf '%s' "$normalizePHPModuleName_name" +} + +# Parse a package.xml (or package2.xml) file and extract the module name and version +# +# Arguments: +# $1: the patho to the XML file +# +# Set these variables: +# - EXTRACTPACKAGEVERSIONFROMXML_NAME +# - EXTRACTPACKAGEVERSIONFROMXML_VERSION +# +# Output: +# Nothing +# +# Return: +# 0 (true): if the string is in the list +# 1 (false): if the string is not in the list +extractPackageVersionFromXML() { + if ! test -f "$1"; then + printf 'Unable to find the file\n%s\n' >&2 + return 1 + fi + extractPackageVersionFromXML_code="$( + cat <<'EOT' +$doc = new DOMDocument(); +if (!$doc->load($argv[1])) { + fwrite(STDERR, "Failed to load XML file\n"); + exit(1); +} +set_error_handler( + static function($errno, $errstr) { + fwrite(STDERR, trim((string) $errstr) . "\n"); + exit(1); + }, + -1 +); +$xpath = new DOMXpath($doc); +$xpath->registerNamespace('v20', 'http://pear.php.net/dtd/package-2.0'); +$xpath->registerNamespace('v21', 'http://pear.php.net/dtd/package-2.1'); +if ($xpath->query('/v20:package/v20:dependencies')->length === 1) { + $ns = 'v20:'; +} elseif ($xpath->query('/v21:package/v21:dependencies')->length === 1) { + $ns = 'v21:'; +} elseif ($xpath->query('/package')->length === 1) { + $ns = ''; +} else { + fwrite(STDERR, "Unsupported namespace of the XML of package version details\n"); + exit(1); +} +$nodes = $xpath->query("/{$ns}package/{$ns}name"); +$name = trim((string) $nodes[0]->nodeValue); +$nodes = $xpath->query("/{$ns}package/{$ns}version/{$ns}release"); +if ($nodes->length === 0) { + $nodes = $xpath->query("/{$ns}package/{$ns}release/{$ns}version"); + if ($nodes->length === 0) { + $nodes = $xpath->query("/{$ns}package/{$ns}version"); + if ($nodes->length === 0) { + fwrite(STDERR, "Unable to find the version in the XML of package version details\n"); + exit(1); + } + } +} +$version = trim((string) $nodes[0]->nodeValue); +echo "EXTRACTPACKAGEVERSIONFROMXML_NAME='{$name}'\n"; +echo "EXTRACTPACKAGEVERSIONFROMXML_VERSION='{$version}'\n"; +exit(0); +EOT + )" + extractPackageVersionFromXML_vars="$(php -n -d display_errors=stderr -r "$extractPackageVersionFromXML_code" "$1")" + if test -z "$extractPackageVersionFromXML_vars"; then + return 1 + fi + eval "$extractPackageVersionFromXML_vars" + return 0 +} + +# Parse a module name (and optionally version) as received via command arguments, extracting the version and normalizing it +# Examples: +# xdebug-2.9.8 +# xdebug-^2 +# xdebug-^2.9 +# +# Arguments: +# $1: the name of the module to be normalized +# +# Set these variables: +# - PROCESSED_PHP_MODULE_ARGUMENT +# +# Update these variables: +# - FORCED_REMOTE_MODULES +# +# Optionally set these variables: +# - PHP_WANTEDMODULEVERSION_<...> (where <...> is the normalized module name) +# - PHP_MODULESOURCECODEPATH_<...> (where <...> is the normalized module name) +# +# Output: +# Nothing +processPHPModuleArgument() { + processPHPModuleArgument_arg="$1" + # Convert GitHub short form to long url, + # for example: from + # php-memcached-dev/php-memcached@8f106564e6bb005ca6100b12ccc89000daafa9d8 + # to + # https://codeload.github.com/php-memcached-dev/php-memcached/tar.gz/8f106564e6bb005ca6100b12ccc89000daafa9d8 + processPHPModuleArgument_arg="$(printf '%s' "$processPHPModuleArgument_arg" | sed -E 's/^([a-zA-Z0-9_.\-]+\/[a-zA-Z0-9_.\-]+)@(.+$)/https:\/\/codeload.github.com\/\1\/tar.gz\/\2/')" + # Let's check if $processPHPModuleArgument_arg is an URL + if printf '%s' "$processPHPModuleArgument_arg" | grep -Eq '^https?://[^ ]+/[^ ]+$'; then + printf 'Downloading source from %s\n' "$processPHPModuleArgument_arg" + processPHPModuleArgument_arg="$(getPackageSource "$processPHPModuleArgument_arg")" + fi + # Let's check if $processPHPModuleArgument_arg the absolute path of an existing directory + if test "$processPHPModuleArgument_arg" != "${processPHPModuleArgument_arg#/}" && test -d "$processPHPModuleArgument_arg"; then + if test -f "$processPHPModuleArgument_arg/package2.xml"; then + printf 'Checking package2.xml of directory %s... ' "$processPHPModuleArgument_arg" + if ! extractPackageVersionFromXML "$processPHPModuleArgument_arg/package2.xml"; then + return 1 + fi + elif test -f "$processPHPModuleArgument_arg/package.xml"; then + printf 'Checking package.xml of directory %s... ' "$processPHPModuleArgument_arg" + if ! extractPackageVersionFromXML "$processPHPModuleArgument_arg/package.xml"; then + return 1 + fi + else + printf 'Unable to find the package.xml file in the directory\n%s\n' "$processPHPModuleArgument_arg" + return 1 + fi + printf 'good (name: %s, version: %s)\n' "$EXTRACTPACKAGEVERSIONFROMXML_NAME" "$EXTRACTPACKAGEVERSIONFROMXML_VERSION" + PROCESSED_PHP_MODULE_ARGUMENT="$(normalizePHPModuleName "$EXTRACTPACKAGEVERSIONFROMXML_NAME")" + processPHPModuleArgument_version="$EXTRACTPACKAGEVERSIONFROMXML_VERSION" + if printf '%s' "$PROCESSED_PHP_MODULE_ARGUMENT" | grep -Eq '^[a-zA-Z0-9_]+$'; then + eval PHP_MODULESOURCECODEPATH_$PROCESSED_PHP_MODULE_ARGUMENT="$processPHPModuleArgument_arg" + else + printf 'Unable to parse the following module name:\n%s\n' "$PROCESSED_PHP_MODULE_ARGUMENT" >&2 + exit 1 + fi + else + PROCESSED_PHP_MODULE_ARGUMENT="${processPHPModuleArgument_arg%%-*}" + if test -n "$PROCESSED_PHP_MODULE_ARGUMENT" && test "$PROCESSED_PHP_MODULE_ARGUMENT" != "$processPHPModuleArgument_arg"; then + processPHPModuleArgument_version="${processPHPModuleArgument_arg#*-}" + else + processPHPModuleArgument_version='' + fi + PROCESSED_PHP_MODULE_ARGUMENT="$(normalizePHPModuleName "$PROCESSED_PHP_MODULE_ARGUMENT")" + fi + if test -n "$processPHPModuleArgument_version"; then + FORCED_REMOTE_MODULES="${FORCED_REMOTE_MODULES:+$FORCED_REMOTE_MODULES }$PROCESSED_PHP_MODULE_ARGUMENT" + if printf '%s' "$PROCESSED_PHP_MODULE_ARGUMENT" | grep -Eq '^[a-zA-Z0-9_]+$'; then + eval PHP_WANTEDMODULEVERSION_$PROCESSED_PHP_MODULE_ARGUMENT="$processPHPModuleArgument_version" + elif printf '%s' "$PROCESSED_PHP_MODULE_ARGUMENT" | grep -Eq '^@[a-zA-Z0-9_]+$'; then + eval PHP_WANTEDMODULEVERSION__${PROCESSED_PHP_MODULE_ARGUMENT#@}="$processPHPModuleArgument_version" + else + printf 'Unable to parse the following module name:\n%s\n' "$PROCESSED_PHP_MODULE_ARGUMENT" >&2 + fi + fi +} + +# Get the wanted PHP module version, as specified in the command line arguments. +# +# Arguments: +# $1: the name of the module to be normalized +# +# Output: +# The wanted version (if any) +getWantedPHPModuleVersion() { + if printf '%s' "$1" | grep -Eq '^[a-zA-Z0-9_]+$'; then + eval printf '%s' "\${PHP_WANTEDMODULEVERSION_$1:-}" + elif printf '%s' "$1" | grep -Eq '^@[a-zA-Z0-9_]+$'; then + eval printf '%s' "\${PHP_WANTEDMODULEVERSION__${1#@}:-}" + fi +} + +# Get source code path of a PHP module version, as specified in the command line arguments. +# +# Arguments: +# $1: the name of the module to be normalized +# +# Output: +# The wanted version (if any) +getModuleSourceCodePath() { + if printf '%s' "$1" | grep -Eq '^[a-zA-Z0-9_]+$'; then + eval printf '%s' "\${PHP_MODULESOURCECODEPATH_$1:-}" + fi +} + +# Get the actual PHP module version, resolving it if it starts with '^' +# +# Arguments: +# $1: the name of the module +# $2: the wanted version (optional, if omitted we'll use getWantedPHPModuleVersion) +# +# Output: +# The version to be used +resolvePHPModuleVersion() { + resolvePHPModuleVersion_module="$1" + if test $# -lt 2; then + resolvePHPModuleVersion_raw="$(getWantedPHPModuleVersion "$resolvePHPModuleVersion_module")" + else + resolvePHPModuleVersion_raw="$2" + fi + resolvePHPModuleVersion_afterCaret="${resolvePHPModuleVersion_raw#^}" + if test "$resolvePHPModuleVersion_raw" = "$resolvePHPModuleVersion_afterCaret"; then + printf '%s' "$resolvePHPModuleVersion_raw" + return + fi + case "$resolvePHPModuleVersion_afterCaret" in + ?*@snapshot | ?*@devel | ?*@alpha | ?*@beta | ?*@stable) + resolvePHPModuleVersion_wantedStability="${resolvePHPModuleVersion_afterCaret##*@}" + resolvePHPModuleVersion_wantedVersion="${resolvePHPModuleVersion_afterCaret%@*}" + ;; + *) + resolvePHPModuleVersion_wantedStability='' + resolvePHPModuleVersion_wantedVersion="$resolvePHPModuleVersion_afterCaret" + ;; + esac + resolvePHPModuleVersion_peclModule="$(getPeclModuleName "$resolvePHPModuleVersion_module")" + resolvePHPModuleVersion_xml="$(curl $IPE_CURL_FLAGS -sSLf "http://pecl.php.net/rest/r/$resolvePHPModuleVersion_peclModule/allreleases.xml")" + # remove line endings, collapse spaces + resolvePHPModuleVersion_versions="$(printf '%s' "$resolvePHPModuleVersion_xml" | tr -s ' \t\r\n' ' ')" + # one line per release (eg 1.2.3stable) + resolvePHPModuleVersion_versions="$(printf '%s' "$resolvePHPModuleVersion_versions" | sed -r 's#$resolvePHPModuleVersion_wantedStability")" + fi + # remove everything's up to '' (included) + resolvePHPModuleVersion_versions="$(printf '%s' "$resolvePHPModuleVersion_versions" | sed 's#^.*##')" + # keep just the versions + resolvePHPModuleVersion_versions="$(printf '%s' "$resolvePHPModuleVersion_versions" | cut -d'<' -f1)" + resetIFS + for resolvePHPModuleVersion_version in $resolvePHPModuleVersion_versions; do + resolvePHPModuleVersion_suffix="${resolvePHPModuleVersion_version#$resolvePHPModuleVersion_wantedVersion}" + if test "$resolvePHPModuleVersion_version" != "${resolvePHPModuleVersion_version#$resolvePHPModuleVersion_wantedVersion.}"; then + # Example: looking for 1.0, found 1.0.1 + printf '%s' "$resolvePHPModuleVersion_version" + return + fi + done + for resolvePHPModuleVersion_version in $resolvePHPModuleVersion_versions; do + resolvePHPModuleVersion_suffix="${resolvePHPModuleVersion_version#$resolvePHPModuleVersion_wantedVersion}" + if test "$resolvePHPModuleVersion_version" = "$resolvePHPModuleVersion_suffix"; then + continue + fi + if test -z "$resolvePHPModuleVersion_suffix"; then + # Example: looking for 1.0, found exactly it + printf '%s' "$resolvePHPModuleVersion_version" + return + fi + case "$resolvePHPModuleVersion_suffix" in + [0-9]) + # Example: looking for 1.1, but this is 1.10 + ;; + *) + # Example: looking for 1.1, this is 1.1rc1 + printf '%s' "$resolvePHPModuleVersion_version" + return + ;; + esac + done + printf 'Unable to find a version of "%s" compatible with "%s"\nAvailable versions are:\n%s\n' "$resolvePHPModuleVersion_module" "$resolvePHPModuleVersion_raw" "$resolvePHPModuleVersion_versions" >&2 + exit 1 +} + +# Get the actual version of a PECL pmodule, resolving 'latest', 'stable', 'beta', 'alpha', 'devel'. +# +# Arguments: +# $1: the module name as known on the PECL archive +# $2: the version to be resolved +# Output: +# $2 itself if $1 is not 'latest', 'stable', 'beta', 'alpha', or 'devel', the actual version otherwise +resolvePeclStabilityVersion() { + case "$2" in + latest | stable | beta | alpha | devel) ;; + *) + printf '%s' "$2" + return + ;; + esac + resolvePeclStabilityVersion_peclModule="$(getPeclModuleName "$1")" + peclStabilityFlagToVersion_url="http://pecl.php.net/rest/r/$resolvePeclStabilityVersion_peclModule/$2.txt" + if ! peclStabilityFlagToVersion_result="$(curl $IPE_CURL_FLAGS -sSLf "$peclStabilityFlagToVersion_url")"; then + peclStabilityFlagToVersion_result='' + fi + if test -z "$peclStabilityFlagToVersion_result"; then + printf 'Failed to resolve the PECL package version "%s" of %s from %s\n' "$2" "$1" "$peclStabilityFlagToVersion_url" >&2 + exit 1 + fi + printf '%s' "$peclStabilityFlagToVersion_result" +} + +# Set these variables: +# - PHP_PREINSTALLED_MODULES the normalized list of PHP modules installed before running this script +setPHPPreinstalledModules() { + PHP_PREINSTALLED_MODULES='' + IFS=' +' + for getPHPInstalledModules_module in $(php -m); do + getPHPInstalledModules_moduleNormalized='' + case "$getPHPInstalledModules_module" in + \[PHP\ Modules\]) ;; + \[Zend\ Modules\]) + break + ;; + *) + getPHPInstalledModules_moduleNormalized="$(normalizePHPModuleName "$getPHPInstalledModules_module")" + if ! stringInList "$getPHPInstalledModules_moduleNormalized" "$PHP_PREINSTALLED_MODULES"; then + PHP_PREINSTALLED_MODULES="$PHP_PREINSTALLED_MODULES $getPHPInstalledModules_moduleNormalized" + fi + ;; + esac + done + if command -v composer >/dev/null; then + PHP_PREINSTALLED_MODULES="$PHP_PREINSTALLED_MODULES @composer" + fi + resetIFS + PHP_PREINSTALLED_MODULES="${PHP_PREINSTALLED_MODULES# }" +} + +# Get the handles of the modules to be installed +# +# Arguments: +# $@: all module handles +# +# Set: +# PHP_MODULES_TO_INSTALL +# FORCED_REMOTE_MODULES +# +# Output: +# Nothing +processCommandArguments() { + processCommandArguments_endArgs=0 + PHP_MODULES_TO_INSTALL='' + FORCED_REMOTE_MODULES='' + # Support deprecated flag IPE_FIX_CACERTS + case "${IPE_FIX_CACERTS:-}" in + 1 | y* | Y*) + PHP_MODULES_TO_INSTALL="$PHP_MODULES_TO_INSTALL @fix_letsencrypt" + ;; + esac + while :; do + if test $# -lt 1; then + break + fi + processCommandArguments_skip=0 + if test $processCommandArguments_endArgs -eq 0; then + case "$1" in + --cleanup) + printf '### WARNING the %s option is deprecated (we always cleanup everything) ###\n' "$1" >&2 + processCommandArguments_skip=1 + ;; + --) + processCommandArguments_skip=1 + processCommandArguments_endArgs=1 + ;; + -*) + printf 'Unrecognized option: %s\n' "$1" >&2 + exit 1 + ;; + esac + fi + if test $processCommandArguments_skip -eq 0; then + processPHPModuleArgument "$1" + processCommandArguments_name="$PROCESSED_PHP_MODULE_ARGUMENT" + if stringInList "$processCommandArguments_name" "$PHP_MODULES_TO_INSTALL"; then + printf '### WARNING Duplicated module name specified: %s ###\n' "$processCommandArguments_name" >&2 + elif stringInList "$processCommandArguments_name" "$PHP_PREINSTALLED_MODULES"; then + printf '### WARNING Module already installed: %s ###\n' "$processCommandArguments_name" >&2 + else + PHP_MODULES_TO_INSTALL="$PHP_MODULES_TO_INSTALL $processCommandArguments_name" + fi + fi + shift + done + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL# }" +} + +# Add a module that's required by another module +# +# Arguments: +# $1: module that requires another module +# $2: the required module +# +# Update: +# PHP_MODULES_TO_INSTALL +# +# Output: +# Nothing +checkRequiredModule() { + if ! stringInList "$1" "$PHP_MODULES_TO_INSTALL"; then + return + fi + if stringInList "$2" "$PHP_PREINSTALLED_MODULES"; then + return + fi + PHP_MODULES_TO_INSTALL="$(removeStringFromList "$1" "$PHP_MODULES_TO_INSTALL")" + if ! stringInList "$2" "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$PHP_MODULES_TO_INSTALL $2" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL# }" + fi + PHP_MODULES_TO_INSTALL="$PHP_MODULES_TO_INSTALL $1" +} + +# Sort the modules to be installed, in order to fix dependencies +# +# Update: +# PHP_MODULES_TO_INSTALL +# +# Output: +# Nothing +sortModulesToInstall() { + # apcu_bc requires apcu + checkRequiredModule 'apcu_bc' 'apcu' + # http requires propro (for PHP < 8) and raphf + if test $PHP_MAJMIN_VERSION -le 704; then + checkRequiredModule 'http' 'propro' + fi + checkRequiredModule 'http' 'raphf' + # event requires sockets (for PHP <= 5.6) + if test $PHP_MAJMIN_VERSION -le 506; then + checkRequiredModule event sockets + fi + # relay requires msgpack + checkRequiredModule relay msgpack + # relay requires igbinary + checkRequiredModule relay igbinary + # pq requires raphf + checkRequiredModule pq raphf + # phalcon up to v5.0.0beta3 requires psr + if test $PHP_MAJMINPAT_VERSION -lt 70401; then + checkRequiredModule phalcon psr + fi + # Some module installation may use sockets if available: move it before other modules + if stringInList 'sockets' "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$(removeStringFromList 'sockets' "$PHP_MODULES_TO_INSTALL")" + PHP_MODULES_TO_INSTALL="sockets $PHP_MODULES_TO_INSTALL" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL% }" + fi + # Some module installation may use igbinary if available: move it before other modules + if stringInList 'igbinary' "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$(removeStringFromList 'igbinary' "$PHP_MODULES_TO_INSTALL")" + PHP_MODULES_TO_INSTALL="igbinary $PHP_MODULES_TO_INSTALL" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL% }" + fi + # Some module installation may use msgpack if available: move it before other modules + if stringInList 'msgpack' "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$(removeStringFromList 'msgpack' "$PHP_MODULES_TO_INSTALL")" + PHP_MODULES_TO_INSTALL="msgpack $PHP_MODULES_TO_INSTALL" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL% }" + fi + # Some module installation may use socket if available: move it before other modules + if stringInList 'socket' "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$(removeStringFromList 'socket' "$PHP_MODULES_TO_INSTALL")" + PHP_MODULES_TO_INSTALL="socket $PHP_MODULES_TO_INSTALL" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL% }" + fi + # Some module installation may use apcu if available: move it before other modules + if stringInList 'apcu' "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$(removeStringFromList 'apcu' "$PHP_MODULES_TO_INSTALL")" + PHP_MODULES_TO_INSTALL="apcu $PHP_MODULES_TO_INSTALL" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL% }" + fi + # Some module installation may use raphf if available: move it before other modules + if stringInList 'raphf' "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$(removeStringFromList 'raphf' "$PHP_MODULES_TO_INSTALL")" + PHP_MODULES_TO_INSTALL="raphf $PHP_MODULES_TO_INSTALL" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL% }" + fi + # In any case, first of all, we need to install composer + if stringInList '@composer' "$PHP_MODULES_TO_INSTALL"; then + PHP_MODULES_TO_INSTALL="$(removeStringFromList '@composer' "$PHP_MODULES_TO_INSTALL")" + PHP_MODULES_TO_INSTALL="@composer $PHP_MODULES_TO_INSTALL" + PHP_MODULES_TO_INSTALL="${PHP_MODULES_TO_INSTALL% }" + fi +} + +# Expand the IPE_ASPELL_LANGUAGES environment variable into apk/apt package names +expandASpellDictionaries() { + expandASpellDictionaries_languages="${IPE_ASPELL_LANGUAGES:-en}" + expandASpellDictionaries_result='' + resetIFS + for expandASpellDictionaries_language in $expandASpellDictionaries_languages; do + expandASpellDictionaries_result="$expandASpellDictionaries_result aspell-$expandASpellDictionaries_language" + done + printf '%s' "${expandASpellDictionaries_result# }" +} + +# Get the required APT/APK packages for a specific PHP version and for the list of module handles +# +# Arguments: +# $@: the PHP module handles +# +# Set: +# PACKAGES_PERSISTENT_NEW the list of packages required at runtime that must be installed +# PACKAGES_PERSISTENT_PRE the list of packages required at runtime that are already installed +# PACKAGES_VOLATILE the list of packages required at compile time that must be installed +# PACKAGES_PREVIOUS the list of packages (with their version) that are installed right now (calculated only on Debian and only if PACKAGES_PERSISTENT_NEW or PACKAGES_VOLATILE are not empty) +# COMPILE_LIBS +buildRequiredPackageLists() { + buildRequiredPackageLists_persistent='' + buildRequiredPackageLists_volatile='' + COMPILE_LIBS='' + case "$DISTRO" in + alpine) + apk update + ;; + debian) + invokeAptGetUpdate + ;; + esac + buildRequiredPackageLists_sslTextVersion="$(php -d display_errors=stderr -r 'echo defined("OPENSSL_VERSION_TEXT") ? OPENSSL_VERSION_TEXT : "";' 2>/dev/null)" + if test $? -ne 0 || test -z "$buildRequiredPackageLists_sslTextVersion"; then + printf 'Unable to determine the version of the SSL library\n' >&2 + exit 1 + fi + case "$buildRequiredPackageLists_sslTextVersion" in + OpenSSL\ *) + buildRequiredPackageLists_sslLib=openssl + buildRequiredPackageLists_sslMajorVersion="$(php -d display_errors=stderr -r 'echo defined("OPENSSL_VERSION_NUMBER") ? (OPENSSL_VERSION_NUMBER >> 28) : "";' 2>/dev/null)" + if test $? -ne 0 || test -z "$buildRequiredPackageLists_sslMajorVersion"; then + printf 'Unable to determine the major version of the SSL library\n' >&2 + exit 1 + fi + buildRequiredPackageLists_sslMajorMinorVersion="$(php -d display_errors=stderr -r 'echo defined("OPENSSL_VERSION_NUMBER") ? ((OPENSSL_VERSION_NUMBER >> 28) . "." . ((OPENSSL_VERSION_NUMBER >> 20) & 0xFF)) : "";' 2>/dev/null)" + if test $? -ne 0 || test -z "$buildRequiredPackageLists_sslMajorMinorVersion"; then + printf 'Unable to determine the major.minor version of the SSL library\n' >&2 + exit 1 + fi + ;; + LibreSSL\ *) + buildRequiredPackageLists_sslLib=libressl + buildRequiredPackageLists_sslMajorVersion="${buildRequiredPackageLists_sslTextVersion#LibreSSL }" + buildRequiredPackageLists_sslMajorVersion="${buildRequiredPackageLists_sslMajorVersion%%.*}" + buildRequiredPackageLists_sslMajorMinorVersion="${buildRequiredPackageLists_sslTextVersion#LibreSSL }" + buildRequiredPackageLists_sslMajorMinorVersion="${buildRequiredPackageLists_sslMajorMinorVersion%.*}" + ;; + *) + printf 'Unrecognized SSL library: %s\n' "$buildRequiredPackageLists_sslTextVersion" >&2 + exit 1 + ;; + esac + case "$DISTRO_VERSION" in + alpine@*) + if test $# -gt 1 || test "${1:-}" != '@composer'; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $PHPIZE_DEPS" + fi + case "$buildRequiredPackageLists_sslLib" in + openssl) + if test $buildRequiredPackageLists_sslMajorVersion -le 1; then + buildRequiredPackageLists_libssl="libssl$buildRequiredPackageLists_sslMajorMinorVersion" + else + buildRequiredPackageLists_libssl="libssl$buildRequiredPackageLists_sslMajorVersion" + fi + buildRequiredPackageLists_libssldev='openssl-dev' + ;; + libressl) + buildRequiredPackageLists_libssl="libressl$buildRequiredPackageLists_sslMajorMinorVersion-libssl" + buildRequiredPackageLists_libssldev='libressl-dev' + ;; + *) + printf 'Unsupported SSL library for Alpine: %s\n' "$buildRequiredPackageLists_sslLib" >&2 + exit 1 + ;; + esac + buildRequiredPackageLists_icuPersistent='' + if test $DISTRO_MAJMIN_VERSION -ge 316; then + case "${IPE_ICU_EN_ONLY:-}" in + 1 | y* | Y*) ;; + *) + buildRequiredPackageLists_icuPersistent='icu-data-full' + ;; + esac + fi + buildRequiredPackageLists_libpcredev=pcre-dev + ;; + debian@*) + case "$buildRequiredPackageLists_sslLib" in + openssl) + if test $buildRequiredPackageLists_sslMajorVersion -le 1; then + buildRequiredPackageLists_libssl="libssl$buildRequiredPackageLists_sslMajorMinorVersion" + if test $DISTRO_VERSION_NUMBER -eq 9 && test "$buildRequiredPackageLists_sslMajorMinorVersion" = '1.0'; then + buildRequiredPackageLists_libssldev="libssl$buildRequiredPackageLists_sslMajorMinorVersion-dev" + else + buildRequiredPackageLists_libssldev="libssl-dev" + fi + else + buildRequiredPackageLists_libssl="libssl$buildRequiredPackageLists_sslMajorVersion" + buildRequiredPackageLists_libssldev="libssl-dev" + fi + ;; + *) + printf 'Unsupported SSL library for Debian: %s\n' "$buildRequiredPackageLists_sslLib" >&2 + exit 1 + ;; + esac + if test $DISTRO_VERSION_NUMBER -ge 13; then + buildRequiredPackageLists_libpcredev=libpcre2-dev + else + buildRequiredPackageLists_libpcredev=libpcre3-dev + fi + ;; + esac + if test $USE_PICKLE -gt 1; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile git" + fi + while :; do + if test $# -lt 1; then + break + fi + case "$1@$DISTRO" in + @composer@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent unzip" + ;; + amqp@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent rabbitmq-c" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile rabbitmq-c-dev" + ;; + amqp@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^librabbitmq[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile librabbitmq-dev libssh-dev" + ;; + bz2@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libbz2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile bzip2-dev" + ;; + bz2@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libbz2-dev" + ;; + cassandra@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent cassandra-cpp-driver gmp" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cassandra-cpp-driver-dev gmp-dev" + ;; + cmark@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake" + ;; + cmark@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake" + ;; + ddtrace@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libgcc" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile curl-dev automake libtool" + ;; + ddtrace@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libcurl4-openssl-dev automake libtool" + ;; + dba@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent db" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile db-dev" + ;; + dba@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile ^libdb5\.3-dev$" + if test $PHP_MAJMIN_VERSION -le 505; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile patch" + fi + ;; + decimal@debian) + if test $DISTRO_MAJMIN_VERSION -lt 1200; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libmpdec[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmpdec-dev" + fi + ;; + ecma_intl@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent icu-libs $buildRequiredPackageLists_icuPersistent" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile icu-dev libidn-dev" + ;; + ecma_intl@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libicu[0-9]+$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libicu-dev" + ;; + enchant@alpine) + if test $DISTRO_MAJMIN_VERSION -ge 312; then + if test $PHP_MAJMIN_VERSION -ge 800; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent enchant2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile enchant2-dev" + else + # The system provides libenchant2, supported since PHP 8.0: we need to build libenchant1 on our own + if ! isLibenchant1Installed; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent glib aspell-libs libhunspell" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile glib-dev aspell-dev hunspell-dev" + COMPILE_LIBS="$COMPILE_LIBS libenchant1" + fi + fi + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent enchant" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile enchant-dev" + fi + ;; + enchant@debian) + if test $DISTRO_VERSION_NUMBER -ge 11; then + if test $PHP_MAJMIN_VERSION -ge 800; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libenchant-2-2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libenchant-2-dev" + else + if ! isLibenchant1Installed; then + # The system provides libenchant2, supported since PHP 8.0: we need to build libenchant1 on our own + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent aspell-en libhunspell-1.7-0" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libglib2.0-dev libaspell-dev libhunspell-dev" + COMPILE_LIBS="$COMPILE_LIBS libenchant1" + fi + fi + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libenchant1c2a" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libenchant-dev" + fi + ;; + event@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libevent" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libevent-dev" + ;; + event@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl ^libevent[0-9\.\-]*$ ^libevent-openssl[0-9\.\-]*$ ^libevent-extra[0-9\.\-]*$ ^libevent-pthreads[0-9\.\-]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libevent-dev" + ;; + ffi@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libffi" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libffi-dev" + ;; + ffi@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libffi-dev" + ;; + ftp@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev" + ;; + ftp@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev" + ;; + gd@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent freetype libjpeg-turbo libpng libxpm" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile freetype-dev libjpeg-turbo-dev libpng-dev libxpm-dev" + if test $PHP_MAJMIN_VERSION -le 506; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libvpx" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libvpx-dev" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libwebp" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libwebp-dev" + if test $PHP_MAJMIN_VERSION -ge 801; then + if test $DISTRO_MAJMIN_VERSION -ge 315; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libavif aom-libs libdav1d" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libavif-dev aom-dev dav1d-dev" + elif isLibaomInstalled && isLibdav1dInstalled && isLibyuvInstalled && isLibavifInstalled; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + else + case "${IPE_GD_WITHOUTAVIF:-}" in + 1 | y* | Y*) ;; + *) + if ! isLibaomInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libaom" + fi + if ! isLibdav1dInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libdav1d" + fi + if ! isLibyuvInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libyuv" + fi + if ! isLibavifInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libavif" + fi + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake nasm meson" + ;; + esac + fi + fi + fi + ;; + gd@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libfreetype6 libjpeg62-turbo ^libpng[0-9]+-[0-9]+$ libxpm4" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev" + if test $PHP_MAJMIN_VERSION -le 506; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libvpx[0-9]+$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libvpx-dev" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libwebp[0-9]+$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libwebp-dev" + if test $PHP_MAJMIN_VERSION -ge 801; then + if test $DISTRO_VERSION_NUMBER -ge 12; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libavif[0-9]+$ ^libaom[0-9]+$ ^libdav1d[0-9]+$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libavif-dev libaom-dev libdav1d-dev" + elif ! isLibaomInstalled || ! isLibdav1dInstalled || ! isLibyuvInstalled || ! isLibavifInstalled; then + case "${IPE_GD_WITHOUTAVIF:-}" in + 1 | y* | Y*) ;; + *) + if ! isLibaomInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libaom" + fi + if ! isLibdav1dInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libdav1d" + fi + if ! isLibyuvInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libyuv" + fi + if ! isLibavifInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libavif" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake nasm meson" + ;; + esac + fi + fi + fi + ;; + gearman@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++ libuuid" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile boost-dev gperf libmemcached-dev libevent-dev util-linux-dev" + ;; + gearman@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libgearman[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgearman-dev" + ;; + geoip@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent geoip" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile geoip-dev" + ;; + geoip@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libgeoip1[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgeoip-dev" + ;; + geos@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent geos-dev" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile geos" + ;; + geos@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libgeos-c1(v[0-9]*)?$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgeos-dev" + ;; + gettext@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libintl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile gettext-dev" + ;; + gmagick@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent graphicsmagick libgomp" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile graphicsmagick-dev libtool" + ;; + gmagick@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libgraphicsmagick(-q16-)?[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgraphicsmagick1-dev" + ;; + gmp@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent gmp" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile gmp-dev" + ;; + gmp@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgmp-dev" + ;; + gnupg@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent gpgme" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile gpgme-dev" + ;; + gnupg@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libgpgme[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile ^libgpgme[0-9]*-dev$" + ;; + grpc@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib-dev linux-headers" + ;; + grpc@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib1g-dev" + ;; + http@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libevent" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib-dev curl-dev libevent-dev" + if test $PHP_MAJMIN_VERSION -le 506; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libidn" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libidn-dev" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent icu-libs $buildRequiredPackageLists_icuPersistent libidn" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile icu-dev libidn-dev" + fi + ;; + http@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl ^libevent[0-9\.\-]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev zlib1g-dev libcurl4-openssl-dev libevent-dev" + if test $PHP_MAJMIN_VERSION -le 506; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile ^libidn1[0-9+]-dev$" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libicu[0-9]+$ ^libidn2-[0-9+]$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libicu-dev ^libidn2-[0-9+]-dev$ ^libgcrypt[0-9]+-dev$" + fi + ;; + imagick@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent imagemagick libgomp" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile imagemagick-dev" + if [ $DISTRO_MAJMIN_VERSION -ge 319 ]; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ghostscript libheif libjxl libraw librsvg" + fi + ;; + imagick@debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libmagickwand-7.q16-[0-9]+$ ^libmagickcore-7.q16-[0-9]+-extra$ libheif-plugin-aomenc" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libmagickwand-6.q16-[0-9]+$ ^libmagickcore-6.q16-[0-9]+-extra$" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmagickwand-dev" + ;; + imap@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl c-client" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev krb5-dev imap-dev" + ;; + imap@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libkrb5-dev" + if test $DISTRO_VERSION_NUMBER -ge 13; then + # Since Debian 13 (trixie) libc-client2007e is no more available + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent sgml-base" + if ! isLibcClient2007eInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libc-client2007e" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libpam0g-dev $buildRequiredPackageLists_libssldev" + fi + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libc-client2007e" + if test $DISTRO_VERSION_NUMBER -eq 9; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev comerr-dev krb5-multidev libc-client2007e libgssrpc4 libkadm5clnt-mit11 libkadm5srv-mit11 libkdb5-8 libpam0g-dev libssl-doc mlock" + else + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libc-client-dev" + fi + fi + ;; + interbase@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile icu-dev ncurses-dev" + if ! isFirebirdInstalled; then + COMPILE_LIBS="$COMPILE_LIBS firebird" + fi + ;; + interbase@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libfbclient2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile firebird-dev libib-util" + ;; + intl@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent icu-libs $buildRequiredPackageLists_icuPersistent" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile icu-dev" + if test $DISTRO_MAJMIN_VERSION -ge 322 && test $PHP_MAJMIN_VERSION -eq 801 && test $PHP_MAJMINPAT_VERSION -lt 80133; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile patch" + fi + ;; + intl@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libicu[0-9]+$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libicu-dev" + ;; + ion@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake git" + ;; + ion@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake git" + ;; + ip2location@alpine) + if ! isLibIP2LocationInstalled; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile automake libtool" + COMPILE_LIBS="$COMPILE_LIBS libip2location" + fi + ;; + ip2location@debian) + if ! isLibIP2LocationInstalled; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile automake libtool" + COMPILE_LIBS="$COMPILE_LIBS libip2location" + fi + ;; + judy@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent judy" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile judy-dev" + ;; + judy@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libjudydebian1" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libjudy-dev" + ;; + ldap@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libldap" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile openldap-dev" + ;; + ldap@debian) + if test $DISTRO_VERSION_NUMBER -ge 9; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libldap-common" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libldap2-dev" + ;; + luasandbox@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent lua5.1-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile lua5.1-dev" + ;; + luasandbox@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent liblua5.1-0" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile liblua5.1-0-dev" + ;; + lz4@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent lz4-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile lz4-dev" + ;; + lz4@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent liblz4-1" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile liblz4-dev" + ;; + maxminddb@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libmaxminddb" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmaxminddb-dev" + ;; + maxminddb@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libmaxminddb[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmaxminddb-dev" + ;; + memprof@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent judy" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile judy-dev bsd-compat-headers" + ;; + memprof@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libjudydebian1" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libjudy-dev" + ;; + mcrypt@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libmcrypt" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmcrypt-dev" + ;; + mcrypt@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libmcrypt4" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmcrypt-dev" + ;; + memcache@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib-dev" + ;; + memcache@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib1g-dev" + ;; + memcached@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libmemcached-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmemcached-dev zlib-dev" + ;; + memcached@debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libmemcachedutil2t64" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libmemcachedutil2" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmemcached-dev zlib1g-dev" + if test $DISTRO_MAJMIN_VERSION -ge 12; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev" + fi + ;; + mongo@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libsasl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev cyrus-sasl-dev" + ;; + mongo@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libsasl2-dev" + ;; + mongodb@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl icu-libs $buildRequiredPackageLists_icuPersistent libsasl snappy" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev icu-dev cyrus-sasl-dev snappy-dev zlib-dev" + if test $PHP_MAJMIN_VERSION -ge 704; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent zstd-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zstd-dev" + fi + ;; + mongodb@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl ^libsnappy[0-9]+(v[0-9]+)?$ ^libicu[0-9]+$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libicu-dev libsasl2-dev libsnappy-dev zlib1g-dev" + if test $PHP_MAJMIN_VERSION -ge 704; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libzstd[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libzstd-dev" + fi + ;; + mosquitto@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent mosquitto-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile mosquitto-dev" + ;; + mosquitto@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libmosquitto1" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libmosquitto-dev" + ;; + mssql@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent freetds" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile freetds-dev" + ;; + mssql@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libsybdb5" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile freetds-dev" + ;; + nsq@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libevent" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libevent-dev" + ;; + nsq@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl ^libevent[0-9\.\-]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libevent-dev" + ;; + oauth@alpine) + if test $PHP_MAJMIN_VERSION -ge 700; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libpcredev" + fi + ;; + oauth@debian) + if test $PHP_MAJMIN_VERSION -ge 700; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libpcredev" + fi + ;; + oci8@alpine | pdo_oci@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libaio libc6-compat libnsl" + if test $DISTRO_MAJMIN_VERSION -le 307; then + # The unzip tool of Alpine 3.7 can't extract symlinks from ZIP archives: let's use bsdtar instead + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libarchive-tools" + fi + ;; + oci8@debian | pdo_oci@debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libaio1t64" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libaio[0-9]*$" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile unzip" + ;; + odbc@alpine | pdo_odbc@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent unixodbc" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile unixodbc-dev" + ;; + odbc@debian | pdo_odbc@debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libodbc2" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libodbc1" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile unixodbc-dev" + ;; + openswoole@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl postgresql-libs libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev curl-dev postgresql-dev linux-headers" + ;; + openswoole@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libpq5" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libcurl4-openssl-dev libpq-dev" + ;; + parle@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + ;; + pdo_dblib@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent freetds" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile freetds-dev" + ;; + pdo_dblib@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libsybdb5" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile freetds-dev" + ;; + pdo_firebird@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile icu-dev ncurses-dev" + if ! isFirebirdInstalled; then + COMPILE_LIBS="$COMPILE_LIBS firebird" + if test $PHP_MAJMIN_VERSION -ge 804; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib-dev" + if ! isLibTommathInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libtommath" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake" + fi + if ! isLibTomcryptInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libtomcrypt" + fi + fi + fi + ;; + pdo_firebird@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libfbclient2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile firebird-dev libib-util" + ;; + pgsql@alpine | pdo_pgsql@alpine | pq@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent postgresql-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile postgresql-dev" + ;; + pgsql@debian | pdo_pgsql@debian | pq@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libpq5" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libpq-dev" + ;; + php_trie@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + ;; + phpy@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent python3" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile python3-dev" + ;; + phpy@debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libpython3.13" + elif test $DISTRO_VERSION_NUMBER -ge 12; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libpython3.11" + elif test $DISTRO_VERSION_NUMBER -ge 11; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libpython3.9" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libpython3.7" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile python3-dev" + ;; + pkcs11@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent softhsm" + ;; + pkcs11@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libsofthsm2" + ;; + pspell@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent aspell-libs $(expandASpellDictionaries)" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile aspell-dev" + ;; + pspell@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libaspell15 $(expandASpellDictionaries)" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libpspell-dev" + ;; + rdkafka@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent librdkafka" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile librdkafka-dev" + ;; + rdkafka@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^librdkafka\+*[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile librdkafka-dev" + ;; + recode@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent recode" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile recode-dev" + ;; + recode@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent librecode0" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile librecode-dev" + ;; + redis@alpine) + if test $PHP_MAJMIN_VERSION -ge 700; then + case "$DISTRO_VERSION" in + alpine@3.7) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent zstd" + ;; + *) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent zstd-libs" + ;; + esac + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zstd-dev" + if test $PHP_MAJMIN_VERSION -ge 702; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent lz4-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile lz4-dev" + fi + fi + ;; + redis@debian) + if test $PHP_MAJMIN_VERSION -ge 700; then + case "$DISTRO_VERSION" in + debian@8) + ## There's no APT package for libzstd + ;; + debian@9) + ## libzstd is too old (available: 1.1.2, required: 1.3.0+) + ;; + *) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libzstd[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libzstd-dev" + ;; + esac + fi + if test $PHP_MAJMIN_VERSION -ge 702; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent liblz4-1" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile liblz4-dev" + fi + ;; + rrd@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent librrd" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile rrdtool-dev" + ;; + rrd@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile librrd-dev" + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^librrd[0-9]*$" + ;; + relay@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent lz4-libs zstd-libs" + if test $DISTRO_MAJMIN_VERSION -ge 317; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + fi + ;; + saxon@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + ;; + saxon@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_volatile unzip" + ;; + seasclick@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + ;; + simdjson@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + ;; + smbclient@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libsmbclient" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile samba-dev" + ;; + smbclient@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libsmbclient" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libsmbclient-dev" + ;; + snappy@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent snappy" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile snappy-dev" + ;; + snappy@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libsnappy1(v[0-9]+)?$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libsnappy-dev" + ;; + snmp@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent net-snmp-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile net-snmp-dev" + ;; + snmp@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent snmp" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libsnmp-dev" + ;; + snuffleupagus@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent pcre" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libpcredev" + ;; + snuffleupagus@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libpcredev" + ;; + soap@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + soap@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + sockets@alpine) + if test $PHP_MAJMIN_VERSION -ge 802; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile linux-headers" + fi + ;; + sodium@alpine | libsodium@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libsodium" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libsodium-dev" + ;; + sodium@debian | libsodium@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libsodium[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libsodium-dev" + ;; + solr@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile curl-dev libxml2-dev" + ;; + solr@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libcurl4-openssl-dev libxml2-dev" + ;; + sourceguardian@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent eudev-libs" + ;; + spx@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib-dev" + ;; + spx@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib1g-dev" + ;; + sqlsrv@alpine | pdo_sqlsrv@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++ unixodbc" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile unixodbc-dev" + ;; + sqlsrv@debian | pdo_sqlsrv@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent unixodbc" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile unixodbc-dev" + if ! isMicrosoftSqlServerODBCInstalled; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile gnupg apt-transport-https" + fi + ;; + pdo_snowflake@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libstdc++6 libcurl4" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev cmake g++ libcurl4-openssl-dev" + ;; + ssh2@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libssh2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libssh2-dev" + ;; + ssh2@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libssh2-1-dev" + ;; + statgrab@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstatgrab" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libstatgrab-dev" + ;; + statgrab@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libstatgrab[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libstatgrab-dev" + ;; + stomp@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev" + ;; + stomp@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev" + ;; + swoole@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl postgresql-libs libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev curl-dev postgresql-dev linux-headers" + if test $PHP_MAJMIN_VERSION -ge 702; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent c-ares" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile c-ares-dev" + if test $PHP_MAJMIN_VERSION -ge 801; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent zstd-libs" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile sqlite-dev zstd-dev" + if test $PHP_MAJMIN_VERSION -ge 802; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libssh2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile ncurses-dev libssh2-dev" + if test $PHP_MAJMIN_VERSION -ge 804; then # swoole 6.2+ requires firebird 3+, but with PHP < 8.4 we install firebird 2.5 (see installFirebird) + if ! isFirebirdInstalled; then + COMPILE_LIBS="$COMPILE_LIBS firebird" + if ! isLibTommathInstalled; then + if ! isLibTomcryptInstalled; then + COMPILE_LIBS="$COMPILE_LIBS libtomcrypt" + fi + COMPILE_LIBS="$COMPILE_LIBS libtommath" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile cmake" + fi + fi + fi + fi + fi + fi + case "${IPE_SWOOLE_WITHOUT_IOURING:-}" in + 1 | y* | Y*) ;; + *) + # iouring support in swoole 6 requires liburing 2.5+: available since Alpine 3.19 + # but with Alpine 3.19 we have a "invalid use of incomplete type 'const struct statx'" error + if test $DISTRO_MAJMIN_VERSION -ge 320; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent liburing" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile liburing-dev" + fi + ;; + esac + ;; + swoole@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libpq5" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev libcurl4-openssl-dev libpq-dev" + if test $PHP_MAJMIN_VERSION -ge 702; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libc-ares2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libc-ares-dev" + if test $PHP_MAJMIN_VERSION -ge 800; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libbrotli1" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib1g-dev libbrotli-dev" + if test $PHP_MAJMIN_VERSION -ge 801; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libsqlite3-dev" + if test $DISTRO_VERSION_NUMBER -ge 11; then + # swoole 6 requires libzstd >= 1.4.0, but on debian 10 (buster) we have 1.3.8 + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libzstd[0-9]*$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libzstd-dev" + fi + if test $PHP_MAJMIN_VERSION -ge 802; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libfbclient2 ^libssh2(-[0-9]+)$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile firebird-dev ^libssh2(-[0-9]+)*-dev$" + fi + fi + fi + fi + if test $DISTRO_VERSION_NUMBER -ge 13; then + # iouring support in swoole 6 requires liburing 2.5+: available since Debian Trixie (13) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent liburing2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile liburing-dev" + fi + ;; + sybase_ct@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent freetds" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile freetds-dev" + ;; + sybase_ct@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libct4" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile freetds-dev" + ;; + tdlib@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev git cmake gperf zlib-dev linux-headers readline-dev" + ;; + tdlib@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev git cmake gperf zlib1g-dev" + ;; + tensor@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent openblas" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile lapack-dev openblas-dev" + if test $DISTRO_MAJMIN_VERSION -le 317; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent lapack" + if test $DISTRO_MAJMIN_VERSION -le 316; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libexecinfo" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libexecinfo-dev" + if test $DISTRO_MAJMIN_VERSION -le 310; then + if ! stringInList --force-overwrite "$IPE_APK_FLAGS"; then + IPE_APK_FLAGS="$IPE_APK_FLAGS --force-overwrite" + fi + fi + fi + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent liblapack" + fi + ;; + tensor@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent liblapacke" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile liblapack-dev libopenblas-dev liblapacke-dev" + if test $DISTRO_VERSION_NUMBER -le 9; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent gfortran-6 libopenblas-base" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgfortran-6-dev" + elif test $DISTRO_VERSION_NUMBER -le 10; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent gfortran-8 libopenblas-base" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgfortran-8-dev" + elif test $DISTRO_VERSION_NUMBER -le 11; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent gfortran-10 libopenblas-base" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgfortran-10-dev" + elif test $DISTRO_VERSION_NUMBER -le 12; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent gfortran-12 libopenblas0" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgfortran-12-dev" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libgfortran5 libopenblas0" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libgfortran-14-dev" + fi + ;; + tidy@alpine) + if test $DISTRO_MAJMIN_VERSION -ge 315; then + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent tidyhtml" + else + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent tidyhtml-libs" + fi + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile tidyhtml-dev" + ;; + tidy@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libtidy-?[0-9][0-9.\-]*(deb[0-9])?$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libtidy-dev" + ;; + uuid@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libuuid" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile util-linux-dev" + ;; + uuid@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile uuid-dev" + ;; + uv@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libuv" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libuv-dev" + ;; + uv@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libuv1" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libuv1-dev" + ;; + vips@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent vips" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile vips-dev" + ;; + vips@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libvips" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libvips-dev" + ;; + wddx@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + wddx@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + wikidiff2@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile git" + ;; + wikidiff2@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libthai0" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile git libthai-dev" + ;; + xdebug@alpine) + if test $PHP_MAJMIN_VERSION -ge 800; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile linux-headers" + fi + ;; + xlswriter@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib-dev" + ;; + xlswriter@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile zlib1g-dev" + ;; + xmldiff@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libstdc++" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + xmldiff@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + xmlrpc@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + xmlrpc@debian) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxml2-dev" + ;; + xpass@alpine) + if ! isLibXCryptInstalled; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile linux-headers" + COMPILE_LIBS="$COMPILE_LIBS libxcrypt" + fi + ;; + xsl@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libxslt" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxslt-dev libgcrypt-dev" + ;; + xsl@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent ^libxslt1\.1$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libxslt-dev" + ;; + yaml@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent yaml" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile yaml-dev" + ;; + yaml@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libyaml-0-2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libyaml-dev" + ;; + yar@alpine) + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile curl-dev" + ;; + yar@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libcurl4-openssl-dev" + ;; + zip@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl libzip" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev cmake libzip-dev zlib-dev" + ;; + zip@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent $buildRequiredPackageLists_libssl ^libzip[0-9]$" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile $buildRequiredPackageLists_libssldev cmake libzip-dev libbz2-dev zlib1g-dev" + ;; + zmq@alpine) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent zeromq-dev" + ;; + zmq@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libzmq3-dev" + ;; + zookeeper@alpine) + if ! test -f /usr/local/include/zookeeper/zookeeper.h; then + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile maven automake libtool openjdk8" + fi + ;; + zookeeper@debian) + buildRequiredPackageLists_persistent="$buildRequiredPackageLists_persistent libzookeeper-mt2" + buildRequiredPackageLists_volatile="$buildRequiredPackageLists_volatile libzookeeper-mt-dev" + ;; + esac + shift + done + PACKAGES_PERSISTENT_NEW='' + PACKAGES_PERSISTENT_PRE='' + PACKAGES_VOLATILE='' + PACKAGES_PREVIOUS='' + if test -z "$buildRequiredPackageLists_persistent$buildRequiredPackageLists_volatile"; then + return + fi + if test -n "$buildRequiredPackageLists_persistent"; then + PACKAGES_PERSISTENT_NEW="$(expandPackagesToBeInstalled $buildRequiredPackageLists_persistent)" + if test -s "$IPE_ERRFLAG_FILE"; then + exit 1 + fi + resetIFS + for buildRequiredPackageLists_package in $buildRequiredPackageLists_persistent; do + buildRequiredPackageLists_package="$(expandInstalledSystemPackageName "$buildRequiredPackageLists_package")" + if test -n "$buildRequiredPackageLists_package"; then + PACKAGES_PERSISTENT_PRE="$PACKAGES_PERSISTENT_PRE $buildRequiredPackageLists_package" + fi + done + PACKAGES_PERSISTENT_PRE="${PACKAGES_PERSISTENT_PRE# }" + fi + if test -n "$buildRequiredPackageLists_volatile"; then + buildRequiredPackageLists_packages="$(expandPackagesToBeInstalled $buildRequiredPackageLists_volatile)" + if test -s "$IPE_ERRFLAG_FILE"; then + exit 1 + fi + resetIFS + for buildRequiredPackageLists_package in $buildRequiredPackageLists_packages; do + if ! stringInList "$buildRequiredPackageLists_package" "$PACKAGES_PERSISTENT_NEW"; then + if test "$buildRequiredPackageLists_package" != icu-data-en || ! stringInList icu-data-full "$PACKAGES_PERSISTENT_NEW"; then + PACKAGES_VOLATILE="$PACKAGES_VOLATILE $buildRequiredPackageLists_package" + fi + fi + done + PACKAGES_VOLATILE="${PACKAGES_VOLATILE# }" + fi + if test -n "$PACKAGES_PERSISTENT_NEW$PACKAGES_VOLATILE"; then + case "$DISTRO" in + debian) + PACKAGES_PREVIOUS="$(dpkg --get-selections | grep -E '\sinstall$' | awk '{ print $1 }')" + ;; + esac + fi +} + +# Get the full list of APT/APK packages that will be installed, given the required packages +# +# Arguments: +# $1: the list of required APT/APK packages +# +# Output: +# Space-separated list of every APT/APK packages that will be installed +expandPackagesToBeInstalled() { + expandPackagesToBeInstalled_result='' + case "$DISTRO" in + alpine) + expandPackagesToBeInstalled_log="$(apk add --simulate $@ 2>&1 || printf '\nERROR: apk failed\n')" + if test -n "$(printf '%s' "$expandPackagesToBeInstalled_log" | grep -E '^ERROR:')"; then + printf 'FAILED TO LIST THE WHOLE PACKAGE LIST FOR\n' >&2 + printf '%s ' "$@" >&2 + printf '\n\nCOMMAND OUTPUT:\n%s\n' "$expandPackagesToBeInstalled_log" >&2 + echo 'y' >"$IPE_ERRFLAG_FILE" + exit 1 + fi + IFS=' +' + for expandPackagesToBeInstalled_line in $expandPackagesToBeInstalled_log; do + if test -n "$(printf '%s' "$expandPackagesToBeInstalled_line" | grep -E '^\( *[0-9]*/[0-9]*) Installing ')"; then + expandPackagesToBeInstalled_result="$expandPackagesToBeInstalled_result $(printf '%s' "$expandPackagesToBeInstalled_line" | sed -E 's/^\(.+\) Installing //' | cut -d ' ' -f 1)" + fi + done + resetIFS + ;; + debian) + expandPackagesToBeInstalled_log="$(apt-get install -sy --no-install-recommends $@ 2>&1 || printf '\nE: apt-get failed\n')" + if test -n "$(printf '%s' "$expandPackagesToBeInstalled_log" | grep -E '^E:')"; then + printf 'FAILED TO LIST THE WHOLE PACKAGE LIST FOR\n' >&2 + printf '%s ' "$@" >&2 + printf '\n\nCOMMAND OUTPUT:\n%s\n' "$expandPackagesToBeInstalled_log" >&2 + echo 'y' >"$IPE_ERRFLAG_FILE" + exit 1 + fi + expandPackagesToBeInstalled_inNewPackages=0 + IFS=' +' + for expandPackagesToBeInstalled_line in $expandPackagesToBeInstalled_log; do + if test $expandPackagesToBeInstalled_inNewPackages -eq 0; then + if test "$expandPackagesToBeInstalled_line" = 'The following NEW packages will be installed:'; then + expandPackagesToBeInstalled_inNewPackages=1 + fi + elif test "$expandPackagesToBeInstalled_line" = "${expandPackagesToBeInstalled_line# }"; then + break + else + resetIFS + for expandPackagesToBeInstalled_newPackage in $expandPackagesToBeInstalled_line; do + expandPackagesToBeInstalled_result="$expandPackagesToBeInstalled_result $expandPackagesToBeInstalled_newPackage" + done + IFS=' +' + fi + done + resetIFS + ;; + esac + printf '%s' "${expandPackagesToBeInstalled_result# }" +} + +# Check if a system package is installed; if so we prints its name. +# +# Arguments: +# $1: the name of the package to be checked (regular expressions accepted: they must start with a ^) +expandInstalledSystemPackageName() { + if test "$1" = "${1#^}"; then + expandInstalledSystemPackageName_grepflags='-Fx' + else + expandInstalledSystemPackageName_grepflags='-E' + fi + case "$DISTRO" in + alpine) + apk info | grep $expandInstalledSystemPackageName_grepflags -- "$1" || test $? -eq 1 + ;; + debian) + dpkg --get-selections | grep -E '\sinstall$' | awk '{ print $1 }' | cut -d: -f1 | grep $expandInstalledSystemPackageName_grepflags -- "$1" || test $? -eq 1 + ;; + esac +} + +# Retrieve the number of available cores (alternative to nproc if not available) +# +# Output: +# The number of processor cores available +getProcessorCount() { + if test -n "${IPE_PROCESSOR_COUNT:-}"; then + echo $IPE_PROCESSOR_COUNT + return + fi + if command -v nproc >/dev/null 2>&1; then + nproc + else + getProcessorCount_tmp=$(cat /proc/cpuinfo | grep -E '^processor\s*:\s*\d+$' | wc -l) + if test $getProcessorCount_tmp -ge 1; then + echo $getProcessorCount_tmp + else + echo 1 + fi + fi +} + +# Set these variables: +# - TARGET_TRIPLET the build target tripled (eg 'x86_64-linux-gnu', 'x86_64-alpine-linux-musl') +setTargetTriplet() { + TARGET_TRIPLET="$(gcc -print-multiarch 2>/dev/null || true)" + if test -z "$TARGET_TRIPLET"; then + TARGET_TRIPLET="$(gcc -dumpmachine)" + fi +} + +# Retrieve the number of processors to be used when compiling an extension +# +# Arguments: +# $1: the handle of the PHP extension to be compiled +# Output: +# The number of processors to be used +getCompilationProcessorCount() { + case "$1" in + '') + # The above extensions don't support parallel compilation + echo 1 + ;; + *) + # All the other extensions support parallel compilation + getProcessorCount + ;; + esac +} + +# Get the full path of a PHP extension given its name. +# +# Arguments: +# $1: the name of the PHP extension +# +# Output: +# The absolute path of the PHP extension file (or nothing if the file can't be found) +getModuleFullPath() { + case "$1" in + apcu_bc) + getModuleFullPath_path="$PHP_EXTDIR/apc.so" + ;; + seasclick) + getModuleFullPath_path="$PHP_EXTDIR/SeasClick.so" + ;; + *) + getModuleFullPath_path="$PHP_EXTDIR/$1.so" + ;; + esac + if ! test -f "$getModuleFullPath_path"; then + printf 'Unable to find the file of the PHP extension "%s"\n' "$1" >&2 + exit 1 + fi + printf '%s' "$getModuleFullPath_path" +} + +# Post-process a PHP module just compiled and installed in the PHP extension directory +# +# Arguments: +# $1: the name of the PHP extension +# +# Return: +# 0 (true): if succeeded +# non-zero (false): in case of errors +postProcessModule() { + postProcessModule_file="$(getModuleFullPath "$1")" + if test $PHP_DEBUGBUILD -ne 1; then + case "${IPE_NOSTRIP:-}" in + 1 | y* | Y*) ;; + *) + printf 'Removing symbols from %s... ' "$postProcessModule_file" + postProcessModule_preSize="$(stat -c %s "$postProcessModule_file")" + strip --strip-all "$postProcessModule_file" + postProcessModule_postSize="$(stat -c %s "$postProcessModule_file")" + printf 'done (%s bytes saved).\n' "$((postProcessModule_preSize - postProcessModule_postSize))" + ;; + esac + fi + return $? +} + +# Get the type of the php.ini entry to be used for a PHP extension +# +# Arguments: +# $1: the name of the PHP extension +# +# Output: +# zend_extension or extension +getModuleIniEntryType() { + case "$1" in + ioncube_loader | sourceguardian) + # On PHP 5.5, docker-php-ext-enable fails to detect that ionCube Loader and sourceguardian are Zend extensions + if test $PHP_MAJMIN_VERSION -le 505; then + printf 'zend_extension' + return 0 + fi + ;; + esac + getModuleIniEntryType_file="$(getModuleFullPath "$1")" + if readelf --wide --syms "$getModuleIniEntryType_file" | grep -Eq ' zend_extension_entry$'; then + printf 'zend_extension' + else + printf 'extension' + fi +} + +# Create the contents of a PHP ini file that enables an extension +# +# Arguments: +# $1: the name of the PHP extension +# $2: additional php.ini configuration (optional) +# +# Output: +# The contents of the ini file +buildPhpExtensionIniContent() { + buildPhpExtensionIniContent_type="$(getModuleIniEntryType "$1")" + buildPhpExtensionIniContent_soFile="$(getModuleFullPath "$1")" + buildPhpExtensionIniContent_result="$(printf '%s=%s' "$buildPhpExtensionIniContent_type" "${buildPhpExtensionIniContent_soFile##$PHP_EXTDIR/}")" + if test -n "${2:-}"; then + buildPhpExtensionIniContent_result="$(printf '%s\n%s' "$buildPhpExtensionIniContent_result" "$2")" + fi + printf '%s' "$buildPhpExtensionIniContent_result" +} + +# Check that a PHP module actually works (better to run this check before enabling the extension) +# +# Arguments: +# $1: the name of the PHP extension +# $2: base name (without path and extension) of additional php.ini configuration (optional) +# $3: additional php.ini configuration (optional) +# +# Return: +# 0 (true): if the string is in the list +# 1 (false): if the string is not in the list +checkModuleWorking() { + if test -n "${2:-}"; then + checkModuleWorking_iniFile="$PHP_INI_DIR/conf.d/$2--temp.ini" + else + checkModuleWorking_iniFile="$PHP_INI_DIR/conf.d/docker-php-ext-$1--temp.ini" + fi + checkModuleWorking_iniContent="$(buildPhpExtensionIniContent "$1" "${3:-}")" + printf 'Check if the %s module can be loaded... ' "$1" + checkModuleWorking_errBefore="$(php -r 'return;' 2>&1 || true)" + printf '%s' "$checkModuleWorking_iniContent" >"$checkModuleWorking_iniFile" + checkModuleWorking_errAfter="$(php -r 'return;' 2>&1 || true)" + rm "$checkModuleWorking_iniFile" + if test "$checkModuleWorking_errAfter" != "$checkModuleWorking_errBefore"; then + printf 'Error loading the "%s" extension:\n%s\n' "$1" "$checkModuleWorking_errAfter" >&2 + return 1 + fi + printf 'ok.\n' + return 0 +} + +# Enable a PHP extension +# +# Arguments: +# $1: the name of the PHP extension to be enabled +# $2: base name (without path and extension) of additional php.ini configuration (optional) +# $3: additional php.ini configuration (optional) +enablePhpExtension() { + if test -n "${2:-}"; then + enablePhpExtension_iniFile="$PHP_INI_DIR/conf.d/$2.ini" + else + enablePhpExtension_iniFile="$PHP_INI_DIR/conf.d/docker-php-ext-$1.ini" + fi + enablePhpExtension_iniContent="$(buildPhpExtensionIniContent "$1" "${3:-}")" + case "${IPE_DONT_ENABLE:-}" in + 1 | y* | Y*) + enablePhpExtension_enableCommand="/usr/local/bin/docker-php-ext-enable-$1" + printf '%s' "$enablePhpExtension_iniContent" >"$enablePhpExtension_iniFile-disabled" + printf '\n' >>"$enablePhpExtension_iniFile-disabled" + cat <"$enablePhpExtension_enableCommand" +#!/bin/sh + +if test -f '$enablePhpExtension_iniFile-disabled'; then + echo 'Enabling extension $1' + mv '$enablePhpExtension_iniFile-disabled' '$enablePhpExtension_iniFile' +else + echo 'The extension $1 has already been enabled' +fi +EOT + chmod +x "$enablePhpExtension_enableCommand" + printf '## Extension %s not enabled.\nYou can enable it by running the following command:\n%s\n\n' "$1" "$(basename "$enablePhpExtension_enableCommand")" + ;; + *) + printf '%s' "$enablePhpExtension_iniContent" >"$enablePhpExtension_iniFile" + printf '\n' >>"$enablePhpExtension_iniFile" + ;; + esac +} + +# Mark the pre-installed APT/APK packages as used +# that way they won't be uninstalled by accident +markPreinstalledPackagesAsUsed() { + printf '### MARKING PRE-INSTALLED PACKAGES AS IN-USE ###\n' + case "$DISTRO" in + alpine) + printf '# Packages: %s\n' "$PACKAGES_PERSISTENT_PRE" + apk add $PACKAGES_PERSISTENT_PRE + ;; + debian) + apt-mark manual $PACKAGES_PERSISTENT_PRE + ;; + esac +} + +# Install the required APT/APK packages +# +# Arguments: +# $@: the list of APT/APK packages to be installed +installRequiredPackages() { + printf '### INSTALLING REQUIRED PACKAGES ###\n' + printf '# Packages to be kept after installation: %s\n' "$PACKAGES_PERSISTENT_NEW" + if test -n "${IPE_SAVE_PERMDEPS_TO:-}"; then + printf '%s\n' "$PACKAGES_PERSISTENT_NEW" >"$IPE_SAVE_PERMDEPS_TO" + fi + printf '# Packages to be used only for installation: %s\n' "$PACKAGES_VOLATILE" + if test -n "${IPE_SAVE_VOLDEPS_TO:-}"; then + printf '%s\n' "$PACKAGES_VOLATILE" >"$IPE_SAVE_VOLDEPS_TO" + fi + case "$DISTRO" in + alpine) + apk add $IPE_APK_FLAGS $PACKAGES_PERSISTENT_NEW $PACKAGES_VOLATILE + # https://gitlab.alpinelinux.org/alpine/aports/-/issues/12763#note_172090 + # https://github.com/mlocati/docker-php-extension-installer/issues/385 + # https://github.com/mlocati/docker-php-extension-installer/issues/537#issuecomment-1078748882 + for installRequiredPackages_item in wget; do + if test -n "$(expandInstalledSystemPackageName "$installRequiredPackages_item")"; then + apk add --upgrade "$installRequiredPackages_item" + fi + done + ;; + debian) + apt-get install -qqy --no-install-recommends $PACKAGES_PERSISTENT_NEW $PACKAGES_VOLATILE + ;; + esac +} + +# Get the version of an installed APT/APK package +# +# Arguments: +# $1: the name of the installed package +# +# Output: +# The numeric part of the package version, with from 1 to 3 numbers +# +# Example: +# 1 +# 1.2 +# 1.2.3 +getInstalledPackageVersion() { + case "$DISTRO" in + alpine) + apk info "$1" | head -n1 | cut -c $((${#1} + 2))- | grep -o -E '^[0-9]+(\.[0-9]+){0,2}' + ;; + debian) + dpkg-query --showformat='${Version}' --show "$1" 2>/dev/null | grep -o -E '^[0-9]+(\.[0-9]+){0,2}' + ;; + esac +} + +# Compare two versions +# +# Arguments: +# $1: the first version +# $2: the second version +# +# Output +# -1 if $1 is less than $2 +# 0 if $1 is the same as $2 +# 1 if $1 is greater than $2 +compareVersions() { + compareVersions_v1="$1.0.0" + compareVersions_v2="$2.0.0" + compareVersions_vMin="$(printf '%s\n%s' "$compareVersions_v1" "$compareVersions_v2" | sort -t '.' -n -k1,1 -k2,2 -k3,3 | head -n 1)" + if test "$compareVersions_vMin" != "$compareVersions_v1"; then + echo '1' + elif test "$compareVersions_vMin" = "$compareVersions_v2"; then + echo '0' + else + echo '-1' + fi +} + +# Install Oracle Instant Client & SDK +# +# Set: +# ORACLE_INSTANTCLIENT_LIBPATH +installOracleInstantClient() { + case "${IPE_INSTANTCLIENT_BASIC:-}" in + 1 | y* | Y*) + installOracleInstantClient_handle=basic + ;; + *) + installOracleInstantClient_handle=basiclite + ;; + esac + case $PHP_BITS in + 32) + installOracleInstantClient_client=client + installOracleInstantClient_version='19.9' + installOracleInstantClient_ic=https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-$installOracleInstantClient_handle-linux-$installOracleInstantClient_version.0.0.0dbru.zip + installOracleInstantClient_sdk=https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-sdk-linux-$installOracleInstantClient_version.0.0.0dbru.zip + ;; + *) + case $(uname -m) in + aarch64*) + installOracleInstantClient_client=client64 + installOracleInstantClient_version='19.10' + installOracleInstantClient_ic=https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-$installOracleInstantClient_handle-linux.arm64-$installOracleInstantClient_version.0.0.0dbru.zip + installOracleInstantClient_sdk=https://download.oracle.com/otn_software/linux/instantclient/191000/instantclient-sdk-linux.arm64-$installOracleInstantClient_version.0.0.0dbru.zip + ;; + *) + installOracleInstantClient_client=client64 + installOracleInstantClient_version='21.1' + installOracleInstantClient_ic=https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-$installOracleInstantClient_handle-linux.x64-$installOracleInstantClient_version.0.0.0.zip + installOracleInstantClient_sdk=https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-sdk-linux.x64-$installOracleInstantClient_version.0.0.0.zip + ;; + esac + ;; + esac + ORACLE_INSTANTCLIENT_LIBPATH=/usr/lib/oracle/$installOracleInstantClient_version/$installOracleInstantClient_client/lib + if ! test -e "$ORACLE_INSTANTCLIENT_LIBPATH"; then + printf 'Downloading Oracle Instant Client v%s (%s)... ' "$installOracleInstantClient_version" "$installOracleInstantClient_handle" + installOracleInstantClient_src="$(getPackageSource $installOracleInstantClient_ic)" + mkdir -p "/usr/lib/oracle/$installOracleInstantClient_version/$installOracleInstantClient_client" + mv "$installOracleInstantClient_src" "$ORACLE_INSTANTCLIENT_LIBPATH" + echo 'done.' + fi + if ! test -e "$ORACLE_INSTANTCLIENT_LIBPATH/sdk" && ! test -L "$ORACLE_INSTANTCLIENT_LIBPATH/sdk"; then + printf 'Downloading Oracle Instant SDK v%s... ' "$installOracleInstantClient_version" + installOracleInstantClient_src="$(getPackageSource $installOracleInstantClient_sdk)" + ln -sf "$installOracleInstantClient_src/sdk" "$ORACLE_INSTANTCLIENT_LIBPATH/sdk" + UNNEEDED_PACKAGE_LINKS="$UNNEEDED_PACKAGE_LINKS $ORACLE_INSTANTCLIENT_LIBPATH/sdk" + echo 'done.' + fi + case "$DISTRO" in + alpine) + if ! test -e /usr/lib/libresolv.so.2 && test -e /lib/libc.so.6; then + ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2 + fi + installOracleInstantClient_ldconf=/etc/ld-musl-${TARGET_TRIPLET%-alpine-linux-musl}.path + if test -e "$installOracleInstantClient_ldconf"; then + if ! cat "$installOracleInstantClient_ldconf" | grep -q "$ORACLE_INSTANTCLIENT_LIBPATH"; then + cat "$ORACLE_INSTANTCLIENT_LIBPATH" | awk -v suffix=":$ORACLE_INSTANTCLIENT_LIBPATH" '{print NR==1 ? $0suffix : $0}' >"$ORACLE_INSTANTCLIENT_LIBPATH" + fi + else + case $PHP_BITS in + 32) + echo "/lib:/usr/local/lib:/usr/lib:$ORACLE_INSTANTCLIENT_LIBPATH" >"$installOracleInstantClient_ldconf" + ;; + *) + echo "/lib64:/lib:/usr/local/lib:/usr/lib:$ORACLE_INSTANTCLIENT_LIBPATH" >"$installOracleInstantClient_ldconf" + ;; + esac + fi + ;; + debian) + if ! test -e /etc/ld.so.conf.d/oracle-instantclient.conf; then + echo "$ORACLE_INSTANTCLIENT_LIBPATH" >/etc/ld.so.conf.d/oracle-instantclient.conf + ldconfig + fi + ;; + esac +} + +# Check if the Microsoft SQL Server ODBC Driver is installed +# +# Return: +# 0 (true): if the string is in the list +# 1 (false): if the string is not in the list +isMicrosoftSqlServerODBCInstalled() { + test -d /opt/microsoft/msodbcsql*/ +} + +# Install the Microsoft SQL Server ODBC Driver +# see https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server +installMicrosoftSqlServerODBC() { + printf 'Installing the Microsoft SQL Server ODBC Driver\n' + case "$DISTRO" in + alpine) + rm -rf /tmp/src/msodbcsql.apk + if test $PHP_MAJMIN_VERSION -le 703; then + installMicrosoftSqlServerODBC_url=https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.10.6.1-1_amd64.apk + else + case $(uname -m) in + aarch64 | arm64 | armv8) + installMicrosoftSqlServerODBC_arch=arm64 + ;; + *) + installMicrosoftSqlServerODBC_arch=amd64 + ;; + esac + installMicrosoftSqlServerODBC_url=https://download.microsoft.com/download/9dcab408-e0d4-4571-a81a-5a0951e3445f/msodbcsql18_18.6.1.1-1_$installMicrosoftSqlServerODBC_arch.apk + fi + printf 'APK package URL: %s\n' "$installMicrosoftSqlServerODBC_url" + curl $IPE_CURL_FLAGS -sSLf -o /tmp/src/msodbcsql.apk "$installMicrosoftSqlServerODBC_url" + printf '\n' | apk add --allow-untrusted /tmp/src/msodbcsql.apk + rm -rf /tmp/src/msodbcsql.apk + ;; + debian) + printf -- '- installing the Microsoft APT key\n' + if test $DISTRO_VERSION_NUMBER -ge 13; then + curl $IPE_CURL_FLAGS https://packages.microsoft.com/keys/microsoft-2025.asc | gpg --dearmor --yes --output /usr/share/keyrings/microsoft-prod.gpg + elif test $DISTRO_VERSION_NUMBER -ge 12; then + curl $IPE_CURL_FLAGS https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor --yes --output /usr/share/keyrings/microsoft-prod.gpg + elif test $DISTRO_VERSION_NUMBER -ge 11; then + curl $IPE_CURL_FLAGS -sSLf -o /etc/apt/trusted.gpg.d/microsoft.asc https://packages.microsoft.com/keys/microsoft.asc + else + curl $IPE_CURL_FLAGS -sSLf https://packages.microsoft.com/keys/microsoft.asc | apt-key add - + fi + if ! test -f /etc/apt/sources.list.d/mssql-release.list; then + printf -- '- adding the Microsoft APT source list\n' + curl $IPE_CURL_FLAGS -sSLf https://packages.microsoft.com/config/debian/$DISTRO_VERSION_NUMBER/prod.list >/etc/apt/sources.list.d/mssql-release.list + invokeAptGetUpdate + fi + printf -- '- installing the APT package\n' + if test $PHP_MAJMIN_VERSION -le 703; then + ACCEPT_EULA=Y apt-get install -qqy --no-install-recommends msodbcsql17 + elif test $DISTRO_VERSION_NUMBER -ge 9 && test $DISTRO_VERSION_NUMBER -le 13; then + # On Debian 9 to 13 we have both msodbcsql17 and msodbcsql18: let's install just one + # see https://packages.microsoft.com/debian/9/prod/pool/main/m/ + # see https://packages.microsoft.com/debian/13/prod/pool/main/m/ + ACCEPT_EULA=Y apt-get install -qqy --no-install-recommends msodbcsql18 + else + ACCEPT_EULA=Y apt-get install -qqy --no-install-recommends '^msodbcsql[0-9]+$' + fi + ;; + esac +} + +# Check if libaom is installed +# +# Return: +# 0 (true) +# 1 (false) +isLibaomInstalled() { + if ! test -f /usr/local/lib/libaom.so && ! test -f /usr/lib/libaom.so && ! test -f /usr/lib/x86_64*/libaom.so; then + return 1 + fi + if ! test -f /usr/local/include/aom/aom_codec.h && ! test -f /usr/include/aom/aom_codec.h; then + return 1 + fi + return 0 +} + +# Install libaom +installLibaom() { + printf 'Installing libaom\n' + installLibaom_version=3.10.0 + installLibaom_dir="$(getPackageSource https://aomedia.googlesource.com/aom/+archive/v$installLibaom_version.tar.gz)" + mkdir -- "$installLibaom_dir/my.build" + cd -- "$installLibaom_dir/my.build" + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1 -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0 -DCMAKE_INSTALL_LIBDIR:PATH=lib .. + ninja -j $(getProcessorCount) install + cd - >/dev/null + ldconfig || true +} + +# Check if libdav1d is installed +# +# Return: +# 0 (true) +# 1 (false) +isLibdav1dInstalled() { + if ! test -f /usr/local/lib/libdav1d.so && ! test -f /usr/lib/libdav1d.so && ! test -f /usr/lib/x86_64*/libdav1d.so; then + return 1 + fi + if ! test -f /usr/local/include/dav1d/dav1d.h && ! test -f /usr/include/dav1d/dav1d.h; then + return 1 + fi + return 0 +} + +# Install libdav1d +installLibdav1d() { + printf 'Installing libdav1d\n' + installLibdav1d_dir="$(getPackageSource https://github.com/videolan/dav1d/archive/refs/tags/1.3.0.tar.gz)" + mkdir -- "$installLibdav1d_dir/build" + cd -- "$installLibdav1d_dir/build" + meson --buildtype release -Dprefix=/usr .. + ninja -j $(getProcessorCount) install + cd - >/dev/null + if test -f /usr/lib/$TARGET_TRIPLET/libdav1d.so && ! test -f /usr/lib/libdav1d.so; then + ln -s /usr/lib/$TARGET_TRIPLET/libdav1d.so /usr/lib/ + fi + ldconfig || true +} + +# Check if libyuv is installed +# +# Return: +# 0 (true) +# 1 (false) +isLibyuvInstalled() { + if ! test -f /usr/local/lib/libyuv.so && ! test -f /usr/lib/libyuv.so && ! test -f /usr/lib/x86_64*/libyuv.so && ! test -f /usr/lib/x86_64*/libyuv.so.*; then + return 1 + fi + if ! test -f /usr/local/include/libyuv.h && ! test -f /usr/include/libyuv.h; then + return 1 + fi + return 0 +} + +# Install libyuv +installLibyuv() { + printf 'Installing libyuv\n' + installLibyuv_dir="$(getPackageSource https://chromium.googlesource.com/libyuv/libyuv/+archive/d359a9f922af840b043535d43cf9d38b220d102e.tar.gz)" + mkdir -- "$installLibyuv_dir/build" + cd -- "$installLibyuv_dir/build" + cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -B. .. + make -j$(getProcessorCount) install + cd - >/dev/null +} + +# Check if libavif is installed +# +# Return: +# 0 (true) +# 1 (false) +isLibavifInstalled() { + if ! test -f /usr/local/lib/libavif.so && ! test -f /usr/lib/libavif.so && ! test -f /usr/lib/x86_64*/libavif.so; then + return 1 + fi + if ! test -f /usr/local/include/avif/avif.h && ! test -f /usr/include/avif/avif.h; then + return 1 + fi + return 0 +} + +# Install libavif +installLibavif() { + printf 'Installing libavif\n' + installLibavif_dir="$(getPackageSource https://codeload.github.com/AOMediaCodec/libavif/tar.gz/refs/tags/v1.0.3)" + mkdir -- "$installLibavif_dir/build" + cd -- "$installLibavif_dir/build" + cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DAVIF_CODEC_AOM=ON -DCMAKE_INSTALL_LIBDIR:PATH=lib + make -j$(getProcessorCount) install + cd - >/dev/null +} + +# Install libmpdec +installLibMPDec() { + installLibMPDec_version=4.0.1 + printf '# Installing libmpdec v%s\n' "$installLibMPDec_version" + installLibMPDec_src="$(getPackageSource https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-$installLibMPDec_version.tar.gz)" + cd -- "$installLibMPDec_src" + ./configure --disable-cxx + make -j$(getProcessorCount) + make install + cd - >/dev/null +} + +# Check if libdatrie is installed +# +# Return: +# 0 (true) +# 1 (false) +isLibDatrieInstalled() { + if ! test -f /usr/local/lib/libdatrie.so && ! test -f /usr/lib/libdatrie.so && ! test -f /usr/lib/x86_64*/libdatrie.so; then + return 1 + fi + if ! test -f /usr/local/include/datrie/trie.h && ! test -f /usr/include/datrie/trie.h; then + return 1 + fi + return 0 +} + +# Install libdatrie +installLibDatrie() { + printf 'Installing libdatrie\n' + installLibDatrie_src="$(getPackageSource https://github.com/tlwg/libdatrie/releases/download/v0.2.13/libdatrie-0.2.13.tar.xz)" + cd -- "$installLibDatrie_src" + ./configure + make -j$(getProcessorCount) + make install + cd - >/dev/null +} + +# Check if libdatrie is installed +# +# Return: +# 0 (true) +# 1 (false) +isLibThaiInstalled() { + return 1 + if ! test -f /usr/local/lib/libthai.so && ! test -f /usr/lib/libthai.so && ! test -f /usr/lib/x86_64*/libthai.so; then + return 1 + fi + if ! test -f /usr/local/include/thai/thailib.h && ! test -f /usr/include/thai/thailib.h; then + return 1 + fi + return 0 +} + +# Install libdatrie +installLibThai() { + printf 'Installing libthai\n' + installLibThai_src="$(getPackageSource https://github.com/tlwg/libthai/releases/download/v0.1.29/libthai-0.1.29.tar.xz)" + cd -- "$installLibThai_src" + ./configure + make -j$(getProcessorCount) + make install + cd - >/dev/null +} + +isLibTommathInstalled() { + if test -f /usr/local/lib/libtommath.a && test -f /usr/local/include/tommath.h; then + return 0 + fi + return 1 +} + +installLibTommath() { + printf 'Installing libtommath\n' + installLibTommath_src="$(getPackageSource https://github.com/libtom/libtommath/releases/download/v1.3.0/ltm-1.3.0.tar.xz)" + mkdir -p "$installLibTommath_src/build" + cd -- "$installLibTommath_src/build" + CFLAGS='-fPIC' cmake -DCMAKE_BUILD_TYPE=Release .. + make -j$(getProcessorCount) + make install + cd - >/dev/null +} + +isLibTomcryptInstalled() { + if test -f /usr/local/lib/libtomcrypt.a && test -f /usr/local/include/tomcrypt.h; then + return 0 + fi + return 1 +} + +installLibTomcrypt() { + printf 'Installing libtomcrypt\n' + installLibTomcrypt_src="$(getPackageSource https://github.com/libtom/libtomcrypt/releases/download/v1.18.2/crypt-1.18.2.tar.xz)" + cd -- "$installLibTomcrypt_src" + CFLAGS='-fPIC' make -j$(getProcessorCount) + make install +} + +isFirebirdInstalled() { + if test -f /usr/lib/libfbclient.so && test -f /usr/include/ibase.h; then + return 0 + fi + if test -d /tmp/src/firebird; then + return 0 + fi + return 1 +} + +installFirebird() { + printf 'Installing firebird\n' + if test $PHP_MAJMIN_VERSION -ge 804; then + installFirebird_src="$(getPackageSource https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-source.tar.xz)" + cd -- "$installFirebird_src" + # Turn off profiling on arm64, otherwise the build fails with "undefined reference to `_mcount'" + sed -i 's/ -p / /g; s/ -p$//g; s/^-p //g' builds/posix/prefix.linux_arm64 + ./configure --enable-client-only + make -j$(getProcessorCount) + cp -Rd gen/Release/firebird/include/* /usr/include + cp -Rd gen/Release/firebird/lib/* /usr/lib + cd - >/dev/null + else + mv "$(getPackageSource https://github.com/FirebirdSQL/firebird/releases/download/R2_5_9/Firebird-2.5.9.27139-0.tar.bz2)" /tmp/src/firebird + cd /tmp/src/firebird + # Patch rwlock.h (this has been fixed in later release of firebird 3.x) + sed -i '194s/.*/#if 0/' src/common/classes/rwlock.h + if [ "$DISTRO" = alpine ] && [ "$DISTRO_MAJMIN_VERSION" -ge 322 ]; then + # Firebird 2.5.x does not support recent ICU versions + ./configure + else + ./configure --with-system-icu + fi + # Don't try to enable parallel build: Firebird forces -j1 + make -s btyacc_binary gpre_boot libfbstatic libfbclient + cp gen/firebird/lib/libfbclient.so /usr/lib/ + ln -s /usr/lib/libfbclient.so /usr/lib/libfbclient.so.2 + cd - >/dev/null + fi +} + +isLibXCryptInstalled() { + if ! test -f /usr/local/lib/libcrypt.so && ! test -f /usr/lib/libcrypt.so && ! test -f /usr/lib/x86_64*/libcrypt.so; then + return 1 + fi + return 0 +} + +installLibXCrypt() { + printf 'Installing libxcrypt\n' + installLibXCrypt_version=4.4.36 + installLibXCrypt_src="$(getPackageSource "https://github.com/besser82/libxcrypt/releases/download/v$installLibXCrypt_version/libxcrypt-$installLibXCrypt_version.tar.xz")" + cd -- "$installLibXCrypt_src" + ./configure --prefix /usr --disable-werror + make -j$(getProcessorCount) + make install + cd - >/dev/null +} + +isLibenchant1Installed() { + if test -f /usr/lib/libenchant.so || test -f /usr/local/lib/libenchant.so; then + return 0 + fi + return 1 +} + +installLibenchant1() { + printf 'Installing libenchant1\n' + installLibenchant1_src="$(getPackageSource https://github.com/rrthomas/enchant/releases/download/enchant-1-6-1/enchant-1.6.1.tar.gz)" + cd -- "$installLibenchant1_src" + ./configure + make -j$(getProcessorCount) + make install + cd - >/dev/null +} + +isLibcClient2007eInstalled() { + if test -f /usr/lib/libc-client.so.2007e && test -f /usr/include/c-client/utf8.h; then + return 0 + fi + return 1 +} + +isLibIP2LocationInstalled() { + if test -f /usr/local/lib/libIP2Location.so && test -f /usr/local/include/IP2Location.h; then + return 0 + fi + return 1 +} + +installLibIP2Location() { + printf 'Installing libIP2Location\n' + installLibIP2Location_src="$(getPackageSource https://codeload.github.com/chrislim2888/IP2Location-C-Library/tar.gz/8.7.0)" + cd -- "$installLibIP2Location_src" + autoreconf -fiv + ./configure + make -j$(getProcessorCount) + make install + cd - >/dev/null + ldconfig || true +} + +installLibcClient2007e() { + mkdir -p /tmp/src + installLibcClient2007e_arch="$(dpkg --print-architecture)" + # See: + # - https://packages.debian.org/bookworm/mlock + # - https://packages.debian.org/bookworm/libc-client2007e + # - https://packages.debian.org/bookworm/libc-client2007e-dev + case "$installLibcClient2007e_arch" in + amd64) + installLibcClient2007e_version='2007f~dfsg-7+b2' + ;; + *) + installLibcClient2007e_version='2007f~dfsg-7+b1' + ;; + esac + if ! test -f /usr/bin/mlock; then + installLibcClient2007e_url="http://ftp.debian.org/debian/pool/main/u/uw-imap/mlock_${installLibcClient2007e_version}_${installLibcClient2007e_arch}.deb" + installLibcClient2007e_deb="$(mktemp -p /tmp/src)" + printf '# Installing mlock from %s\n' "$installLibcClient2007e_url" + curl $IPE_CURL_FLAGS -sSLf -o "$installLibcClient2007e_deb" "$installLibcClient2007e_url" + dpkg -i "$installLibcClient2007e_deb" + fi + if ! test -f /usr/lib/libc-client.so.2007e; then + installLibcClient2007e_url="http://ftp.debian.org/debian/pool/main/u/uw-imap/libc-client2007e_${installLibcClient2007e_version}_${installLibcClient2007e_arch}.deb" + installLibcClient2007e_deb="$(mktemp -p /tmp/src)" + printf '# Installing libc-client2007e from %s\n' "$installLibcClient2007e_url" + curl $IPE_CURL_FLAGS -sSLf -o "$installLibcClient2007e_deb" "$installLibcClient2007e_url" + dpkg -i "$installLibcClient2007e_deb" + fi + if ! test -f /usr/include/c-client/utf8.h; then + installLibcClient2007e_url="http://ftp.debian.org/debian/pool/main/u/uw-imap/libc-client2007e-dev_${installLibcClient2007e_version}_${installLibcClient2007e_arch}.deb" + installLibcClient2007e_deb="$(mktemp -p /tmp/src)" + printf '# Installing libc-client2007e-dev from %s\n' "$installLibcClient2007e_url" + curl $IPE_CURL_FLAGS -sSLf -o "$installLibcClient2007e_deb" "$installLibcClient2007e_url" + dpkg -i "$installLibcClient2007e_deb" + PACKAGES_VOLATILE="$PACKAGES_VOLATILE libc-client2007e-dev" + fi +} + +# Install Composer +installComposer() { + installComposer_version="$(getWantedPHPModuleVersion @composer)" + installComposer_version="${installComposer_version#^}" + if test -z "$installComposer_version"; then + installComposer_fullname=composer + installComposer_flags='' + else + installComposer_fullname="$(printf 'composer v%s' "$installComposer_version")" + if printf '%s' "$installComposer_version" | grep -Eq '^[0-9]+$'; then + installComposer_flags="--$installComposer_version" + else + installComposer_flags="--version=$installComposer_version" + fi + fi + printf '### INSTALLING %s ###\n' "$installComposer_fullname" + actuallyInstallComposer /usr/local/bin composer "$installComposer_flags" +} + +# Actually install composer +# +# Arguments: +# $1: the directory where composer should be installed (required) +# $2: the composer filename (optional, default: composer) +# $3. additional flags for the composer installed (optional) +actuallyInstallComposer() { + actuallyInstallComposer_installer="$(mktemp -p /tmp/src)" + curl $IPE_CURL_FLAGS -sSLf -o "$actuallyInstallComposer_installer" https://getcomposer.org/installer + actuallyInstallComposer_expectedSignature="$(curl $IPE_CURL_FLAGS -sSLf https://composer.github.io/installer.sig)" + actuallyInstallComposer_actualSignature="$(php -n -r "echo hash_file('sha384', '$actuallyInstallComposer_installer');")" + if test "$actuallyInstallComposer_expectedSignature" != "$actuallyInstallComposer_actualSignature"; then + printf 'Verification of composer installer failed!\nExpected signature: %s\nActual signature: %s\n' "$actuallyInstallComposer_expectedSignature" "$actuallyInstallComposer_actualSignature" >&2 + exit 1 + fi + actuallyInstallComposer_flags="--install-dir=$1" + if test -n "${2:-}"; then + actuallyInstallComposer_flags="$actuallyInstallComposer_flags --filename=$2" + else + actuallyInstallComposer_flags="$actuallyInstallComposer_flags --filename=composer" + fi + if test -n "${3:-}"; then + actuallyInstallComposer_flags="$actuallyInstallComposer_flags $3" + fi + php "$actuallyInstallComposer_installer" $actuallyInstallComposer_flags + rm -- "$actuallyInstallComposer_installer" +} + +# Install ionCube Loader +installIonCubeLoader() { + installIonCubeLoader_version='' + installIonCubeLoader_soPrefix=ioncube_loader_lin + installIonCubeLoader_url='https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin' + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -le 312; then + installIonCubeLoader_version=14.0.0 # For 14.4.0 we have a Segmentation Fault + fi + if test -z "$installIonCubeLoader_version" || test $(compareVersions "$installIonCubeLoader_version" 14.4.0) -ge 0; then + installIonCubeLoader_url="${installIonCubeLoader_url}-musl" + installIonCubeLoader_soPrefix="${installIonCubeLoader_soPrefix}-musl" + fi + ;; + esac + case $PHP_BITS in + 32) + case $(uname -m) in + aarch* | arm*) + installIonCubeLoader_url="${installIonCubeLoader_url}_armv7l" + ;; + *) + installIonCubeLoader_url="${installIonCubeLoader_url}_x86" + ;; + esac + ;; + *) + case $(uname -m) in + aarch64 | arm64 | armv8) + installIonCubeLoader_url="${installIonCubeLoader_url}_aarch64" + ;; + *) + installIonCubeLoader_url="${installIonCubeLoader_url}_x86-64" + ;; + esac + ;; + esac + installIonCubeLoader_versionDisplayName=latest + if test -n "$installIonCubeLoader_version"; then + installIonCubeLoader_url="${installIonCubeLoader_url}_${installIonCubeLoader_version}" + installIonCubeLoader_versionDisplayName="v$installIonCubeLoader_version" + fi + installIonCubeLoader_url="${installIonCubeLoader_url}.tar.gz" + # See https://www.ioncube.com/loaders.php + printf 'Downloading ionCube Loader (%s)... ' "$installIonCubeLoader_versionDisplayName" + installIonCubeLoader_dir="$(getPackageSource $installIonCubeLoader_url)" + echo 'done.' + installIonCubeLoader_so="${installIonCubeLoader_soPrefix}_${PHP_MAJDOTMIN_VERSION}" + if test $PHP_THREADSAFE -eq 1; then + installIonCubeLoader_so="${installIonCubeLoader_so}_ts" + fi + installIonCubeLoader_so="${installIonCubeLoader_so}.so" + cp "$installIonCubeLoader_dir/$installIonCubeLoader_so" "$(getPHPExtensionsDir)/ioncube_loader.so" +} + +# Install SourceGuardian Loader +installSourceGuardian() { + # See https://www.sourceguardian.com/loaders.html + case $PHP_BITS in + 32) + installSourceGuardian_url=https://www.sourceguardian.com/loaders/download/loaders.linux-i386.tar.gz + ;; + *) + case $(uname -m) in + aarch64 | arm64 | armv8) + installSourceGuardian_url=https://www.sourceguardian.com/loaders/download/loaders.linux-aarch64.tar.gz + ;; + *) + installSourceGuardian_url=https://www.sourceguardian.com/loaders/download/loaders.linux-x86_64.tar.gz + ;; + esac + ;; + esac + printf 'Downloading SourceGuardian... ' + installSourceGuardian_dir="$(getPackageSource $installSourceGuardian_url)" + printf 'done (version: %s)\n' "$(cat "$installSourceGuardian_dir/version")" + for installSourceGuardian_phpv in $PHP_MAJDOTMINDOTPAT_VERSION $PHP_MAJDOTMIN_VERSION; do + installSourceGuardian_file="$installSourceGuardian_dir/ixed.$PHP_MAJDOTMIN_VERSION" + if test $PHP_THREADSAFE -eq 1; then + installSourceGuardian_file="${installSourceGuardian_file}ts" + fi + installSourceGuardian_file="${installSourceGuardian_file}.lin" + if test -f "$installSourceGuardian_file"; then + mv "$installSourceGuardian_file" "$(getPHPExtensionsDir)/sourceguardian.so" + return + fi + done + printf 'Unable to find a SourceGuardian compatible with PHP %s or PHP %s.\nAvailable SourceGuardian versions:\n' "$PHP_MAJDOTMINDOTPAT_VERSION" "$PHP_MAJDOTMIN_VERSION" >&2 + ls -1 "$installSourceGuardian_dir" | grep -E '^ixed\..*\.lin$' | sed -E 's/^[^0-9]+([0-9]+(\.[0-9]+)*).*$/\1/' | sort | uniq >&2 + exit 1 +} + +# Install Cargo (if not yet installed) +installCargo() { + if command -v cargo >/dev/null; then + return + fi + installCargo_cargoversion= + if ! test -f "$HOME/.cargo/env"; then + printf '# Installing cargo\n' + case "$DISTRO" in + alpine) + # see https://github.com/hyperledger/indy-vdr/issues/69#issuecomment-998104850 + export RUSTFLAGS='-C target-feature=-crt-static' + ;; + esac + curl $IPE_CURL_FLAGS https://sh.rustup.rs -sSf | sh -s -- -y -q + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -le 310; then + # With version 1.84.0 we have this error: + # Error relocating /root/.rustup/toolchains/stable-x86_64-unknown-linux-musl/bin/cargo: posix_spawn_file_actions_addchdir_np: symbol not found + # See https://github.com/rust-lang/rust/pull/131851#issue-2595663507 + installCargo_cargoversion=1.83.0 + fi + ;; + esac + fi + . "$HOME/.cargo/env" + if test -n "$installCargo_cargoversion"; then + rustup default -- "$installCargo_cargoversion" + fi + if test -z "${IPE_UNINSTALL_CARGO:-}"; then + IPE_UNINSTALL_CARGO=y + fi +} + +# Install New Relic +# +# Arguments: +# $1: the version to be installed (optional) +installNewRelic() { + printf '# Installing newrelic\n' + installNewRelic_version="${1:-}" + if test -z "$installNewRelic_version"; then + # see https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/php-agent-compatibility-requirements/ + if test $PHP_MAJMIN_VERSION -le 701; then + installNewRelic_version=10.21.0.11 + fi + fi + if test -z "$installNewRelic_version"; then + installNewRelic_baseUrl=https://download.newrelic.com/php_agent/release/ + else + installNewRelic_baseUrl="https://download.newrelic.com/php_agent/archive/$installNewRelic_version/" + fi + installNewRelic_search='\bnewrelic-php[0-9.]*-[0-9]+(\.[0-9]+)*-linux' + case "$DISTRO" in + alpine) + installNewRelic_search="$installNewRelic_search-musl" + ;; + esac + installNewRelic_file="$(curl $IPE_CURL_FLAGS -sSLf -o- "$installNewRelic_baseUrl" | sed -E 's/<[^>]*>//g' | grep -Eo "$installNewRelic_search.tar.gz" | sort | head -1)" + installNewRelic_url="$installNewRelic_baseUrl$installNewRelic_file" + installNewRelic_src="$(getPackageSource "$installNewRelic_url")" + cd -- "$installNewRelic_src" + NR_INSTALL_USE_CP_NOT_LN=1 NR_INSTALL_SILENT=1 ./newrelic-install install + case "${IPE_NEWRELIC_DAEMON:-}" in + 1 | y* | Y*) + NR_INSTALL_USE_CP_NOT_LN=1 NR_INSTALL_SILENT=1 ./newrelic-install install_daemon + ;; + esac + case "${IPE_NEWRELIC_KEEPLOG:-}" in + 1 | y* | Y*) ;; + *) + rm -f /tmp/nrinstall-*.tar + ;; + esac + cd - >/dev/null + cat <&2 + fi + if test -n "$(getModuleSourceCodePath "$installBundledModule_module")"; then + printf '### WARNING the module "%s" is bundled with PHP, you can NOT specify a source code path for it\n' "$installBundledModule_module" >&2 + fi + case "$installBundledModule_module" in + dba) + if test -e /usr/lib/$TARGET_TRIPLET/libdb-5.3.so && ! test -e /usr/lib/libdb-5.3.so; then + ln -s /usr/lib/$TARGET_TRIPLET/libdb-5.3.so /usr/lib/ + fi + if test $PHP_MAJMIN_VERSION -le 505; then + docker-php-source extract + patch /usr/src/php/ext/dba/config.m4 </dev/null + ;; + oci8 | pdo_oci) + # oci8/pdo_oci must be loaded after smbclient (otherwise we have a segmentation fault when using smbclient_open) + installBundledModule_ini_basename="xx-php-ext-$installBundledModule_module" + case "$DISTRO" in + debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + if test -f /usr/lib/$TARGET_TRIPLET/libaio.so.1t64 && ! test -f /usr/lib/$TARGET_TRIPLET/libaio.so.1; then + ln -s /usr/lib/$TARGET_TRIPLET/libaio.so.1t64 /usr/lib/$TARGET_TRIPLET/libaio.so.1 + fi + if test -f /usr/lib/$TARGET_TRIPLET/libaio.so.1 && ! test -f /usr/lib/$TARGET_TRIPLET/libaio.so; then + ln -s /usr/lib/$TARGET_TRIPLET/libaio.so.1 /usr/lib/$TARGET_TRIPLET/libaio.so + fi + fi + ;; + esac + installOracleInstantClient + if test "$installBundledModule_module" = oci8; then + docker-php-ext-configure "$installBundledModule_module" "--with-oci8=instantclient,$ORACLE_INSTANTCLIENT_LIBPATH" + elif test "$installBundledModule_module" = pdo_oci; then + docker-php-ext-configure "$installBundledModule_module" "--with-pdo-oci=instantclient,$ORACLE_INSTANTCLIENT_LIBPATH" + fi + ;; + pdo_odbc) + docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr + ;; + snmp) + case "$DISTRO" in + alpine) + mkdir -p -m 0755 /var/lib/net-snmp/mib_indexes + ;; + esac + ;; + sockets) + case "$PHP_MAJDOTMINDOTPAT_VERSION" in + 8.0.15 | 8.1.2) + sed -i '70 i #ifndef _GNU_SOURCE' /usr/src/php/ext/sockets/config.m4 + sed -i '71 i #define _GNU_SOURCE' /usr/src/php/ext/sockets/config.m4 + sed -i '72 i #endif' /usr/src/php/ext/sockets/config.m4 + ;; + esac + ;; + sybase_ct) + docker-php-ext-configure sybase_ct --with-sybase-ct=/usr + ;; + tidy) + case "$DISTRO" in + alpine) + if ! test -f /usr/include/buffio.h; then + ln -s /usr/include/tidybuffio.h /usr/include/buffio.h + UNNEEDED_PACKAGE_LINKS="$UNNEEDED_PACKAGE_LINKS /usr/include/buffio.h" + fi + ;; + esac + ;; + zip) + if test $PHP_MAJMIN_VERSION -le 505; then + docker-php-ext-configure zip + elif test $PHP_MAJMIN_VERSION -le 703; then + docker-php-ext-configure zip --with-libzip + else + docker-php-ext-configure zip --with-zip + fi + ;; + esac + installBundledModule_errBefore="$(php -r 'return;' 2>&1 || true)" + docker-php-ext-install -j$(getProcessorCount) "$installBundledModule_module" + if test -z "$installBundledModule_ini_basename"; then + installBundledModule_ini_basename="docker-php-ext-$installBundledModule_module" + else + mv "$PHP_INI_DIR/conf.d/docker-php-ext-$installBundledModule_module.ini" "$PHP_INI_DIR/conf.d/$installBundledModule_ini_basename.ini" + fi + case "$installBundledModule_module" in + imap) + case "$DISTRO_VERSION" in + debian@9) + dpkg -r libc-client2007e-dev + ;; + esac + ;; + esac + case "${IPE_SKIP_CHECK:-}" in + 1 | y* | Y*) ;; + *) + php -r 'return;' >/dev/null 2>/dev/null || true + installBundledModule_errAfter="$(php -r 'return;' 2>&1 || true)" + if test "$installBundledModule_errAfter" != "$installBundledModule_errBefore"; then + printf 'PHP has problems after installing the "%s" extension:\n%s\n' "$installBundledModule_module" "$installBundledModule_errAfter" >&2 + rm "$PHP_INI_DIR/conf.d/$installBundledModule_ini_basename.ini" || true + return 1 + fi + ;; + esac +} + +# Fetch a tar.gz file, extract it and returns the path of the extracted folder. +# +# Arguments: +# $1: the URL of the file to be downloaded +# +# Output: +# The path of the extracted directory +getPackageSource() { + mkdir -p /tmp/src + getPackageSource_tempFile=$(mktemp -p /tmp/src) + curl $IPE_CURL_FLAGS -sSLf -o "$getPackageSource_tempFile" "$1" + getPackageSource_tempDir=$(mktemp -p /tmp/src -d) + cd "$getPackageSource_tempDir" + tar -xzf "$getPackageSource_tempFile" 2>/dev/null || tar -xf "$getPackageSource_tempFile" 2>/dev/null || ( + if command -v bsdtar >/dev/null; then + bsdtar -xf "$getPackageSource_tempFile" + else + unzip -q "$getPackageSource_tempFile" + fi + ) + cd - >/dev/null + unlink "$getPackageSource_tempFile" + getPackageSource_outDir='' + for getPackageSource_i in $(ls "$getPackageSource_tempDir"); do + if test -n "$getPackageSource_outDir" || test -f "$getPackageSource_tempDir/$getPackageSource_i"; then + getPackageSource_outDir='' + break + fi + getPackageSource_outDir="$getPackageSource_tempDir/$getPackageSource_i" + done + if test -n "$getPackageSource_outDir"; then + printf '%s' "$getPackageSource_outDir" + else + printf '%s' "$getPackageSource_tempDir" + fi +} + +# Install a PECL/remote PHP module given its handle +# +# Arguments: +# $1: the handle of the PHP module +installRemoteModule() { + installRemoteModule_module="$1" + printf '### INSTALLING REMOTE MODULE %s ###\n' "$installRemoteModule_module" + installRemoteModule_version="$(resolvePHPModuleVersion "$installRemoteModule_module")" + installRemoteModule_path="$(getModuleSourceCodePath "$installRemoteModule_module")" + rm -rf "$CONFIGURE_FILE" + installRemoteModule_manuallyInstalled=0 + installRemoteModule_cppflags='' + installRemoteModule_ini_basename='' + installRemoteModule_ini_extra='' + case "$installRemoteModule_module" in + amqp) + if test -z "$installRemoteModule_version"; then + if test "$DISTRO_VERSION" = debian@8; then + # in Debian Jessie we have librabbitmq version 0.5.2 + installRemoteModule_version=1.9.3 + elif test $PHP_MAJMIN_VERSION -le 505; then + installRemoteModule_version=1.9.4 + elif test $PHP_MAJMIN_VERSION -le 703; then + installRemoteModule_version=1.11.0 + fi + fi + ;; + apcu) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=4.0.11 + fi + fi + ;; + apcu_bc) + # apcu_bc must be loaded after apcu + installRemoteModule_ini_basename="xx-php-ext-$installRemoteModule_module" + ;; + ast) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=1.0.16 + fi + fi + ;; + bitset) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.0.4 + fi + fi + ;; + blackfire) + case $(uname -m) in + i386 | i686 | x86) + installRemoteModule_tmp1=i386 + ;; + aarch64 | arm64 | armv8) + installRemoteModule_tmp1=arm64 + ;; + *) + installRemoteModule_tmp1=amd64 + ;; + esac + case $DISTRO in + alpine) + installRemoteModule_distro=alpine + ;; + *) + installRemoteModule_distro=linux + ;; + esac + installRemoteModule_tmp2=$(php -r 'echo PHP_MAJOR_VERSION . PHP_MINOR_VERSION . (ZEND_THREAD_SAFE ? "-zts" : "");') + installRemoteModule_tmp="$(mktemp -p /tmp/src -d)" + cd "$installRemoteModule_tmp" + curl $IPE_CURL_FLAGS -sSLf --user-agent Docker https://blackfire.io/api/v1/releases/probe/php/$installRemoteModule_distro/$installRemoteModule_tmp1/$installRemoteModule_tmp2 | tar xz + mv blackfire-*.so $(getPHPExtensionsDir)/blackfire.so + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + installRemoteModule_ini_extra="$(printf '%sblackfire.agent_socket=tcp://blackfire:8307\n' "$installRemoteModule_ini_extra")" + ;; + brotli) + if test -z "$installRemoteModule_version"; then + case "$DISTRO_VERSION" in + debian@8) + # In Debian Jessie we have brotli version 0.18.2 + installRemoteModule_version=0.18.2 + ;; + esac + fi + ;; + cassandra) + installRemoteModule_src="$(getPackageSource https://github.com/nano-interactive/ext-cassandra/tarball/1cf12c5ce49ed43a2c449bee4b7b23ce02a37bf0)" + cd "$installRemoteModule_src/ext" + phpize + ./configure + make -j$(getProcessorCount) install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + ;; + cmark) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=1.1.0 + fi + fi + if ! test -e /usr/local/lib/libcmark.so && ! test -e /usr/local/lib64/libcmark.so && ! test -e /usr/lib/libcmark.so && ! test -e /usr/lib64/libcmark.so && ! test -e /lib/libcmark.so; then + installRemoteModule_cmakeVersion="$(cmake --version | head -n1 | sed -E 's/^.* //')" + if test $(compareVersions "$installRemoteModule_cmakeVersion" '3.7') -lt 0; then + installRemoteModule_cmarkVersion=0.29.0 + elif test $(compareVersions "$installRemoteModule_cmakeVersion" '3.15') -lt 0; then + installRemoteModule_cmarkVersion=0.31.1 + else + installRemoteModule_cmarkVersion=0.31.2 + fi + printf 'Installing libcmark %s\n' "$installRemoteModule_cmarkVersion" + cd "$(getPackageSource https://github.com/commonmark/cmark/archive/$installRemoteModule_cmarkVersion.tar.gz)" + make -s -j$(getProcessorCount) cmake_build + make -s -j$(getProcessorCount) install + cd - >/dev/null + case "$DISTRO" in + alpine) + if test -e /usr/local/lib64/libcmark.so.$installRemoteModule_cmarkVersion && ! test -e /usr/local/lib/libcmark.so.$installRemoteModule_cmarkVersion; then + ln -s /usr/local/lib64/libcmark.so.$installRemoteModule_cmarkVersion /usr/local/lib/ + fi + ;; + *) + ldconfig || true + ;; + esac + fi + ;; + csv) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=0.3.1 + fi + fi + ;; + ddtrace) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=0.75.0 + fi + if test -z "$installRemoteModule_version"; then + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -le 312; then + # cc is not supported due to a memcmp related bug + installRemoteModule_version=1.1.0 + fi + ;; + esac + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 0.75.0) -ge 0; then + installCargo + fi + ;; + decimal) + case "$DISTRO" in + alpine) + if ! test -f /usr/local/lib/libmpdec.so; then + installLibMPDec + fi + ;; + debian) + if test $DISTRO_MAJMIN_VERSION -ge 1200; then + if test -z "$(ldconfig -p | grep -E '\slibmpdec.so\s')"; then + installLibMPDec + fi + fi + ;; + esac + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 802; then + installRemoteModule_version=1.5.1 + fi + fi + ;; + ds) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 703; then + installRemoteModule_version=1.3.0 + elif test $PHP_MAJMIN_VERSION -lt 704; then + installRemoteModule_version=1.4.0 + elif test $PHP_MAJMIN_VERSION -lt 802; then + installRemoteModule_version=1.6.0 + fi + fi + ;; + ecma_intl) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=alpha + fi + ;; + ev) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 800; then + installRemoteModule_version=1.1.5 + fi + fi + ;; + event) + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 2.4.0) -ge 0; then + # Enable internal debugging in Event + addConfigureOption enable-event-debug no + # Enable sockets support in Event + if php --ri sockets >/dev/null 2>/dev/null; then + addConfigureOption enable-event-sockets yes + else + addConfigureOption enable-event-sockets no + fi + # libevent installation prefix + addConfigureOption with-event-libevent-dir /usr + # Include libevent's pthreads library and enable thread safety support in Event + addConfigureOption with-event-pthreads yes + # Include libevent protocol-specific functionality support including HTTP, DNS, and RPC + addConfigureOption with-event-extra yes + # Include libevent OpenSSL support + addConfigureOption with-event-openssl yes + # PHP Namespace for all Event classes + if test -n "${IPE_EVENT_NAMESPACE:-}"; then + addConfigureOption with-event-ns "$IPE_EVENT_NAMESPACE" + else + addConfigureOption with-event-ns no + fi + # openssl installation prefix + addConfigureOption with-openssl-dir yes + elif test $(compareVersions "$installRemoteModule_version" 1.7.6) -ge 0; then + # Enable internal debugging in Event + addConfigureOption enable-event-debug no + # Enable sockets support in Event + if php --ri sockets >/dev/null 2>/dev/null; then + addConfigureOption enable-event-sockets yes + else + addConfigureOption enable-event-sockets no + fi + # libevent installation prefix + addConfigureOption with-event-libevent-dir /usr + # Include libevent's pthreads library and enable thread safety support in Event + addConfigureOption with-event-pthreads yes + # Include libevent protocol-specific functionality support including HTTP, DNS, and RPC + addConfigureOption with-event-extra yes + # Include libevent OpenSSL support + addConfigureOption with-event-openssl yes + # openssl installation prefix + addConfigureOption with-openssl-dir no + elif test $(compareVersions "$installRemoteModule_version" 1.3.0) -ge 0; then + # Enable internal debugging in event + addConfigureOption enable-event-debug no + # libevent installation prefix + addConfigureOption with-event-libevent-dir /usr + # Include libevent's pthreads library and enable thread safety support in event + addConfigureOption with-event-pthreads yes + # Include libevent protocol-specific functionality support including HTTP, DNS, and RPC + addConfigureOption with-event-extra yes + # Include libevent OpenSSL support + addConfigureOption with-event-openssl yes + # openssl installation prefix + addConfigureOption with-openssl-dir no + fi + # event must be loaded after sockets + installRemoteModule_ini_basename="xx-php-ext-$installRemoteModule_module" + ;; + excimer) + if test -z "$installRemoteModule_version"; then + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -le 313; then + # With newer versions we have: + # configure: error: excimer requires timer_create or kevent + installRemoteModule_version=1.2.3 + fi + ;; + esac + fi + ;; + gearman) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.1.2 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=2.1.3 + elif test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=2.1.4 + elif test $DISTRO_VERSION_NUMBER -eq 10 && { test $PHP_MAJMIN_VERSION -eq 801 || test $PHP_MAJMIN_VERSION -eq 802; }; then + # I don't know why on Debian Buster sometimes we have "undefined symbol: zif_gearman_client_set_ssl" + installRemoteModule_version=2.1.4 + fi + fi + case "$DISTRO" in + alpine) + if ! test -e /usr/local/include/libgearman/gearman.h || ! test -e /usr/local/lib/libgearman.so; then + installRemoteModule_src="$(getPackageSource https://github.com/gearman/gearmand/releases/download/1.1.22/gearmand-1.1.22.tar.gz)" + cd -- "$installRemoteModule_src" + ./configure + make -j$(getProcessorCount) install-binPROGRAMS + make -j$(getProcessorCount) install-nobase_includeHEADERS + cd - >/dev/null + fi + ;; + esac + ;; + geoip) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=beta + fi + ;; + geos) + if test -z "$installRemoteModule_path"; then + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=dfe1ab17b0f155cc315bc13c75689371676e02e1 + fi + installRemoteModule_src="$(getPackageSource https://github.com/libgeos/php-geos/archive/$installRemoteModule_version.tar.gz)" + cd "$installRemoteModule_src" + ./autogen.sh + ./configure + make -j$(getProcessorCount) install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + fi + ;; + geospatial) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.2.1 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=0.3.2 + else + installRemoteModule_version=beta + fi + fi + ;; + gmagick) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.1.7RC3 + else + installRemoteModule_version=beta + fi + fi + ;; + grpc) + installRemoteModule_cppflags='-Wno-maybe-uninitialized -Wno-attributes -Wno-return-type' + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.33.1 + else + case "$DISTRO_VERSION" in + debian@8) + installRemoteModule_version=1.46.3 + ;; + alpine@3.7 | alpine@3.8 | debian@9) # With newer version: "This package requires GCC 7 or higher" + installRemoteModule_version=1.52.1 + ;; + alpine@3.13) # With 1.71.0, 1.72.0: "src/core/call/call_filters.h:1002:69: internal compiler error: in assign_temp, at function.c:984" + installRemoteModule_version=1.70.0 + ;; + esac + fi + fi + ;; + http) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.6.0 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=3.2.4 + fi + fi + if test $PHP_MAJMIN_VERSION -ge 700; then + if ! test -e /usr/local/lib/libidnkit.so; then + installRemoteModule_src="$(getPackageSource https://jprs.co.jp/idn/idnkit-2.3.tar.bz2)" + cd -- "$installRemoteModule_src" + CFLAGS=-Wno-incompatible-pointer-types ./configure + make -j$(getProcessorCount) install + cd - >/dev/null + fi + fi + # http must be loaded after raphf and propro + installRemoteModule_ini_basename="xx-php-ext-$installRemoteModule_module" + ;; + igbinary) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.0.8 + fi + fi + ;; + imap) + # Include Kerberos Support + addConfigureOption with-kerberos yes + # Include SSL Support + addConfigureOption with-imap-ssl yes + ;; + imagick) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 506; then + installRemoteModule_version=3.7.0 + fi + fi + ;; + inotify) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.1.6 + fi + fi + ;; + ion) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=alpha + fi + if ! test -f /usr/local/lib/libionc.so || ! test -f /usr/local/include/ionc/ion.h; then + echo 'Installing ion-c... ' + installRemoteModule_src="$(mktemp -p /tmp/src -d)" + git clone -q -c advice.detachedHead=false --depth 1 --branch v1.1.4 https://github.com/amzn/ion-c.git "$installRemoteModule_src/ion" + ( + cd "$installRemoteModule_src/ion" + git submodule init -q + git submodule update -q + mkdir -p build + cd build + CFLAGS='-Wno-incompatible-pointer-types -Wno-stringop-overflow -Wno-discarded-qualifiers' cmake -DCMAKE_BUILD_TYPE=Release .. -Wno-dev + make clean + make -j$(getProcessorCount) install + ) + rm -rf "$installRemoteModule_src" + fi + addConfigureOption with-ion "shared,/usr/local" + ;; + ioncube_loader) + installIonCubeLoader + installRemoteModule_manuallyInstalled=1 + ;; + jsmin) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=2.0.1 + fi + fi + ;; + jsonpath) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 800; then + installRemoteModule_version=1.0.1 + fi + fi + ;; + luasandbox) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 702; then + installRemoteModule_version=3.0.3 + fi + fi + ;; + lz4) + if test -z "$installRemoteModule_path"; then + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=0.4.3 + fi + installRemoteModule_src="$(getPackageSource https://github.com/kjdev/php-ext-lz4/archive/refs/tags/$installRemoteModule_version.tar.gz)" + cd "$installRemoteModule_src" + phpize + ./configure --with-lz4-includedir=/usr + make -j$(getProcessorCount) install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + fi + ;; + lzf) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 702; then + installRemoteModule_version=1.6.8 + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" '1.5.0') -ge 0; then + # Sacrifice speed in favour of compression ratio? + case "${IPE_LZF_BETTERCOMPRESSION:-}" in + 1 | y* | Y*) + addConfigureOption 'enable-lzf-better-compression' 'yes' + ;; + *) + addConfigureOption 'enable-lzf-better-compression' 'no' + ;; + esac + fi + ;; + mailparse) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.1.6 + elif test $PHP_MAJMIN_VERSION -le 702; then + installRemoteModule_version=3.1.3 + fi + fi + ;; + memcache) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.2.7 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=4.0.5.2 + fi + fi + ;; + memcached) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.2.0 + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + # Set the path to libmemcached install prefix + addConfigureOption 'with-libmemcached-dir' 'no' + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" '3.0.0') -ge 0; then + # Set the path to ZLIB install prefix + addConfigureOption 'with-zlib-dir' 'no' + # Use system FastLZ library + addConfigureOption 'with-system-fastlz' 'no' + # Enable memcached igbinary serializer support + if php --ri igbinary >/dev/null 2>/dev/null; then + addConfigureOption 'enable-memcached-igbinary' 'yes' + else + addConfigureOption 'enable-memcached-igbinary' 'no' + fi + # Enable memcached msgpack serializer support + if php --ri msgpack >/dev/null 2>/dev/null; then + addConfigureOption 'enable-memcached-msgpack' 'yes' + else + addConfigureOption 'enable-memcached-msgpack' 'no' + fi + # Enable memcached json serializer support + addConfigureOption 'enable-memcached-json' 'yes' + # Enable memcached protocol support + addConfigureOption 'enable-memcached-protocol' 'no' # https://github.com/php-memcached-dev/php-memcached/issues/418#issuecomment-449587972 + # Enable memcached sasl support + addConfigureOption 'enable-memcached-sasl' 'yes' + # Enable memcached session handler support + addConfigureOption 'enable-memcached-session' 'yes' + fi + # memcached must be loaded after msgpack + installRemoteModule_ini_basename="xx-php-ext-$installRemoteModule_module" + ;; + memprof) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.0.0 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=2.1.0 + fi + fi + ;; + mongo) + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" '1.5.0') -ge 0; then + # Build with Cyrus SASL (MongoDB Enterprise Authentication) support? + addConfigureOption '-with-mongo-sasl' 'yes' + fi + ;; + mongodb) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 505; then + installRemoteModule_version=1.5.5 + elif test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.7.5 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=1.9.2 + elif test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=1.11.1 + elif test $PHP_MAJMIN_VERSION -le 703; then + installRemoteModule_version=1.16.2 + elif test $PHP_MAJMIN_VERSION -le 800; then + installRemoteModule_version=1.20.1 + fi + fi + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 1.17.0) -ge 0; then + # Enable developer flags? (yes/no) + addConfigureOption enable-mongodb-developer-flags no + # Enable code coverage? (yes/no) + addConfigureOption enable-mongodb-coverage no + # Use system libraries for libbson, libmongoc, and libmongocrypt? (yes/no) + addConfigureOption with-mongodb-system-libs no + # Enable client-side encryption? (auto/yes/no) + addConfigureOption with-mongodb-client-side-encryption yes + # Enable Snappy for compression? (auto/yes/no) + addConfigureOption with-mongodb-snappy yes + # Enable zlib for compression? (auto/system/bundled/no) + addConfigureOption with-mongodb-zlib yes + # Enable zstd for compression? (auto/yes/no) + addConfigureOption with-mongodb-zstd yes + # Enable SASL for Kerberos authentication? (auto/cyrus/no) + addConfigureOption with-mongodb-sasl yes + # Enable crypto and TLS? (auto/openssl/libressl/darwin/no) + addConfigureOption with-mongodb-ssl yes + # Use system crypto profile (OpenSSL only)? (yes/no) + addConfigureOption enable-mongodb-crypto-system-profile yes + # Use bundled or system utf8proc for SCRAM-SHA-256 SASLprep? (bundled/system) + addConfigureOption with-mongodb-utf8proc bundled + fi + ;; + mosquitto) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=beta + fi + ;; + msgpack) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.5.7 + fi + fi + ;; + newrelic) + installNewRelic "$installRemoteModule_version" + installRemoteModule_manuallyInstalled=2 + ;; + oauth) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.2.3 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=2.0.9 + fi + fi + ;; + oci8 | pdo_oci) + # oci8/pdo_oci must be loaded after smbclient (otherwise we have a segmentation fault when using smbclient_open) + installRemoteModule_ini_basename="xx-php-ext-$installRemoteModule_module" + case "$DISTRO" in + debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + if test -f /usr/lib/$TARGET_TRIPLET/libaio.so.1t64 && ! test -f /usr/lib/$TARGET_TRIPLET/libaio.so.1; then + ln -s /usr/lib/$TARGET_TRIPLET/libaio.so.1t64 /usr/lib/$TARGET_TRIPLET/libaio.so.1 + fi + if test -f /usr/lib/$TARGET_TRIPLET/libaio.so.1 && ! test -f /usr/lib/$TARGET_TRIPLET/libaio.so; then + ln -s /usr/lib/$TARGET_TRIPLET/libaio.so.1 /usr/lib/$TARGET_TRIPLET/libaio.so + fi + fi + ;; + esac + installOracleInstantClient + if test "$installRemoteModule_module" = oci8; then + addConfigureOption with-oci8 "instantclient,$ORACLE_INSTANTCLIENT_LIBPATH" + elif test "$installRemoteModule_module" = pdo_oci; then + addConfigureOption with-pdo-oci "instantclient,$ORACLE_INSTANTCLIENT_LIBPATH" + fi + ;; + opencensus) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=alpha + fi + ;; + openswoole) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 704; then + installRemoteModule_version=4.10.0 + elif test $PHP_MAJMIN_VERSION -lt 801; then + installRemoteModule_version=22.0.0 + elif test $PHP_MAJMIN_VERSION -lt 802; then + installRemoteModule_version=22.1.2 + elif test $PHP_MAJMIN_VERSION -lt 803; then + installRemoteModule_version=25.2.0 + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + if php --ri sockets >/dev/null 2>/dev/null; then + installRemoteModule_sockets=yes + installRemoteModule_ini_basename="xx-php-ext-$installRemoteModule_module" + else + installRemoteModule_sockets=no + fi + installRemoteModule_openssl=yes + if test -n "$installRemoteModule_version" && test $(compareVersions "$installRemoteModule_version" 22.1.2) -ge 0; then + # enable coroutine sockets? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 protocol? + addConfigureOption enable-http2 yes + # enable coroutine mysqlnd? + addConfigureOption enable-mysqlnd yes + # enable coroutine curl? + addConfigureOption enable-hook-curl yes + # enable coroutine postgres? + addConfigureOption with-postgres yes + elif test $(compareVersions "$installRemoteModule_version" 22.1.1) -ge 0; then + # enable c-ares support? + addConfigureOption enable-cares yes + # enable coroutine sockets? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 protocol? + addConfigureOption enable-http2 yes + # enable coroutine mysqlnd? + addConfigureOption enable-mysqlnd yes + # enable coroutine curl? + addConfigureOption enable-hook-curl yes + # enable coroutine postgres? + addConfigureOption with-postgres yes + elif test $(compareVersions "$installRemoteModule_version" 22.1.0) -ge 0; then + # enable coroutine sockets? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 protocol? + addConfigureOption enable-http2 yes + # enable coroutine mysqlnd? + addConfigureOption enable-mysqlnd yes + # enable coroutine curl? + addConfigureOption enable-hook-curl yes + # enable coroutine postgres? + addConfigureOption with-postgres yes + elif test $(compareVersions "$installRemoteModule_version" 22.0.0) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable hook curl support? + addConfigureOption enable-hook-curl yes + # enable postgres support? + addConfigureOption with-postgres yes + elif test $(compareVersions "$installRemoteModule_version" 4.8.0) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable json support? + addConfigureOption enable-swoole-json yes + # enable curl support? + addConfigureOption enable-swoole-curl yes + # enable postgres support? + addConfigureOption with-postgres yes + else + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable json support? + addConfigureOption enable-swoole-json yes + # enable curl support? + addConfigureOption enable-swoole-curl yes + fi + ;; + opentelemetry) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 801; then + installRemoteModule_version=1.1.3 + fi + fi + ;; + operator) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=beta + fi + ;; + parallel) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=0.8.3 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=1.1.4 + fi + fi + ;; + parle) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 704; then + installRemoteModule_version=0.8.3 + else + installRemoteModule_version=beta + fi + fi + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 0.8.4) -ge 0; then + # Enable internal UTF-32 support in parle + addConfigureOption enable-parle-utf32 yes + fi + ;; + pcov) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=0.9.0 + fi + fi + ;; + phalcon) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMINPAT_VERSION -lt 70401; then + installRemoteModule_version=4.1.2 + elif test $PHP_MAJMIN_VERSION -lt 800; then + installRemoteModule_version=5.4.0 + elif test $PHP_MAJMIN_VERSION -lt 801; then + installRemoteModule_version=5.10.0 + fi + fi + installRemoteModule_cppflags='-Wno-incompatible-pointer-types' + ;; + php_trie) + if ! test -f /usr/local/include/hat-trie/include/tsl/htrie_map.h; then + installRemoteModule_src="$(getPackageSource https://codeload.github.com/Tessil/hat-trie/tar.gz/v0.7.1)" + mkdir -p /usr/local/include/hat-trie + mv "$installRemoteModule_src/include" /usr/local/include/hat-trie + fi + ;; + pq) + # pq must be loaded after raphf + installRemoteModule_ini_basename="xx-php-ext-$installRemoteModule_module" + ;; + propro) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.0.2 + fi + fi + ;; + protobuf) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=3.12.4 + elif test $PHP_MAJMIN_VERSION -lt 800; then + installRemoteModule_version=3.24.4 + elif test $PHP_MAJMIN_VERSION -lt 801; then + installRemoteModule_version=3.25.3 + elif test $PHP_MAJMIN_VERSION -lt 802; then + installRemoteModule_version=4.33.5 + fi + fi + ;; + psr) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 506; then + installRemoteModule_version=0.5.1 + elif test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=0.6.1 + elif test $PHP_MAJMIN_VERSION -lt 703; then + installRemoteModule_version=1.1.0 + fi + fi + ;; + pthreads) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.0.10 + fi + fi + ;; + raphf) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.1.2 + fi + fi + ;; + rdkafka) + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + if test -z "$installRemoteModule_version"; then + installRemoteModule_version1='' + if test $PHP_MAJMIN_VERSION -le 505; then + installRemoteModule_version1=3.0.5 + elif test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version1=4.1.2 + fi + installRemoteModule_version2='' + case "$DISTRO" in + alpine) + installRemoteModule_tmp='librdkafka' + ;; + debian) + installRemoteModule_tmp='librdkafka*' + ;; + *) + installRemoteModule_tmp='' + ;; + esac + if test -n "$installRemoteModule_tmp"; then + installRemoteModule_tmp="$(getInstalledPackageVersion "$installRemoteModule_tmp")" + if test -n "$installRemoteModule_tmp" && test $(compareVersions "$installRemoteModule_tmp" '0.11.0') -lt 0; then + installRemoteModule_version2=3.1.3 + fi + fi + if test -z "$installRemoteModule_version1" || test -z "$installRemoteModule_version2"; then + installRemoteModule_version="$installRemoteModule_version1$installRemoteModule_version2" + elif test $(compareVersions "$installRemoteModule_version1" "$installRemoteModule_version2") -le 0; then + installRemoteModule_version="$installRemoteModule_version1" + else + installRemoteModule_version="$installRemoteModule_version2" + fi + fi + ;; + redis) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=4.3.0 + elif test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=5.3.7 + elif test $PHP_MAJMIN_VERSION -le 703; then + installRemoteModule_version=6.0.2 + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + # Enable igbinary serializer support? + if php --ri igbinary >/dev/null 2>/dev/null; then + addConfigureOption enable-redis-igbinary yes + else + addConfigureOption enable-redis-igbinary no + fi + # Enable lzf compression support? + addConfigureOption enable-redis-lzf yes + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 5.0.0) -ge 0; then + if ! test -e /usr/include/zstd.h || ! test -e /usr/lib/libzstd.so -o -e "/usr/lib/$TARGET_TRIPLET/libzstd.so"; then + installRemoteModule_zstdVersion=1.4.4 + installRemoteModule_zstdVersionMajor=$(echo $installRemoteModule_zstdVersion | cut -d. -f1) + rm -rf /tmp/src/zstd + mv "$(getPackageSource https://github.com/facebook/zstd/releases/download/v$installRemoteModule_zstdVersion/zstd-$installRemoteModule_zstdVersion.tar.gz)" /tmp/src/zstd + cd /tmp/src/zstd + make V=0 -j$(getProcessorCount) lib + cp -f lib/libzstd.so "/usr/lib/$TARGET_TRIPLET/libzstd.so.$installRemoteModule_zstdVersion" + ln -sf "/usr/lib/$TARGET_TRIPLET/libzstd.so.$installRemoteModule_zstdVersion" "/usr/lib/$TARGET_TRIPLET/libzstd.so.$installRemoteModule_zstdVersionMajor" + ln -sf "/usr/lib/$TARGET_TRIPLET/libzstd.so.$installRemoteModule_zstdVersion" "/usr/lib/$TARGET_TRIPLET/libzstd.so" + ln -sf /tmp/src/zstd/lib/zstd.h /usr/include/zstd.h + UNNEEDED_PACKAGE_LINKS="$UNNEEDED_PACKAGE_LINKS /usr/include/zstd.h" + cd - >/dev/null + fi + # Enable zstd compression support? + addConfigureOption enable-redis-zstd yes + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 6.0.0) -ge 0; then + # Enable msgpack serializer support? + if php --ri msgpack >/dev/null 2>/dev/null; then + addConfigureOption enable-redis-msgpack yes + else + addConfigureOption enable-redis-msgpack no + fi + # Enable lz4 compression? + addConfigureOption enable-redis-lz4 yes + # Use system liblz4? + addConfigureOption with-liblz4 yes + fi + fi + ;; + relay) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version="$(curl $IPE_CURL_FLAGS -sSLf https://builds.r2.relay.so/meta/latest)" + installRemoteModule_version="${installRemoteModule_version#v}" + fi + case $(uname -m) in + aarch64 | arm64 | armv8) + installRemoteModule_hardware=aarch64 + ;; + *) + installRemoteModule_hardware=x86-64 + ;; + esac + installRemoteModule_distro="$DISTRO" + installRemoteModule_flags='' + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -lt 317; then + installRemoteModule_distro=alpine3.9 + else + installRemoteModule_distro=alpine3.17 + fi + ;; + debian) + if dpkg -l 'libssl*' | grep -E '^ii ' | cut -d' ' -f3 | grep -q '^libssl3'; then + installRemoteModule_flags=+libssl3 + fi + ;; + esac + # See https://relay.so/builds + installRemoteModule_url="https://builds.r2.relay.so/v${installRemoteModule_version}/relay-v${installRemoteModule_version}-php${PHP_MAJDOTMIN_VERSION}-${installRemoteModule_distro}-${installRemoteModule_hardware}${installRemoteModule_flags}.tar.gz" + printf 'Downloading relay v%s (%s) from %s... ' "$installRemoteModule_version" "$installRemoteModule_hardware" "$installRemoteModule_url" + installRemoteModule_src="$(getPackageSource $installRemoteModule_url)" + echo 'done.' + if test $PHP_THREADSAFE -eq 1; then + cp -- "$installRemoteModule_src/relay-zts.so" "$PHP_EXTDIR/relay.so" + else + cp -- "$installRemoteModule_src/relay-pkg.so" "$PHP_EXTDIR/relay.so" + fi + sed -i "s/00000000-0000-0000-0000-000000000000/$(cat /proc/sys/kernel/random/uuid)/" "$PHP_EXTDIR/relay.so" + installRemoteModule_ini_extra="$(grep -vE '^[ \t]*extension[ \t]*=' $installRemoteModule_src/relay.ini)" + installRemoteModule_manuallyInstalled=1 + ;; + rrd) + installRemoteModule_cppflags='-Wno-incompatible-pointer-types' + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=1.1.3 + fi + fi + ;; + saxon) + case "${IPE_SAXON_EDITION:-}" in + EE | PE | HE) + installRemoteModule_edition=$IPE_SAXON_EDITION + ;; + *) + installRemoteModule_edition=EE + ;; + esac + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 800; then + installRemoteModule_version='12.3' + fi + fi + case $(uname -m) in + aarch64 | arm64 | armv8) + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" '12.9') -ge 0 || test $(compareVersions "$installRemoteModule_version" '12.6') -lt 0; then + installRemoteModule_architecture=linux-arm64 + else + installRemoteModule_architecture=linux-aarch64 + fi + ;; + *) + installRemoteModule_architecture=linux-x86_64 + ;; + esac + installRemoteModule_majorVersion= + if test -n "$installRemoteModule_version"; then + installRemoteModule_majorVersion="${installRemoteModule_version%%.*}" + if test "$installRemoteModule_majorVersion" -ge 12; then + installRemoteModule_url=https://downloads.saxonica.com/SaxonC/${installRemoteModule_edition}/${installRemoteModule_majorVersion}/libsaxon-${installRemoteModule_edition}C-${installRemoteModule_architecture}-v${installRemoteModule_version}.zip + else + installRemoteModule_url=https://downloads.saxonica.com/SaxonC/${installRemoteModule_edition}/${installRemoteModule_majorVersion}/libsaxon-${installRemoteModule_edition}C-setup64-v${installRemoteModule_version}.zip + fi + else + installRemoteModule_regex="https://downloads.saxonica.com/SaxonC/${installRemoteModule_edition}/[0-9]+/SaxonC${installRemoteModule_edition}-${installRemoteModule_architecture}-[0-9\-]+.zip" + installRemoteModule_url="$(curl $IPE_CURL_FLAGS -sSLf https://www.saxonica.com/download/c.xml | grep -Eo "$installRemoteModule_regex" | head -n 1)" + if test $? -ne 0 || test -z "$installRemoteModule_url"; then + printf "Failed to determine SaxonC download URL - Nothing matches\n%s\n" "$installRemoteModule_regex" + exit 1 + fi + fi + printf 'Downloading SaxonC %s from %s\n' "$installRemoteModule_edition" "$installRemoteModule_url" + installRemoteModule_dir="$(getPackageSource $installRemoteModule_url)" + if ! test -f /usr/lib/libsaxon-*.so; then + installRemoteModule_files="$(find "$installRemoteModule_dir" \( -type f -o -type l \) \( -name 'libsaxonc-*.so*' -o -name 'libsaxon-*.so*' \))" + for installRemoteModule_file in $installRemoteModule_files; do + cp -P "$installRemoteModule_file" /usr/lib/ + done + ldconfig || true + fi + installRemoteModule_files="$(find "$installRemoteModule_dir" -type f -name php8_XsltExecutable.cpp)" + for installRemoteModule_file in $installRemoteModule_files; do + sed -i 's/Z_TYPE_P(val) != NULL/Z_TYPE_P(val) != IS_NULL/g' "$installRemoteModule_file" + done + if test -d "$installRemoteModule_dir/php/src"; then + cd "$installRemoteModule_dir/php/src" + else + cd "$installRemoteModule_dir/Saxon.C.API" + fi + phpize + ./configure --with-saxon="$installRemoteModule_dir/SaxonC${installRemoteModule_edition}" + make -j$(getProcessorCount) install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + ;; + seasclick) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.1.0 + fi + fi + ;; + seaslog) + installRemoteModule_cppflags='-Wno-incompatible-pointer-types' + ;; + smbclient) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.1.1 + elif test $PHP_MAJMIN_VERSION -le 703; then + installRemoteModule_version=1.1.2 + fi + fi + ;; + snappy) + if test -z "$installRemoteModule_path"; then + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=0.2.1 + fi + installRemoteModule_src="$(getPackageSource https://github.com/kjdev/php-ext-snappy/archive/refs/tags/$installRemoteModule_version.tar.gz)" + cd "$installRemoteModule_src" + phpize + ./configure --with-snappy-includedir=/usr + make -j$(getProcessorCount) install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + fi + ;; + snuffleupagus) + if test -z "$installRemoteModule_path"; then + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 800; then + installRemoteModule_version=0.9.0 + elif test $PHP_MAJMIN_VERSION -le 801; then + installRemoteModule_version=0.10.0 + else + installRemoteModule_version=0.13.0 + fi + fi + installRemoteModule_src="$(getPackageSource https://codeload.github.com/jvoisin/snuffleupagus/tar.gz/v$installRemoteModule_version)" + cd "$installRemoteModule_src/src" + phpize + ./configure --enable-snuffleupagus + make -j$(getProcessorCount) install + cd - >/dev/null + cp -a "$installRemoteModule_src/config/default.rules" "$PHP_INI_DIR/conf.d/snuffleupagus.rules" + if test $(compareVersions "$installRemoteModule_version" 0.8.0) -ge 0; then + printf '\n# Disable "PHP version is not officially maintained anymore" message\nsp.global.show_old_php_warning.disable();\n' >>"$PHP_INI_DIR/conf.d/snuffleupagus.rules" + fi + else + if test -f "$installRemoteModule_path/config/default.rules"; then + cp -a "$installRemoteModule_path/config/default.rules" "$PHP_INI_DIR/conf.d/snuffleupagus.rules" + fi + fi + installRemoteModule_ini_extra="$(printf '%ssp.configuration_file=%s\n' "$installRemoteModule_ini_extra" "$PHP_INI_DIR/conf.d/snuffleupagus.rules")" + installRemoteModule_manuallyInstalled=1 + ;; + sodium | libsodium) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=1.0.7 + fi + fi + ;; + solr) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=2.4.0 + elif test $PHP_MAJMIN_VERSION -lt 704; then + installRemoteModule_version=2.6.0 + fi + fi + ;; + sourceguardian) + installSourceGuardian + installRemoteModule_manuallyInstalled=1 + ;; + spx) + if test -z "$installRemoteModule_path"; then + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=v0.4.21 + fi + if test "${installRemoteModule_version%.*}" = "$installRemoteModule_version"; then + installRemoteModule_displayVersion="$installRemoteModule_version" + else + installRemoteModule_displayVersion="git--master-$installRemoteModule_version" + fi + installRemoteModule_src="$(getPackageSource https://codeload.github.com/NoiseByNorthwest/php-spx/tar.gz/$installRemoteModule_version)" + cd -- "$installRemoteModule_src" + phpize + ./configure + make -j$(getProcessorCount) install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + fi + ;; + sqlsrv | pdo_sqlsrv) + isMicrosoftSqlServerODBCInstalled || installMicrosoftSqlServerODBC + if test -z "$installRemoteModule_version"; then + # https://docs.microsoft.com/it-it/sql/connect/php/system-requirements-for-the-php-sql-driver?view=sql-server-2017 + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=3.0.1 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=5.3.0 + elif test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=5.6.1 + elif test $PHP_MAJMIN_VERSION -le 702; then + installRemoteModule_version=5.8.1 + elif test $PHP_MAJMIN_VERSION -le 703; then + installRemoteModule_version=5.9.0 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=5.10.1 + elif test $PHP_MAJMIN_VERSION -le 800; then + installRemoteModule_version=5.11.1 + elif test $PHP_MAJMIN_VERSION -le 802; then + installRemoteModule_version=5.12.0 + fi + fi + ;; + pdo_snowflake) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version="$(curl $IPE_CURL_FLAGS -sSLf https://api.github.com/repos/snowflakedb/pdo_snowflake/releases/latest 2>/dev/null | grep -o '"tag_name": *"[^"]*"' | head -1 | sed 's/.*"v*\([^"]*\)".*/\1/')" + if test -z "$installRemoteModule_version"; then + printf 'Failed to detect pdo_snowflake version\n' >&2 + exit 1 + fi + fi + printf 'Downloading pdo_snowflake v%s source code (this may take a while)... ' "$installRemoteModule_version" + installRemoteModule_src="$(getPackageSource "https://codeload.github.com/snowflakedb/pdo_snowflake/tar.gz/v${installRemoteModule_version}")" + echo 'done.' + cd "$installRemoteModule_src" + chmod +x scripts/build_pdo_snowflake.sh + PHP_HOME="$(php-config --prefix)" ./scripts/build_pdo_snowflake.sh + cp modules/pdo_snowflake.so "$PHP_EXTDIR/pdo_snowflake.so" + if test -f libsnowflakeclient/cacert.pem; then + installRemoteModule_cacert_path="/usr/local/share/snowflake/cacert.pem" + mkdir -p "$(dirname "$installRemoteModule_cacert_path")" + cp libsnowflakeclient/cacert.pem "$installRemoteModule_cacert_path" + installRemoteModule_ini_extra="pdo_snowflake.cacert=$installRemoteModule_cacert_path" + fi + cd - >/dev/null + rm -rf "$installRemoteModule_src" + installRemoteModule_manuallyInstalled=1 + ;; + ssh2) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.13 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=1.4.1 + fi + fi + ;; + statgrab) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=0.6.0 + fi + fi + ;; + stomp) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.0.9 + fi + fi + if test "$DISTRO" = debian; then + addConfigureOption with-openssl-dir yes + else + addConfigureOption with-openssl-dir /usr + fi + ;; + swoole) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 502; then + installRemoteModule_version=1.6.10 + elif test $PHP_MAJMIN_VERSION -le 504; then + installRemoteModule_version=2.0.4 + elif test $PHP_MAJMIN_VERSION -le 506; then + # Using 2.0.11 when libpcre-dev is installed causes a Segmentation fault in php 5 (see https://github.com/mlocati/docker-php-extension-installer/issues/1282) + if test "$DISTRO" = debian && { dpkg -l 'libpcre*-dev' 2>/dev/null | grep -Eq '^ii'; }; then + installRemoteModule_version=2.0.10 + else + installRemoteModule_version=2.0.11 + fi + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=4.3.6 + elif test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=4.5.10 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=4.8.11 + elif test $PHP_BITS -eq 32; then + # See https://github.com/swoole/swoole-src/issues/5198#issuecomment-1820162178 + installRemoteModule_version="$(resolvePHPModuleVersion "$installRemoteModule_module" '^5.0')" + else + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -le 312; then + installRemoteModule_version=5.1.2 + elif test $DISTRO_MAJMIN_VERSION -le 315; then + # With later versions: 'pthread_getname_np' was not declared in this scope + installRemoteModule_version=5.1.8 + fi + ;; + esac + fi + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 800; then + installRemoteModule_version=5.1.3 + elif test $PHP_MAJMIN_VERSION -le 801; then + installRemoteModule_version=6.1.7 + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" stable)" + fi + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + if php --ri sockets >/dev/null 2>/dev/null; then + installRemoteModule_sockets=yes + else + installRemoteModule_sockets=no + fi + installRemoteModule_openssl=yes + if test $PHP_THREADSAFE -eq 1; then + installRemoteModule_zts=yes + else + installRemoteModule_zts=no + fi + installRemoteModule_sqlite=yes + installRemoteModule_iouring=no + installRemoteModule_curl=yes + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -lt 317; then + # we need sqlite3 >= 3.7.7 + installRemoteModule_sqlite=no + fi + case "${IPE_SWOOLE_WITHOUT_IOURING:-}" in + 1 | y* | Y*) ;; + *) + # iouring support in swoole 6 requires liburing 2.5+: available since Alpine 3.19 + # but with Alpine 3.19 we have a "invalid use of incomplete type 'const struct statx'" error + if test $DISTRO_MAJMIN_VERSION -lt 320; then + : # swoole requires liburing 2.5+: available since Alpine 3.20 + elif test $(compareVersions "$installRemoteModule_version" 6.2.0) -ge 0 && test $DISTRO_MAJMIN_VERSION -lt 321; then + : # swoole 6.2.0+ requires liburing 2.8+: available since Alpine 3.21 + else + installRemoteModule_iouring=yes + fi + ;; + esac + ;; + debian) + if test $PHP_MAJMIN_VERSION -ge 800; then + # see https://github.com/swoole/swoole-src/issues/5365 + installRemoteModule_curl=no + fi + if test $DISTRO_MAJMIN_VERSION -lt 1200; then + # we need sqlite3 >= 3.7.7 + installRemoteModule_sqlite=no + fi + case "${IPE_SWOOLE_WITHOUT_IOURING:-}" in + 1 | y* | Y*) ;; + *) + if test $DISTRO_VERSION_NUMBER -lt 13; then + : # swoole 6+ requires liburing 2.5+: available since Debian Trixie (13) + else + installRemoteModule_iouring=yes + fi + ;; + esac + ;; + esac + installRemoteModule_zstd=yes + case "$DISTRO" in + debian) + if test $DISTRO_VERSION_NUMBER -lt 11; then + # swoole 6 requires libzstd >= 1.4.0, but on debian 10 (buster) we have 1.3.8 + installRemoteModule_zstd=no + fi + ;; + esac + installRemoteModule_firebird=yes + case "$DISTRO" in + alpine) + if test $PHP_MAJMIN_VERSION -lt 804; then # swoole 6.2+ requires firebird 3+, but with PHP < 8.4 we install firebird 2.5 (see installFirebird) + installRemoteModule_firebird=no + fi + ;; + esac + if test $(compareVersions "$installRemoteModule_version" 6.2.0) -ge 0; then + # enable sockets support? + addConfigureOption enable-sockets $installRemoteModule_sockets + # specify openssl installation directory (requires openssl 1.1.0 or later)? + addConfigureOption with-openssl-dir $installRemoteModule_openssl + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable curl support? + addConfigureOption enable-swoole-curl $installRemoteModule_curl + # enable cares support? + addConfigureOption enable-cares yes + # enable brotli support? + addConfigureOption enable-brotli yes + # specify brotli installation directory? + addConfigureOption with-brotli-dir no + # enable zstd support (requires zstd 1.4.0 or later)? + addConfigureOption enable-zstd $installRemoteModule_zstd + # enable PostgreSQL database support? + addConfigureOption enable-swoole-pgsql yes + # enable ODBC database support? + addConfigureOption with-swoole-odbc no + # enable Oracle database support? + addConfigureOption with-swoole-oracle no + # enable Sqlite database support? + addConfigureOption enable-swoole-sqlite $installRemoteModule_sqlite + # enable Firebird database support? + addConfigureOption with-swoole-firebird $installRemoteModule_firebird + # enable swoole thread support (need php zts support)? + addConfigureOption enable-swoole-thread $installRemoteModule_zts + # enable iouring for file async support? + addConfigureOption enable-iouring $installRemoteModule_iouring + # specify liburing installation directory (requires liburing 2.8 or later)? + addConfigureOption with-liburing-dir no + # enable iouring for http coroutine server support? + addConfigureOption enable-uring-socket $installRemoteModule_iouring + # enable async ssh2 client support? + addConfigureOption with-swoole-ssh2 yes + # enable async ftp client support? + addConfigureOption enable-swoole-ftp no # conflicts with ftp PHP extension + elif test $(compareVersions "$installRemoteModule_version" 6.0.0) -ge 0; then + # enable sockets support? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable curl support? + addConfigureOption enable-swoole-curl $installRemoteModule_curl + # enable cares support? + addConfigureOption enable-cares yes + # enable brotli support? + addConfigureOption enable-brotli yes + # enable zstd support? + addConfigureOption enable-zstd $installRemoteModule_zstd + # enable PostgreSQL database support? + addConfigureOption enable-swoole-pgsql yes + # enable ODBC database support? + addConfigureOption with-swoole-odbc no + # enable Oracle database support? + addConfigureOption with-swoole-oracle no + # enable Sqlite database support? + addConfigureOption enable-swoole-sqlite $installRemoteModule_sqlite + # enable swoole thread support (need php zts support)? + addConfigureOption enable-swoole-thread $installRemoteModule_zts + # enable iouring for file async support? + addConfigureOption enable-iouring $installRemoteModule_iouring + elif test $(compareVersions "$installRemoteModule_version" 5.1.0) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable curl support? + addConfigureOption enable-swoole-curl $installRemoteModule_curl + # enable cares support? + addConfigureOption enable-cares yes + # enable brotli support? + addConfigureOption enable-brotli yes + # enable PostgreSQL database support? + addConfigureOption enable-swoole-pgsql yes + # enable ODBC database support? + addConfigureOption with-swoole-odbc no + # enable Oracle database support? + addConfigureOption with-swoole-oracle no + # enable Sqlite database support? + addConfigureOption enable-swoole-sqlite $installRemoteModule_sqlite + elif test $(compareVersions "$installRemoteModule_version" 5.0.1) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable curl support? + addConfigureOption enable-swoole-curl $installRemoteModule_curl + # enable cares support? + addConfigureOption enable-cares yes + # enable brotli support? + addConfigureOption enable-brotli yes + elif test $(compareVersions "$installRemoteModule_version" 5.0.0) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable curl support? + addConfigureOption enable-swoole-curl $installRemoteModule_curl + # enable cares support? + addConfigureOption enable-cares yes + elif test $(compareVersions "$installRemoteModule_version" 4.8.11) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable json support? + addConfigureOption enable-swoole-json yes + # enable curl support? + addConfigureOption enable-swoole-curl $installRemoteModule_curl + # enable cares support? + addConfigureOption enable-cares yes + elif test $(compareVersions "$installRemoteModule_version" 4.6.1) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable json support? + addConfigureOption enable-swoole-json yes + # enable curl support? + addConfigureOption enable-swoole-curl $installRemoteModule_curl + elif test $(compareVersions "$installRemoteModule_version" 4.4.0) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + elif test $(compareVersions "$installRemoteModule_version" 4.2.11) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable postgresql coroutine client support? + addConfigureOption enable-coroutine-postgresql yes + elif test $(compareVersions "$installRemoteModule_version" 4.2.7) -ge 0; then + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable postgresql coroutine client support? + addConfigureOption enable-coroutine-postgresql yes + # enable kernel debug/trace log? (it will degrade performance) + addConfigureOption enable-debug-log no + elif test $(compareVersions "$installRemoteModule_version" 4.2.6) -ge 0; then + # enable debug/trace log support? + addConfigureOption enable-debug-log no + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable postgresql coroutine client support? + addConfigureOption enable-coroutine-postgresql yes + elif test $(compareVersions "$installRemoteModule_version" 4.2.0) -ge 0; then + # enable debug/trace log support? + addConfigureOption enable-debug-log no + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable async-redis support? + addConfigureOption enable-async-redis yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable postgresql coroutine client support? + addConfigureOption enable-coroutine-postgresql yes + elif test $(compareVersions "$installRemoteModule_version" 2.1.2) -ge 0; then + # enable debug/trace log support? + addConfigureOption enable-swoole-debug no + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable async-redis support? + addConfigureOption enable-async-redis yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + # enable postgresql coroutine client support? + addConfigureOption enable-coroutine-postgresql yes + elif test $(compareVersions "$installRemoteModule_version" 1.10.4) -ge 0 && test $(compareVersions "$installRemoteModule_version" 1.10.5) -le 0; then + # enable debug/trace log support? + addConfigureOption enable-swoole-debug no + # enable sockets supports? + addConfigureOption enable-sockets $installRemoteModule_sockets + # enable openssl support? + addConfigureOption enable-openssl $installRemoteModule_openssl + # enable http2 support? + addConfigureOption enable-http2 yes + # enable async-redis support? + addConfigureOption enable-async-redis yes + # enable mysqlnd support? + addConfigureOption enable-mysqlnd yes + fi + ;; + tdlib) + if ! test -f /usr/lib/libphpcpp.so || ! test -f /usr/include/phpcpp.h; then + if test $PHP_MAJMIN_VERSION -le 701; then + cd "$(getPackageSource https://codeload.github.com/CopernicaMarketingSoftware/PHP-CPP/tar.gz/v2.1.4)" + elif test $PHP_MAJMIN_VERSION -le 703; then + cd "$(getPackageSource https://codeload.github.com/CopernicaMarketingSoftware/PHP-CPP/tar.gz/v2.2.0)" + else + cd "$(getPackageSource https://codeload.github.com/CopernicaMarketingSoftware/PHP-CPP/tar.gz/444d1f90cf6b7f3cb5178fa0d0b5ab441b0389d0)" + fi + make -j$(getProcessorCount) + make install + cd - >/dev/null + fi + if test -z "$installRemoteModule_path"; then + installRemoteModule_tmp="$(mktemp -p /tmp/src -d)" + git clone --depth=1 --recurse-submodules https://github.com/yaroslavche/phptdlib.git "$installRemoteModule_tmp" + mkdir "$installRemoteModule_tmp/build" + cd "$installRemoteModule_tmp/build" + cmake -D USE_SHARED_PHPCPP:BOOL=ON .. + make + make install + cd - >/dev/null + rm "$PHP_INI_DIR/conf.d/tdlib.ini" + installRemoteModule_manuallyInstalled=1 + fi + ;; + tensor) + installRemoteModule_cppflags='-Wno-incompatible-pointer-types' + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 703; then + installRemoteModule_version=2.2.3 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=3.0.5 + fi + fi + case "$DISTRO" in + alpine) + if test $DISTRO_MAJMIN_VERSION -ge 315 && test $DISTRO_MAJMIN_VERSION -le 317; then + if test -e /usr/lib/liblapacke.so.3 && ! test -e /usr/lib/liblapacke.so; then + ln -s /usr/lib/liblapacke.so.3 /usr/lib/liblapacke.so + fi + fi + ;; + debian) + if test $DISTRO_VERSION_NUMBER -ge 13; then + if test -f /usr/lib/$TARGET_TRIPLET/libblas.so.3 && ! test -f /usr/lib/$TARGET_TRIPLET/libblas.so; then + ln -s /usr/lib/$TARGET_TRIPLET/libblas.so.3 /usr/lib/$TARGET_TRIPLET/libblas.so + fi + fi + ;; + esac + ;; + tideways) + case "$DISTRO" in + alpine) + case $(uname -m) in + aarch64 | arm64 | armv8) + installRemoteModule_architecture=alpine-arm64 + ;; + *) + installRemoteModule_architecture=alpine-x86_64 + ;; + esac + ;; + debian) + case $(uname -m) in + aarch64 | arm64 | armv8) + installRemoteModule_architecture=arm64 + ;; + *) + installRemoteModule_architecture=x86_64 + ;; + esac + ;; + esac + installRemoteModule_url="$(curl $IPE_CURL_FLAGS -sSLf -o - https://tideways.com/profiler/downloads | grep -Eo "\"[^\"]+/tideways-php-([0-9]+\.[0-9]+\.[0-9]+)-$installRemoteModule_architecture.tar.gz\"" | cut -d'"' -f2)" + if test -z "$installRemoteModule_url"; then + echo 'Failed to find the tideways tarball to be downloaded' + exit 1 + fi + printf 'Downloading tideways from %s\n' "$installRemoteModule_url" + installRemoteModule_src="$(getPackageSource $installRemoteModule_url)" + if test -d "$installRemoteModule_src/dist"; then + installRemoteModule_src="$installRemoteModule_src/dist" + fi + installRemoteModule_src="$installRemoteModule_src/tideways-php" + case "$DISTRO" in + alpine) + installRemoteModule_src="$installRemoteModule_src-alpine" + ;; + esac + installRemoteModule_src="$installRemoteModule_src-$PHP_MAJDOTMIN_VERSION" + if test $PHP_THREADSAFE -eq 1; then + installRemoteModule_src="$installRemoteModule_src-zts" + fi + installRemoteModule_src="$installRemoteModule_src.so" + if ! test -f "$installRemoteModule_src"; then + echo 'tideways does not support the current environment' >&2 + exit 1 + fi + mv "$installRemoteModule_src" $(getPHPExtensionsDir)/tideways.so + installRemoteModule_manuallyInstalled=1 + ;; + translit) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 506; then + installRemoteModule_version=0.6.1 + elif test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=0.6.3 + else + installRemoteModule_version=beta + fi + fi + ;; + uopz) + installRemoteModule_cppflags='-Wno-incompatible-pointer-types' + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.0.7 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=5.0.2 + elif test $PHP_MAJMIN_VERSION -le 740; then + installRemoteModule_version=6.1.2 + fi + fi + ;; + uploadprogress) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=1.1.4 + fi + fi + ;; + uuid) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.0.5 + fi + fi + ;; + uv) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 800; then + installRemoteModule_version=0.2.4 + else + installRemoteModule_version=beta + fi + fi + ;; + vld) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 700; then + installRemoteModule_version=0.14.0 + else + installRemoteModule_version=beta + fi + fi + ;; + wikidiff2) + case "$DISTRO" in + alpine) + if ! isLibDatrieInstalled; then + installLibDatrie + fi + if ! isLibThaiInstalled; then + installLibThai + fi + ;; + esac + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 702; then + installRemoteModule_version=1.13.0 + else + installRemoteModule_version="$(git -c versionsort.suffix=- ls-remote --tags --refs --quiet --exit-code --sort=version:refname https://github.com/wikimedia/mediawiki-php-wikidiff2.git 'refs/tags/*.*.*' | tail -1 | cut -d/ -f3)" + fi + fi + installRemoteModule_src="$(getPackageSource "https://codeload.github.com/wikimedia/mediawiki-php-wikidiff2/tar.gz/refs/tags/$installRemoteModule_version")" + cd -- "$installRemoteModule_src" + phpize + ./configure + make -j$(getProcessorCount) + make install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + ;; + xattr) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -lt 702; then + installRemoteModule_version=1.3.1 + fi + fi + ;; + xdebug) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 500; then + installRemoteModule_version=2.0.5 + elif test $PHP_MAJMIN_VERSION -le 503; then + installRemoteModule_version=2.2.7 + elif test $PHP_MAJMIN_VERSION -le 504; then + installRemoteModule_version=2.4.1 + elif test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=2.5.5 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=2.6.1 + elif test $PHP_MAJMIN_VERSION -le 701; then + installRemoteModule_version=2.9.8 + elif test $PHP_MAJMIN_VERSION -le 704; then + installRemoteModule_version=3.1.6 + fi + fi + ;; + xdiff) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.5.2 + fi + fi + if ! test -f /usr/local/lib/libxdiff.* && ! test -f /usr/lib/libxdiff.* && ! test -f /usr/lib/x86_64*/libxdiff.*; then + installRemoteModule_src="$(getPackageSource https://raw.githubusercontent.com/mlocati/docker-php-extension-installer/assets/resources/libxdiff-0.23.tar.gz)" + cd -- "$installRemoteModule_src" + ./configure --disable-shared --disable-dependency-tracking --with-pic + make -j$(getProcessorCount) + make install + cd - >/dev/null + fi + ;; + xhprof) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.9.4 + fi + fi + ;; + xlswriter) + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 1.2.7) -ge 0; then + # enable reader supports? + addConfigureOption enable-reader yes + fi + ;; + xmldiff) + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + if test -z "$installRemoteModule_version"; then + case "$DISTRO_VERSION" in + debian@8) + # The gcc version of Debian Jessie is too old => error: 'nullptr' was not declared in this scope + installRemoteModule_version=1.1.4 + ;; + esac + fi + ;; + xmlrpc) + if test -z "$installRemoteModule_version"; then + installRemoteModule_version=beta + fi + ;; + yac) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.9.2 + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 2.2.0) -ge 0; then + # Enable igbinary serializer support + if php --ri igbinary >/dev/null 2>/dev/null; then + addConfigureOption enable-igbinary yes + else + addConfigureOption enable-igbinary no + fi + # Enable json serializer support + if php --ri json >/dev/null 2>/dev/null; then + addConfigureOption enable-json yes + else + addConfigureOption enable-json no + fi + # Enable msgpack serializer support + if php --ri msgpack >/dev/null 2>/dev/null; then + addConfigureOption enable-msgpack yes + else + addConfigureOption enable-msgpack no + fi + fi + ;; + yaml) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.3.1 + elif test $PHP_MAJMIN_VERSION -le 700; then + installRemoteModule_version=2.0.4 + fi + fi + ;; + yar) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=1.2.5 + fi + else + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + fi + if test -z "$installRemoteModule_version" || test $(compareVersions "$installRemoteModule_version" 1.2.4) -ge 0; then + # Enable Msgpack Supports + if php --ri msgpack >/dev/null 2>/dev/null; then + addConfigureOption enable-msgpack yes + else + addConfigureOption enable-msgpack no + fi + fi + ;; + zmq) + if test -z "$installRemoteModule_version"; then + installRemoteModule_src="$(getPackageSource https://github.com/zeromq/php-zmq/tarball/master)" + cd "$installRemoteModule_src" + phpize + ./configure + make -j$(getProcessorCount) + make install + cd - >/dev/null + installRemoteModule_manuallyInstalled=1 + fi + ;; + zookeeper) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.5.0 + fi + fi + installRemoteModule_version="$(resolvePeclStabilityVersion "$installRemoteModule_module" "$installRemoteModule_version")" + case "$DISTRO" in + alpine) + if ! test -f /usr/local/include/zookeeper/zookeeper.h; then + if test $(compareVersions "$installRemoteModule_version" 1.0.0) -lt 0; then + installRemoteModule_src="$(getPackageSource http://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9.tar.gz)" + else + installRemoteModule_tmp="$(curl $IPE_CURL_FLAGS -sSLf https://downloads.apache.org/zookeeper/stable | sed -E 's/["<>]/\n/g' | grep -E '^(apache-)?zookeeper-[0-9]+\.[0-9]+\.[0-9]+\.(tar\.gz|tgz)$' | head -n1)" + if test -z "$installRemoteModule_tmp"; then + echo 'Failed to detect the zookeeper library URL' >&2 + exit 1 + fi + installRemoteModule_src="$(getPackageSource https://downloads.apache.org/zookeeper/stable/$installRemoteModule_tmp)" + fi + cd -- "$installRemoteModule_src" + if test -d ~/.m2; then + installRemoteModule_delm2=n + else + installRemoteModule_delm2=y + fi + mvn -pl zookeeper-jute compile + cd - >/dev/null + cd -- "$installRemoteModule_src/zookeeper-client/zookeeper-client-c" + autoreconf -if + ./configure --without-cppunit + make -j$(getProcessorCount) CFLAGS='-Wno-stringop-truncation -Wno-format-overflow' + make install + cd - >/dev/null + if test $installRemoteModule_delm2 = y; then + rm -rf ~/.m2 + fi + fi + ;; + esac + ;; + zstd) + if test -z "$installRemoteModule_version"; then + if test $PHP_MAJMIN_VERSION -le 506; then + installRemoteModule_version=0.11.0 + fi + fi + ;; + esac + if test $installRemoteModule_manuallyInstalled -eq 0; then + if test -n "$installRemoteModule_path"; then + printf ' (installing version %s from %s)\n' "$installRemoteModule_version" "$installRemoteModule_path" + elif test -n "$installRemoteModule_version"; then + printf ' (installing version %s)\n' "$installRemoteModule_version" + fi + installPeclPackage "$installRemoteModule_module" "$installRemoteModule_version" "$installRemoteModule_cppflags" "$installRemoteModule_path" + fi + postProcessModule "$installRemoteModule_module" + if test $installRemoteModule_manuallyInstalled -lt 2; then + case "${IPE_SKIP_CHECK:-}" in + 1 | y* | Y*) ;; + *) + checkModuleWorking "$installRemoteModule_module" "$installRemoteModule_ini_basename" "$installRemoteModule_ini_extra" + ;; + esac + enablePhpExtension "$installRemoteModule_module" "$installRemoteModule_ini_basename" "$installRemoteModule_ini_extra" + fi +} + +# Check if a module/helper may be installed using the pecl archive +# +# Arguments: +# $1: the name of the module +# +# Return: +# 0: true +# 1: false +moduleMayUsePecl() { + case "$1" in + @composer | @fix_letsencrypt) + return 1 + ;; + blackfire | geos | ioncube_loader | snuffleupagus | sourceguardian | spx | tdlib | tideways) + return 1 + ;; + esac + if test -n "$(getModuleSourceCodePath "$1")"; then + return 1 + fi + if stringInList "$1" "$BUNDLED_MODULES"; then + return 1 + fi + return 0 +} + +# Configure the PECL package installer +# +# Updates: +# PHP_MODULES_TO_INSTALL +# Sets: +# USE_PICKLE 0: no, 1: yes (already downloaded), 2: yes (build it from source) +configureInstaller() { + USE_PICKLE=0 + if ! which pecl >/dev/null; then + for PHP_MODULE_TO_INSTALL in $PHP_MODULES_TO_INSTALL; do + if ! moduleMayUsePecl "$PHP_MODULE_TO_INSTALL"; then + continue + fi + if false && anyStringInList '' "$PHP_MODULES_TO_INSTALL"; then + USE_PICKLE=2 + else + curl $IPE_CURL_FLAGS -sSLf https://github.com/FriendsOfPHP/pickle/releases/latest/download/pickle.phar -o /tmp/pickle + chmod +x /tmp/pickle + USE_PICKLE=1 + fi + break + done + fi + if test $USE_PICKLE -eq 0; then + if test -z "$(pear config-get http_proxy)"; then + if test -n "${http_proxy:-}"; then + pear config-set http_proxy "$http_proxy" || true + elif test -n "${HTTP_PROXY:-}"; then + pear config-set http_proxy "$HTTP_PROXY" || true + fi + fi + pecl channel-update pecl.php.net || true + fi +} + +buildPickle() { + printf '### BUILDING PICKLE ###\n' + buildPickle_tempDir="$(mktemp -p /tmp/src -d)" + cd -- "$buildPickle_tempDir" + printf 'Downloading... ' + git clone --quiet --depth 1 https://github.com/FriendsOfPHP/pickle.git . + git tag 0.7.0 + printf 'done.\n' + printf 'Installing composer... ' + actuallyInstallComposer . composer '--1 --quiet' + printf 'done.\n' + printf 'Installing composer dependencies... ' + ./composer install --no-dev --no-progress --no-suggest --optimize-autoloader --ignore-platform-reqs --quiet --no-cache + printf 'done.\n' + printf 'Building... ' + php -d phar.readonly=0 box.phar build + mv pickle.phar /tmp/pickle + printf 'done.\n' + cd - >/dev/null +} + +# Add a configure option for the pecl/pickle install command +# +# Arguments: +# $1: the option name +# $2: the option value +addConfigureOption() { + if test $USE_PICKLE -eq 0; then + printf -- '%s\n' "$2" >>"$CONFIGURE_FILE" + else + printf -- '--%s=%s\n' "$1" "$2" >>"$CONFIGURE_FILE" + fi +} + +# Actually installs a PECL package +# +# Arguments: +# $1: the package to be installed +# $2: the package version to be installed (optional) +# $3: the value of the CPPFLAGS variable (optional) +# $4: the path of the local package to be installed (optional, downloaded from PECL if omitted/empty) +installPeclPackage() { + if ! test -f "$CONFIGURE_FILE"; then + printf '\n' >"$CONFIGURE_FILE" + fi + installPeclPackage_name="$(getPeclModuleName "$1")" + if test -z "${2:-}"; then + installPeclPackage_fullname="$installPeclPackage_name" + else + installPeclPackage_fullname="$installPeclPackage_name-$2" + fi + installPeclPackage_path="${4:-}" + if test -z "$installPeclPackage_path"; then + installPeclPackage_path="$installPeclPackage_fullname" + fi + if test $USE_PICKLE -eq 0; then + if test -n "${4:-}"; then + if test -f "$installPeclPackage_path/package2.xml"; then + installPeclPackage_path="$installPeclPackage_path/package2.xml" + else + installPeclPackage_path="$installPeclPackage_path/package.xml" + fi + fi + cat "$CONFIGURE_FILE" | MAKE="make -j$(getCompilationProcessorCount $1)" CPPFLAGS="${3:-}" pecl install "$installPeclPackage_path" + else + MAKEFLAGS="-j$(getCompilationProcessorCount $1)" CPPFLAGS="${3:-}" /tmp/pickle install --tmp-dir=/tmp/pickle.tmp --no-interaction --version-override='' --with-configure-options "$CONFIGURE_FILE" -- "$installPeclPackage_path" + fi +} + +# Check if a string is in a list of space-separated string +# +# Arguments: +# $1: the string to be checked +# $2: the string list +# +# Return: +# 0 (true): if the string is in the list +# 1 (false): if the string is not in the list +stringInList() { + for stringInList_listItem in $2; do + if test "$1" = "$stringInList_listItem"; then + return 0 + fi + done + return 1 +} + +# Check if at least one item in a list is in another list +# +# Arguments: +# $1: the space-separated list of items to be searched +# $2: the space-separated list of reference items +# +# Return: +# 0 (true): at least one of the items in $1 is in $2 +# 1 (false): otherwise +anyStringInList() { + for anyStringInList_item in $1; do + if stringInList "$anyStringInList_item" "$2"; then + return 0 + fi + done + return 1 +} + +# Remove a word from a space-separated list +# +# Arguments: +# $1: the word to be removed +# $2: the string list +# +# Output: +# The list without the word +removeStringFromList() { + removeStringFromList_result='' + for removeStringFromList_listItem in $2; do + if test "$1" != "$removeStringFromList_listItem"; then + if test -z "$removeStringFromList_result"; then + removeStringFromList_result="$removeStringFromList_listItem" + else + removeStringFromList_result="$removeStringFromList_result $removeStringFromList_listItem" + fi + fi + done + printf '%s' "$removeStringFromList_result" +} + +# Invoke apt-get update +invokeAptGetUpdate() { + if test -n "${IPE_APTGETUPDATE_ALREADY:-}"; then + apt-get update -q + return + fi + IPE_APTGETUPDATE_ALREADY=y + if grep -q 'VERSION="8 (jessie)"' /etc/os-release; then + invokeAptGetUpdate_fixdistro=jessie + elif grep -q 'VERSION="9 (stretch)"' /etc/os-release; then + invokeAptGetUpdate_fixdistro=stretch + elif grep -q 'VERSION="10 (buster)"' /etc/os-release; then + invokeAptGetUpdate_fixdistro=buster + else + invokeAptGetUpdate + return + fi + # See https://www.debian.org/distrib/archive.en.html for a list of mirrors + if test -z "${IPE_DEB_ARCHIVE:-}"; then + IPE_DEB_ARCHIVE=http://archive.debian.org/debian-archive + fi + if test -z "${IPE_DEB_ARCHIVE_SECURITY:-}"; then + IPE_DEB_ARCHIVE_SECURITY=http://archive.debian.org/debian-archive/debian-security + fi + sed -ri "s;^(\s*deb\s+http://(httpredir|deb).debian.org/debian\s+$invokeAptGetUpdate_fixdistro-updates\b.*);#\1;" /etc/apt/sources.list + sed -ri "s;^(\s*deb\s+)http://(httpredir|deb).debian.org;\1$IPE_DEB_ARCHIVE;" /etc/apt/sources.list + sed -ri "s;^(\s*deb\s+)http://security.debian.org/debian-security;\1$IPE_DEB_ARCHIVE_SECURITY;" /etc/apt/sources.list + sed -ri "s;^(\s*deb\s+)http://security.debian.org;\1$IPE_DEB_ARCHIVE_SECURITY;" /etc/apt/sources.list + if test "$invokeAptGetUpdate_fixdistro" = stretch && test -f /etc/apt/sources.list.d/buster.list; then + sed -ri "s;^(\s*deb\s+http://(httpredir|deb).debian.org/debian\s+buster-updates\b.*);#\1;" /etc/apt/sources.list.d/buster.list + sed -ri "s;^(\s*deb\s+)http://(httpredir|deb).debian.org;\1$IPE_DEB_ARCHIVE;" /etc/apt/sources.list.d/buster.list + sed -ri "s;^(\s*deb\s+)http://security.debian.org/debian-security;\1$IPE_DEB_ARCHIVE_SECURITY;" /etc/apt/sources.list.d/buster.list + sed -ri "s;^(\s*deb\s+)http://security.debian.org;\1$IPE_DEB_ARCHIVE_SECURITY;" /etc/apt/sources.list.d/buster.list + fi + invokeAptGetUpdate_tmp="$(mktemp)" + apt-get update -q 2>"$invokeAptGetUpdate_tmp" + if test -s "$invokeAptGetUpdate_tmp"; then + cat "$invokeAptGetUpdate_tmp" >&2 + if grep -qE ' KEYEXPIRED [0-9A-Z]' "$invokeAptGetUpdate_tmp" || grep -qE ' EXPKEYSIG [0-9A-Z]' "$invokeAptGetUpdate_tmp"; then + echo '############' >&2 + echo '# WARNING! #' >&2 + echo '############' >&2 + echo 'apt packages will be installed without checking authenticity!' >&2 + printf 'APT::Get::AllowUnauthenticated "true";\n' >>/etc/apt/apt.conf.d/99unauthenticated + fi + fi + rm "$invokeAptGetUpdate_tmp" +} + +# Fix the Let's Encrypt CA certificates on old distros +fixLetsEncrypt() { + printf '### FIXING LETS ENCRYPT CA CERTIFICATES ###\n' + case "$DISTRO_VERSION" in + alpine@3.7 | alpine@3.8) + printf -- '- old Alpine Linux detected: we should fix the certificates\n' + ;; + debian@8 | debian@9) + printf -- '- old Debian detected: we should fix the certificates\n' + if ! grep -q 'mozilla/ISRG_Root_X1.crt' /etc/ca-certificates.conf && grep -q 'mozilla/DST_Root_CA_X3.crt' /etc/ca-certificates.conf; then + printf -- '- old ca-certificates package detected\n' + fixCACerts_mustUpdate=1 + if test -d /var/lib/apt/lists; then + for fixCACerts_item in $(ls -1 /var/lib/apt/lists); do + case "$fixCACerts_item" in + partial | lock) ;; + *) + fixCACerts_mustUpdate=0 + break + ;; + esac + done + fi + if test $fixCACerts_mustUpdate -eq 1; then + printf -- '- refreshing the APT package list\n' + invokeAptGetUpdate + fi + printf -- '- installing newer ca-certificates package\n' + apt-get install -qqy --no-install-recommends ca-certificates + fi + ;; + *) + printf -- '- patch not required in this distro version\n' + return + ;; + esac + if grep -Eq '^mozilla/ISRG_Root_X1\.crt$' /etc/ca-certificates.conf && grep -Eq '^mozilla/DST_Root_CA_X3\.crt$' /etc/ca-certificates.conf; then + printf -- '- disabling the DST_Root_CA_X3 certificate\n' + sed -i '/^mozilla\/DST_Root_CA_X3/s/^/!/' /etc/ca-certificates.conf + printf -- '- refreshing the certificates\n' + update-ca-certificates -f + else + printf -- '- DST_Root_CA_X3 certificate not found or already disabled\n' + fi +} + +# Cleanup everything at the end of the execution +cleanup() { + if test "${IPE_UNINSTALL_CARGO:-}" = y; then + if test -f "$HOME/.cargo/env"; then + . "$HOME/.cargo/env" + fi + if command -v rustup >/dev/null; then + rustup self uninstall -y + fi + fi + if test -n "$UNNEEDED_PACKAGE_LINKS"; then + printf '### REMOVING UNNEEDED PACKAGE LINKS ###\n' + for cleanup_link in $UNNEEDED_PACKAGE_LINKS; do + if test -L "$cleanup_link"; then + rm -f "$cleanup_link" + fi + done + fi + case "$DISTRO" in + alpine) + if stringInList icu-libs "${PACKAGES_PERSISTENT_NEW:-}" && stringInList icu-data-en "${PACKAGES_PERSISTENT_NEW:-}"; then + apk del icu-data-en >/dev/null 2>&1 || true + fi + if test -n "$PACKAGES_VOLATILE"; then + printf '### REMOVING UNNEEDED PACKAGES ###\n' + apk del --purge $PACKAGES_VOLATILE + fi + ;; + debian) + if test -n "$PACKAGES_VOLATILE"; then + printf '### REMOVING UNNEEDED PACKAGES ###\n' + apt-get remove --purge -y $PACKAGES_VOLATILE + fi + if test -n "$PACKAGES_PREVIOUS"; then + printf '### RESTORING PREVIOUSLY INSTALLED PACKAGES ###\n' + apt-get install -qqy --no-install-recommends --no-upgrade $PACKAGES_PREVIOUS + fi + ;; + esac + docker-php-source delete + rm -rf /tmp/src + rm -rf /tmp/pickle + rm -rf /tmp/pickle.tmp + rm -rf "$CONFIGURE_FILE" + case "${IPE_KEEP_SYSPKG_CACHE:-}" in + 1 | y* | Y*) ;; + *) + case "$DISTRO" in + alpine) + rm -rf /var/cache/apk/* + ;; + debian) + rm -rf /var/lib/apt/lists/* + ;; + esac + rm -rf /tmp/pear + ;; + esac +} + +DEBIAN_FRONTEND=noninteractive +export DEBIAN_FRONTEND +resetIFS +mkdir -p /tmp/src +mkdir -p /tmp/pickle.tmp +IPE_ERRFLAG_FILE="$(mktemp -p /tmp/src)" +CONFIGURE_FILE=/tmp/configure-options +IPE_APK_FLAGS='' +case "${IPE_INSECURE:-}" in + 1 | y* | Y*) + IPE_CURL_FLAGS='-k' + ;; + *) + IPE_CURL_FLAGS='' + ;; +esac +setDistro +case "$DISTRO_VERSION" in + debian@8) + fixMaxOpenFiles || true + ;; +esac +setPHPVersionVariables +setPHPPreinstalledModules +case "$PHP_MAJMIN_VERSION" in + 505 | 506 | 700 | 701 | 702 | 703 | 704 | 800 | 801 | 802 | 803 | 804 | 805) ;; + *) + printf "### ERROR: Unsupported PHP version: %s.%s ###\n" $((PHP_MAJMIN_VERSION / 100)) $((PHP_MAJMIN_VERSION % 100)) + ;; +esac +UNNEEDED_PACKAGE_LINKS='' +processCommandArguments "$@" + +if test -z "$PHP_MODULES_TO_INSTALL"; then + exit 0 +fi + +if stringInList @fix_letsencrypt "$PHP_MODULES_TO_INSTALL"; then + # This must be the very first thing we do + fixLetsEncrypt +fi + +sortModulesToInstall + +docker-php-source extract +BUNDLED_MODULES="$(find /usr/src/php/ext -mindepth 2 -maxdepth 2 -type f -name 'config.m4' | xargs -n1 dirname | xargs -n1 basename | xargs)" +configureInstaller + +buildRequiredPackageLists $PHP_MODULES_TO_INSTALL +if test -n "$PACKAGES_PERSISTENT_PRE"; then + markPreinstalledPackagesAsUsed +fi +if test -n "$PACKAGES_PERSISTENT_NEW$PACKAGES_VOLATILE"; then + installRequiredPackages +fi +if test "$PHP_MODULES_TO_INSTALL" != '@composer'; then + setTargetTriplet +fi +if test $USE_PICKLE -gt 1; then + buildPickle +fi + +compileLibs + +for PHP_MODULE_TO_INSTALL in $PHP_MODULES_TO_INSTALL; do + case "$PHP_MODULE_TO_INSTALL" in + @fix_letsencrypt) + # Already done: it must be the first thing we do + ;; + @composer) + installComposer + ;; + *) + if stringInList "$PHP_MODULE_TO_INSTALL" "$BUNDLED_MODULES" && ! stringInList "$PHP_MODULE_TO_INSTALL" "$FORCED_REMOTE_MODULES"; then + installBundledModule "$PHP_MODULE_TO_INSTALL" + else + installRemoteModule "$PHP_MODULE_TO_INSTALL" + fi + ;; + esac +done +cleanup diff --git a/resources/views/vendor/l5-swagger/.gitkeep b/resources/views/vendor/l5-swagger/.gitkeep new file mode 100644 index 0000000..e69de29