Merge pull request #83896 from etu/slim-down-default-php-v3

PHP: Make the default package more sane [v3]
gstqt5
Elis Hirwing 2020-04-05 20:00:03 +02:00 committed by GitHub
commit 3b6539896b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 1326 additions and 971 deletions

7
.github/CODEOWNERS vendored
View File

@ -178,6 +178,7 @@
/nixos/tests/prometheus-exporters.nix @WilliButz
# PHP
/pkgs/development/interpreters/php @etu
/pkgs/top-level/php-packages.nix @etu
/pkgs/build-support/build-pecl.nix @etu
/doc/languages-frameworks/php.section.md @etu
/pkgs/development/interpreters/php @etu
/pkgs/top-level/php-packages.nix @etu
/pkgs/build-support/build-pecl.nix @etu

View File

@ -0,0 +1,112 @@
# PHP
## User Guide
### Using PHP
#### Overview
Several versions of PHP are available on Nix, each of which having a
wide variety of extensions and libraries available.
The attribute `php` refers to the version of PHP considered most
stable and thoroughly tested in nixpkgs for any given release of
NixOS. Note that while this version of PHP may not be the latest major
release from upstream, any version of PHP supported in nixpkgs may be
utilized by specifying the desired attribute by version, such as
`php74`.
Only versions of PHP that are supported by upstream for the entirety
of a given NixOS release will be included in that release of
NixOS. See [PHP Supported
Versions](https://www.php.net/supported-versions.php).
Interactive tools built on PHP are put in `php.packages`; composer is
for example available at `php.packages.composer`.
Most extensions that come with PHP, as well as some popular
third-party ones, are available in `php.extensions`; for example, the
opcache extension shipped with PHP is available at
`php.extensions.opcache` and the third-party ImageMagick extension at
`php.extensions.imagick`.
The different versions of PHP that nixpkgs provides is located under
attributes named based on major and minor version number; e.g.,
`php74` is PHP 7.4 with commonly used extensions installed,
`php74base` is the same PHP runtime without extensions.
#### Installing PHP with packages
A PHP package with specific extensions enabled can be built using
`php.withExtensions`. This is a function which accepts an anonymous
function as its only argument; the function should take one argument,
the set of all extensions, and return a list of wanted extensions. For
example, a PHP package with the opcache and ImageMagick extensions
enabled:
```nix
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`
takes an extension specification equivalent to that of
`php.withExtensions`, `extraConfig` a string of additional `php.ini`
configuration parameters. For example, a PHP package with the opcache
and ImageMagick extensions enabled, and `memory_limit` set to `256M`:
```nix
php.buildEnv {
extensions = e: with e; [ imagick opcache ];
extraConfig = "memory_limit=256M";
}
```
##### Example setup for `phpfpm`
You can use the previous examples in a `phpfpm` pool called `foo` as
follows:
```nix
let
myPhp = php.withExtensions (e: with e; [ imagick opcache ]);
in {
services.phpfpm.pools."foo".phpPackage = myPhp;
};
```
```nix
let
myPhp = php.buildEnv {
extensions = e: with e; [ imagick opcache ];
extraConfig = "memory_limit=256M";
};
in {
services.phpfpm.pools."foo".phpPackage = myPhp;
};
```
##### Example usage with `nix-shell`
This brings up a temporary environment that contains a PHP interpreter
with the extensions `imagick` and `opcache` enabled.
```sh
nix-shell -p 'php.buildEnv { extensions = e: with e; [ imagick opcache ]; }'
```

View File

@ -128,6 +128,73 @@
documentation for instructions.
</para>
</listitem>
<listitem>
<para>
Since this release there's an easy way to customize your PHP install to get a much smaller
base PHP with only wanted extensions enabled. See the following snippet installing a smaller PHP
with the extensions <literal>imagick</literal>, <literal>opcache</literal> and
<literal>pdo_mysql</literal> loaded:
<programlisting>
environment.systemPackages = [
(pkgs.php.buildEnv { extensions = pp: with pp; [
imagick
opcache
pdo_mysql
]; })
];</programlisting>
The default <literal>php</literal> attribute hasn't lost any extensions -
the <literal>opcache</literal> extension was added there.
All upstream PHP extensions are available under <package><![CDATA[php.extensions.<name?>]]></package>.
</para>
<para>
The updated <literal>php</literal> attribute is now easily customizable to your liking
by using extensions instead of writing config files or changing configure flags.
Therefore we have removed the following configure flags:
<itemizedlist>
<title>PHP <literal>config</literal> flags that we don't read anymore:</title>
<listitem><para><literal>config.php.argon2</literal></para></listitem>
<listitem><para><literal>config.php.bcmath</literal></para></listitem>
<listitem><para><literal>config.php.bz2</literal></para></listitem>
<listitem><para><literal>config.php.calendar</literal></para></listitem>
<listitem><para><literal>config.php.curl</literal></para></listitem>
<listitem><para><literal>config.php.exif</literal></para></listitem>
<listitem><para><literal>config.php.ftp</literal></para></listitem>
<listitem><para><literal>config.php.gd</literal></para></listitem>
<listitem><para><literal>config.php.gettext</literal></para></listitem>
<listitem><para><literal>config.php.gmp</literal></para></listitem>
<listitem><para><literal>config.php.imap</literal></para></listitem>
<listitem><para><literal>config.php.intl</literal></para></listitem>
<listitem><para><literal>config.php.ldap</literal></para></listitem>
<listitem><para><literal>config.php.libxml2</literal></para></listitem>
<listitem><para><literal>config.php.libzip</literal></para></listitem>
<listitem><para><literal>config.php.mbstring</literal></para></listitem>
<listitem><para><literal>config.php.mysqli</literal></para></listitem>
<listitem><para><literal>config.php.mysqlnd</literal></para></listitem>
<listitem><para><literal>config.php.openssl</literal></para></listitem>
<listitem><para><literal>config.php.pcntl</literal></para></listitem>
<listitem><para><literal>config.php.pdo_mysql</literal></para></listitem>
<listitem><para><literal>config.php.pdo_odbc</literal></para></listitem>
<listitem><para><literal>config.php.pdo_pgsql</literal></para></listitem>
<listitem><para><literal>config.php.phpdbg</literal></para></listitem>
<listitem><para><literal>config.php.postgresql</literal></para></listitem>
<listitem><para><literal>config.php.readline</literal></para></listitem>
<listitem><para><literal>config.php.soap</literal></para></listitem>
<listitem><para><literal>config.php.sockets</literal></para></listitem>
<listitem><para><literal>config.php.sodium</literal></para></listitem>
<listitem><para><literal>config.php.sqlite</literal></para></listitem>
<listitem><para><literal>config.php.tidy</literal></para></listitem>
<listitem><para><literal>config.php.xmlrpc</literal></para></listitem>
<listitem><para><literal>config.php.xsl</literal></para></listitem>
<listitem><para><literal>config.php.zip</literal></para></listitem>
<listitem><para><literal>config.php.zlib</literal></para></listitem>
</itemizedlist>
</para>
</listitem>
</itemizedlist>
</section>

View File

@ -6,27 +6,28 @@ let
cfg = config.services.nextcloud;
fpm = config.services.phpfpm.pools.nextcloud;
phpPackage = pkgs.php73;
phpPackages = pkgs.php73Packages;
phpPackage =
let
base = pkgs.php74;
in
base.buildEnv {
extensions = e: with e;
base.enabledExtensions ++ [
apcu redis memcached imagick
];
extraConfig = phpOptionsStr;
};
toKeyValue = generators.toKeyValue {
mkKeyValue = generators.mkKeyValueDefault {} " = ";
};
phpOptionsExtensions = ''
${optionalString cfg.caching.apcu "extension=${phpPackages.apcu}/lib/php/extensions/apcu.so"}
${optionalString cfg.caching.redis "extension=${phpPackages.redis}/lib/php/extensions/redis.so"}
${optionalString cfg.caching.memcached "extension=${phpPackages.memcached}/lib/php/extensions/memcached.so"}
extension=${phpPackages.imagick}/lib/php/extensions/imagick.so
zend_extension = opcache.so
opcache.enable = 1
'';
phpOptions = {
upload_max_filesize = cfg.maxUploadSize;
post_max_size = cfg.maxUploadSize;
memory_limit = cfg.maxUploadSize;
} // cfg.phpOptions;
phpOptionsStr = phpOptionsExtensions + (toKeyValue phpOptions);
phpOptionsStr = toKeyValue phpOptions;
occ = pkgs.writeScriptBin "nextcloud-occ" ''
#! ${pkgs.stdenv.shell}
@ -38,7 +39,6 @@ let
export NEXTCLOUD_CONFIG_DIR="${cfg.home}/config"
$sudo \
${phpPackage}/bin/php \
-c ${pkgs.writeText "php.ini" phpOptionsStr}\
occ $*
'';

View File

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

View File

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

View File

@ -241,7 +241,7 @@ in
peerflix = handleTest ./peerflix.nix {};
pgjwt = handleTest ./pgjwt.nix {};
pgmanage = handleTest ./pgmanage.nix {};
php-pcre = handleTest ./php-pcre.nix {};
php = handleTest ./php {};
plasma5 = handleTest ./plasma5.nix {};
plotinus = handleTest ./plotinus.nix {};
postgis = handleTest ./postgis.nix {};

View File

@ -0,0 +1,7 @@
{ system ? builtins.currentSystem,
config ? {},
pkgs ? import ../../.. { inherit system config; }
}: {
fpm = import ./fpm.nix { inherit system pkgs; };
pcre = import ./pcre.nix { inherit system pkgs; };
}

55
nixos/tests/php/fpm.nix Normal file
View File

@ -0,0 +1,55 @@
import ../make-test-python.nix ({pkgs, ...}: {
name = "php-fpm-nginx-test";
meta.maintainers = with pkgs.stdenv.lib.maintainers; [ etu ];
machine = { config, lib, pkgs, ... }: {
services.nginx = {
enable = true;
virtualHosts."phpfpm" = let
testdir = pkgs.writeTextDir "web/index.php" "<?php phpinfo();";
in {
root = "${testdir}/web";
locations."~ \.php$".extraConfig = ''
fastcgi_pass unix:${config.services.phpfpm.pools.foobar.socket};
fastcgi_index index.php;
include ${pkgs.nginx}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
'';
locations."/" = {
tryFiles = "$uri $uri/ index.php";
index = "index.php index.html index.htm";
};
};
};
services.phpfpm.pools."foobar" = {
user = "nginx";
settings = {
"listen.group" = "nginx";
"listen.mode" = "0600";
"listen.owner" = "nginx";
"pm" = "dynamic";
"pm.max_children" = 5;
"pm.max_requests" = 500;
"pm.max_spare_servers" = 3;
"pm.min_spare_servers" = 1;
"pm.start_servers" = 2;
};
};
};
testScript = { ... }: ''
machine.wait_for_unit("nginx.service")
machine.wait_for_unit("phpfpm-foobar.service")
# Check so we get an evaluated PHP back
assert "PHP Version ${pkgs.php.version}" in machine.succeed("curl -vvv -s http://127.0.0.1:80/")
# Check so we have database and some other extensions loaded
assert "json" in machine.succeed("curl -vvv -s http://127.0.0.1:80/")
assert "opcache" in machine.succeed("curl -vvv -s http://127.0.0.1:80/")
assert "pdo_mysql" in machine.succeed("curl -vvv -s http://127.0.0.1:80/")
assert "pdo_pgsql" in machine.succeed("curl -vvv -s http://127.0.0.1:80/")
assert "pdo_sqlite" in machine.succeed("curl -vvv -s http://127.0.0.1:80/")
'';
})

View File

@ -1,7 +1,6 @@
let testString = "can-use-subgroups"; in
import ./make-test-python.nix ({ ...}: {
let
testString = "can-use-subgroups";
in import ../make-test-python.nix ({ ...}: {
name = "php-httpd-pcre-jit-test";
machine = { lib, pkgs, ... }: {
time.timeZone = "UTC";
@ -10,15 +9,13 @@ import ./make-test-python.nix ({ ...}: {
adminAddr = "please@dont.contact";
enablePHP = true;
phpOptions = "pcre.jit = true";
extraConfig =
let
extraConfig = let
testRoot = pkgs.writeText "index.php"
''
<?php
''
<?php
preg_match('/(${testString})/', '${testString}', $result);
var_dump($result);
?>
'';
'';
in
''
Alias / ${testRoot}/
@ -30,11 +27,11 @@ import ./make-test-python.nix ({ ...}: {
};
};
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"
)
'';
''
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"
)
'';
})

View File

@ -1,9 +1,11 @@
{ stdenv, php, autoreconfHook, fetchurl, re2c }:
{ stdenv, lib, php, autoreconfHook, fetchurl, re2c }:
{ pname
, version
, internalDeps ? []
, buildInputs ? []
, nativeBuildInputs ? []
, postPhpize ? ""
, makeFlags ? []
, src ? fetchurl {
url = "http://pecl.php.net/get/${pname}-${version}.tgz";
@ -22,5 +24,11 @@ stdenv.mkDerivation (args // {
makeFlags = [ "EXTENSION_DIR=$(out)/lib/php/extensions" ] ++ makeFlags;
autoreconfPhase = "phpize";
autoreconfPhase = ''
phpize
${postPhpize}
${lib.concatMapStringsSep "\n"
(dep: "mkdir -p ext; ln -s ${dep.dev}/include ext/${dep.extensionName}")
internalDeps}
'';
})

View File

@ -1,13 +1,9 @@
# 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
# 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
}:
let
@ -15,182 +11,83 @@ let
{ 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
# 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 ]
buildInputs =
# PCRE extension
[ pcre' ]
# 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
[ "--disable-all" ]
# 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 +101,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 +130,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,57 +144,121 @@ 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 (_: {
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, self, selfWithExtensions, ... }@args:
let
php = generic (builtins.removeAttrs args [ "self" "selfWithExtensions" ]);
in {
php72 = generic' {
php-packages = (callPackage ../../../top-level/php-packages.nix {
php = self;
phpWithExtensions = selfWithExtensions;
});
buildEnv = { extensions ? (_: []), extraConfig ? "" }:
let
getExtName = ext: lib.removePrefix "php-" (builtins.parseDrvName ext.name).name;
enabledExtensions = 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:
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)
(map getExtName ext.internalDeps);
})
enabledExtensions);
extNames = map getExtName enabledExtensions;
extraInit = writeText "custom-php.ini" ''
${lib.concatStringsSep "\n"
(lib.textClosureList extensionTexts extNames)}
${extraConfig}
'';
in
symlinkJoin {
name = "php-with-extensions-${version}";
inherit (php) version dev;
nativeBuildInputs = [ makeWrapper ];
passthru = {
inherit buildEnv withExtensions enabledExtensions;
inherit (php-packages) packages extensions;
};
paths = [ php ];
postBuild = ''
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
'';
};
withExtensions = extensions: buildEnv { inherit extensions; };
in
php.overrideAttrs (_: {
passthru = {
enabledExtensions = [];
inherit buildEnv withExtensions;
inherit (php-packages) packages extensions;
};
});
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;
};
php73 = generic' {
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;
};
php74 = generic' {
php74base = generic' {
version = "7.4.3";
sha256 = "wVF7pJV4+y3MZMc6Ptx21PxQfEp6xjmYFYTMfTtMbRQ=";
self = php74base;
selfWithExtensions = php74;
};
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 ]);
defaultPhpExtensionsWithHash = extensions:
(defaultPhpExtensions extensions) ++ [ extensions.hash ];
php74 = php74base.withExtensions defaultPhpExtensions;
php73 = php73base.withExtensions defaultPhpExtensionsWithHash;
php72 = php72base.withExtensions defaultPhpExtensionsWithHash;
in {
inherit php72base php73base php74base php72 php73 php74;
}

