From 9404daf91c152498adce1fb1ea4bea752afe42f5 Mon Sep 17 00:00:00 2001 From: Elis Hirwing Date: Sun, 15 Mar 2020 17:57:34 +0100 Subject: php: Make a slimmer php as default --- pkgs/development/interpreters/php/default.nix | 257 +++++++++----------------- 1 file changed, 85 insertions(+), 172 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 497a1d87f557..ec6689a5b140 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -1,196 +1,111 @@ # pcre functionality is tested in nixos/tests/php-pcre.nix -{ config, lib, stdenv, fetchurl -, autoconf, automake, bison, file, flex, libtool, pkgconfig, re2c -, libxml2, readline, zlib, curl, postgresql, gettext -, openssl, pcre, pcre2, sqlite -, libxslt, bzip2, icu, openldap, cyrus_sasl, unixODBC -, uwimap, pam, gmp, apacheHttpd, libiconv, systemd, libsodium, html-tidy, libargon2 -, gd, freetype, libXpm, libjpeg, libpng, libwebp -, libzip, valgrind, oniguruma, symlinkJoin, writeText -, makeWrapper, callPackage -}: +{ callPackage, config, fetchurl, lib, makeWrapper, stdenv, symlinkJoin, writeText +, autoconf, automake, bison, flex, libtool, pkgconfig, re2c +, apacheHttpd, gettext, libargon2, libxml2, openssl, pcre, pcre2, readline +, sqlite, systemd, valgrind, zlib, oniguruma }: let generic = { version , sha256 , extraPatches ? [] - , withSystemd ? config.php.systemd or stdenv.isLinux - , imapSupport ? config.php.imap or (!stdenv.isDarwin) - , ldapSupport ? config.php.ldap or true - , mysqlndSupport ? config.php.mysqlnd or true - , mysqliSupport ? (config.php.mysqli or true) && (mysqlndSupport) - , pdo_mysqlSupport ? (config.php.pdo_mysql or true) && (mysqlndSupport) - , libxml2Support ? config.php.libxml2 or true - , apxs2Support ? config.php.apxs2 or (!stdenv.isDarwin) - , embedSupport ? config.php.embed or false - , bcmathSupport ? config.php.bcmath or true - , socketsSupport ? config.php.sockets or true - , curlSupport ? config.php.curl or true - , gettextSupport ? config.php.gettext or true - , pcntlSupport ? config.php.pcntl or true - , pdo_odbcSupport ? config.php.pdo_odbc or true - , postgresqlSupport ? config.php.postgresql or true - , pdo_pgsqlSupport ? config.php.pdo_pgsql or true - , readlineSupport ? config.php.readline or true - , sqliteSupport ? config.php.sqlite or true - , soapSupport ? (config.php.soap or true) && (libxml2Support) - , zlibSupport ? config.php.zlib or true - , opensslSupport ? config.php.openssl or true - , mbstringSupport ? config.php.mbstring or true - , gdSupport ? config.php.gd or true - , intlSupport ? config.php.intl or true - , exifSupport ? config.php.exif or true - , xslSupport ? config.php.xsl or false - , bz2Support ? config.php.bz2 or false - , zipSupport ? config.php.zip or true - , ftpSupport ? config.php.ftp or true - , fpmSupport ? config.php.fpm or true - , gmpSupport ? config.php.gmp or true - , ztsSupport ? (config.php.zts or false) || (apxs2Support) - , calendarSupport ? config.php.calendar or true - , sodiumSupport ? (config.php.sodium or true) && (lib.versionAtLeast version "7.2") - , tidySupport ? (config.php.tidy or false) - , argon2Support ? (config.php.argon2 or true) && (lib.versionAtLeast version "7.2") - , libzipSupport ? (config.php.libzip or true) && (lib.versionAtLeast version "7.2") - , phpdbgSupport ? config.php.phpdbg or true + + # Build a minimal php + , minimalBuild ? config.php.minimal or false + + # Sapi flags , cgiSupport ? config.php.cgi or true , cliSupport ? config.php.cli or true + , fpmSupport ? config.php.fpm or true + , pearSupport ? config.php.pear or true , pharSupport ? config.php.phar or true - , xmlrpcSupport ? (config.php.xmlrpc or false) && (libxml2Support) + , phpdbgSupport ? config.php.phpdbg or true + + + # Misc flags + , apxs2Support ? config.php.apxs2 or (!stdenv.isDarwin) + , argon2Support ? config.php.argon2 or true , cgotoSupport ? config.php.cgoto or false - , valgrindSupport ? (config.php.valgrind or true) && (lib.versionAtLeast version "7.2") + , embedSupport ? config.php.embed or false , ipv6Support ? config.php.ipv6 or true - , pearSupport ? (config.php.pear or true) && (libxml2Support) - }: stdenv.mkDerivation { + , systemdSupport ? config.php.systemd or stdenv.isLinux + , valgrindSupport ? config.php.valgrind or true + , ztsSupport ? (config.php.zts or false) || (apxs2Support) + }: let + pcre' = if (lib.versionAtLeast version "7.3") then pcre2 else pcre; + in stdenv.mkDerivation { pname = "php"; inherit version; enableParallelBuilding = true; - nativeBuildInputs = [ autoconf automake bison file flex libtool pkgconfig re2c ]; + nativeBuildInputs = [ autoconf automake bison flex libtool pkgconfig re2c ]; buildInputs = [ ] - ++ lib.optional (lib.versionOlder version "7.3") pcre - ++ lib.optional (lib.versionAtLeast version "7.3") pcre2 - ++ lib.optional (lib.versionAtLeast version "7.4") oniguruma - ++ lib.optional withSystemd systemd - ++ lib.optionals imapSupport [ uwimap openssl pam ] - ++ lib.optionals curlSupport [ curl openssl ] - ++ lib.optionals ldapSupport [ openldap openssl ] - ++ lib.optionals gdSupport [ gd freetype libXpm libjpeg libpng libwebp ] - ++ lib.optionals opensslSupport [ openssl openssl.dev ] + # Deps for some base extensions + ++ [ gettext ] # Gettext extension + ++ [ openssl openssl.dev ] # Openssl extension + ++ [ pcre' ] # PCRE extension + ++ [ readline ] # Readline extension + ++ [ zlib ] # Zlib extension + ++ [ oniguruma ] # mbstring extension + + # Deps needed when building all default extensions + ++ lib.optionals (!minimalBuild) [ sqlite ] + + # Enable sapis + ++ lib.optional pearSupport [ libxml2.dev ] + + # Misc deps ++ lib.optional apxs2Support apacheHttpd - ++ lib.optional (ldapSupport && stdenv.isLinux) cyrus_sasl - ++ lib.optional zlibSupport zlib - ++ lib.optional libxml2Support libxml2 - ++ lib.optional readlineSupport readline - ++ lib.optional sqliteSupport sqlite - ++ lib.optional postgresqlSupport postgresql - ++ lib.optional pdo_odbcSupport unixODBC - ++ lib.optional pdo_pgsqlSupport postgresql - ++ lib.optional gmpSupport gmp - ++ lib.optional gettextSupport gettext - ++ lib.optional intlSupport icu - ++ lib.optional xslSupport libxslt - ++ lib.optional bz2Support bzip2 - ++ lib.optional sodiumSupport libsodium - ++ lib.optional tidySupport html-tidy ++ lib.optional argon2Support libargon2 - ++ lib.optional libzipSupport libzip - ++ lib.optional valgrindSupport valgrind; + ++ lib.optional systemdSupport systemd + ++ lib.optional valgrindSupport valgrind + ; CXXFLAGS = lib.optionalString stdenv.cc.isClang "-std=c++11"; - configureFlags = [ "--with-config-file-scan-dir=/etc/php.d" ] - ++ lib.optionals (lib.versionOlder version "7.3") [ "--with-pcre-regex=${pcre.dev}" "PCRE_LIBDIR=${pcre}" ] - ++ lib.optionals (lib.versions.majorMinor version == "7.3") [ "--with-pcre-regex=${pcre2.dev}" "PCRE_LIBDIR=${pcre2}" ] - ++ lib.optionals (lib.versionAtLeast version "7.4") [ "--with-external-pcre=${pcre2.dev}" "PCRE_LIBDIR=${pcre2}" ] - ++ lib.optional stdenv.isDarwin "--with-iconv=${libiconv}" - ++ lib.optional withSystemd "--with-fpm-systemd" - ++ lib.optionals imapSupport [ - "--with-imap=${uwimap}" - "--with-imap-ssl" - ] - ++ lib.optionals ldapSupport [ - "--with-ldap=/invalid/path" - "LDAP_DIR=${openldap.dev}" - "LDAP_INCDIR=${openldap.dev}/include" - "LDAP_LIBDIR=${openldap.out}/lib" - ] - ++ lib.optional (ldapSupport && stdenv.isLinux) "--with-ldap-sasl=${cyrus_sasl.dev}" - ++ lib.optional apxs2Support "--with-apxs2=${apacheHttpd.dev}/bin/apxs" - ++ lib.optional embedSupport "--enable-embed" - ++ lib.optional curlSupport "--with-curl=${curl.dev}" - ++ lib.optional zlibSupport "--with-zlib=${zlib.dev}" - ++ lib.optional (libxml2Support && (lib.versionOlder version "7.4")) "--with-libxml-dir=${libxml2.dev}" - ++ lib.optional (!libxml2Support) [ - "--disable-dom" - (if (lib.versionOlder version "7.4") then "--disable-libxml" else "--without-libxml") - "--disable-simplexml" - "--disable-xml" - "--disable-xmlreader" - "--disable-xmlwriter" - "--without-pear" - ] - ++ lib.optional pcntlSupport "--enable-pcntl" - ++ lib.optional readlineSupport "--with-readline=${readline.dev}" - ++ lib.optional sqliteSupport "--with-pdo-sqlite=${sqlite.dev}" - ++ lib.optional postgresqlSupport "--with-pgsql=${postgresql}" - ++ lib.optional pdo_odbcSupport "--with-pdo-odbc=unixODBC,${unixODBC}" - ++ lib.optional pdo_pgsqlSupport "--with-pdo-pgsql=${postgresql}" - ++ lib.optional (pdo_mysqlSupport && mysqlndSupport) "--with-pdo-mysql=mysqlnd" - ++ lib.optional (mysqliSupport && mysqlndSupport) "--with-mysqli=mysqlnd" - ++ lib.optional (pdo_mysqlSupport || mysqliSupport) "--with-mysql-sock=/run/mysqld/mysqld.sock" - ++ lib.optional bcmathSupport "--enable-bcmath" - ++ lib.optionals (gdSupport && lib.versionAtLeast version "7.4") [ - "--enable-gd" - "--with-external-gd=${gd.dev}" - "--with-webp=${libwebp}" - "--with-jpeg=${libjpeg.dev}" - "--with-xpm=${libXpm.dev}" - "--with-freetype=${freetype.dev}" - "--enable-gd-jis-conv" - ] ++ lib.optionals (gdSupport && lib.versionOlder version "7.4") [ - "--with-gd=${gd.dev}" - "--with-webp-dir=${libwebp}" - "--with-jpeg-dir=${libjpeg.dev}" - "--with-png-dir=${libpng.dev}" - "--with-freetype-dir=${freetype.dev}" - "--with-xpm-dir=${libXpm.dev}" - "--enable-gd-jis-conv" - ] - ++ lib.optional gmpSupport "--with-gmp=${gmp.dev}" - ++ lib.optional soapSupport "--enable-soap" - ++ lib.optional socketsSupport "--enable-sockets" - ++ lib.optional opensslSupport "--with-openssl" - ++ lib.optional mbstringSupport "--enable-mbstring" - ++ lib.optional gettextSupport "--with-gettext=${gettext}" - ++ lib.optional intlSupport "--enable-intl" - ++ lib.optional exifSupport "--enable-exif" - ++ lib.optional xslSupport "--with-xsl=${libxslt.dev}" - ++ lib.optional bz2Support "--with-bz2=${bzip2.dev}" - ++ lib.optional (zipSupport && (lib.versionOlder version "7.4")) "--enable-zip" - ++ lib.optional (zipSupport && (lib.versionAtLeast version "7.4")) "--with-zip" - ++ lib.optional ftpSupport "--enable-ftp" - ++ lib.optional fpmSupport "--enable-fpm" - ++ lib.optional ztsSupport "--enable-maintainer-zts" - ++ lib.optional calendarSupport "--enable-calendar" - ++ lib.optional sodiumSupport "--with-sodium=${libsodium.dev}" - ++ lib.optional tidySupport "--with-tidy=${html-tidy}" - ++ lib.optional argon2Support "--with-password-argon2=${libargon2}" - ++ lib.optional (libzipSupport && (lib.versionOlder version "7.4")) "--with-libzip=${libzip.dev}" - ++ lib.optional phpdbgSupport "--enable-phpdbg" - ++ lib.optional (!phpdbgSupport) "--disable-phpdbg" + configureFlags = [] + # Disable all extensions + ++ lib.optional minimalBuild [ "--disable-all" ] + + # A bunch of base extensions + ++ [ "--with-gettext=${gettext}" ] + ++ [ "--with-openssl" ] + ++ [ "--with-readline=${readline.dev}" ] + ++ [ "--with-zlib=${zlib.dev}" ] + ++ [ "--enable-mysqlnd" ] # Required to be able to build mysqli and pdo_mysql + ++ [ "--enable-sockets" ] + ++ [ "--enable-mbstring" ] + + # PCRE + ++ lib.optionals (lib.versionAtLeast version "7.4") [ "--with-external-pcre=${pcre'.dev}" ] + ++ lib.optionals (lib.versions.majorMinor version == "7.3") [ "--with-pcre-regex=${pcre'.dev}" ] + ++ lib.optionals (lib.versionOlder version "7.3") [ "--with-pcre-regex=${pcre'.dev}" ] + ++ [ "PCRE_LIBDIR=${pcre'}" ] + + + # Enable sapis ++ lib.optional (!cgiSupport) "--disable-cgi" ++ lib.optional (!cliSupport) "--disable-cli" - ++ lib.optional (!pharSupport) "--disable-phar" - ++ lib.optional xmlrpcSupport "--with-xmlrpc" + ++ lib.optional fpmSupport "--enable-fpm" + ++ lib.optional pearSupport [ "--with-pear=$(out)/lib/php/pear" "--enable-xml" "--with-libxml" ] + ++ lib.optional (pearSupport && (lib.versionOlder version "7.4")) "--enable-libxml" + ++ lib.optional pharSupport "--enable-phar" + ++ lib.optional phpdbgSupport "--enable-phpdbg" + + + # Misc flags + ++ lib.optional apxs2Support "--with-apxs2=${apacheHttpd.dev}/bin/apxs" + ++ lib.optional argon2Support "--with-password-argon2=${libargon2}" ++ lib.optional cgotoSupport "--enable-re2c-cgoto" - ++ lib.optional valgrindSupport "--with-valgrind=${valgrind.dev}" + ++ lib.optional embedSupport "--enable-embed" ++ lib.optional (!ipv6Support) "--disable-ipv6" - ++ lib.optional (pearSupport && libxml2Support) "--with-pear=$(out)/lib/php/pear"; + ++ lib.optional systemdSupport "--with-fpm-systemd" + ++ lib.optional valgrindSupport "--with-valgrind=${valgrind.dev}" + ++ lib.optional ztsSupport "--enable-maintainer-zts" + ; hardeningDisable = [ "bindnow" ]; @@ -204,8 +119,6 @@ let --replace '@PHP_LDFLAGS@' "" done - substituteInPlace ./build/libtool.m4 --replace /usr/bin/file ${file}/bin/file - export EXTENSION_DIR=$out/lib/php/extensions ./buildconf --copy --force @@ -235,6 +148,12 @@ let inherit sha256; }; + patches = [ ./fix-paths-php7.patch ] ++ extraPatches; + + separateDebugInfo = true; + + outputs = [ "out" "dev" ]; + meta = with stdenv.lib; { description = "An HTML-embedded scripting language"; homepage = "https://www.php.net/"; @@ -243,12 +162,6 @@ let platforms = platforms.all; outputsToInstall = [ "out" "dev" ]; }; - - patches = [ ./fix-paths-php7.patch ] ++ extraPatches; - - stripDebugList = "bin sbin lib modules"; - - outputs = [ "out" "dev" ]; }; generic' = { version, sha256, ... }@args: let php = generic args; in php.overrideAttrs (_: { -- cgit 1.4.1 From 96a5e0c928e8ab3be35f28b0c9df8d73fbda2729 Mon Sep 17 00:00:00 2001 From: Elis Hirwing Date: Sun, 22 Mar 2020 18:58:23 +0100 Subject: php: init phpXYbase packages and make the default php extended by default Also, add opcache to default extensions since it significantly increases PHP's performance and is by default enabled on Debian based distributions. Not having it enabled by default results in a puzzling performance loss for anyone attempting to migrate from Debian/Ubuntu to NixOS who is unaware of this. Therefore, enable it by default. /talyz --- pkgs/development/interpreters/php/default.nix | 23 +++++++++++++++++++---- pkgs/top-level/all-packages.nix | 11 ++++------- 2 files changed, 23 insertions(+), 11 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index ec6689a5b140..1e5c2cd8f270 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -188,8 +188,7 @@ let }; }); -in { - php72 = generic' { + php72base = generic' { version = "7.2.28"; sha256 = "18sjvl67z5a2x5s2a36g6ls1r3m4hbrsw52hqr2qsgfvg5dkm5bw"; @@ -197,7 +196,7 @@ in { extraPatches = lib.optional stdenv.isDarwin ./php72-darwin-isfinite.patch; }; - php73 = generic' { + php73base = generic' { version = "7.3.15"; sha256 = "0g84hws15s8gh8iq4h6q747dyfazx47vh3da3whz8d80x83ibgld"; @@ -205,8 +204,24 @@ in { extraPatches = lib.optional stdenv.isDarwin ./php73-darwin-isfinite.patch; }; - php74 = generic' { + php74base = generic' { version = "7.4.3"; sha256 = "wVF7pJV4+y3MZMc6Ptx21PxQfEp6xjmYFYTMfTtMbRQ="; }; + + defaultPhpExtensions = { + exts = pp: with pp.exts; ([ + bcmath calendar curl ctype dom exif fileinfo filter ftp gd + gettext gmp iconv intl json ldap mbstring mysqli mysqlnd opcache + openssl pcntl pdo pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql + posix readline session simplexml sockets soap sodium sqlite3 + tokenizer xmlreader xmlwriter zip zlib + ] ++ lib.optionals (!stdenv.isDarwin) [ imap ]); + }; +in { + inherit php72base php73base php74base; + + php74 = php74base.buildEnv defaultPhpExtensions; + php73 = php73base.buildEnv defaultPhpExtensions; + php72 = php72base.buildEnv defaultPhpExtensions; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index ab765f45d8fb..92ef5c9fcb39 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9374,15 +9374,15 @@ in phpPackages = php74Packages; php72Packages = recurseIntoAttrs (callPackage ./php-packages.nix { - php = php72; + php = php72base; }); php73Packages = recurseIntoAttrs (callPackage ./php-packages.nix { - php = php73; + php = php73base; }); php74Packages = recurseIntoAttrs (callPackage ./php-packages.nix { - php = php74; + php = php74base; }); phpPackages-unit = php74Packages-unit; @@ -9401,10 +9401,7 @@ in inherit (callPackages ../development/interpreters/php { stdenv = if stdenv.cc.isClang then llvmPackages_6.stdenv else stdenv; - }) - php74 - php73 - php72; + }) php74 php73 php72 php74base php73base php72base; php-embed = php74-embed; -- cgit 1.4.1 From 282337799b08844c145c295110f20025541f829a Mon Sep 17 00:00:00 2001 From: talyz Date: Tue, 24 Mar 2020 19:30:18 +0100 Subject: php: Build an even slimmer base This moves yet more extensions from the base build to phpPackages.ext. Some of the extensions are a bit quirky and need patching for this to work, most notably mysqlnd and opcache. Two new parameters are introduced for mkExtension - internalDeps and postPhpize. internalDeps is used to specify which other internal extensions the current extension depends on, in order to provide them at build time. postPhpize is for when patches and quirks need to be applied after running phpize. Patch notes: - For opcache, older versions of PHP have a bug where header files are included in the wrong order. - For mysqlnd, the config.h is never included, so we include it in the main header file, mysqlnd.h. Also, the configure script doesn't add the necessary library link flags, so we add them to the variable configure should have added them to. --- pkgs/development/interpreters/php/default.nix | 38 ++------ pkgs/top-level/php-packages.nix | 128 ++++++++++++++++++++++---- 2 files changed, 120 insertions(+), 46 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 1e5c2cd8f270..f23ebd67eaad 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -1,8 +1,8 @@ # pcre functionality is tested in nixos/tests/php-pcre.nix -{ callPackage, config, fetchurl, lib, makeWrapper, stdenv, symlinkJoin, writeText -, autoconf, automake, bison, flex, libtool, pkgconfig, re2c -, apacheHttpd, gettext, libargon2, libxml2, openssl, pcre, pcre2, readline -, sqlite, systemd, valgrind, zlib, oniguruma }: +{ callPackage, config, fetchurl, lib, makeWrapper, stdenv, symlinkJoin +, writeText , autoconf, automake, bison, flex, libtool, pkgconfig, re2c +, apacheHttpd, libargon2, libxml2, pcre, pcre2 , systemd, valgrind +}: let generic = @@ -10,9 +10,6 @@ let , sha256 , extraPatches ? [] - # Build a minimal php - , minimalBuild ? config.php.minimal or false - # Sapi flags , cgiSupport ? config.php.cgi or true , cliSupport ? config.php.cli or true @@ -42,17 +39,9 @@ let nativeBuildInputs = [ autoconf automake bison flex libtool pkgconfig re2c ]; - buildInputs = [ ] - # Deps for some base extensions - ++ [ gettext ] # Gettext extension - ++ [ openssl openssl.dev ] # Openssl extension - ++ [ pcre' ] # PCRE extension - ++ [ readline ] # Readline extension - ++ [ zlib ] # Zlib extension - ++ [ oniguruma ] # mbstring extension - - # Deps needed when building all default extensions - ++ lib.optionals (!minimalBuild) [ sqlite ] + buildInputs = + # PCRE extension + [ pcre' ] # Enable sapis ++ lib.optional pearSupport [ libxml2.dev ] @@ -66,18 +55,9 @@ let CXXFLAGS = lib.optionalString stdenv.cc.isClang "-std=c++11"; - configureFlags = [] + configureFlags = # Disable all extensions - ++ lib.optional minimalBuild [ "--disable-all" ] - - # A bunch of base extensions - ++ [ "--with-gettext=${gettext}" ] - ++ [ "--with-openssl" ] - ++ [ "--with-readline=${readline.dev}" ] - ++ [ "--with-zlib=${zlib.dev}" ] - ++ [ "--enable-mysqlnd" ] # Required to be able to build mysqli and pdo_mysql - ++ [ "--enable-sockets" ] - ++ [ "--enable-mbstring" ] + [ "--disable-all" ] # PCRE ++ lib.optionals (lib.versionAtLeast version "7.4") [ "--with-external-pcre=${pcre'.dev}" ] diff --git a/pkgs/top-level/php-packages.nix b/pkgs/top-level/php-packages.nix index ab0abf7b26bb..c819a33b620f 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -1,8 +1,9 @@ -{ stdenv, lib, pkgs, fetchgit, php, autoconf, pkgconfig, re2c +{ stdenv, lib, pkgs, fetchgit, php, autoconf, pkgconfig, re2c, gettext , bzip2, curl, libxml2, openssl, gmp, icu, oniguruma, libsodium, html-tidy , libzip, zlib, pcre, pcre2, libxslt, aspell, openldap, cyrus_sasl, uwimap , pam, libiconv, enchant1, libXpm, gd, libwebp, libjpeg, libpng, freetype -, libffi, freetds, postgresql, sqlite, recode, net-snmp, unixODBC }: +, libffi, freetds, postgresql, sqlite, net-snmp, unixODBC, libedit, readline +}: let self = with self; { @@ -709,6 +710,8 @@ let mkExtension = { name , configureFlags ? [ "--enable-${name}" ] + , internalDeps ? [] + , postPhpize ? "" , buildInputs ? [] , zendExtension ? false , ... @@ -720,10 +723,24 @@ let enableParallelBuilding = true; nativeBuildInputs = [ php autoconf pkgconfig re2c ]; - inherit configureFlags buildInputs zendExtension; - - preConfigure = "phpize"; - + inherit configureFlags internalDeps buildInputs zendExtension; + + preConfigure = '' + nullglobRestore=$(shopt -p nullglob) + shopt -u nullglob # To make ?-globbing work + + # Some extensions have a config0.m4 or config9.m4 + if [ -f config?.m4 ]; then + mv config?.m4 config.m4 + fi + + $nullglobRestore + phpize + ${postPhpize} + ${lib.concatMapStringsSep "\n" + (dep: "mkdir -p ext; ln -s ../../${dep} ext/") + internalDeps} + ''; installPhase = '' mkdir -p $out/lib/php/extensions cp modules/${name}.so $out/lib/php/extensions/ext-${name}.so @@ -779,6 +796,10 @@ let "--enable-gd-jis-conv" ]; enable = lib.versionOlder php.version "7.4"; } + { name = "gettext"; + buildInputs = [ gettext ]; + postPhpize = ''substituteInPlace configure --replace 'as_fn_error $? "Cannot locate header file libintl.h" "$LINENO" 5' ':' ''; + configureFlags = "--with-gettext=${gettext}"; } { name = "gmp"; buildInputs = [ gmp ]; configureFlags = [ "--with-gmp=${gmp.dev}" ]; } @@ -804,29 +825,96 @@ let "LDAP_LIBDIR=${openldap.out}/lib" ] ++ lib.optional stdenv.isLinux "--with-ldap-sasl=${cyrus_sasl.dev}"; } { name = "mbstring"; buildInputs = [ oniguruma ]; } - { name = "mysqli"; configureFlags = [ "--with-mysqli=mysqlnd" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; } + { name = "mysqli"; + internalDeps = [ "mysqlnd" ]; + configureFlags = [ "--with-mysqli=mysqlnd" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; } + { name = "mysqlnd"; + buildInputs = [ zlib openssl ]; + # The configure script doesn't correctly add library link + # flags, so we add them to the variable used by the Makefile + # when linking. + MYSQLND_SHARED_LIBADD = "-lssl -lcrypto -lz"; + # The configure script builds a config.h which is never + # included. Let's include it in the main header file + # included by all .c-files. + patches = [ + (pkgs.writeText "mysqlnd_config.patch" '' + --- a/mysqlnd.h + +++ b/mysqlnd.h + @@ -1,3 +1,6 @@ + +#ifdef HAVE_CONFIG_H + +#include "config.h" + +#endif + /* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + '') + ]; + postPhpize = lib.optionalString (lib.versionOlder php.version "7.4") '' + substituteInPlace configure --replace '$OPENSSL_LIBDIR' '${openssl}/lib' \ + --replace '$OPENSSL_INCDIR' '${openssl.dev}/include' + ''; } # oci8 (7.4, 7.3, 7.2) # odbc (7.4, 7.3, 7.2) - { name = "opcache"; buildInputs = [ pcre' ]; zendExtension = true; } + { name = "opcache"; + buildInputs = [ pcre' ]; + # HAVE_OPCACHE_FILE_CACHE is defined in config.h, which is + # included from ZendAccelerator.h, but ZendAccelerator.h is + # included after the ifdef... + patches = lib.optional (lib.versionOlder php.version "7.4") [ + (pkgs.writeText "zend_file_cache_config.patch" '' + --- a/zend_file_cache.c + +++ b/zend_file_cache.c + @@ -27,9 +27,9 @@ + #include "ext/standard/md5.h" + #endif + + +#include "ZendAccelerator.h" + #ifdef HAVE_OPCACHE_FILE_CACHE + + -#include "ZendAccelerator.h" + #include "zend_file_cache.h" + #include "zend_shared_alloc.h" + #include "zend_accelerator_util_funcs.h" + '') ]; + zendExtension = true; } + { name = "openssl"; + buildInputs = [ openssl ]; + configureFlags = [ "--with-openssl" ]; } { name = "pcntl"; } { name = "pdo"; } { name = "pdo_dblib"; + internalDeps = [ "pdo" ]; configureFlags = [ "--with-pdo-dblib=${freetds}" ]; # Doesn't seem to work on darwin. enable = (!stdenv.isDarwin); } # pdo_firebird (7.4, 7.3, 7.2) - { name = "pdo_mysql"; configureFlags = [ "--with-pdo-mysql=mysqlnd" ]; } + { name = "pdo_mysql"; + internalDeps = [ "mysqlnd" "pdo" ]; + configureFlags = [ "--with-pdo-mysql=mysqlnd" ]; } # pdo_oci (7.4, 7.3, 7.2) - { name = "pdo_odbc"; configureFlags = [ "--with-pdo-odbc=unixODBC,${unixODBC}" ]; } - { name = "pdo_pgsql"; configureFlags = [ "--with-pdo-pgsql=${postgresql}" ]; } - { name = "pdo_sqlite"; buildInputs = [ sqlite ]; configureFlags = [ "--with-pdo-sqlite=${sqlite.dev}" ]; } - { name = "pgsql"; buildInputs = [ pcre' ]; configureFlags = [ "--with-pgsql=${postgresql}" ]; } + { name = "pdo_odbc"; + internalDeps = [ "pdo" ]; + configureFlags = [ "--with-pdo-odbc=unixODBC,${unixODBC}" ]; } + { name = "pdo_pgsql"; + internalDeps = [ "pdo" ]; + configureFlags = [ "--with-pdo-pgsql=${postgresql}" ]; } + { name = "pdo_sqlite"; + internalDeps = [ "pdo" ]; + buildInputs = [ sqlite ]; + configureFlags = [ "--with-pdo-sqlite=${sqlite.dev}" ]; } + { name = "pgsql"; + buildInputs = [ pcre' ]; + configureFlags = [ "--with-pgsql=${postgresql}" ]; } { name = "posix"; } { name = "pspell"; configureFlags = [ "--with-pspell=${aspell}" ]; } - { name = "recode"; - configureFlags = [ "--with-recode=${recode}" ]; - # Removed in php 7.4. - enable = lib.versionOlder php.version "7.4"; } + { name = "readline"; + buildInputs = [ libedit readline ]; + configureFlags = [ "--with-readline=${readline.dev}" ]; + postPhpize = lib.optionalString (lib.versionOlder php.version "7.4") '' + substituteInPlace configure --replace 'as_fn_error $? "Please reinstall libedit - I cannot find readline.h" "$LINENO" 5' ':' + ''; } + # recode (7.3, 7.2) { name = "session"; } { name = "shmop"; } { name = "simplexml"; @@ -846,6 +934,7 @@ let ++ lib.optional (lib.versionOlder php.version "7.4") [ "--with-libxml-dir=${libxml2.dev}" ]; } { name = "sockets"; } { name = "sodium"; buildInputs = [ libsodium ]; } + { name = "sqlite3"; buildInputs = [ sqlite ]; } { name = "sysvmsg"; } { name = "sysvsem"; } { name = "sysvshm"; } @@ -853,6 +942,7 @@ let { name = "tokenizer"; } { name = "wddx"; buildInputs = [ libxml2 ]; + internalDeps = [ "session" ]; configureFlags = [ "--enable-wddx" "--with-libxml-dir=${libxml2.dev}" ]; # Removed in php 7.4. enable = lib.versionOlder php.version "7.4"; } @@ -882,6 +972,10 @@ let configureFlags = [ "--with-zip" ] ++ lib.optional (lib.versionOlder php.version "7.4") [ "--with-zlib-dir=${zlib.dev}" ] ++ lib.optional (lib.versionOlder php.version "7.3") [ "--with-libzip" ]; } + { name = "zlib"; + buildInputs = [ zlib ]; + configureFlags = [ "--with-zlib" ] + ++ lib.optional (lib.versionOlder php.version "7.4") [ "--with-zlib-dir=${zlib.dev}" ]; } ]; # Convert the list of attrs: -- cgit 1.4.1 From 8924a7de3d27f14f18ac9877d1d5e29ba474e566 Mon Sep 17 00:00:00 2001 From: talyz Date: Tue, 24 Mar 2020 19:57:49 +0100 Subject: php: Make buildEnv recursive + take extension deps into account A slight rewrite of buildEnv which: 1. Makes buildEnv recursively add itself to its output, so that it can be accessed from any php derivation. 2. Orders the extension text strings according to their internalDeps attribute - dependencies have to be put before dependants in the php.ini or they will fail to load due to missing symbols. --- pkgs/development/interpreters/php/default.nix | 74 ++++++++++++++++++--------- pkgs/top-level/php-packages.nix | 4 +- 2 files changed, 53 insertions(+), 25 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index f23ebd67eaad..36f1d9f92e96 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -144,29 +144,57 @@ let }; }; - generic' = { version, sha256, ... }@args: let php = generic args; in php.overrideAttrs (_: { - passthru.buildEnv = { exts ? (_: []), extraConfig ? "" }: let - extraInit = writeText "custom-php.ini" '' - ${extraConfig} - ${lib.concatMapStringsSep "\n" (ext: let - extName = lib.removePrefix "php-" (builtins.parseDrvName ext.name).name; - type = "${lib.optionalString (ext.zendExtension or false) "zend_"}extension"; - in '' - ${type}=${ext}/lib/php/extensions/${extName}.so - '') (exts (callPackage ../../../top-level/php-packages.nix { inherit php; }))} - ''; - in symlinkJoin { - name = "php-custom-${version}"; - nativeBuildInputs = [ makeWrapper ]; - paths = [ php ]; - postBuild = '' - wrapProgram $out/bin/php \ - --add-flags "-c ${extraInit}" - wrapProgram $out/bin/php-fpm \ - --add-flags "-c ${extraInit}" - ''; - }; - }); + generic' = { version, sha256, ... }@args: + let + php = generic args; + buildEnv = { exts ? (_: []), extraConfig ? "" }: + let + getExtName = ext: lib.removePrefix "php-" (builtins.parseDrvName ext.name).name; + extList = exts (callPackage ../../../top-level/php-packages.nix { inherit php; }); + + # Generate extension load configuration snippets from + # exts. This is an attrset suitable for use with + # textClosureList, which is used to put the strings in the + # right order - if a plugin which is dependent on another + # plugin is placed before its dependency, it will fail to + # load. + extensionTexts = + lib.listToAttrs + (map (ext: + let + extName = getExtName ext; + type = "${lib.optionalString (ext.zendExtension or false) "zend_"}extension"; + in + lib.nameValuePair extName { + text = "${type}=${ext}/lib/php/extensions/${extName}.so"; + deps = lib.optionals (ext ? internalDeps) ext.internalDeps; + }) + extList); + + extNames = map getExtName extList; + extraInit = writeText "custom-php.ini" '' + ${extraConfig} + ${lib.concatStringsSep "\n" + (lib.textClosureList extensionTexts extNames)} + ''; + in + symlinkJoin { + name = "php-with-extensions-${version}"; + inherit version; + nativeBuildInputs = [ makeWrapper ]; + passthru.buildEnv = buildEnv; + paths = [ php ]; + postBuild = '' + wrapProgram $out/bin/php \ + --add-flags "-c ${extraInit}" + wrapProgram $out/bin/php-fpm \ + --add-flags "-c ${extraInit}" + ''; + }; + in + php.overrideAttrs (_: { + passthru.buildEnv = buildEnv; + }); php72base = generic' { version = "7.2.28"; diff --git a/pkgs/top-level/php-packages.nix b/pkgs/top-level/php-packages.nix index 02a747b00e54..7d690c0ec51a 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -717,7 +717,7 @@ let , doCheck ? true , ... }: stdenv.mkDerivation { - pname = "php-ext-${name}"; + pname = "php-${name}"; inherit (php) version src; sourceRoot = "php-${php.version}/ext/${name}"; @@ -746,7 +746,7 @@ let checkPhase = "echo n | make test"; installPhase = '' mkdir -p $out/lib/php/extensions - cp modules/${name}.so $out/lib/php/extensions/ext-${name}.so + cp modules/${name}.so $out/lib/php/extensions/${name}.so ''; }; -- cgit 1.4.1 From b1106a18510245bfd642c057dda43ad5ea985baa Mon Sep 17 00:00:00 2001 From: talyz Date: Sat, 28 Mar 2020 22:37:22 +0100 Subject: phpPackages: Move phpPackages to php.packages This means php packages can now refer to other php packages by looking them up in the php.packages attribute and gets rid of the internal recursive set previously defined in php-packages.nix. This also means that in applications where previously both the php package and the corresponding version of the phpPackages package set had to be specified, the php package will now suffice. This also adds the phpWithExtensions parameter to the php-packages.nix, which can be used by extensions that need a fully featured PHP executable. --- pkgs/development/interpreters/php/default.nix | 29 ++++++++++---- pkgs/top-level/all-packages.nix | 16 ++------ pkgs/top-level/php-packages.nix | 57 +++++++++++++++++---------- 3 files changed, 62 insertions(+), 40 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 36f1d9f92e96..3c2a73a5c193 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -144,13 +144,17 @@ let }; }; - generic' = { version, sha256, ... }@args: + generic' = { version, sha256, self, selfWithExtensions, ... }@args: let - php = generic args; + php = generic (builtins.removeAttrs args [ "self" "selfWithExtensions" ]); + packages = callPackage ../../../top-level/php-packages.nix { + php = self; + phpWithExtensions = selfWithExtensions; + }; buildEnv = { exts ? (_: []), extraConfig ? "" }: let getExtName = ext: lib.removePrefix "php-" (builtins.parseDrvName ext.name).name; - extList = exts (callPackage ../../../top-level/php-packages.nix { inherit php; }); + extList = exts packages; # Generate extension load configuration snippets from # exts. This is an attrset suitable for use with @@ -182,7 +186,9 @@ let name = "php-with-extensions-${version}"; inherit version; nativeBuildInputs = [ makeWrapper ]; - passthru.buildEnv = buildEnv; + passthru = { + inherit buildEnv packages; + }; paths = [ php ]; postBuild = '' wrapProgram $out/bin/php \ @@ -193,12 +199,16 @@ let }; in php.overrideAttrs (_: { - passthru.buildEnv = buildEnv; + passthru = { + inherit buildEnv packages; + }; }); php72base = generic' { version = "7.2.28"; sha256 = "18sjvl67z5a2x5s2a36g6ls1r3m4hbrsw52hqr2qsgfvg5dkm5bw"; + self = php72base; + selfWithExtensions = php72; # https://bugs.php.net/bug.php?id=76826 extraPatches = lib.optional stdenv.isDarwin ./php72-darwin-isfinite.patch; @@ -207,6 +217,8 @@ let php73base = generic' { version = "7.3.15"; sha256 = "0g84hws15s8gh8iq4h6q747dyfazx47vh3da3whz8d80x83ibgld"; + self = php73base; + selfWithExtensions = php73; # https://bugs.php.net/bug.php?id=76826 extraPatches = lib.optional stdenv.isDarwin ./php73-darwin-isfinite.patch; @@ -215,6 +227,8 @@ let php74base = generic' { version = "7.4.3"; sha256 = "wVF7pJV4+y3MZMc6Ptx21PxQfEp6xjmYFYTMfTtMbRQ="; + self = php74base; + selfWithExtensions = php74; }; defaultPhpExtensions = { @@ -226,10 +240,11 @@ let tokenizer xmlreader xmlwriter zip zlib ] ++ lib.optionals (!stdenv.isDarwin) [ imap ]); }; -in { - inherit php72base php73base php74base; php74 = php74base.buildEnv defaultPhpExtensions; php73 = php73base.buildEnv defaultPhpExtensions; php72 = php72base.buildEnv defaultPhpExtensions; + +in { + inherit php72base php73base php74base php72 php73 php74; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 1bceaf3d29d1..1bb373ad6336 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9371,19 +9371,11 @@ in pachyderm = callPackage ../applications/networking/cluster/pachyderm { }; php = php74; - phpPackages = php74Packages; - - php72Packages = recurseIntoAttrs (callPackage ./php-packages.nix { - php = php72base; - }); - php73Packages = recurseIntoAttrs (callPackage ./php-packages.nix { - php = php73base; - }); - - php74Packages = recurseIntoAttrs (callPackage ./php-packages.nix { - php = php74base; - }); + phpPackages = php74Packages; + php72Packages = recurseIntoAttrs php72.packages; + php73Packages = recurseIntoAttrs php73.packages; + php74Packages = recurseIntoAttrs php74.packages; inherit (callPackages ../development/interpreters/php { stdenv = if stdenv.cc.isClang then llvmPackages_6.stdenv else stdenv; diff --git a/pkgs/top-level/php-packages.nix b/pkgs/top-level/php-packages.nix index 198b2c2e8e97..604a7b0474c3 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -1,25 +1,28 @@ -{ stdenv, lib, pkgs, fetchgit, php, autoconf, pkgconfig, re2c, gettext -, bzip2, curl, libxml2, openssl, gmp, icu, oniguruma, libsodium, html-tidy -, libzip, zlib, pcre, pcre2, libxslt, aspell, openldap, cyrus_sasl, uwimap -, pam, libiconv, enchant1, libXpm, gd, libwebp, libjpeg, libpng, freetype -, libffi, freetds, postgresql, sqlite, net-snmp, unixODBC, libedit, readline +{ stdenv, lib, pkgs, fetchgit, php, phpWithExtensions, autoconf, pkgconfig, re2c +, gettext, bzip2, curl, libxml2, openssl, gmp, icu, oniguruma, libsodium +, html-tidy, libzip, zlib, pcre, pcre2, libxslt, aspell, openldap, cyrus_sasl +, uwimap, pam, libiconv, enchant1, libXpm, gd, libwebp, libjpeg, libpng +, freetype, libffi, freetds, postgresql, sqlite, net-snmp, unixODBC, libedit +, readline, rsync }: let - self = with self; { - buildPecl = import ../build-support/build-pecl.nix { - inherit php; - inherit (pkgs) stdenv autoreconfHook fetchurl re2c; - }; + buildPecl = import ../build-support/build-pecl.nix { + inherit php lib; + inherit (pkgs) stdenv autoreconfHook fetchurl re2c; + }; - # Wrap mkDerivation to prepend pname with "php-" to make names consistent - # with how buildPecl does it and make the file easier to overview. - mkDerivation = { pname, ... }@args: pkgs.stdenv.mkDerivation (args // { - pname = "php-${pname}"; - }); + # Wrap mkDerivation to prepend pname with "php-" to make names consistent + # with how buildPecl does it and make the file easier to overview. + mkDerivation = { pname, ... }@args: pkgs.stdenv.mkDerivation (args // { + pname = "php-${pname}"; + }); isPhp73 = pkgs.lib.versionAtLeast php.version "7.3"; isPhp74 = pkgs.lib.versionAtLeast php.version "7.4"; +in +{ + inherit buildPecl; apcu = buildPecl { version = "5.1.18"; @@ -41,7 +44,10 @@ let sha256 = "0ma00syhk2ps9k9p02jz7rii6x3i2p986il23703zz5npd6y9n20"; - buildInputs = [ apcu (if isPhp73 then pkgs.pcre2 else pkgs.pcre) ]; + buildInputs = [ + php.packages.apcu + (if isPhp73 then pkgs.pcre2 else pkgs.pcre) + ]; }; ast = buildPecl { @@ -111,7 +117,12 @@ let version = "2.6.1"; pname = "couchbase"; - buildInputs = [ pkgs.libcouchbase pkgs.zlib igbinary pcs ]; + buildInputs = [ + pkgs.libcouchbase + pkgs.zlib + php.packages.igbinary + php.packages.pcs + ]; src = pkgs.fetchFromGitHub { owner = "couchbase"; @@ -139,8 +150,8 @@ let igbinary_inc_path="$phpincludedir" elif test -f "$phpincludedir/ext/igbinary/igbinary.h"; then igbinary_inc_path="$phpincludedir" - + elif test -f "${igbinary.dev}/include/ext/igbinary/igbinary.h"; then - + igbinary_inc_path="${igbinary.dev}/include" + + elif test -f "${php.packages.igbinary.dev}/include/ext/igbinary/igbinary.h"; then + + igbinary_inc_path="${php.packages.igbinary.dev}/include" fi if test "$igbinary_inc_path" = ""; then AC_MSG_WARN([Cannot find igbinary.h]) @@ -353,7 +364,11 @@ let sha256 = "16nv8yyk2z3l213dg067l6di4pigg5rd8yswr5xgd18jwbys2vnw"; }; - buildInputs = [ pkgs.makeWrapper composer box ]; + buildInputs = [ + pkgs.makeWrapper + php.packages.composer + php.packages.box + ]; buildPhase = '' composer dump-autoload @@ -1024,4 +1039,4 @@ let # Produce the final attribute set of all extensions defined. in builtins.listToAttrs namedExtensions; -}; in self +} -- cgit 1.4.1 From 90dcab948c22f997a76f9f77afe5f542af2e6734 Mon Sep 17 00:00:00 2001 From: talyz Date: Sat, 28 Mar 2020 23:03:35 +0100 Subject: php.packages: Use derivations for internalDeps in mkExtension Make mkExtension put headers in the dev output and use them, instead of a different part of the current source tree, when referring to another extension by using internalDeps. This means external extensions can be built against the internal ones. --- pkgs/development/interpreters/php/default.nix | 3 ++- pkgs/top-level/php-packages.nix | 24 ++++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 3c2a73a5c193..082f2ef8fdcd 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -171,7 +171,8 @@ let in lib.nameValuePair extName { text = "${type}=${ext}/lib/php/extensions/${extName}.so"; - deps = lib.optionals (ext ? internalDeps) ext.internalDeps; + deps = lib.optionals (ext ? internalDeps) + (map getExtName ext.internalDeps); }) extList); diff --git a/pkgs/top-level/php-packages.nix b/pkgs/top-level/php-packages.nix index 604a7b0474c3..2ebc06978242 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -733,6 +733,7 @@ in , ... }@args: stdenv.mkDerivation ((builtins.removeAttrs args [ "name" ]) // { pname = "php-${name}"; + extensionName = name; inherit (php) version src; sourceRoot = "php-${php.version}/ext/${name}"; @@ -755,13 +756,20 @@ in phpize ${postPhpize} ${lib.concatMapStringsSep "\n" - (dep: "mkdir -p ext; ln -s ../../${dep} ext/") + (dep: "mkdir -p ext; ln -s ${dep.dev}/include ext/${dep.extensionName}") internalDeps} ''; checkPhase = "echo n | make test"; + outputs = [ "out" "dev" ]; installPhase = '' mkdir -p $out/lib/php/extensions cp modules/${name}.so $out/lib/php/extensions/${name}.so + mkdir -p $dev/include + ${rsync}/bin/rsync -r --filter="+ */" \ + --filter="+ *.h" \ + --filter="- *" \ + --prune-empty-dirs \ + . $dev/include/ ''; }); @@ -853,7 +861,7 @@ in doCheck = false; } { name = "mbstring"; buildInputs = [ oniguruma ]; doCheck = false; } { name = "mysqli"; - internalDeps = [ "mysqlnd" ]; + internalDeps = [ php.packages.exts.mysqlnd ]; configureFlags = [ "--with-mysqli=mysqlnd" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; doCheck = false; } { name = "mysqlnd"; @@ -914,27 +922,27 @@ in { name = "pcntl"; } { name = "pdo"; doCheck = false; } { name = "pdo_dblib"; - internalDeps = [ "pdo" ]; + internalDeps = [ php.packages.exts.pdo ]; configureFlags = [ "--with-pdo-dblib=${freetds}" ]; # Doesn't seem to work on darwin. enable = (!stdenv.isDarwin); doCheck = false; } # pdo_firebird (7.4, 7.3, 7.2) { name = "pdo_mysql"; - internalDeps = [ "mysqlnd" "pdo" ]; + internalDeps = with php.packages.exts; [ pdo mysqlnd ]; configureFlags = [ "--with-pdo-mysql=mysqlnd" ]; doCheck = false; } # pdo_oci (7.4, 7.3, 7.2) { name = "pdo_odbc"; - internalDeps = [ "pdo" ]; + internalDeps = [ php.packages.exts.pdo ]; configureFlags = [ "--with-pdo-odbc=unixODBC,${unixODBC}" ]; doCheck = false; } { name = "pdo_pgsql"; - internalDeps = [ "pdo" ]; + internalDeps = [ php.packages.exts.pdo ]; configureFlags = [ "--with-pdo-pgsql=${postgresql}" ]; doCheck = false; } { name = "pdo_sqlite"; - internalDeps = [ "pdo" ]; + internalDeps = [ php.packages.exts.pdo ]; buildInputs = [ sqlite ]; configureFlags = [ "--with-pdo-sqlite=${sqlite.dev}" ]; doCheck = false; } @@ -982,7 +990,7 @@ in { name = "tokenizer"; } { name = "wddx"; buildInputs = [ libxml2 ]; - internalDeps = [ "session" ]; + internalDeps = [ php.extensions.session ]; configureFlags = [ "--enable-wddx" "--with-libxml-dir=${libxml2.dev}" ]; # Removed in php 7.4. enable = lib.versionOlder php.version "7.4"; } -- cgit 1.4.1 From 82cd2fbbf470b0b53005737e8fd833a77cf2f38c Mon Sep 17 00:00:00 2001 From: Elis Hirwing Date: Sat, 28 Mar 2020 09:57:04 +0100 Subject: php: Wrap the programs and provide an environment variable instead of a flag --- pkgs/development/interpreters/php/default.nix | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 082f2ef8fdcd..bfb024077c81 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -192,10 +192,13 @@ let }; paths = [ php ]; postBuild = '' - wrapProgram $out/bin/php \ - --add-flags "-c ${extraInit}" - wrapProgram $out/bin/php-fpm \ - --add-flags "-c ${extraInit}" + cp ${extraInit} $out/lib/custom-php.ini + + wrapProgram $out/bin/php --set PHP_INI_SCAN_DIR $out/lib + + if test -e $out/bin/php-fpm; then + wrapProgram $out/bin/php-fpm --set PHP_INI_SCAN_DIR $out/lib + fi ''; }; in -- cgit 1.4.1 From 716fd0e2f576c3eeea2a231a259ff67bad3f6594 Mon Sep 17 00:00:00 2001 From: talyz Date: Sun, 29 Mar 2020 12:01:38 +0200 Subject: php.buildEnv: Put the extraConfig snippet after extensions Make sure all the extensions are loaded first, then read the custom config where possible. --- pkgs/development/interpreters/php/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index bfb024077c81..3692191e121f 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -178,9 +178,9 @@ let extNames = map getExtName extList; extraInit = writeText "custom-php.ini" '' - ${extraConfig} ${lib.concatStringsSep "\n" (lib.textClosureList extensionTexts extNames)} + ${extraConfig} ''; in symlinkJoin { -- cgit 1.4.1 From 0dc95728bac36c3711009e0611b7b31c402a959e Mon Sep 17 00:00:00 2001 From: Elis Hirwing Date: Tue, 31 Mar 2020 19:06:04 +0200 Subject: nixos/php: Move the pcre tests to the php test attribute --- nixos/release-combined.nix | 2 +- nixos/release-small.nix | 4 +-- nixos/tests/all-tests.nix | 1 - nixos/tests/php-pcre.nix | 40 --------------------------- nixos/tests/php/default.nix | 1 + nixos/tests/php/pcre.nix | 37 +++++++++++++++++++++++++ pkgs/development/interpreters/php/default.nix | 4 ++- 7 files changed, 44 insertions(+), 45 deletions(-) delete mode 100644 nixos/tests/php-pcre.nix create mode 100644 nixos/tests/php/pcre.nix (limited to 'pkgs/development/interpreters') diff --git a/nixos/release-combined.nix b/nixos/release-combined.nix index 9377a931a75e..b23c17a1b696 100644 --- a/nixos/release-combined.nix +++ b/nixos/release-combined.nix @@ -112,7 +112,7 @@ in rec { "nixos.tests.nfs4.simple.x86_64-linux" "nixos.tests.openssh.x86_64-linux" "nixos.tests.pantheon.x86_64-linux" - "nixos.tests.php-pcre.x86_64-linux" + "nixos.tests.php.x86_64-linux" "nixos.tests.plasma5.x86_64-linux" "nixos.tests.predictable-interface-names.predictableNetworkd.x86_64-linux" "nixos.tests.predictable-interface-names.predictable.x86_64-linux" diff --git a/nixos/release-small.nix b/nixos/release-small.nix index 2a15073b6698..d78788d05315 100644 --- a/nixos/release-small.nix +++ b/nixos/release-small.nix @@ -40,7 +40,7 @@ in rec { nat nfs3 openssh - php-pcre + php predictable-interface-names proxy simple; @@ -108,7 +108,7 @@ in rec { "nixos.tests.nat.standalone.x86_64-linux" "nixos.tests.nfs3.simple.x86_64-linux" "nixos.tests.openssh.x86_64-linux" - "nixos.tests.php-pcre.x86_64-linux" + "nixos.tests.php.x86_64-linux" "nixos.tests.predictable-interface-names.predictable.x86_64-linux" "nixos.tests.predictable-interface-names.predictableNetworkd.x86_64-linux" "nixos.tests.predictable-interface-names.unpredictable.x86_64-linux" diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index e003372ef9d4..1f8f0d49a850 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -241,7 +241,6 @@ in pgjwt = handleTest ./pgjwt.nix {}; pgmanage = handleTest ./pgmanage.nix {}; php = handleTest ./php {}; - php-pcre = handleTest ./php-pcre.nix {}; plasma5 = handleTest ./plasma5.nix {}; plotinus = handleTest ./plotinus.nix {}; postgis = handleTest ./postgis.nix {}; diff --git a/nixos/tests/php-pcre.nix b/nixos/tests/php-pcre.nix deleted file mode 100644 index d5c22e0582a0..000000000000 --- a/nixos/tests/php-pcre.nix +++ /dev/null @@ -1,40 +0,0 @@ - -let testString = "can-use-subgroups"; in - -import ./make-test-python.nix ({ ...}: { - name = "php-httpd-pcre-jit-test"; - machine = { lib, pkgs, ... }: { - time.timeZone = "UTC"; - services.httpd = { - enable = true; - adminAddr = "please@dont.contact"; - enablePHP = true; - phpOptions = "pcre.jit = true"; - extraConfig = - let - testRoot = pkgs.writeText "index.php" - '' - - ''; - in - '' - Alias / ${testRoot}/ - - - Require all granted - - ''; - }; - }; - testScript = { ... }: - '' - machine.wait_for_unit("httpd.service") - # Ensure php evaluation by matching on the var_dump syntax - assert 'string(${toString (builtins.stringLength testString)}) "${testString}"' in machine.succeed( - "curl -vvv -s http://127.0.0.1:80/index.php" - ) - ''; -}) diff --git a/nixos/tests/php/default.nix b/nixos/tests/php/default.nix index c5735bd664d7..9ab14f722d08 100644 --- a/nixos/tests/php/default.nix +++ b/nixos/tests/php/default.nix @@ -3,4 +3,5 @@ pkgs ? import ../../.. { inherit system config; } }: { fpm = import ./fpm.nix { inherit system pkgs; }; + pcre = import ./pcre.nix { inherit system pkgs; }; } diff --git a/nixos/tests/php/pcre.nix b/nixos/tests/php/pcre.nix new file mode 100644 index 000000000000..56a87778579f --- /dev/null +++ b/nixos/tests/php/pcre.nix @@ -0,0 +1,37 @@ +let + testString = "can-use-subgroups"; +in import ../make-test-python.nix ({ ...}: { + name = "php-httpd-pcre-jit-test"; + machine = { lib, pkgs, ... }: { + time.timeZone = "UTC"; + services.httpd = { + enable = true; + adminAddr = "please@dont.contact"; + enablePHP = true; + phpOptions = "pcre.jit = true"; + extraConfig = let + testRoot = pkgs.writeText "index.php" + '' + + Require all granted + + ''; + }; + }; + testScript = { ... }: + '' + machine.wait_for_unit("httpd.service") + # Ensure php evaluation by matching on the var_dump syntax + assert 'string(${toString (builtins.stringLength testString)}) "${testString}"' in machine.succeed( + "curl -vvv -s http://127.0.0.1:80/index.php" + ) + ''; +}) diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 3692191e121f..7daf32e5127c 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -1,4 +1,6 @@ -# pcre functionality is tested in nixos/tests/php-pcre.nix +# We have tests for PCRE and PHP-FPM in nixos/tests/php/ or +# both in the same attribute named nixosTests.php + { callPackage, config, fetchurl, lib, makeWrapper, stdenv, symlinkJoin , writeText , autoconf, automake, bison, flex, libtool, pkgconfig, re2c , apacheHttpd, libargon2, libxml2, pcre, pcre2 , systemd, valgrind -- cgit 1.4.1 From a2099156eca905ee0b7a232cb7ec07539eebd72c Mon Sep 17 00:00:00 2001 From: Elis Hirwing Date: Thu, 2 Apr 2020 22:13:04 +0200 Subject: php: split php.packages to php.packages and php.extensions So now we have only packages for human interaction in php.packages and only extensions in php.extensions. With this php.packages.exts have been merged into the same attribute set as all the other extensions to make it flat and nice. The nextcloud module have been updated to reflect this change as well as the documentation. --- doc/languages-frameworks/php.section.md | 41 +- nixos/doc/manual/release-notes/rl-2009.xml | 6 +- nixos/modules/services/web-apps/nextcloud.nix | 6 +- pkgs/development/interpreters/php/default.nix | 19 +- pkgs/top-level/all-packages.nix | 5 + pkgs/top-level/php-packages.nix | 1039 +++++++++++++------------ 6 files changed, 563 insertions(+), 553 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/doc/languages-frameworks/php.section.md b/doc/languages-frameworks/php.section.md index 9924946a45c1..18d4ee83709d 100644 --- a/doc/languages-frameworks/php.section.md +++ b/doc/languages-frameworks/php.section.md @@ -21,20 +21,12 @@ of a given NixOS release will be included in that release of NixOS. See [PHP Supported Versions](https://www.php.net/supported-versions.php). -As for packages we have `php.packages` that contains a bunch of -attributes where some are suitable as extensions (notable example: -`php.packages.imagick`). And some are more suitable for command -line use (notable example: `php.packages.composer`). +For packages we have `php.packages` that contains packages related +for human interaction, notable example is `php.packages.composer`. -We have a special section within `php.packages` called -`php.packages.exts` that contain certain PHP modules that may not -be part of the default PHP derivation (example: -`php.packages.exts.opcache`). - -The `php.packages.exts.*` attributes are official extensions which -originate from the mainline PHP project, while other extensions within -the `php.packages.*` attribute are of mixed origin (such as `pecl` -and other places). +For extensions we have `php.extensions` that contains most upstream +extensions as separate attributes as well some additional extensions +that tend to be popular, notable example is: `php.extensions.imagick`. The different versions of PHP that nixpkgs fetch is located under attributes named based on major and minor version number; e.g., @@ -43,23 +35,20 @@ attributes named based on major and minor version number; e.g., #### Installing PHP with packages -There's two different kinds of things you could install: - - A command line utility. Simply refer to it via - `php*.packages.*`, and it automatically comes with the necessary - PHP environment, certain extensions and libraries around it. - - A PHP interpreter with certain extensions available. The `php` - attribute provides `php.buildEnv` that allows you to wrap the PHP - derivation with an additional config file that makes PHP import - additional libraries or dependencies. +There's two majorly different parts of the PHP ecosystem in NixOS: + - Command line utilities for human interaction. These comes from the + `php.packages.*` attributes. + - PHP environments with different extensions enabled. These are + composed with `php.buildEnv` using an additional configuration file. ##### Example setup for `phpfpm` -Example to build a PHP with `imagick` and `opcache` enabled, and -configure it for the "foo" `phpfpm` pool: +Example to build a PHP with the extensions `imagick` and `opcache` +enabled. Then to configure it for the "foo" `phpfpm` pool: ```nix let - myPhp = php.buildEnv { exts = pp: with pp; [ imagick exts.opcache ]; }; + myPhp = php.buildEnv { exts = pp: with pp; [ imagick opcache ]; }; in { services.phpfpm.pools."foo".phpPackage = myPhp; }; @@ -68,8 +57,8 @@ in { ##### Example usage with `nix-shell` This brings up a temporary environment that contains a PHP interpreter -with `imagick` and `opcache` enabled. +with the extensions `imagick` and `opcache` enabled. ```sh -nix-shell -p 'php.buildEnv { exts = pp: with pp; [ imagick exts.opcache ]; }' +nix-shell -p 'php.buildEnv { exts = pp: with pp; [ imagick opcache ]; }' ``` diff --git a/nixos/doc/manual/release-notes/rl-2009.xml b/nixos/doc/manual/release-notes/rl-2009.xml index db4b8df4a225..1618fc89477f 100644 --- a/nixos/doc/manual/release-notes/rl-2009.xml +++ b/nixos/doc/manual/release-notes/rl-2009.xml @@ -134,8 +134,8 @@ environment.systemPackages = [ -(pkgs.php.buildEnv { exts = pp: with pp.exts; [ - pp.imagick +(pkgs.php.buildEnv { exts = pp: with pp; [ + imagick opcache pdo_mysql ]; }) @@ -144,7 +144,7 @@ environment.systemPackages = [ The default php attribute hasn't lost any extensions - the opcache extension was added there. - All upstream PHP extensions are available under ]]>. + All upstream PHP extensions are available under ]]>. The updated php attribute is now easily customizable to your liking diff --git a/nixos/modules/services/web-apps/nextcloud.nix b/nixos/modules/services/web-apps/nextcloud.nix index c6c1cdadf027..33d356700294 100644 --- a/nixos/modules/services/web-apps/nextcloud.nix +++ b/nixos/modules/services/web-apps/nextcloud.nix @@ -7,12 +7,12 @@ let fpm = config.services.phpfpm.pools.nextcloud; phpPackage = pkgs.php74.buildEnv { - exts = pp: with pp.exts; [ + exts = pp: with pp; [ bcmath calendar curl exif ftp filter gd gettext gmp intl json ldap mysqlnd opcache openssl pcntl pdo pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql readline session soap sodium sqlite3 zip zlib mbstring - posix ctype dom simplexml xmlreader xmlwriter pp.apcu - pp.redis pp.memcached pp.imagick + posix ctype dom simplexml xmlreader xmlwriter + apcu redis memcached imagick ]; extraConfig = phpOptionsStr; }; diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 7daf32e5127c..514c20708863 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -149,14 +149,21 @@ let generic' = { version, sha256, self, selfWithExtensions, ... }@args: let php = generic (builtins.removeAttrs args [ "self" "selfWithExtensions" ]); - packages = callPackage ../../../top-level/php-packages.nix { + + packages = (callPackage ../../../top-level/php-packages.nix { php = self; phpWithExtensions = selfWithExtensions; - }; + }).packages; + + extensions = (callPackage ../../../top-level/php-packages.nix { + php = self; + phpWithExtensions = selfWithExtensions; + }).extensions; + buildEnv = { exts ? (_: []), extraConfig ? "" }: let getExtName = ext: lib.removePrefix "php-" (builtins.parseDrvName ext.name).name; - extList = exts packages; + extList = exts extensions; # Generate extension load configuration snippets from # exts. This is an attrset suitable for use with @@ -190,7 +197,7 @@ let inherit version; nativeBuildInputs = [ makeWrapper ]; passthru = { - inherit buildEnv packages; + inherit buildEnv packages extensions; }; paths = [ php ]; postBuild = '' @@ -206,7 +213,7 @@ let in php.overrideAttrs (_: { passthru = { - inherit buildEnv packages; + inherit buildEnv packages extensions; }; }); @@ -238,7 +245,7 @@ let }; defaultPhpExtensions = { - exts = pp: with pp.exts; ([ + exts = pp: with pp; ([ bcmath calendar curl ctype dom exif fileinfo filter ftp gd gettext gmp iconv intl json ldap mbstring mysqli mysqlnd opcache openssl pcntl pdo pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 1bb373ad6336..2aa5696d86c1 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9377,6 +9377,11 @@ in php73Packages = recurseIntoAttrs php73.packages; php74Packages = recurseIntoAttrs php74.packages; + phpExtensions = php74Extensions; + php72Extensions = recurseIntoAttrs php72.extensions; + php73Extensions = recurseIntoAttrs php73.extensions; + php74Extensions = recurseIntoAttrs php74.extensions; + inherit (callPackages ../development/interpreters/php { stdenv = if stdenv.cc.isClang then llvmPackages_6.stdenv else stdenv; }) php74 php73 php72 php74base php73base php72base; diff --git a/pkgs/top-level/php-packages.nix b/pkgs/top-level/php-packages.nix index b3a3fe699c43..bb4a5a946c1c 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -20,654 +20,665 @@ let isPhp73 = pkgs.lib.versionAtLeast php.version "7.3"; isPhp74 = pkgs.lib.versionAtLeast php.version "7.4"; + + pcre' = if (lib.versionAtLeast php.version "7.3") then pcre2 else pcre; in { inherit buildPecl; - apcu = buildPecl { - version = "5.1.18"; - pname = "apcu"; + # Packages are an attribute set meant for for human interaction and not + # extensions for the language itself. + packages = { + box = mkDerivation rec { + version = "2.7.5"; + pname = "box"; - sha256 = "0ayykd4hfvdzk7qnr5k6yq5scwf6rb2i05xscfv76q5dmkkynvfl"; + src = pkgs.fetchurl { + url = "https://github.com/box-project/box2/releases/download/${version}/box-${version}.phar"; + sha256 = "1zmxdadrv0i2l8cz7xb38gnfmfyljpsaz2nnkjzqzksdmncbgd18"; + }; - buildInputs = if isPhp73 then [ pkgs.pcre2 ] else [ pkgs.pcre ]; - doCheck = true; - checkTarget = "test"; - checkFlagsArray = ["REPORT_EXIT_STATUS=1" "NO_INTERACTION=1"]; - makeFlags = [ "phpincludedir=$(dev)/include" ]; - outputs = [ "out" "dev" ]; - }; + phases = [ "installPhase" ]; + buildInputs = [ pkgs.makeWrapper ]; - apcu_bc = buildPecl { - version = "1.0.5"; - pname = "apcu_bc"; + installPhase = '' + mkdir -p $out/bin + install -D $src $out/libexec/box/box.phar + makeWrapper ${phpWithExtensions}/bin/php $out/bin/box \ + --add-flags "-d phar.readonly=0 $out/libexec/box/box.phar" + ''; - sha256 = "0ma00syhk2ps9k9p02jz7rii6x3i2p986il23703zz5npd6y9n20"; + meta = with pkgs.lib; { + description = "An application for building and managing Phars"; + license = licenses.mit; + homepage = https://box-project.github.io/box2/; + maintainers = with maintainers; [ jtojnar ]; + }; + }; - buildInputs = [ - php.packages.apcu - (if isPhp73 then pkgs.pcre2 else pkgs.pcre) - ]; - }; + composer = mkDerivation rec { + version = "1.9.3"; + pname = "composer"; - ast = buildPecl { - version = "1.0.5"; - pname = "ast"; + src = pkgs.fetchurl { + url = "https://getcomposer.org/download/${version}/composer.phar"; + sha256 = "VRZVwvyB9BBlCPQrvEsk6r00sCKxO8Hn2WQr9IPQp9Q="; + }; - sha256 = "16c5isldm4csjbcvz1qk2mmrhgvh24sxsp6w6f5a37xpa3vciawp"; - }; + dontUnpack = true; + + nativeBuildInputs = [ pkgs.makeWrapper ]; - box = mkDerivation rec { - version = "2.7.5"; - pname = "box"; + installPhase = '' + mkdir -p $out/bin + install -D $src $out/libexec/composer/composer.phar + makeWrapper ${phpWithExtensions}/bin/php $out/bin/composer \ + --add-flags "$out/libexec/composer/composer.phar" \ + --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.unzip ]} + ''; - src = pkgs.fetchurl { - url = "https://github.com/box-project/box2/releases/download/${version}/box-${version}.phar"; - sha256 = "1zmxdadrv0i2l8cz7xb38gnfmfyljpsaz2nnkjzqzksdmncbgd18"; + meta = with pkgs.lib; { + description = "Dependency Manager for PHP"; + license = licenses.mit; + homepage = https://getcomposer.org/; + maintainers = with maintainers; [ globin offline ]; + }; }; - phases = [ "installPhase" ]; - buildInputs = [ pkgs.makeWrapper ]; + php-cs-fixer = mkDerivation rec { + version = "2.16.1"; + pname = "php-cs-fixer"; - installPhase = '' - mkdir -p $out/bin - install -D $src $out/libexec/box/box.phar - makeWrapper ${phpWithExtensions}/bin/php $out/bin/box \ - --add-flags "-d phar.readonly=0 $out/libexec/box/box.phar" - ''; + src = pkgs.fetchurl { + url = "https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v${version}/php-cs-fixer.phar"; + sha256 = "1dq1nhy666zg6d4fkfsjwhj1vwh1ncap2c9ljplxv98a9mm6fk68"; + }; - meta = with pkgs.lib; { - description = "An application for building and managing Phars"; - license = licenses.mit; - homepage = https://box-project.github.io/box2/; - maintainers = with maintainers; [ jtojnar ]; - }; - }; + phases = [ "installPhase" ]; + buildInputs = [ pkgs.makeWrapper ]; - composer = mkDerivation rec { - version = "1.9.3"; - pname = "composer"; + installPhase = '' + mkdir -p $out/bin + install -D $src $out/libexec/php-cs-fixer/php-cs-fixer.phar + makeWrapper ${php}/bin/php $out/bin/php-cs-fixer \ + --add-flags "$out/libexec/php-cs-fixer/php-cs-fixer.phar" + ''; - src = pkgs.fetchurl { - url = "https://getcomposer.org/download/${version}/composer.phar"; - sha256 = "VRZVwvyB9BBlCPQrvEsk6r00sCKxO8Hn2WQr9IPQp9Q="; + meta = with pkgs.lib; { + description = "A tool to automatically fix PHP coding standards issues"; + license = licenses.mit; + homepage = http://cs.sensiolabs.org/; + maintainers = with maintainers; [ jtojnar ]; + }; }; - dontUnpack = true; - - nativeBuildInputs = [ pkgs.makeWrapper ]; + php-parallel-lint = mkDerivation rec { + version = "1.0.0"; + pname = "php-parallel-lint"; + + src = pkgs.fetchFromGitHub { + owner = "JakubOnderka"; + repo = "PHP-Parallel-Lint"; + rev = "v${version}"; + sha256 = "16nv8yyk2z3l213dg067l6di4pigg5rd8yswr5xgd18jwbys2vnw"; + }; + + buildInputs = [ + pkgs.makeWrapper + php.packages.composer + php.packages.box + ]; + + buildPhase = '' + composer dump-autoload + box build + ''; - installPhase = '' - mkdir -p $out/bin - install -D $src $out/libexec/composer/composer.phar - makeWrapper ${phpWithExtensions}/bin/php $out/bin/composer \ - --add-flags "$out/libexec/composer/composer.phar" \ - --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.unzip ]} - ''; + installPhase = '' + mkdir -p $out/bin + install -D parallel-lint.phar $out/libexec/php-parallel-lint/php-parallel-lint.phar + makeWrapper ${php}/bin/php $out/bin/php-parallel-lint \ + --add-flags "$out/libexec/php-parallel-lint/php-parallel-lint.phar" + ''; - meta = with pkgs.lib; { - description = "Dependency Manager for PHP"; - license = licenses.mit; - homepage = https://getcomposer.org/; - maintainers = with maintainers; [ globin offline ]; + meta = with pkgs.lib; { + description = "This tool check syntax of PHP files faster than serial check with fancier output"; + license = licenses.bsd2; + homepage = https://github.com/JakubOnderka/PHP-Parallel-Lint; + maintainers = with maintainers; [ jtojnar ]; + }; }; - }; - couchbase = buildPecl rec { - version = "2.6.1"; - pname = "couchbase"; + phpcbf = mkDerivation rec { + version = "3.5.3"; + pname = "phpcbf"; - buildInputs = [ - pkgs.libcouchbase - pkgs.zlib - php.packages.igbinary - php.packages.pcs - ]; + src = pkgs.fetchurl { + url = "https://github.com/squizlabs/PHP_CodeSniffer/releases/download/${version}/phpcbf.phar"; + sha256 = "1mrsf9p6p64pyqyylnlxb2b7cirdfccch83g7yhfnka3znffq86v"; + }; - src = pkgs.fetchFromGitHub { - owner = "couchbase"; - repo = "php-couchbase"; - rev = "v${version}"; - sha256 = "0jdzgcvab1vpxai23brmmvizjjq2d2dik9aklz6bzspfb512qjd6"; - }; - - configureFlags = [ "--with-couchbase" ]; - internalDeps = [ php.packages.exts.json ]; - patches = [ - (pkgs.writeText "php-couchbase.patch" '' - --- a/config.m4 - +++ b/config.m4 - @@ -9,7 +9,7 @@ if test "$PHP_COUCHBASE" != "no"; then - LIBCOUCHBASE_DIR=$PHP_COUCHBASE - else - AC_MSG_CHECKING(for libcouchbase in default path) - - for i in /usr/local /usr; do - + for i in ${pkgs.libcouchbase}; do - if test -r $i/include/libcouchbase/couchbase.h; then - LIBCOUCHBASE_DIR=$i - AC_MSG_RESULT(found in $i) - @@ -154,6 +154,8 @@ COUCHBASE_FILES=" \ - igbinary_inc_path="$phpincludedir" - elif test -f "$phpincludedir/ext/igbinary/igbinary.h"; then - igbinary_inc_path="$phpincludedir" - + elif test -f "${php.packages.igbinary.dev}/include/ext/igbinary/igbinary.h"; then - + igbinary_inc_path="${php.packages.igbinary.dev}/include" - fi - if test "$igbinary_inc_path" = ""; then - AC_MSG_WARN([Cannot find igbinary.h]) - '') - ]; - - meta.broken = isPhp74; # Build error - }; + phases = [ "installPhase" ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; - event = buildPecl { - version = "2.5.3"; - pname = "event"; + installPhase = '' + mkdir -p $out/bin + install -D $src $out/libexec/phpcbf/phpcbf.phar + makeWrapper ${php}/bin/php $out/bin/phpcbf \ + --add-flags "$out/libexec/phpcbf/phpcbf.phar" + ''; - sha256 = "12liry5ldvgwp1v1a6zgfq8w6iyyxmsdj4c71bp157nnf58cb8hb"; + meta = with pkgs.lib; { + description = "PHP coding standard beautifier and fixer"; + license = licenses.bsd3; + homepage = https://squizlabs.github.io/PHP_CodeSniffer/; + maintainers = with maintainers; [ cmcdragonkai etu ]; + }; + }; - configureFlags = [ - "--with-event-libevent-dir=${pkgs.libevent.dev}" - "--with-event-core" - "--with-event-extra" - "--with-event-pthreads" - ]; + phpcs = mkDerivation rec { + version = "3.5.3"; + pname = "phpcs"; - postPhpize = '' - substituteInPlace configure --replace 'as_fn_error $? "Couldn'\'''t find $phpincludedir/sockets/php_sockets.h. Please check if sockets extension installed" "$LINENO" 5' \ - ':' - ''; + src = pkgs.fetchurl { + url = "https://github.com/squizlabs/PHP_CodeSniffer/releases/download/${version}/phpcs.phar"; + sha256 = "0y4nhsifj4pdmf5g1nnm4951yjgiqswyz7wmjxx6kqiqc7chlkml"; + }; - nativeBuildInputs = [ pkgs.pkgconfig ]; - buildInputs = with pkgs; [ openssl libevent ]; - internalDeps = [ php.packages.exts.sockets ]; + phases = [ "installPhase" ]; + buildInputs = [ pkgs.makeWrapper ]; - meta = with pkgs.lib; { - description = '' - This is an extension to efficiently schedule I/O, time and signal based - events using the best I/O notification mechanism available for specific platform. + installPhase = '' + mkdir -p $out/bin + install -D $src $out/libexec/phpcs/phpcs.phar + makeWrapper ${php}/bin/php $out/bin/phpcs \ + --add-flags "$out/libexec/phpcs/phpcs.phar" ''; - license = licenses.php301; - homepage = "https://bitbucket.org/osmanov/pecl-event/"; - }; - }; - - igbinary = buildPecl { - version = "3.0.1"; - pname = "igbinary"; - sha256 = "1w8jmf1qpggdvq0ndfi86n7i7cqgh1s8q6hys2lijvi37rzn0nar"; + meta = with pkgs.lib; { + description = "PHP coding standard tool"; + license = licenses.bsd3; + homepage = https://squizlabs.github.io/PHP_CodeSniffer/; + maintainers = with maintainers; [ javaguirre etu ]; + }; + }; - configureFlags = [ "--enable-igbinary" ]; - makeFlags = [ "phpincludedir=$(dev)/include" ]; - outputs = [ "out" "dev" ]; - }; + phpstan = mkDerivation rec { + version = "0.12.14"; + pname = "phpstan"; - imagick = buildPecl { - version = "3.4.4"; - pname = "imagick"; + src = pkgs.fetchurl { + url = "https://github.com/phpstan/phpstan/releases/download/${version}/phpstan.phar"; + sha256 = "JAq1/+bVhTgKRR7oFusqZ/yBOYewaOM38ZoiCjirsTg="; + }; - sha256 = "0xvhaqny1v796ywx83w7jyjyd0nrxkxf34w9zi8qc8aw8qbammcd"; + phases = [ "installPhase" ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; - configureFlags = [ "--with-imagick=${pkgs.imagemagick.dev}" ]; - nativeBuildInputs = [ pkgs.pkgconfig ]; - buildInputs = [ (if isPhp73 then pkgs.pcre2 else pkgs.pcre) ]; - }; + installPhase = '' + mkdir -p $out/bin + install -D $src $out/libexec/phpstan/phpstan.phar + makeWrapper ${php}/bin/php $out/bin/phpstan \ + --add-flags "$out/libexec/phpstan/phpstan.phar" + ''; - mailparse = buildPecl { - version = "3.0.3"; - pname = "mailparse"; - sha256 = "00nk14jbdbln93mx3ag691avc11ff94hkadrcv5pn51c6ihsxbmz"; + meta = with pkgs.lib; { + description = "PHP Static Analysis Tool"; + longDescription = '' + PHPStan focuses on finding errors in your code without actually running + it. It catches whole classes of bugs even before you write tests for the + code. It moves PHP closer to compiled languages in the sense that the + correctness of each line of the code can be checked before you run the + actual line. + ''; + license = licenses.mit; + homepage = "https://github.com/phpstan/phpstan"; + maintainers = with maintainers; [ etu ]; + }; + }; - internalDeps = [ php.packages.exts.mbstring ]; - postConfigure = '' - echo "#define HAVE_MBSTRING 1" >> config.h - ''; - }; + psalm = mkDerivation rec { + version = "3.9.3"; + pname = "psalm"; - maxminddb = buildPecl rec { - pname = "maxminddb"; - version = "1.6.0"; + src = pkgs.fetchurl { + url = "https://github.com/vimeo/psalm/releases/download/${version}/psalm.phar"; + sha256 = "KHm2n06y/yxN5B2rCVxT5ja7HxkyxAMsjZ5HLb3xr4M="; + }; - src = pkgs.fetchFromGitHub { - owner = "maxmind"; - repo = "MaxMind-DB-Reader-php"; - rev = "v${version}"; - sha256 = "0sa943ij9pgz55aik93lllb8lh063bvr66ibn77p3y3p41vdiabz"; - }; + phases = [ "installPhase" ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; - buildInputs = [ pkgs.libmaxminddb ]; - sourceRoot = "source/ext"; + installPhase = '' + mkdir -p $out/bin + install -D $src $out/libexec/psalm/psalm.phar + makeWrapper ${php}/bin/php $out/bin/psalm \ + --add-flags "$out/libexec/psalm/psalm.phar" + ''; - meta = with pkgs.lib; { - description = "C extension that is a drop-in replacement for MaxMind\\Db\\Reader"; - license = with licenses; [ asl20 ]; - maintainers = with maintainers; [ ajs124 das_j ]; + meta = with pkgs.lib; { + description = "A static analysis tool for finding errors in PHP applications"; + license = licenses.mit; + homepage = https://github.com/vimeo/psalm; + }; }; - }; - memcached = buildPecl rec { - version = "3.1.5"; - pname = "memcached"; + psysh = mkDerivation rec { + version = "0.9.12"; + pname = "psysh"; - src = fetchgit { - url = "https://github.com/php-memcached-dev/php-memcached"; - rev = "v${version}"; - sha256 = "01mbh2m3kfbdvih3c8g3g9h4vdd80r0i9g2z8b3lx3mi8mmcj380"; - }; + src = pkgs.fetchurl { + url = "https://github.com/bobthecow/psysh/releases/download/v${version}/psysh-v${version}.tar.gz"; + sha256 = "0bzmc94li481xk81gv460ipq9zl03skbnq8m3rnw34i2c04hxczc"; + }; - internalDeps = [ - php.packages.exts.session - ] ++ lib.optionals (lib.versionOlder php.version "7.4") [ - php.packages.exts.hash ]; + phases = [ "installPhase" ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; - configureFlags = [ - "--with-zlib-dir=${pkgs.zlib.dev}" - "--with-libmemcached-dir=${pkgs.libmemcached}" - ]; + installPhase = '' + mkdir -p $out/bin + tar -xzf $src -C $out/bin + chmod +x $out/bin/psysh + wrapProgram $out/bin/psysh + ''; - nativeBuildInputs = [ pkgs.pkgconfig ]; - buildInputs = with pkgs; [ cyrus_sasl zlib ]; + meta = with pkgs.lib; { + description = "PsySH is a runtime developer console, interactive debugger and REPL for PHP."; + license = licenses.mit; + homepage = https://psysh.org/; + maintainers = with maintainers; [ caugner ]; + }; + }; }; - mongodb = buildPecl { - pname = "mongodb"; - version = "1.6.1"; - - sha256 = "1j1w4n33347j9kwvxwsrix3gvjbiqcn1s5v59pp64s536cci8q0m"; - - nativeBuildInputs = [ pkgs.pkgconfig ]; - buildInputs = with pkgs; [ - cyrus_sasl - icu - openssl - snappy - zlib - (if isPhp73 then pcre2 else pcre) - ] ++ lib.optional (pkgs.stdenv.isDarwin) pkgs.darwin.apple_sdk.frameworks.Security; - }; - oci8 = buildPecl { - version = "2.2.0"; - pname = "oci8"; - sha256 = "0jhivxj1nkkza4h23z33y7xhffii60d7dr51h1czjk10qywl7pyd"; - buildInputs = [ pkgs.oracle-instantclient ]; - configureFlags = [ "--with-oci8=shared,instantclient,${pkgs.oracle-instantclient.lib}/lib" ]; + # Extensions are an attribute set meant for for PHP extensions that extend the + # language rather than human interaction. + extensions = { + apcu = buildPecl { + version = "5.1.18"; + pname = "apcu"; - postPatch = '' - sed -i -e 's|OCISDKMANINC=`.*$|OCISDKMANINC="${pkgs.oracle-instantclient.dev}/include"|' config.m4 - ''; - }; - - pcov = buildPecl { - version = "1.0.6"; - pname = "pcov"; + sha256 = "0ayykd4hfvdzk7qnr5k6yq5scwf6rb2i05xscfv76q5dmkkynvfl"; - sha256 = "1psfwscrc025z8mziq69pcx60k4fbkqa5g2ia8lplb94mmarj0v1"; + buildInputs = [ pcre' ]; + doCheck = true; + checkTarget = "test"; + checkFlagsArray = ["REPORT_EXIT_STATUS=1" "NO_INTERACTION=1"]; + makeFlags = [ "phpincludedir=$(dev)/include" ]; + outputs = [ "out" "dev" ]; + }; - buildInputs = [ (if isPhp73 then pkgs.pcre2 else pkgs.pcre) ]; - }; + apcu_bc = buildPecl { + version = "1.0.5"; + pname = "apcu_bc"; - pcs = buildPecl { - version = "1.3.3"; - pname = "pcs"; + sha256 = "0ma00syhk2ps9k9p02jz7rii6x3i2p986il23703zz5npd6y9n20"; - sha256 = "0d4p1gpl8gkzdiv860qzxfz250ryf0wmjgyc8qcaaqgkdyh5jy5p"; + buildInputs = [ + php.extensions.apcu + pcre' + ]; + }; - meta.broken = isPhp74; # Build error - }; + ast = buildPecl { + version = "1.0.5"; + pname = "ast"; - pdo_oci = buildPecl rec { - inherit (php) src version; + sha256 = "16c5isldm4csjbcvz1qk2mmrhgvh24sxsp6w6f5a37xpa3vciawp"; + }; - pname = "pdo_oci"; - sourceRoot = "php-${version}/ext/pdo_oci"; + couchbase = buildPecl rec { + version = "2.6.1"; + pname = "couchbase"; + + buildInputs = [ + pkgs.libcouchbase + pkgs.zlib + php.extensions.igbinary + php.extensions.pcs + ]; + + src = pkgs.fetchFromGitHub { + owner = "couchbase"; + repo = "php-couchbase"; + rev = "v${version}"; + sha256 = "0jdzgcvab1vpxai23brmmvizjjq2d2dik9aklz6bzspfb512qjd6"; + }; + + configureFlags = [ "--with-couchbase" ]; + internalDeps = [ php.extensions.json ]; + patches = [ + (pkgs.writeText "php-couchbase.patch" '' + --- a/config.m4 + +++ b/config.m4 + @@ -9,7 +9,7 @@ if test "$PHP_COUCHBASE" != "no"; then + LIBCOUCHBASE_DIR=$PHP_COUCHBASE + else + AC_MSG_CHECKING(for libcouchbase in default path) + - for i in /usr/local /usr; do + + for i in ${pkgs.libcouchbase}; do + if test -r $i/include/libcouchbase/couchbase.h; then + LIBCOUCHBASE_DIR=$i + AC_MSG_RESULT(found in $i) + @@ -154,6 +154,8 @@ COUCHBASE_FILES=" \ + igbinary_inc_path="$phpincludedir" + elif test -f "$phpincludedir/ext/igbinary/igbinary.h"; then + igbinary_inc_path="$phpincludedir" + + elif test -f "${php.extensions.igbinary.dev}/include/ext/igbinary/igbinary.h"; then + + igbinary_inc_path="${php.extensions.igbinary.dev}/include" + fi + if test "$igbinary_inc_path" = ""; then + AC_MSG_WARN([Cannot find igbinary.h]) + '') + ]; + + meta.broken = isPhp74; # Build error + }; - buildInputs = [ pkgs.oracle-instantclient ]; - configureFlags = [ "--with-pdo-oci=instantclient,${pkgs.oracle-instantclient.lib}/lib" ]; + event = buildPecl { + version = "2.5.3"; + pname = "event"; - internalDeps = [ php.packages.exts.pdo ]; + sha256 = "12liry5ldvgwp1v1a6zgfq8w6iyyxmsdj4c71bp157nnf58cb8hb"; - postPatch = '' - sed -i -e 's|OCISDKMANINC=`.*$|OCISDKMANINC="${pkgs.oracle-instantclient.dev}/include"|' config.m4 - ''; - }; + configureFlags = [ + "--with-event-libevent-dir=${pkgs.libevent.dev}" + "--with-event-core" + "--with-event-extra" + "--with-event-pthreads" + ]; - pdo_sqlsrv = buildPecl { - version = "5.8.0"; - pname = "pdo_sqlsrv"; + postPhpize = '' + substituteInPlace configure --replace 'as_fn_error $? "Couldn'\'''t find $phpincludedir/sockets/php_sockets.h. Please check if sockets extension installed" "$LINENO" 5' \ + ':' + ''; - sha256 = "0z4vbyd851b4jr6p69l2ylk91iihndsm2qjb429pxcv8g6dqzqll"; + nativeBuildInputs = [ pkgs.pkgconfig ]; + buildInputs = with pkgs; [ openssl libevent ]; + internalDeps = [ php.extensions.sockets ]; - internalDeps = [ php.packages.exts.pdo ]; + meta = with pkgs.lib; { + description = '' + This is an extension to efficiently schedule I/O, time and signal based + events using the best I/O notification mechanism available for specific platform. + ''; + license = licenses.php301; + homepage = "https://bitbucket.org/osmanov/pecl-event/"; + }; + }; - buildInputs = [ pkgs.unixODBC ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.libiconv ]; - }; + igbinary = buildPecl { + version = "3.0.1"; + pname = "igbinary"; - php-cs-fixer = mkDerivation rec { - version = "2.16.1"; - pname = "php-cs-fixer"; + sha256 = "1w8jmf1qpggdvq0ndfi86n7i7cqgh1s8q6hys2lijvi37rzn0nar"; - src = pkgs.fetchurl { - url = "https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v${version}/php-cs-fixer.phar"; - sha256 = "1dq1nhy666zg6d4fkfsjwhj1vwh1ncap2c9ljplxv98a9mm6fk68"; + configureFlags = [ "--enable-igbinary" ]; + makeFlags = [ "phpincludedir=$(dev)/include" ]; + outputs = [ "out" "dev" ]; }; - phases = [ "installPhase" ]; - buildInputs = [ pkgs.makeWrapper ]; + imagick = buildPecl { + version = "3.4.4"; + pname = "imagick"; - installPhase = '' - mkdir -p $out/bin - install -D $src $out/libexec/php-cs-fixer/php-cs-fixer.phar - makeWrapper ${php}/bin/php $out/bin/php-cs-fixer \ - --add-flags "$out/libexec/php-cs-fixer/php-cs-fixer.phar" - ''; + sha256 = "0xvhaqny1v796ywx83w7jyjyd0nrxkxf34w9zi8qc8aw8qbammcd"; - meta = with pkgs.lib; { - description = "A tool to automatically fix PHP coding standards issues"; - license = licenses.mit; - homepage = http://cs.sensiolabs.org/; - maintainers = with maintainers; [ jtojnar ]; + configureFlags = [ "--with-imagick=${pkgs.imagemagick.dev}" ]; + nativeBuildInputs = [ pkgs.pkgconfig ]; + buildInputs = [ pcre' ]; }; - }; - php-parallel-lint = mkDerivation rec { - version = "1.0.0"; - pname = "php-parallel-lint"; + mailparse = buildPecl { + version = "3.0.3"; + pname = "mailparse"; + sha256 = "00nk14jbdbln93mx3ag691avc11ff94hkadrcv5pn51c6ihsxbmz"; - src = pkgs.fetchFromGitHub { - owner = "JakubOnderka"; - repo = "PHP-Parallel-Lint"; - rev = "v${version}"; - sha256 = "16nv8yyk2z3l213dg067l6di4pigg5rd8yswr5xgd18jwbys2vnw"; + internalDeps = [ php.extensions.mbstring ]; + postConfigure = '' + echo "#define HAVE_MBSTRING 1" >> config.h + ''; }; - buildInputs = [ - pkgs.makeWrapper - php.packages.composer - php.packages.box - ]; - - buildPhase = '' - composer dump-autoload - box build - ''; - - installPhase = '' - mkdir -p $out/bin - install -D parallel-lint.phar $out/libexec/php-parallel-lint/php-parallel-lint.phar - makeWrapper ${php}/bin/php $out/bin/php-parallel-lint \ - --add-flags "$out/libexec/php-parallel-lint/php-parallel-lint.phar" - ''; - - meta = with pkgs.lib; { - description = "This tool check syntax of PHP files faster than serial check with fancier output"; - license = licenses.bsd2; - homepage = https://github.com/JakubOnderka/PHP-Parallel-Lint; - maintainers = with maintainers; [ jtojnar ]; + maxminddb = buildPecl rec { + pname = "maxminddb"; + version = "1.6.0"; + + src = pkgs.fetchFromGitHub { + owner = "maxmind"; + repo = "MaxMind-DB-Reader-php"; + rev = "v${version}"; + sha256 = "0sa943ij9pgz55aik93lllb8lh063bvr66ibn77p3y3p41vdiabz"; + }; + + buildInputs = [ pkgs.libmaxminddb ]; + sourceRoot = "source/ext"; + + meta = with pkgs.lib; { + description = "C extension that is a drop-in replacement for MaxMind\\Db\\Reader"; + license = with licenses; [ asl20 ]; + maintainers = with maintainers; [ ajs124 das_j ]; + }; }; - }; - - php_excel = buildPecl rec { - version = "1.0.2"; - pname = "php_excel"; - phpVersion = "php7"; - - buildInputs = [ pkgs.libxl ]; - src = pkgs.fetchurl { - url = "https://github.com/iliaal/php_excel/releases/download/Excel-1.0.2-PHP7/excel-${version}-${phpVersion}.tgz"; - sha256 = "0dpvih9gpiyh1ml22zi7hi6kslkilzby00z1p8x248idylldzs2n"; + memcached = buildPecl rec { + version = "3.1.5"; + pname = "memcached"; + + src = fetchgit { + url = "https://github.com/php-memcached-dev/php-memcached"; + rev = "v${version}"; + sha256 = "01mbh2m3kfbdvih3c8g3g9h4vdd80r0i9g2z8b3lx3mi8mmcj380"; + }; + + internalDeps = [ + php.extensions.session + ] ++ lib.optionals (lib.versionOlder php.version "7.4") [ + php.extensions.hash + ]; + + configureFlags = [ + "--with-zlib-dir=${pkgs.zlib.dev}" + "--with-libmemcached-dir=${pkgs.libmemcached}" + ]; + + nativeBuildInputs = [ pkgs.pkgconfig ]; + buildInputs = with pkgs; [ cyrus_sasl zlib ]; }; - configureFlags = [ "--with-excel" "--with-libxl-incdir=${pkgs.libxl}/include_c" "--with-libxl-libdir=${pkgs.libxl}/lib" ]; - }; - - phpcbf = mkDerivation rec { - version = "3.5.3"; - pname = "phpcbf"; - - src = pkgs.fetchurl { - url = "https://github.com/squizlabs/PHP_CodeSniffer/releases/download/${version}/phpcbf.phar"; - sha256 = "1mrsf9p6p64pyqyylnlxb2b7cirdfccch83g7yhfnka3znffq86v"; + mongodb = buildPecl { + pname = "mongodb"; + version = "1.6.1"; + + sha256 = "1j1w4n33347j9kwvxwsrix3gvjbiqcn1s5v59pp64s536cci8q0m"; + + nativeBuildInputs = [ pkgs.pkgconfig ]; + buildInputs = with pkgs; [ + cyrus_sasl + icu + openssl + snappy + zlib + pcre' + ] ++ lib.optional (pkgs.stdenv.isDarwin) pkgs.darwin.apple_sdk.frameworks.Security; }; - phases = [ "installPhase" ]; - nativeBuildInputs = [ pkgs.makeWrapper ]; + oci8 = buildPecl { + version = "2.2.0"; + pname = "oci8"; - installPhase = '' - mkdir -p $out/bin - install -D $src $out/libexec/phpcbf/phpcbf.phar - makeWrapper ${php}/bin/php $out/bin/phpcbf \ - --add-flags "$out/libexec/phpcbf/phpcbf.phar" - ''; + sha256 = "0jhivxj1nkkza4h23z33y7xhffii60d7dr51h1czjk10qywl7pyd"; + buildInputs = [ pkgs.oracle-instantclient ]; + configureFlags = [ "--with-oci8=shared,instantclient,${pkgs.oracle-instantclient.lib}/lib" ]; - meta = with pkgs.lib; { - description = "PHP coding standard beautifier and fixer"; - license = licenses.bsd3; - homepage = https://squizlabs.github.io/PHP_CodeSniffer/; - maintainers = with maintainers; [ cmcdragonkai etu ]; + postPatch = '' + sed -i -e 's|OCISDKMANINC=`.*$|OCISDKMANINC="${pkgs.oracle-instantclient.dev}/include"|' config.m4 + ''; }; - }; - phpcs = mkDerivation rec { - version = "3.5.3"; - pname = "phpcs"; + pcov = buildPecl { + version = "1.0.6"; + pname = "pcov"; - src = pkgs.fetchurl { - url = "https://github.com/squizlabs/PHP_CodeSniffer/releases/download/${version}/phpcs.phar"; - sha256 = "0y4nhsifj4pdmf5g1nnm4951yjgiqswyz7wmjxx6kqiqc7chlkml"; + sha256 = "1psfwscrc025z8mziq69pcx60k4fbkqa5g2ia8lplb94mmarj0v1"; + + buildInputs = [ pcre' ]; }; - phases = [ "installPhase" ]; - buildInputs = [ pkgs.makeWrapper ]; + pcs = buildPecl { + version = "1.3.3"; + pname = "pcs"; - installPhase = '' - mkdir -p $out/bin - install -D $src $out/libexec/phpcs/phpcs.phar - makeWrapper ${php}/bin/php $out/bin/phpcs \ - --add-flags "$out/libexec/phpcs/phpcs.phar" - ''; + sha256 = "0d4p1gpl8gkzdiv860qzxfz250ryf0wmjgyc8qcaaqgkdyh5jy5p"; - meta = with pkgs.lib; { - description = "PHP coding standard tool"; - license = licenses.bsd3; - homepage = https://squizlabs.github.io/PHP_CodeSniffer/; - maintainers = with maintainers; [ javaguirre etu ]; + meta.broken = isPhp74; # Build error }; - }; - phpstan = mkDerivation rec { - version = "0.12.14"; - pname = "phpstan"; + pdo_oci = buildPecl rec { + inherit (php) src version; - src = pkgs.fetchurl { - url = "https://github.com/phpstan/phpstan/releases/download/${version}/phpstan.phar"; - sha256 = "JAq1/+bVhTgKRR7oFusqZ/yBOYewaOM38ZoiCjirsTg="; - }; + pname = "pdo_oci"; + sourceRoot = "php-${version}/ext/pdo_oci"; - phases = [ "installPhase" ]; - nativeBuildInputs = [ pkgs.makeWrapper ]; + buildInputs = [ pkgs.oracle-instantclient ]; + configureFlags = [ "--with-pdo-oci=instantclient,${pkgs.oracle-instantclient.lib}/lib" ]; - installPhase = '' - mkdir -p $out/bin - install -D $src $out/libexec/phpstan/phpstan.phar - makeWrapper ${php}/bin/php $out/bin/phpstan \ - --add-flags "$out/libexec/phpstan/phpstan.phar" - ''; + internalDeps = [ php.extensions.pdo ]; - meta = with pkgs.lib; { - description = "PHP Static Analysis Tool"; - longDescription = '' - PHPStan focuses on finding errors in your code without actually running - it. It catches whole classes of bugs even before you write tests for the - code. It moves PHP closer to compiled languages in the sense that the - correctness of each line of the code can be checked before you run the - actual line. - ''; - license = licenses.mit; - homepage = "https://github.com/phpstan/phpstan"; - maintainers = with maintainers; [ etu ]; + postPatch = '' + sed -i -e 's|OCISDKMANINC=`.*$|OCISDKMANINC="${pkgs.oracle-instantclient.dev}/include"|' config.m4 + ''; }; - }; - protobuf = buildPecl { - version = "3.11.2"; - pname = "protobuf"; + pdo_sqlsrv = buildPecl { + version = "5.8.0"; + pname = "pdo_sqlsrv"; - sha256 = "0bhdykdyk58ywqj940zb7jyvrlgdr6hdb4s8kn79fz3p0i79l9hz"; + sha256 = "0z4vbyd851b4jr6p69l2ylk91iihndsm2qjb429pxcv8g6dqzqll"; - buildInputs = with pkgs; [ (if isPhp73 then pcre2 else pcre) ]; + internalDeps = [ php.extensions.pdo ]; - meta = with pkgs.lib; { - description = '' - Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data. - ''; - license = licenses.bsd3; - homepage = "https://developers.google.com/protocol-buffers/"; + buildInputs = [ pkgs.unixODBC ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.libiconv ]; }; - }; - psalm = mkDerivation rec { - version = "3.9.3"; - pname = "psalm"; + php_excel = buildPecl rec { + version = "1.0.2"; + pname = "php_excel"; + phpVersion = "php7"; - src = pkgs.fetchurl { - url = "https://github.com/vimeo/psalm/releases/download/${version}/psalm.phar"; - sha256 = "KHm2n06y/yxN5B2rCVxT5ja7HxkyxAMsjZ5HLb3xr4M="; - }; + buildInputs = [ pkgs.libxl ]; - phases = [ "installPhase" ]; - nativeBuildInputs = [ pkgs.makeWrapper ]; + src = pkgs.fetchurl { + url = "https://github.com/iliaal/php_excel/releases/download/Excel-1.0.2-PHP7/excel-${version}-${phpVersion}.tgz"; + sha256 = "0dpvih9gpiyh1ml22zi7hi6kslkilzby00z1p8x248idylldzs2n"; + }; - installPhase = '' - mkdir -p $out/bin - install -D $src $out/libexec/psalm/psalm.phar - makeWrapper ${php}/bin/php $out/bin/psalm \ - --add-flags "$out/libexec/psalm/psalm.phar" - ''; - - meta = with pkgs.lib; { - description = "A static analysis tool for finding errors in PHP applications"; - license = licenses.mit; - homepage = https://github.com/vimeo/psalm; + configureFlags = [ "--with-excel" "--with-libxl-incdir=${pkgs.libxl}/include_c" "--with-libxl-libdir=${pkgs.libxl}/lib" ]; }; - }; - - psysh = mkDerivation rec { - version = "0.9.12"; - pname = "psysh"; - src = pkgs.fetchurl { - url = "https://github.com/bobthecow/psysh/releases/download/v${version}/psysh-v${version}.tar.gz"; - sha256 = "0bzmc94li481xk81gv460ipq9zl03skbnq8m3rnw34i2c04hxczc"; - }; + protobuf = buildPecl { + version = "3.11.2"; + pname = "protobuf"; - phases = [ "installPhase" ]; - nativeBuildInputs = [ pkgs.makeWrapper ]; + sha256 = "0bhdykdyk58ywqj940zb7jyvrlgdr6hdb4s8kn79fz3p0i79l9hz"; - installPhase = '' - mkdir -p $out/bin - tar -xzf $src -C $out/bin - chmod +x $out/bin/psysh - wrapProgram $out/bin/psysh - ''; + buildInputs = with pkgs; [ pcre' ]; - meta = with pkgs.lib; { - description = "PsySH is a runtime developer console, interactive debugger and REPL for PHP."; - license = licenses.mit; - homepage = https://psysh.org/; - maintainers = with maintainers; [ caugner ]; + meta = with pkgs.lib; { + description = '' + Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data. + ''; + license = licenses.bsd3; + homepage = "https://developers.google.com/protocol-buffers/"; + }; }; - }; - redis = buildPecl { - version = "5.1.1"; - pname = "redis"; + redis = buildPecl { + version = "5.1.1"; + pname = "redis"; - sha256 = "1041zv91fkda73w4c3pj6zdvwjgb3q7mxg6mwnq9gisl80mrs732"; + sha256 = "1041zv91fkda73w4c3pj6zdvwjgb3q7mxg6mwnq9gisl80mrs732"; - internalDeps = with php.packages.exts; [ - json - session - ] ++ lib.optionals (lib.versionOlder php.version "7.4") [ - hash ]; - }; + internalDeps = with php.extensions; [ + json + session + ] ++ lib.optionals (lib.versionOlder php.version "7.4") [ + hash ]; + }; - sqlsrv = buildPecl { - version = "5.8.0"; - pname = "sqlsrv"; + sqlsrv = buildPecl { + version = "5.8.0"; + pname = "sqlsrv"; - sha256 = "1kv4krk1w4hri99b0sdgwgy9c4y0yh217wx2y3irhkfi46kdrjnw"; + sha256 = "1kv4krk1w4hri99b0sdgwgy9c4y0yh217wx2y3irhkfi46kdrjnw"; - buildInputs = [ pkgs.unixODBC ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.libiconv ]; - }; + buildInputs = [ pkgs.unixODBC ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.libiconv ]; + }; - v8 = buildPecl { - version = "0.2.2"; - pname = "v8"; + v8 = buildPecl { + version = "0.2.2"; + pname = "v8"; - sha256 = "103nys7zkpi1hifqp9miyl0m1mn07xqshw3sapyz365nb35g5q71"; + sha256 = "103nys7zkpi1hifqp9miyl0m1mn07xqshw3sapyz365nb35g5q71"; - buildInputs = [ pkgs.v8_6_x ]; - configureFlags = [ "--with-v8=${pkgs.v8_6_x}" ]; - meta.broken = true; - }; + buildInputs = [ pkgs.v8_6_x ]; + configureFlags = [ "--with-v8=${pkgs.v8_6_x}" ]; + meta.broken = true; + }; - v8js = buildPecl { - version = "2.1.0"; - pname = "v8js"; + v8js = buildPecl { + version = "2.1.0"; + pname = "v8js"; - sha256 = "0g63dyhhicngbgqg34wl91nm3556vzdgkq19gy52gvmqj47rj6rg"; + sha256 = "0g63dyhhicngbgqg34wl91nm3556vzdgkq19gy52gvmqj47rj6rg"; - buildInputs = [ pkgs.v8_6_x ]; - configureFlags = [ "--with-v8js=${pkgs.v8_6_x}" ]; - meta.broken = true; - }; + buildInputs = [ pkgs.v8_6_x ]; + configureFlags = [ "--with-v8js=${pkgs.v8_6_x}" ]; + meta.broken = true; + }; - xdebug = buildPecl { - version = "2.8.1"; - pname = "xdebug"; + xdebug = buildPecl { + version = "2.8.1"; + pname = "xdebug"; - sha256 = "080mwr7m72rf0jsig5074dgq2n86hhs7rdbfg6yvnm959sby72w3"; + sha256 = "080mwr7m72rf0jsig5074dgq2n86hhs7rdbfg6yvnm959sby72w3"; - doCheck = true; - checkTarget = "test"; + doCheck = true; + checkTarget = "test"; - zendExtension = true; - }; - - yaml = buildPecl { - version = "2.0.4"; - pname = "yaml"; + zendExtension = true; + }; - sha256 = "1036zhc5yskdfymyk8jhwc34kvkvsn5kaf50336153v4dqwb11lp"; + yaml = buildPecl { + version = "2.0.4"; + pname = "yaml"; - configureFlags = [ - "--with-yaml=${pkgs.libyaml}" - ]; + sha256 = "1036zhc5yskdfymyk8jhwc34kvkvsn5kaf50336153v4dqwb11lp"; - nativeBuildInputs = [ pkgs.pkgconfig ]; - }; + configureFlags = [ + "--with-yaml=${pkgs.libyaml}" + ]; - zmq = buildPecl { - version = "1.1.3"; - pname = "zmq"; + nativeBuildInputs = [ pkgs.pkgconfig ]; + }; - sha256 = "1kj487vllqj9720vlhfsmv32hs2dy2agp6176mav6ldx31c3g4n4"; + zmq = buildPecl { + version = "1.1.3"; + pname = "zmq"; - configureFlags = [ - "--with-zmq=${pkgs.zeromq}" - ]; + sha256 = "1kj487vllqj9720vlhfsmv32hs2dy2agp6176mav6ldx31c3g4n4"; - nativeBuildInputs = [ pkgs.pkgconfig ]; + configureFlags = [ + "--with-zmq=${pkgs.zeromq}" + ]; - meta.broken = isPhp73; - }; + nativeBuildInputs = [ pkgs.pkgconfig ]; - exts = let + meta.broken = isPhp73; + }; + } // (let # Function to build a single php extension based on the php version. # # Name passed is the name of the extension and is automatically used @@ -730,9 +741,7 @@ in # want to build. # # These will be passed as arguments to mkExtension above. - extensionData = let - pcre' = if (lib.versionAtLeast php.version "7.3") then pcre2 else pcre; - in [ + extensionData = [ { name = "bcmath"; } { name = "bz2"; buildInputs = [ bzip2 ]; configureFlags = [ "--with-bz2=${bzip2.dev}" ]; } { name = "calendar"; } @@ -814,7 +823,7 @@ in doCheck = false; } { name = "mbstring"; buildInputs = [ oniguruma ]; doCheck = false; } { name = "mysqli"; - internalDeps = [ php.packages.exts.mysqlnd ]; + internalDeps = [ php.extensions.mysqlnd ]; configureFlags = [ "--with-mysqli=mysqlnd" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; doCheck = false; } { name = "mysqlnd"; @@ -875,27 +884,27 @@ in { name = "pcntl"; } { name = "pdo"; doCheck = false; } { name = "pdo_dblib"; - internalDeps = [ php.packages.exts.pdo ]; + internalDeps = [ php.extensions.pdo ]; configureFlags = [ "--with-pdo-dblib=${freetds}" ]; # Doesn't seem to work on darwin. enable = (!stdenv.isDarwin); doCheck = false; } # pdo_firebird (7.4, 7.3, 7.2) { name = "pdo_mysql"; - internalDeps = with php.packages.exts; [ pdo mysqlnd ]; + internalDeps = with php.extensions; [ pdo mysqlnd ]; configureFlags = [ "--with-pdo-mysql=mysqlnd" ]; doCheck = false; } # pdo_oci (7.4, 7.3, 7.2) { name = "pdo_odbc"; - internalDeps = [ php.packages.exts.pdo ]; + internalDeps = [ php.extensions.pdo ]; configureFlags = [ "--with-pdo-odbc=unixODBC,${unixODBC}" ]; doCheck = false; } { name = "pdo_pgsql"; - internalDeps = [ php.packages.exts.pdo ]; + internalDeps = [ php.extensions.pdo ]; configureFlags = [ "--with-pdo-pgsql=${postgresql}" ]; doCheck = false; } { name = "pdo_sqlite"; - internalDeps = [ php.packages.exts.pdo ]; + internalDeps = [ php.extensions.pdo ]; buildInputs = [ sqlite ]; configureFlags = [ "--with-pdo-sqlite=${sqlite.dev}" ]; doCheck = false; } @@ -999,5 +1008,5 @@ in }) (builtins.filter (i: i.enable or true) extensionData); # Produce the final attribute set of all extensions defined. - in builtins.listToAttrs namedExtensions; + in builtins.listToAttrs namedExtensions); } -- cgit 1.4.1 From 1b69056e4626fd95f7bfad2cc1423662828addf1 Mon Sep 17 00:00:00 2001 From: Elis Hirwing Date: Fri, 3 Apr 2020 06:30:27 +0200 Subject: php: passthru .dev output as well --- pkgs/development/interpreters/php/default.nix | 1 + 1 file changed, 1 insertion(+) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 514c20708863..99a859cb5742 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -195,6 +195,7 @@ let symlinkJoin { name = "php-with-extensions-${version}"; inherit version; + inherit (php) dev; nativeBuildInputs = [ makeWrapper ]; passthru = { inherit buildEnv packages extensions; -- cgit 1.4.1 From 4ff523f691c2caf9e878b6f3ec1b6f14513bd226 Mon Sep 17 00:00:00 2001 From: talyz Date: Fri, 3 Apr 2020 18:14:26 +0200 Subject: php: Simplify php-packages import, rename exts -> extensions --- nixos/doc/manual/release-notes/rl-2009.xml | 2 +- nixos/modules/services/web-apps/nextcloud.nix | 2 +- pkgs/development/interpreters/php/default.nix | 35 ++++++++++++--------------- 3 files changed, 18 insertions(+), 21 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/nixos/doc/manual/release-notes/rl-2009.xml b/nixos/doc/manual/release-notes/rl-2009.xml index 1618fc89477f..14ac73b457d8 100644 --- a/nixos/doc/manual/release-notes/rl-2009.xml +++ b/nixos/doc/manual/release-notes/rl-2009.xml @@ -134,7 +134,7 @@ environment.systemPackages = [ -(pkgs.php.buildEnv { exts = pp: with pp; [ +(pkgs.php.buildEnv { extensions = pp: with pp; [ imagick opcache pdo_mysql diff --git a/nixos/modules/services/web-apps/nextcloud.nix b/nixos/modules/services/web-apps/nextcloud.nix index 33d356700294..82783a2b6aa4 100644 --- a/nixos/modules/services/web-apps/nextcloud.nix +++ b/nixos/modules/services/web-apps/nextcloud.nix @@ -7,7 +7,7 @@ let fpm = config.services.phpfpm.pools.nextcloud; phpPackage = pkgs.php74.buildEnv { - exts = pp: with pp; [ + extensions = e: with e; [ bcmath calendar curl exif ftp filter gd gettext gmp intl json ldap mysqlnd opcache openssl pcntl pdo pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql readline session soap sodium sqlite3 zip zlib mbstring diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 99a859cb5742..2558cf2c4b5d 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -150,27 +150,22 @@ let let php = generic (builtins.removeAttrs args [ "self" "selfWithExtensions" ]); - packages = (callPackage ../../../top-level/php-packages.nix { + php-packages = (callPackage ../../../top-level/php-packages.nix { php = self; phpWithExtensions = selfWithExtensions; - }).packages; - - extensions = (callPackage ../../../top-level/php-packages.nix { - php = self; - phpWithExtensions = selfWithExtensions; - }).extensions; + }); - buildEnv = { exts ? (_: []), extraConfig ? "" }: + buildEnv = { extensions ? (_: []), extraConfig ? "" }: let getExtName = ext: lib.removePrefix "php-" (builtins.parseDrvName ext.name).name; - extList = exts extensions; - - # Generate extension load configuration snippets from - # exts. This is an attrset suitable for use with - # textClosureList, which is used to put the strings in the - # right order - if a plugin which is dependent on another - # plugin is placed before its dependency, it will fail to - # load. + extList = extensions php-packages.extensions; + + # Generate extension load configuration snippets from the + # extension parameter. This is an attrset suitable for use + # with textClosureList, which is used to put the strings in + # the right order - if a plugin which is dependent on + # another plugin is placed before its dependency, it will + # fail to load. extensionTexts = lib.listToAttrs (map (ext: @@ -198,7 +193,8 @@ let inherit (php) dev; nativeBuildInputs = [ makeWrapper ]; passthru = { - inherit buildEnv packages extensions; + inherit buildEnv; + inherit (php-packages) packages extensions; }; paths = [ php ]; postBuild = '' @@ -214,7 +210,8 @@ let in php.overrideAttrs (_: { passthru = { - inherit buildEnv packages extensions; + inherit buildEnv; + inherit (php-packages) packages extensions; }; }); @@ -246,7 +243,7 @@ let }; defaultPhpExtensions = { - exts = pp: with pp; ([ + extensions = extensions: with extensions; ([ bcmath calendar curl ctype dom exif fileinfo filter ftp gd gettext gmp iconv intl json ldap mbstring mysqli mysqlnd opcache openssl pcntl pdo pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql -- cgit 1.4.1 From 1345e5b7634da245238a909f104b0de35db63874 Mon Sep 17 00:00:00 2001 From: talyz Date: Fri, 3 Apr 2020 18:18:36 +0200 Subject: php: Add withExtensions as a simpler alternative to buildEnv --- pkgs/development/interpreters/php/default.nix | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 2558cf2c4b5d..0df371713b67 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -193,7 +193,7 @@ let inherit (php) dev; nativeBuildInputs = [ makeWrapper ]; passthru = { - inherit buildEnv; + inherit buildEnv withExtensions; inherit (php-packages) packages extensions; }; paths = [ php ]; @@ -207,10 +207,12 @@ let fi ''; }; + + withExtensions = extensions: buildEnv { inherit extensions; }; in php.overrideAttrs (_: { passthru = { - inherit buildEnv; + inherit buildEnv withExtensions; inherit (php-packages) packages extensions; }; }); @@ -242,19 +244,17 @@ let selfWithExtensions = php74; }; - defaultPhpExtensions = { - extensions = extensions: with extensions; ([ - bcmath calendar curl ctype dom exif fileinfo filter ftp gd - gettext gmp iconv intl json ldap mbstring mysqli mysqlnd opcache - openssl pcntl pdo pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql - posix readline session simplexml sockets soap sodium sqlite3 - tokenizer xmlreader xmlwriter zip zlib - ] ++ lib.optionals (!stdenv.isDarwin) [ imap ]); - }; - - php74 = php74base.buildEnv defaultPhpExtensions; - php73 = php73base.buildEnv defaultPhpExtensions; - php72 = php72base.buildEnv defaultPhpExtensions; + defaultPhpExtensions = extensions: with extensions; ([ + bcmath calendar curl ctype dom exif fileinfo filter ftp gd + gettext gmp iconv intl json ldap mbstring mysqli mysqlnd opcache + openssl pcntl pdo pdo_mysql pdo_odbc pdo_pgsql pdo_sqlite pgsql + posix readline session simplexml sockets soap sodium sqlite3 + tokenizer xmlreader xmlwriter zip zlib + ] ++ lib.optionals (!stdenv.isDarwin) [ imap ]); + + php74 = php74base.withExtensions defaultPhpExtensions; + php73 = php73base.withExtensions defaultPhpExtensions; + php72 = php72base.withExtensions defaultPhpExtensions; in { inherit php72base php73base php74base php72 php73 php74; -- cgit 1.4.1 From b4d289a7ae319a3f19935a3a3820c876caa83b33 Mon Sep 17 00:00:00 2001 From: talyz Date: Fri, 3 Apr 2020 18:55:03 +0200 Subject: php: Add missing hash extension to php < 7.4 --- pkgs/development/interpreters/php/default.nix | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index 0df371713b67..e29f240ca557 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -252,9 +252,12 @@ let tokenizer xmlreader xmlwriter zip zlib ] ++ lib.optionals (!stdenv.isDarwin) [ imap ]); + defaultPhpExtensionsWithHash = extensions: + (defaultPhpExtensions extensions) ++ [ extensions.hash ]; + php74 = php74base.withExtensions defaultPhpExtensions; - php73 = php73base.withExtensions defaultPhpExtensions; - php72 = php72base.withExtensions defaultPhpExtensions; + php73 = php73base.withExtensions defaultPhpExtensionsWithHash; + php72 = php72base.withExtensions defaultPhpExtensionsWithHash; in { inherit php72base php73base php74base php72 php73 php74; -- cgit 1.4.1 From ca8b8a26e9b2d025ab7d7ed388e9ae7161681660 Mon Sep 17 00:00:00 2001 From: talyz Date: Sun, 5 Apr 2020 15:56:28 +0200 Subject: php: Add enabledExtensions attribute to PHP derivations This provides a means to build a PHP package based on a list of extensions from another. For example, to generate a package with all default extensions enabled, except opcache, but with ImageMagick: php.withExtensions (e: (lib.filter (e: e != php.extensions.opcache) php.enabledExtensions) ++ [ e.imagick ]) --- doc/languages-frameworks/php.section.md | 15 +++++++++++++++ pkgs/development/interpreters/php/default.nix | 12 ++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) (limited to 'pkgs/development/interpreters') diff --git a/doc/languages-frameworks/php.section.md b/doc/languages-frameworks/php.section.md index cc98c760aec6..a302a9a7f87d 100644 --- a/doc/languages-frameworks/php.section.md +++ b/doc/languages-frameworks/php.section.md @@ -48,6 +48,21 @@ enabled: php.withExtensions (e: with e; [ imagick opcache ]) ``` +Note that this will give you a package with _only_ opcache and +ImageMagick, none of the other extensions which are enabled by default +in the `php` package will be available. + +To enable building on a previous PHP package, the currently enabled +extensions are made available in its `enabledExtensions` +attribute. For example, to generate a package with all default +extensions enabled, except opcache, but with ImageMagick: + +```nix +php.withExtensions (e: + (lib.filter (e: e != php.extensions.opcache) php.enabledExtensions) + ++ [ e.imagick ]) +``` + If you want a PHP build with extra configuration in the `php.ini` file, you can use `php.buildEnv`. This function takes two named and optional parameters: `extensions` and `extraConfig`. `extensions` diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix index e29f240ca557..d260a90e8ea6 100644 --- a/pkgs/development/interpreters/php/default.nix +++ b/pkgs/development/interpreters/php/default.nix @@ -158,7 +158,7 @@ let buildEnv = { extensions ? (_: []), extraConfig ? "" }: let getExtName = ext: lib.removePrefix "php-" (builtins.parseDrvName ext.name).name; - extList = extensions php-packages.extensions; + enabledExtensions = extensions php-packages.extensions; # Generate extension load configuration snippets from the # extension parameter. This is an attrset suitable for use @@ -178,9 +178,9 @@ let deps = lib.optionals (ext ? internalDeps) (map getExtName ext.internalDeps); }) - extList); + enabledExtensions); - extNames = map getExtName extList; + extNames = map getExtName enabledExtensions; extraInit = writeText "custom-php.ini" '' ${lib.concatStringsSep "\n" (lib.textClosureList extensionTexts extNames)} @@ -189,11 +189,10 @@ let in symlinkJoin { name = "php-with-extensions-${version}"; - inherit version; - inherit (php) dev; + inherit (php) version dev; nativeBuildInputs = [ makeWrapper ]; passthru = { - inherit buildEnv withExtensions; + inherit buildEnv withExtensions enabledExtensions; inherit (php-packages) packages extensions; }; paths = [ php ]; @@ -212,6 +211,7 @@ let in php.overrideAttrs (_: { passthru = { + enabledExtensions = []; inherit buildEnv withExtensions; inherit (php-packages) packages extensions; }; -- cgit 1.4.1