about summary refs log tree commit diff
path: root/pkgs/development/interpreters/php
diff options
context:
space:
mode:
authortalyz <kim.lindberger@gmail.com>2020-04-12 23:31:56 +0200
committertalyz <kim.lindberger@gmail.com>2020-04-26 16:43:05 +0200
commit2ba79269590cd186c3ad6e5226c4322de8984d87 (patch)
tree1606c5623b36fd7eb0e9a78b9c7eb2b8b700bb84 /pkgs/development/interpreters/php
parentabedfadd7376a2edf59bbfaa7ab101411d042529 (diff)
downloadnixlib-2ba79269590cd186c3ad6e5226c4322de8984d87.tar
nixlib-2ba79269590cd186c3ad6e5226c4322de8984d87.tar.gz
nixlib-2ba79269590cd186c3ad6e5226c4322de8984d87.tar.bz2
nixlib-2ba79269590cd186c3ad6e5226c4322de8984d87.tar.lz
nixlib-2ba79269590cd186c3ad6e5226c4322de8984d87.tar.xz
nixlib-2ba79269590cd186c3ad6e5226c4322de8984d87.tar.zst
nixlib-2ba79269590cd186c3ad6e5226c4322de8984d87.zip
php.buildEnv: Provide a list of currently enabled extensions
Rework withExtensions / buildEnv to handle currently enabled
extensions better and make them compatible with override. They now
accept a function with the named arguments enabled and all, where
enabled is a list of currently enabled extensions and all is the set
of all extensions. This gives us several nice properties:

 - You always get the right version of the list of currently enabled
   extensions

 - Invocations chain

 - It works well with overridden PHP packages - you always get the
   correct versions of extensions

As a contrived example of what's possible, you can add ImageMagick,
then override the version and disable fpm, then disable cgi, and
lastly remove the zip extension like this:

{ pkgs ? (import <nixpkgs>) {} }:
with pkgs;

let
  phpWithImagick = php74.withExtensions ({ all, enabled }: enabled ++ [ all.imagick ]);

  phpWithImagickWithoutFpm743 = phpWithImagick.override {
    version = "7.4.3";
    sha256 = "wVF7pJV4+y3MZMc6Ptx21PxQfEp6xjmYFYTMfTtMbRQ=";
    fpmSupport = false;
  };

  phpWithImagickWithoutFpmZip743 = phpWithImagickWithoutFpm743.withExtensions (
    { enabled, all }:
      lib.filter (e: e != all.zip) enabled);

  phpWithImagickWithoutFpmZipCgi743 = phpWithImagickWithoutFpmZip743.override {
    cgiSupport = false;
  };
in
  phpWithImagickWithoutFpmZipCgi743
Diffstat (limited to 'pkgs/development/interpreters/php')
-rw-r--r--pkgs/development/interpreters/php/default.nix41
1 files changed, 27 insertions, 14 deletions
diff --git a/pkgs/development/interpreters/php/default.nix b/pkgs/development/interpreters/php/default.nix
index c1a7cdd11c47..2313f9fbcc48 100644
--- a/pkgs/development/interpreters/php/default.nix
+++ b/pkgs/development/interpreters/php/default.nix
@@ -43,8 +43,16 @@ let
           phpWithExtensions = self.withExtensions defaultPhpExtensions;
         });
 
-        mkBuildEnv = prevArgs: lib.makeOverridable (
-          { extensions ? (_: []), extraConfig ? "", ... }@innerArgs:
+        # buildEnv wraps php to provide additional extensions and
+        # configuration. Its usage is documented in
+        # doc/languages-frameworks/php.section.md.
+        #
+        # Create a buildEnv with earlier overridden values and
+        # extensions functions in its closure. This is necessary for
+        # consecutive calls to buildEnv and overrides to work as
+        # expected.
+        mkBuildEnv = prevArgs: prevExtensionFunctions: lib.makeOverridable (
+          { extensions ? ({...}: []), extraConfig ? "", ... }@innerArgs:
             let
               allArgs = args // prevArgs // innerArgs;
               filteredArgs = builtins.removeAttrs allArgs [ "extensions" "extraConfig" ];
@@ -54,8 +62,15 @@ let
                 inherit php phpWithExtensions;
               });
 
+              allExtensionFunctions = prevExtensionFunctions ++ [ extensions ];
+              enabledExtensions =
+                builtins.foldl'
+                  (state: f:
+                    f { enabled = state; all = php-packages.extensions; })
+                  []
+                  allExtensionFunctions;
+
               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
@@ -89,9 +104,8 @@ let
                 inherit (php) version;
                 nativeBuildInputs = [ makeWrapper ];
                 passthru = {
-                  buildEnv = mkBuildEnv allArgs;
-                  withExtensions = mkWithExtensions allArgs;
-                  inherit enabledExtensions;
+                  buildEnv = mkBuildEnv allArgs allExtensionFunctions;
+                  withExtensions = mkWithExtensions allArgs allExtensionFunctions;
                   inherit (php-packages) packages extensions;
                 };
                 paths = [ php ];
@@ -108,8 +122,8 @@ let
             in
               phpWithExtensions);
 
-        mkWithExtensions = prevArgs: extensions:
-          mkBuildEnv prevArgs { inherit extensions; };
+        mkWithExtensions = prevArgs: prevExtensionFunctions: extensions:
+          mkBuildEnv prevArgs prevExtensionFunctions { inherit extensions; };
 
         pcre' = if (lib.versionAtLeast version "7.3") then pcre2 else pcre;
       in
@@ -218,9 +232,8 @@ let
           outputs = [ "out" "dev" ];
 
           passthru = {
-            enabledExtensions = [];
-            buildEnv = mkBuildEnv {};
-            withExtensions = mkWithExtensions {};
+            buildEnv = mkBuildEnv {} [];
+            withExtensions = mkWithExtensions {} [];
             inherit (php-packages) packages extensions;
           };
 
@@ -258,7 +271,7 @@ let
     inherit defaultPhpExtensions;
   });
 
-  defaultPhpExtensions = extensions: with extensions; ([
+  defaultPhpExtensions = { all, ... }: with all; ([
     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
@@ -266,8 +279,8 @@ let
     tokenizer xmlreader xmlwriter zip zlib
   ] ++ lib.optionals (!stdenv.isDarwin) [ imap ]);
 
-  defaultPhpExtensionsWithHash = extensions:
-    (defaultPhpExtensions extensions) ++ [ extensions.hash ];
+  defaultPhpExtensionsWithHash = { all, ... }:
+    (defaultPhpExtensions { inherit all; }) ++ [ all.hash ];
 
   php74 = php74base.withExtensions defaultPhpExtensions;
   php73 = php73base.withExtensions defaultPhpExtensionsWithHash;