php: Add enabledExtensions attribute to PHP derivations

This provides a means to build a PHP package based on a list of
extensions from another.

For example, to generate a package with all default extensions
enabled, except opcache, but with ImageMagick:

php.withExtensions (e:
  (lib.filter (e: e != php.extensions.opcache) php.enabledExtensions)
  ++ [ e.imagick ])
This commit is contained in:
talyz 2020-04-05 15:56:28 +02:00
parent 8d2e5d5cd6
commit ca8b8a26e9
No known key found for this signature in database
GPG key ID: 2DED2151F4671A2B
2 changed files with 21 additions and 6 deletions

View file

@ -48,6 +48,21 @@ enabled:
php.withExtensions (e: with e; [ imagick opcache ])
```
Note that this will give you a package with _only_ opcache and
ImageMagick, none of the other extensions which are enabled by default
in the `php` package will be available.
To enable building on a previous PHP package, the currently enabled
extensions are made available in its `enabledExtensions`
attribute. For example, to generate a package with all default
extensions enabled, except opcache, but with ImageMagick:
```nix
php.withExtensions (e:
(lib.filter (e: e != php.extensions.opcache) php.enabledExtensions)
++ [ e.imagick ])
```
If you want a PHP build with extra configuration in the `php.ini`
file, you can use `php.buildEnv`. This function takes two named and
optional parameters: `extensions` and `extraConfig`. `extensions`

View file

@ -158,7 +158,7 @@ let
buildEnv = { extensions ? (_: []), extraConfig ? "" }:
let
getExtName = ext: lib.removePrefix "php-" (builtins.parseDrvName ext.name).name;
extList = extensions php-packages.extensions;
enabledExtensions = extensions php-packages.extensions;
# Generate extension load configuration snippets from the
# extension parameter. This is an attrset suitable for use
@ -178,9 +178,9 @@ let
deps = lib.optionals (ext ? internalDeps)
(map getExtName ext.internalDeps);
})
extList);
enabledExtensions);
extNames = map getExtName extList;
extNames = map getExtName enabledExtensions;
extraInit = writeText "custom-php.ini" ''
${lib.concatStringsSep "\n"
(lib.textClosureList extensionTexts extNames)}
@ -189,11 +189,10 @@ let
in
symlinkJoin {
name = "php-with-extensions-${version}";
inherit version;
inherit (php) dev;
inherit (php) version dev;
nativeBuildInputs = [ makeWrapper ];
passthru = {
inherit buildEnv withExtensions;
inherit buildEnv withExtensions enabledExtensions;
inherit (php-packages) packages extensions;
};
paths = [ php ];
@ -212,6 +211,7 @@ let
in
php.overrideAttrs (_: {
passthru = {
enabledExtensions = [];
inherit buildEnv withExtensions;
inherit (php-packages) packages extensions;
};