Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
1{
2 stdenv,
3 config,
4 callPackages,
5 lib,
6 pkgs,
7 phpPackage,
8 autoconf,
9 pkg-config,
10 bzip2,
11 curl,
12 cyrus_sasl,
13 enchant2,
14 freetds,
15 gd,
16 gettext,
17 gmp,
18 html-tidy,
19 icu73,
20 libffi,
21 libiconv,
22 libkrb5,
23 libpq,
24 libsodium,
25 libxml2,
26 libxslt,
27 libzip,
28 net-snmp,
29 nix-update-script,
30 oniguruma,
31 openldap,
32 openssl_1_1,
33 openssl,
34 pam,
35 pcre2,
36 bison,
37 re2c,
38 readline,
39 rsync,
40 sqlite,
41 unixODBC,
42 uwimap,
43 valgrind,
44 zlib,
45}:
46
47lib.makeScope pkgs.newScope (
48 self:
49 let
50 inherit (self)
51 buildPecl
52 callPackage
53 mkExtension
54 php
55 ;
56
57 builders = import ../build-support/php/builders {
58 inherit callPackages callPackage buildPecl;
59 };
60 in
61 {
62 buildPecl = callPackage ../build-support/php/build-pecl.nix {
63 php = php.unwrapped;
64 };
65
66 inherit (builders.v1)
67 buildComposerProject
68 buildComposerWithPlugin
69 composerHooks
70 mkComposerRepository
71 ;
72
73 # Next version of the builder
74 buildComposerProject2 = builders.v2.buildComposerProject;
75 composerHooks2 = builders.v2.composerHooks;
76 mkComposerVendor = builders.v2.mkComposerVendor;
77
78 # Wrap mkDerivation to prepend pname with "php-" to make names consistent
79 # with how buildPecl does it and make the file easier to overview.
80 mkDerivation =
81 origArgs:
82 let
83 args = lib.fix (
84 lib.extends (_: previousAttrs: {
85 pname = "php-${previousAttrs.pname}";
86 passthru = (previousAttrs.passthru or { }) // {
87 updateScript = nix-update-script { };
88 };
89 meta = (previousAttrs.meta or { }) // {
90 mainProgram = previousAttrs.meta.mainProgram or previousAttrs.pname;
91 };
92 }) (if lib.isFunction origArgs then origArgs else (_: origArgs))
93 );
94 in
95 pkgs.stdenv.mkDerivation args;
96
97 # Function to build an extension which is shipped as part of the php
98 # source, based on the php version.
99 #
100 # Name passed is the name of the extension and is automatically used
101 # to add the configureFlag "--enable-${name}", which can be overridden.
102 #
103 # Build inputs is used for extra deps that may be needed. And zendExtension
104 # will mark the extension as a zend extension or not.
105 mkExtension = lib.makeOverridable (
106 {
107 name,
108 configureFlags ? [ "--enable-${extName}" ],
109 internalDeps ? [ ],
110 postPhpize ? "",
111 buildInputs ? [ ],
112 zendExtension ? false,
113 doCheck ? true,
114 extName ? name,
115 ...
116 }@args:
117 stdenv.mkDerivation (
118 (builtins.removeAttrs args [ "name" ])
119 // {
120 pname = "php-${name}";
121 extensionName = extName;
122
123 outputs = [
124 "out"
125 "dev"
126 ];
127
128 inherit (php.unwrapped) version src;
129
130 enableParallelBuilding = true;
131
132 nativeBuildInputs = [
133 php.unwrapped
134 autoconf
135 pkg-config
136 re2c
137 bison
138 ];
139
140 inherit
141 configureFlags
142 internalDeps
143 buildInputs
144 zendExtension
145 doCheck
146 ;
147
148 preConfigurePhases = [
149 "genfiles"
150 "cdToExtensionRootPhase"
151 ];
152
153 genfiles = ''
154 if [ -f "scripts/dev/genfiles" ]; then
155 ./scripts/dev/genfiles
156 fi
157 '';
158
159 cdToExtensionRootPhase = ''
160 # Go to extension source root.
161 cd "ext/${extName}"
162 '';
163
164 preConfigure = ''
165 nullglobRestore=$(shopt -p nullglob)
166 shopt -u nullglob # To make ?-globbing work
167
168 # Some extensions have a config0.m4 or config9.m4
169 if [ -f config?.m4 ]; then
170 mv config?.m4 config.m4
171 fi
172
173 $nullglobRestore
174
175 phpize
176 ${postPhpize}
177
178 ${lib.concatMapStringsSep "\n" (
179 dep: "mkdir -p ext; ln -s ${dep.dev}/include ext/${dep.extensionName}"
180 ) internalDeps}
181 '';
182
183 checkPhase = ''
184 runHook preCheck
185
186 NO_INTERACTION=yes SKIP_PERF_SENSITIVE=yes SKIP_ONLINE_TESTS=yes make test
187 runHook postCheck
188 '';
189
190 installPhase = ''
191 runHook preInstall
192
193 mkdir -p $out/lib/php/extensions
194 cp modules/${extName}.so $out/lib/php/extensions/${extName}.so
195 mkdir -p $dev/include
196 ${rsync}/bin/rsync -r --filter="+ */" \
197 --filter="+ *.h" \
198 --filter="- *" \
199 --prune-empty-dirs \
200 . $dev/include/
201
202 runHook postInstall
203 '';
204
205 meta = {
206 description = "PHP upstream extension: ${name}";
207 inherit (php.meta)
208 teams
209 homepage
210 license
211 platforms
212 ;
213 }
214 // args.meta or { };
215 }
216 )
217 );
218
219 php = phpPackage;
220
221 # This is a set of interactive tools based on PHP.
222 tools = {
223 box = callPackage ../development/php-packages/box { };
224
225 castor = callPackage ../development/php-packages/castor { };
226
227 composer = callPackage ../development/php-packages/composer { };
228
229 composer-local-repo-plugin = callPackage ../development/php-packages/composer-local-repo-plugin { };
230
231 cyclonedx-php-composer = callPackage ../development/php-packages/cyclonedx-php-composer { };
232
233 deployer = callPackage ../development/php-packages/deployer { };
234
235 grumphp = callPackage ../development/php-packages/grumphp { };
236
237 phan = callPackage ../development/php-packages/phan { };
238
239 phing = callPackage ../development/php-packages/phing { };
240
241 phive = callPackage ../development/php-packages/phive { };
242
243 php-codesniffer = callPackage ../development/php-packages/php-codesniffer { };
244
245 php-cs-fixer = callPackage ../development/php-packages/php-cs-fixer { };
246
247 php-parallel-lint = callPackage ../development/php-packages/php-parallel-lint { };
248
249 phpinsights = callPackage ../development/php-packages/phpinsights { };
250
251 phpmd = callPackage ../development/php-packages/phpmd { };
252
253 phpspy = callPackage ../development/php-packages/phpspy { };
254
255 phpstan = callPackage ../development/php-packages/phpstan { };
256
257 psalm = callPackage ../development/php-packages/psalm { };
258
259 psysh = callPackage ../development/php-packages/psysh { };
260 }
261 // lib.optionalAttrs config.allowAliases {
262 phpcbf = throw "`phpcbf` is now deprecated, use `php-codesniffer` instead which contains both `phpcs` and `phpcbf`.";
263 phpcs = throw "`phpcs` is now deprecated, use `php-codesniffer` instead which contains both `phpcs` and `phpcbf`.";
264 };
265
266 # This is a set of PHP extensions meant to be used in php.buildEnv
267 # or php.withExtensions to extend the functionality of the PHP
268 # interpreter.
269 # The extensions attributes is composed of three sections:
270 # 1. The contrib conditional extensions, which are only available on specific PHP versions
271 # 2. The contrib extensions available
272 # 3. The core extensions
273 extensions =
274 # Contrib extensions
275 {
276 amqp = callPackage ../development/php-packages/amqp { };
277
278 apcu = callPackage ../development/php-packages/apcu { };
279
280 ast = callPackage ../development/php-packages/ast { };
281
282 blackfire = callPackage ../by-name/bl/blackfire/php-probe.nix { };
283
284 couchbase = callPackage ../development/php-packages/couchbase { };
285
286 datadog_trace = callPackage ../development/php-packages/datadog_trace { };
287
288 decimal = callPackage ../development/php-packages/decimal { };
289
290 ds = callPackage ../development/php-packages/ds { };
291
292 event = callPackage ../development/php-packages/event { };
293
294 excimer = callPackage ../development/php-packages/excimer { };
295
296 gnupg = callPackage ../development/php-packages/gnupg { };
297
298 grpc = callPackage ../development/php-packages/grpc { };
299
300 igbinary = callPackage ../development/php-packages/igbinary { };
301
302 imagick = callPackage ../development/php-packages/imagick { };
303
304 # Shadowed by built-in version on PHP < 8.3.
305 imap = callPackage ../development/php-packages/imap { };
306
307 inotify = callPackage ../development/php-packages/inotify { };
308
309 ioncube-loader = callPackage ../development/php-packages/ioncube-loader { };
310
311 luasandbox = callPackage ../development/php-packages/luasandbox { };
312
313 mailparse = callPackage ../development/php-packages/mailparse { };
314
315 maxminddb = callPackage ../development/php-packages/maxminddb { };
316
317 memcache = callPackage ../development/php-packages/memcache { };
318
319 memcached = callPackage ../development/php-packages/memcached { };
320
321 meminfo = callPackage ../development/php-packages/meminfo { };
322
323 memprof = callPackage ../development/php-packages/memprof { };
324
325 mongodb = callPackage ../development/php-packages/mongodb { };
326
327 msgpack = callPackage ../development/php-packages/msgpack { };
328
329 oci8 = callPackage ../development/php-packages/oci8 { };
330
331 opentelemetry = callPackage ../development/php-packages/opentelemetry { };
332
333 openswoole = callPackage ../development/php-packages/openswoole { };
334
335 parallel = callPackage ../development/php-packages/parallel { };
336
337 pdlib = callPackage ../development/php-packages/pdlib { };
338
339 pcov = callPackage ../development/php-packages/pcov { };
340
341 pdo_oci =
342 if (lib.versionAtLeast php.version "8.4") then
343 callPackage ../development/php-packages/pdo_oci { }
344 else
345 buildPecl rec {
346 inherit (php.unwrapped) src version;
347
348 pname = "pdo_oci";
349 sourceRoot = "php-${version}/ext/pdo_oci";
350
351 buildInputs = [ pkgs.oracle-instantclient ];
352 configureFlags = [ "--with-pdo-oci=instantclient,${pkgs.oracle-instantclient.lib}/lib" ];
353
354 internalDeps = [ php.extensions.pdo ];
355 postPatch = ''
356 sed -i -e 's|OCISDKMANINC=`.*$|OCISDKMANINC="${pkgs.oracle-instantclient.dev}/include"|' config.m4
357 '';
358
359 meta.teams = [ lib.teams.php ];
360 };
361
362 pdo_sqlsrv = callPackage ../development/php-packages/pdo_sqlsrv { };
363
364 phalcon = callPackage ../development/php-packages/phalcon { };
365
366 pinba = callPackage ../development/php-packages/pinba { };
367
368 protobuf = callPackage ../development/php-packages/protobuf { };
369
370 pspell = callPackage ../development/php-packages/pspell { };
371
372 rdkafka = callPackage ../development/php-packages/rdkafka { };
373
374 redis = callPackage ../development/php-packages/redis { };
375
376 relay = callPackage ../development/php-packages/relay { };
377
378 rrd = callPackage ../development/php-packages/rrd { };
379
380 smbclient = callPackage ../development/php-packages/smbclient { };
381
382 snuffleupagus = callPackage ../development/php-packages/snuffleupagus { };
383
384 spx = callPackage ../development/php-packages/spx { };
385
386 sqlsrv = callPackage ../development/php-packages/sqlsrv { };
387
388 ssh2 = callPackage ../development/php-packages/ssh2 { };
389
390 swoole = callPackage ../development/php-packages/swoole { };
391
392 systemd = callPackage ../development/php-packages/systemd { };
393
394 tideways = callPackage ../development/php-packages/tideways { };
395
396 uuid = callPackage ../development/php-packages/uuid { };
397
398 uv = callPackage ../development/php-packages/uv { };
399
400 vld = callPackage ../development/php-packages/vld { };
401
402 wikidiff2 = callPackage ../development/php-packages/wikidiff2 { };
403
404 xdebug = callPackage ../development/php-packages/xdebug { };
405
406 yaml = callPackage ../development/php-packages/yaml { };
407
408 zstd = callPackage ../development/php-packages/zstd { };
409 }
410 // lib.optionalAttrs config.allowAliases {
411 php-spx = throw "php-spx is deprecated, use spx instead";
412 }
413 // (
414 # Core extensions
415 let
416 # This list contains build instructions for different modules that one may
417 # want to build.
418 #
419 # These will be passed as arguments to mkExtension above.
420 extensionData = [
421 { name = "bcmath"; }
422 {
423 name = "bz2";
424 buildInputs = [ bzip2 ];
425 configureFlags = [ "--with-bz2=${bzip2.dev}" ];
426 }
427 { name = "calendar"; }
428 {
429 name = "ctype";
430 postPatch =
431 lib.optionalString (stdenv.hostPlatform.isDarwin && lib.versionAtLeast php.version "8.2")
432 # Broken test on aarch64-darwin
433 ''
434 rm ext/ctype/tests/lc_ctype_inheritance.phpt
435 '';
436 }
437 {
438 name = "curl";
439 buildInputs = [ curl ];
440 configureFlags = [ "--with-curl=${curl.dev}" ];
441 doCheck = false;
442 }
443 { name = "dba"; }
444 {
445 name = "dom";
446 buildInputs = [ libxml2 ];
447 configureFlags = [
448 "--enable-dom"
449 ];
450 }
451 {
452 name = "enchant";
453 buildInputs = [ enchant2 ];
454 configureFlags = [ "--with-enchant" ];
455 doCheck = false;
456 }
457 {
458 name = "exif";
459 doCheck = false;
460 }
461 {
462 name = "ffi";
463 buildInputs = [ libffi ];
464 }
465 {
466 name = "fileinfo";
467 buildInputs = [ pcre2 ];
468 }
469 {
470 name = "filter";
471 buildInputs = [ pcre2 ];
472 }
473 {
474 name = "ftp";
475 buildInputs = [ openssl ];
476 }
477 {
478 name = "gd";
479 buildInputs = [
480 zlib
481 gd
482 ];
483 configureFlags = [
484 "--enable-gd"
485 "--with-external-gd=${gd.dev}"
486 "--enable-gd-jis-conv"
487 ];
488 doCheck = false;
489 }
490 {
491 name = "gettext";
492 buildInputs = [ gettext ];
493 postPhpize = ''substituteInPlace configure --replace-fail 'as_fn_error $? "Cannot locate header file libintl.h" "$LINENO" 5' ':' '';
494 configureFlags = [ "--with-gettext=${gettext}" ];
495 }
496 {
497 name = "gmp";
498 buildInputs = [ gmp ];
499 configureFlags = [ "--with-gmp=${gmp.dev}" ];
500 }
501 {
502 name = "iconv";
503 buildInputs = [ libiconv ];
504 configureFlags = [ "--with-iconv" ];
505 # Some other extensions support separate libdirs, but iconv does not. This causes problems with detecting
506 # Darwin’s libiconv because it has separate outputs. Adding `-liconv` works around the issue.
507 env = lib.optionalAttrs stdenv.hostPlatform.isDarwin { NIX_LDFLAGS = "-liconv"; };
508 doCheck = stdenv.hostPlatform.isLinux;
509 }
510 {
511 name = "intl";
512 buildInputs = [ icu73 ];
513 }
514 {
515 name = "ldap";
516 buildInputs = [
517 openldap
518 cyrus_sasl
519 ];
520 configureFlags = [
521 "--with-ldap"
522 "LDAP_DIR=${openldap.dev}"
523 "LDAP_INCDIR=${openldap.dev}/include"
524 "LDAP_LIBDIR=${openldap.out}/lib"
525 ]
526 ++ lib.optionals stdenv.hostPlatform.isLinux [
527 "--with-ldap-sasl=${cyrus_sasl.dev}"
528 ];
529 doCheck = false;
530 }
531 {
532 name = "mbstring";
533 buildInputs = [
534 oniguruma
535 pcre2
536 ];
537 doCheck = false;
538 }
539 {
540 name = "mysqli";
541 internalDeps = [ php.extensions.mysqlnd ];
542 configureFlags = [
543 "--with-mysqli=mysqlnd"
544 "--with-mysql-sock=/run/mysqld/mysqld.sock"
545 ];
546 doCheck = false;
547 }
548 {
549 name = "mysqlnd";
550 buildInputs = [
551 zlib
552 openssl
553 ];
554 configureFlags = [ "--with-mysqlnd-ssl" ];
555 # The configure script doesn't correctly add library link
556 # flags, so we add them to the variable used by the Makefile
557 # when linking.
558 MYSQLND_SHARED_LIBADD = "-lz -lssl -lcrypto";
559 # The configure script builds a config.h which is never
560 # included. Let's include it in the main header file
561 # included by all .c-files.
562 patches = [
563 (pkgs.writeText "mysqlnd_config.patch" ''
564 --- a/ext/mysqlnd/mysqlnd.h
565 +++ b/ext/mysqlnd/mysqlnd.h
566 @@ -1,3 +1,6 @@
567 +#ifdef HAVE_CONFIG_H
568 +#include "config.h"
569 +#endif
570 /*
571 +----------------------------------------------------------------------+
572 | Copyright (c) The PHP Group |
573 '')
574 ];
575 }
576 {
577 name = "opcache";
578 buildInputs = [
579 pcre2
580 ]
581 ++ lib.optional (
582 !stdenv.hostPlatform.isDarwin && lib.meta.availableOn stdenv.hostPlatform valgrind
583 ) valgrind.dev;
584 configureFlags = lib.optional php.ztsSupport "--disable-opcache-jit";
585 zendExtension = true;
586 postPatch = lib.optionalString stdenv.hostPlatform.isDarwin ''
587 # Tests are flaky on darwin
588 rm ext/opcache/tests/blacklist.phpt
589 rm ext/opcache/tests/bug66338.phpt
590 rm ext/opcache/tests/bug78106.phpt
591 rm ext/opcache/tests/issue0115.phpt
592 rm ext/opcache/tests/issue0149.phpt
593 rm ext/opcache/tests/revalidate_path_01.phpt
594 '';
595 # Tests launch the builtin webserver.
596 __darwinAllowLocalNetworking = true;
597 }
598 {
599 name = "openssl";
600 buildInputs = [ openssl ];
601 configureFlags = [ "--with-openssl" ];
602 doCheck = false;
603 }
604 # This provides a legacy OpenSSL PHP extension
605 # For situations where OpenSSL 3 do not support a set of features
606 # without a specific openssl.cnf file
607 {
608 name = "openssl-legacy";
609 extName = "openssl";
610 buildInputs = [ openssl_1_1 ];
611 configureFlags = [ "--with-openssl" ];
612 doCheck = false;
613 }
614 { name = "pcntl"; }
615 {
616 name = "pdo";
617 doCheck = false;
618 }
619 {
620 name = "pdo_dblib";
621 internalDeps = [ php.extensions.pdo ];
622 configureFlags = [ "--with-pdo-dblib=${freetds}" ];
623 meta.broken = stdenv.hostPlatform.isDarwin;
624 doCheck = false;
625 }
626 {
627 name = "pdo_mysql";
628 internalDeps = with php.extensions; [
629 pdo
630 mysqlnd
631 ];
632 configureFlags = [
633 "--with-pdo-mysql=mysqlnd"
634 "PHP_MYSQL_SOCK=/run/mysqld/mysqld.sock"
635 ];
636 doCheck = false;
637 }
638 {
639 name = "pdo_odbc";
640 internalDeps = [ php.extensions.pdo ];
641 buildInputs = [ unixODBC ];
642 configureFlags = [ "--with-pdo-odbc=unixODBC,${unixODBC}" ];
643 doCheck = false;
644 }
645 {
646 name = "pdo_pgsql";
647 internalDeps = [ php.extensions.pdo ];
648 configureFlags = [ "--with-pdo-pgsql=${libpq.pg_config}" ];
649 doCheck = false;
650 }
651 {
652 name = "pdo_sqlite";
653 internalDeps = [ php.extensions.pdo ];
654 buildInputs = [ sqlite ];
655 configureFlags = [ "--with-pdo-sqlite=${sqlite.dev}" ];
656 doCheck = false;
657 }
658 {
659 name = "pgsql";
660 buildInputs = [
661 pcre2
662 ];
663 configureFlags = [ "--with-pgsql=${libpq.pg_config}" ];
664 doCheck = false;
665 }
666 {
667 name = "posix";
668 doCheck = false;
669 }
670 {
671 name = "readline";
672 buildInputs = [
673 readline
674 ];
675 configureFlags = [
676 "--with-readline=${readline.dev}"
677 ];
678 postPatch = ''
679 # Fix `--with-readline` option not being available.
680 # `PHP_ALWAYS_SHARED` generated by phpize enables all options
681 # without the possibility to override them. But when `--with-libedit`
682 # is enabled, `--with-readline` is not registered.
683 echo '
684 AC_DEFUN([PHP_ALWAYS_SHARED],[
685 test "[$]$1" != "no" && ext_shared=yes
686 ])dnl
687 ' | cat - ext/readline/config.m4 > ext/readline/config.m4.tmp
688 mv ext/readline/config.m4{.tmp,}
689 '';
690 doCheck = false;
691 }
692 {
693 name = "session";
694 doCheck = false;
695 }
696 { name = "shmop"; }
697 {
698 name = "simplexml";
699 buildInputs = [
700 libxml2
701 pcre2
702 ];
703 configureFlags = [
704 "--enable-simplexml"
705 ];
706 }
707 {
708 name = "snmp";
709 buildInputs = [
710 net-snmp
711 openssl
712 ];
713 configureFlags = [ "--with-snmp" ];
714 doCheck = false;
715 }
716 {
717 name = "soap";
718 buildInputs = [ libxml2 ];
719 configureFlags = [
720 "--enable-soap"
721 ];
722 # Some tests are causing issues in the Darwin sandbox with issues
723 # such as
724 # Unknown: php_network_getaddresses: getaddrinfo for localhost failed: nodename nor servname provided
725 doCheck = !stdenv.hostPlatform.isDarwin && lib.versionOlder php.version "8.4";
726 internalDeps = [ php.extensions.session ];
727 }
728 {
729 name = "sockets";
730 doCheck = false;
731 }
732 {
733 name = "sodium";
734 buildInputs = [ libsodium ];
735 }
736 {
737 name = "sqlite3";
738 buildInputs = [ sqlite ];
739
740 # The `sqlite3_bind_bug68849.phpt` test is currently broken for i686 Linux systems since sqlite 3.43, cf.:
741 # - https://github.com/php/php-src/issues/12076
742 # - https://www.sqlite.org/forum/forumpost/abbb95376ec6cd5f
743 patches = lib.optionals (stdenv.hostPlatform.isi686 && stdenv.hostPlatform.isLinux) [
744 ../development/interpreters/php/skip-sqlite3_bind_bug68849.phpt.patch
745 ];
746 }
747 { name = "sysvmsg"; }
748 { name = "sysvsem"; }
749 { name = "sysvshm"; }
750 {
751 name = "tidy";
752 configureFlags = [ "--with-tidy=${html-tidy}" ];
753 doCheck = false;
754 }
755 {
756 name = "tokenizer";
757 patches = [ ../development/interpreters/php/fix-tokenizer-php81.patch ];
758 }
759 {
760 name = "xml";
761 buildInputs = [ libxml2 ];
762 configureFlags = [
763 "--enable-xml"
764 ];
765 doCheck = false;
766 }
767 {
768 name = "xmlreader";
769 buildInputs = [ libxml2 ];
770 internalDeps = [ php.extensions.dom ];
771 env.NIX_CFLAGS_COMPILE = toString [
772 "-I../.."
773 "-DHAVE_DOM"
774 ];
775 doCheck = false;
776 configureFlags = [
777 "--enable-xmlreader"
778 ];
779 }
780 {
781 name = "xmlwriter";
782 buildInputs = [ libxml2 ];
783 configureFlags = [
784 "--enable-xmlwriter"
785 ];
786 }
787 {
788 name = "xsl";
789 buildInputs = [
790 libxslt
791 libxml2
792 ];
793 internalDeps = [ php.extensions.dom ];
794 doCheck = false;
795 env.NIX_CFLAGS_COMPILE = toString [
796 "-I../.."
797 "-DHAVE_DOM"
798 ];
799 configureFlags = [ "--with-xsl=${libxslt.dev}" ];
800 }
801 {
802 name = "zend_test";
803 internalDeps = [ php.extensions.dom ];
804 env.NIX_CFLAGS_COMPILE = "-I${libxml2.dev}/include/libxml2";
805 }
806 {
807 name = "zip";
808 buildInputs = [
809 libzip
810 pcre2
811 ];
812 configureFlags = [
813 "--with-zip"
814 ];
815 doCheck = false;
816 }
817 {
818 name = "zlib";
819 buildInputs = [ zlib ];
820 configureFlags = [
821 "--with-zlib"
822 ];
823 }
824 ]
825 ++ lib.optionals (lib.versionOlder php.version "8.3") [
826 # Using version from PECL on new PHP versions.
827 {
828 name = "imap";
829 buildInputs = [
830 uwimap
831 openssl
832 pam
833 pcre2
834 libkrb5
835 ];
836 configureFlags = [
837 "--with-imap=${uwimap}"
838 "--with-imap-ssl"
839 "--with-kerberos"
840 ];
841 }
842 ];
843
844 # Convert the list of attrs:
845 # [ { name = <name>; ... } ... ]
846 # to a list of
847 # [ { name = <name>; value = <extension drv>; } ... ]
848 #
849 # which we later use listToAttrs to make all attrs available by name.
850 namedExtensions = builtins.map (drv: {
851 name = drv.name;
852 value = mkExtension drv;
853 }) extensionData;
854
855 in
856 # Produce the final attribute set of all extensions defined.
857 builtins.listToAttrs namedExtensions
858 );
859 }
860)