lol
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 } // args.meta or { };
214 }
215 )
216 );
217
218 php = phpPackage;
219
220 # This is a set of interactive tools based on PHP.
221 tools =
222 {
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 tideways = callPackage ../development/php-packages/tideways { };
393
394 uuid = callPackage ../development/php-packages/uuid { };
395
396 uv = callPackage ../development/php-packages/uv { };
397
398 vld = callPackage ../development/php-packages/vld { };
399
400 wikidiff2 = callPackage ../development/php-packages/wikidiff2 { };
401
402 xdebug = callPackage ../development/php-packages/xdebug { };
403
404 yaml = callPackage ../development/php-packages/yaml { };
405
406 zstd = callPackage ../development/php-packages/zstd { };
407 }
408 // lib.optionalAttrs config.allowAliases {
409 php-spx = throw "php-spx is deprecated, use spx instead";
410 }
411 // (
412 # Core extensions
413 let
414 # This list contains build instructions for different modules that one may
415 # want to build.
416 #
417 # These will be passed as arguments to mkExtension above.
418 extensionData =
419 [
420 { name = "bcmath"; }
421 {
422 name = "bz2";
423 buildInputs = [ bzip2 ];
424 configureFlags = [ "--with-bz2=${bzip2.dev}" ];
425 }
426 { name = "calendar"; }
427 {
428 name = "ctype";
429 postPatch =
430 lib.optionalString (stdenv.hostPlatform.isDarwin && lib.versionAtLeast php.version "8.2")
431 # Broken test on aarch64-darwin
432 ''
433 rm ext/ctype/tests/lc_ctype_inheritance.phpt
434 '';
435 }
436 {
437 name = "curl";
438 buildInputs = [ curl ];
439 configureFlags = [ "--with-curl=${curl.dev}" ];
440 doCheck = false;
441 }
442 { name = "dba"; }
443 {
444 name = "dom";
445 buildInputs = [ libxml2 ];
446 configureFlags = [
447 "--enable-dom"
448 ];
449 }
450 {
451 name = "enchant";
452 buildInputs = [ enchant2 ];
453 configureFlags = [ "--with-enchant" ];
454 doCheck = false;
455 }
456 {
457 name = "exif";
458 doCheck = false;
459 }
460 {
461 name = "ffi";
462 buildInputs = [ libffi ];
463 }
464 {
465 name = "fileinfo";
466 buildInputs = [ pcre2 ];
467 }
468 {
469 name = "filter";
470 buildInputs = [ pcre2 ];
471 }
472 {
473 name = "ftp";
474 buildInputs = [ openssl ];
475 }
476 {
477 name = "gd";
478 buildInputs = [
479 zlib
480 gd
481 ];
482 configureFlags = [
483 "--enable-gd"
484 "--with-external-gd=${gd.dev}"
485 "--enable-gd-jis-conv"
486 ];
487 doCheck = false;
488 }
489 {
490 name = "gettext";
491 buildInputs = [ gettext ];
492 postPhpize = ''substituteInPlace configure --replace-fail 'as_fn_error $? "Cannot locate header file libintl.h" "$LINENO" 5' ':' '';
493 configureFlags = [ "--with-gettext=${gettext}" ];
494 }
495 {
496 name = "gmp";
497 buildInputs = [ gmp ];
498 configureFlags = [ "--with-gmp=${gmp.dev}" ];
499 }
500 {
501 name = "iconv";
502 buildInputs = [ libiconv ];
503 configureFlags = [ "--with-iconv" ];
504 # Some other extensions support separate libdirs, but iconv does not. This causes problems with detecting
505 # Darwin’s libiconv because it has separate outputs. Adding `-liconv` works around the issue.
506 env = lib.optionalAttrs stdenv.hostPlatform.isDarwin { NIX_LDFLAGS = "-liconv"; };
507 doCheck = stdenv.hostPlatform.isLinux;
508 }
509 {
510 name = "intl";
511 buildInputs = [ icu73 ];
512 }
513 {
514 name = "ldap";
515 buildInputs = [
516 openldap
517 cyrus_sasl
518 ];
519 configureFlags =
520 [
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 ++ lib.optional (
581 !stdenv.hostPlatform.isDarwin && lib.meta.availableOn stdenv.hostPlatform valgrind
582 ) valgrind.dev;
583 configureFlags = lib.optional php.ztsSupport "--disable-opcache-jit";
584 zendExtension = true;
585 postPatch = lib.optionalString stdenv.hostPlatform.isDarwin ''
586 # Tests are flaky on darwin
587 rm ext/opcache/tests/blacklist.phpt
588 rm ext/opcache/tests/bug66338.phpt
589 rm ext/opcache/tests/bug78106.phpt
590 rm ext/opcache/tests/issue0115.phpt
591 rm ext/opcache/tests/issue0149.phpt
592 rm ext/opcache/tests/revalidate_path_01.phpt
593 '';
594 # Tests launch the builtin webserver.
595 __darwinAllowLocalNetworking = true;
596 }
597 {
598 name = "openssl";
599 buildInputs = [ openssl ];
600 configureFlags = [ "--with-openssl" ];
601 doCheck = false;
602 }
603 # This provides a legacy OpenSSL PHP extension
604 # For situations where OpenSSL 3 do not support a set of features
605 # without a specific openssl.cnf file
606 {
607 name = "openssl-legacy";
608 extName = "openssl";
609 buildInputs = [ openssl_1_1 ];
610 configureFlags = [ "--with-openssl" ];
611 doCheck = false;
612 }
613 { name = "pcntl"; }
614 {
615 name = "pdo";
616 doCheck = false;
617 }
618 {
619 name = "pdo_dblib";
620 internalDeps = [ php.extensions.pdo ];
621 configureFlags = [ "--with-pdo-dblib=${freetds}" ];
622 meta.broken = stdenv.hostPlatform.isDarwin;
623 doCheck = false;
624 }
625 {
626 name = "pdo_mysql";
627 internalDeps = with php.extensions; [
628 pdo
629 mysqlnd
630 ];
631 configureFlags = [
632 "--with-pdo-mysql=mysqlnd"
633 "PHP_MYSQL_SOCK=/run/mysqld/mysqld.sock"
634 ];
635 doCheck = false;
636 }
637 {
638 name = "pdo_odbc";
639 internalDeps = [ php.extensions.pdo ];
640 buildInputs = [ unixODBC ];
641 configureFlags = [ "--with-pdo-odbc=unixODBC,${unixODBC}" ];
642 doCheck = false;
643 }
644 {
645 name = "pdo_pgsql";
646 internalDeps = [ php.extensions.pdo ];
647 configureFlags = [ "--with-pdo-pgsql=${libpq.pg_config}" ];
648 doCheck = false;
649 }
650 {
651 name = "pdo_sqlite";
652 internalDeps = [ php.extensions.pdo ];
653 buildInputs = [ sqlite ];
654 configureFlags = [ "--with-pdo-sqlite=${sqlite.dev}" ];
655 doCheck = false;
656 }
657 {
658 name = "pgsql";
659 buildInputs = [
660 pcre2
661 ];
662 configureFlags = [ "--with-pgsql=${libpq.pg_config}" ];
663 doCheck = false;
664 }
665 {
666 name = "posix";
667 doCheck = false;
668 }
669 {
670 name = "readline";
671 buildInputs = [
672 readline
673 ];
674 configureFlags = [
675 "--with-readline=${readline.dev}"
676 ];
677 postPatch = ''
678 # Fix `--with-readline` option not being available.
679 # `PHP_ALWAYS_SHARED` generated by phpize enables all options
680 # without the possibility to override them. But when `--with-libedit`
681 # is enabled, `--with-readline` is not registered.
682 echo '
683 AC_DEFUN([PHP_ALWAYS_SHARED],[
684 test "[$]$1" != "no" && ext_shared=yes
685 ])dnl
686 ' | cat - ext/readline/config.m4 > ext/readline/config.m4.tmp
687 mv ext/readline/config.m4{.tmp,}
688 '';
689 doCheck = false;
690 }
691 {
692 name = "session";
693 doCheck = false;
694 }
695 { name = "shmop"; }
696 {
697 name = "simplexml";
698 buildInputs = [
699 libxml2
700 pcre2
701 ];
702 configureFlags = [
703 "--enable-simplexml"
704 ];
705 }
706 {
707 name = "snmp";
708 buildInputs = [
709 net-snmp
710 openssl
711 ];
712 configureFlags = [ "--with-snmp" ];
713 doCheck = false;
714 }
715 {
716 name = "soap";
717 buildInputs = [ libxml2 ];
718 configureFlags = [
719 "--enable-soap"
720 ];
721 # Some tests are causing issues in the Darwin sandbox with issues
722 # such as
723 # Unknown: php_network_getaddresses: getaddrinfo for localhost failed: nodename nor servname provided
724 doCheck = !stdenv.hostPlatform.isDarwin && lib.versionOlder php.version "8.4";
725 internalDeps = [ php.extensions.session ];
726 }
727 {
728 name = "sockets";
729 doCheck = false;
730 }
731 {
732 name = "sodium";
733 buildInputs = [ libsodium ];
734 }
735 {
736 name = "sqlite3";
737 buildInputs = [ sqlite ];
738
739 # The `sqlite3_bind_bug68849.phpt` test is currently broken for i686 Linux systems since sqlite 3.43, cf.:
740 # - https://github.com/php/php-src/issues/12076
741 # - https://www.sqlite.org/forum/forumpost/abbb95376ec6cd5f
742 patches = lib.optionals (stdenv.hostPlatform.isi686 && stdenv.hostPlatform.isLinux) [
743 ../development/interpreters/php/skip-sqlite3_bind_bug68849.phpt.patch
744 ];
745 }
746 { name = "sysvmsg"; }
747 { name = "sysvsem"; }
748 { name = "sysvshm"; }
749 {
750 name = "tidy";
751 configureFlags = [ "--with-tidy=${html-tidy}" ];
752 doCheck = false;
753 }
754 {
755 name = "tokenizer";
756 patches = [ ../development/interpreters/php/fix-tokenizer-php81.patch ];
757 }
758 {
759 name = "xml";
760 buildInputs = [ libxml2 ];
761 configureFlags = [
762 "--enable-xml"
763 ];
764 doCheck = false;
765 }
766 {
767 name = "xmlreader";
768 buildInputs = [ libxml2 ];
769 internalDeps = [ php.extensions.dom ];
770 env.NIX_CFLAGS_COMPILE = toString [
771 "-I../.."
772 "-DHAVE_DOM"
773 ];
774 doCheck = false;
775 configureFlags = [
776 "--enable-xmlreader"
777 ];
778 }
779 {
780 name = "xmlwriter";
781 buildInputs = [ libxml2 ];
782 configureFlags = [
783 "--enable-xmlwriter"
784 ];
785 }
786 {
787 name = "xsl";
788 buildInputs = [
789 libxslt
790 libxml2
791 ];
792 internalDeps = [ php.extensions.dom ];
793 doCheck = false;
794 env.NIX_CFLAGS_COMPILE = toString [
795 "-I../.."
796 "-DHAVE_DOM"
797 ];
798 configureFlags = [ "--with-xsl=${libxslt.dev}" ];
799 }
800 {
801 name = "zend_test";
802 internalDeps = [ php.extensions.dom ];
803 env.NIX_CFLAGS_COMPILE = "-I${libxml2.dev}/include/libxml2";
804 }
805 {
806 name = "zip";
807 buildInputs = [
808 libzip
809 pcre2
810 ];
811 configureFlags = [
812 "--with-zip"
813 ];
814 doCheck = false;
815 }
816 {
817 name = "zlib";
818 buildInputs = [ zlib ];
819 configureFlags = [
820 "--with-zlib"
821 ];
822 }
823 ]
824 ++ lib.optionals (lib.versionOlder php.version "8.3") [
825 # Using version from PECL on new PHP versions.
826 {
827 name = "imap";
828 buildInputs = [
829 uwimap
830 openssl
831 pam
832 pcre2
833 libkrb5
834 ];
835 configureFlags = [
836 "--with-imap=${uwimap}"
837 "--with-imap-ssl"
838 "--with-kerberos"
839 ];
840 }
841 ];
842
843 # Convert the list of attrs:
844 # [ { name = <name>; ... } ... ]
845 # to a list of
846 # [ { name = <name>; value = <extension drv>; } ... ]
847 #
848 # which we later use listToAttrs to make all attrs available by name.
849 namedExtensions = builtins.map (drv: {
850 name = drv.name;
851 value = mkExtension drv;
852 }) extensionData;
853
854 in
855 # Produce the final attribute set of all extensions defined.
856 builtins.listToAttrs namedExtensions
857 );
858 }
859)