diff options
author | talyz <kim.lindberger@gmail.com> | 2020-04-12 23:31:56 +0200 |
---|---|---|
committer | talyz <kim.lindberger@gmail.com> | 2020-04-26 16:43:05 +0200 |
commit | 2ba79269590cd186c3ad6e5226c4322de8984d87 (patch) | |
tree | 1606c5623b36fd7eb0e9a78b9c7eb2b8b700bb84 /pkgs/development/interpreters/php | |
parent | abedfadd7376a2edf59bbfaa7ab101411d042529 (diff) | |
download | nixlib-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.nix | 41 |
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; |