lol
at 25.11-pre 859 lines 28 kB view raw
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)