View File

@ -16,7 +16,19 @@
with stdenv.lib;
stdenv.mkDerivation rec {
let
phpConfig = {
config.php.embed = true;
config.php.apxs2 = false;
config.php.systemd = false;
config.php.phpdbg = false;
config.php.cgi = false;
config.php.fpm = false;
};
php72-unit = php72.override phpConfig;
php73-unit = php73.override phpConfig;
in stdenv.mkDerivation rec {
version = "1.16.0";
pname = "unit";
@ -37,8 +49,8 @@ stdenv.mkDerivation rec {
buildInputs = [ ]
++ optional withPython2 python2
++ optionals withPython3 [ python3 ncurses ]
++ optional withPHP72 php72
++ optional withPHP73 php73
++ optional withPHP72 php72-unit
++ optional withPHP73 php73-unit
++ optional withPerl528 perl528
++ optional withPerl530 perl530
++ optional withPerldevel perldevel
@ -59,8 +71,8 @@ stdenv.mkDerivation rec {
postConfigure = ''
${optionalString withPython2 "./configure python --module=python2 --config=${python2}/bin/python2-config --lib-path=${python2}/lib"}
${optionalString withPython3 "./configure python --module=python3 --config=${python3}/bin/python3-config --lib-path=${python3}/lib"}
${optionalString withPHP72 "./configure php --module=php72 --config=${php72.dev}/bin/php-config --lib-path=${php72}/lib"}
${optionalString withPHP73 "./configure php --module=php73 --config=${php73.dev}/bin/php-config --lib-path=${php73}/lib"}
${optionalString withPHP72 "./configure php --module=php72 --config=${php72-unit.dev}/bin/php-config --lib-path=${php72-unit}/lib"}
${optionalString withPHP73 "./configure php --module=php73 --config=${php73-unit.dev}/bin/php-config --lib-path=${php73-unit}/lib"}
${optionalString withPerl528 "./configure perl --module=perl528 --perl=${perl528}/bin/perl"}
${optionalString withPerl530 "./configure perl --module=perl530 --perl=${perl530}/bin/perl"}
${optionalString withPerldevel "./configure perl --module=perldev --perl=${perldevel}/bin/perl"}

View File

@ -4,10 +4,15 @@
, pam, withPAM ? stdenv.isLinux
, systemd, withSystemd ? stdenv.isLinux
, python2, python3, ncurses
, ruby, php-embed, libmysqlclient
, ruby, php, libmysqlclient
}:
let pythonPlugin = pkg : lib.nameValuePair "python${if pkg.isPy2 then "2" else "3"}" {
let php-embed = php.override {
config.php.embed = true;
config.php.apxs2 = false;
};
pythonPlugin = pkg : lib.nameValuePair "python${if pkg.isPy2 then "2" else "3"}" {
interpreter = pkg.interpreter;
path = "plugins/python";
inputs = [ pkg ncurses ];

View File

@ -322,6 +322,55 @@ mapAliases ({
perlArchiveCpio = perlPackages.ArchiveCpio; # added 2018-10-12
pgp-tools = signing-party; # added 2017-03-26
pg_tmp = ephemeralpg; # added 2018-01-16
php-embed = throw ''
php*-embed has been dropped, you can build the same package by using
something similar with this following snippet:
(php74.override { config.php.embed = true; config.php.apxs2 = false; })
''; # added 2020-04-01
php72-embed = php-embed; # added 2020-04-01
php73-embed = php-embed; # added 2020-04-01
php74-embed = php-embed; # added 2020-04-01
phpPackages-embed = throw ''
php*Packages-embed has been dropped, you can build the same package by using
something similar with this following snippet:
(php74.override { config.php.embed = true; config.php.apxs2 = false; }).packages
''; # added 2020-04-01
php74Packages-embed = phpPackages-embed;
php73Packages-embed = phpPackages-embed;
php72Packages-embed = phpPackages-embed;
php-unit = throw ''
php*-unit has been dropped, you can build the same package by using
something similar with this following snippet:
(php74.override {
config.php.embed = true;
config.php.apxs2 = false;
config.php.systemd = false;
config.php.phpdbg = false;
config.php.cgi = false;
config.php.fpm = false; })
''; # added 2020-04-01
php72-unit = php-unit; # added 2020-04-01
php73-unit = php-unit; # added 2020-04-01
php74-unit = php-unit; # added 2020-04-01
phpPackages-unit = throw ''
php*Packages-unit has been dropped, you can build the same package by using
something similar with this following snippet:
(php74.override {
config.php.embed = true;
config.php.apxs2 = false;
config.php.systemd = false;
config.php.phpdbg = false;
config.php.cgi = false;
config.php.fpm = false; }).packages
''; # added 2020-04-01
php74Packages-unit = phpPackages-unit;
php73Packages-unit = phpPackages-unit;
php72Packages-unit = phpPackages-unit;
pidgin-with-plugins = pidgin; # added 2016-06
pidginlatex = pidgin-latex; # added 2018-01-08
pidginlatexSF = pidgin-latex; # added 2014-11-02

View File

@ -9391,86 +9391,20 @@ in
pachyderm = callPackage ../applications/networking/cluster/pachyderm { };
php = php74;
phpPackages = php74Packages;
php72Packages = recurseIntoAttrs php72.packages;
php73Packages = recurseIntoAttrs php73.packages;
php74Packages = recurseIntoAttrs php74.packages;
php72Packages = recurseIntoAttrs (callPackage ./php-packages.nix {
php = php72;
});
php73Packages = recurseIntoAttrs (callPackage ./php-packages.nix {
php = php73;
});
php74Packages = recurseIntoAttrs (callPackage ./php-packages.nix {
php = php74;
});
phpPackages-unit = php74Packages-unit;
php72Packages-unit = recurseIntoAttrs (callPackage ./php-packages.nix {
php = php72-unit;
});
php73Packages-unit = recurseIntoAttrs (callPackage ./php-packages.nix {
php = php73-unit;
});
php74Packages-unit = recurseIntoAttrs (callPackage ./php-packages.nix {
php = php74-unit;
});
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;
php-embed = php74-embed;
php72-embed = php72.override {
config.php.embed = true;
config.php.apxs2 = false;
};
php73-embed = php73.override {
config.php.embed = true;
config.php.apxs2 = false;
};
php74-embed = php74.override {
config.php.embed = true;
config.php.apxs2 = false;
};
php-unit = php74-unit;
php72-unit = php72.override {
config.php.embed = true;
config.php.apxs2 = false;
config.php.systemd = false;
config.php.phpdbg = false;
config.php.cgi = false;
config.php.fpm = false;
};
php73-unit = php73.override {
config.php.embed = true;
config.php.apxs2 = false;
config.php.systemd = false;
config.php.phpdbg = false;
config.php.cgi = false;
config.php.fpm = false;
};
php74-unit = php74.override {
config.php.embed = true;
config.php.apxs2 = false;
config.php.systemd = false;
config.php.phpdbg = false;
config.php.cgi = false;
config.php.fpm = false;
};
}) php74 php73 php72 php74base php73base php72base;
picoc = callPackage ../development/interpreters/picoc {};
@ -15641,10 +15575,7 @@ in
neard = callPackage ../servers/neard { };
unit = callPackage ../servers/http/unit {
php72 = php72-unit;
php73 = php73-unit;
};
unit = callPackage ../servers/http/unit { };
nginx = nginxStable;

File diff suppressed because it is too large Load Diff