diff --git a/doc/languages-frameworks/php.section.md b/doc/languages-frameworks/php.section.md index 763beeb593583..5977363323f18 100644 --- a/doc/languages-frameworks/php.section.md +++ b/doc/languages-frameworks/php.section.md @@ -135,3 +135,21 @@ Example of building `composer` with additional extensions: enabled ++ (with all; [ imagick redis ])) ).packages.composer ``` + +### Overriding PHP packages {#ssec-php-user-guide-overriding-packages} + +`php-packages.nix` form a scope, allowing us to override the packages defined within. For example, to apply a patch to a `mysqlnd` extension, you can simply pass an overlay-style function to `php`’s `packageOverrides` argument: + +```nix +php.override { + packageOverrides = final: prev: { + extensions = prev.extensions // { + mysqlnd = prev.extensions.mysqlnd.overrideAttrs (attrs: { + patches = attrs.patches or [] ++ [ + … + ]; + }); + }; + }; +} +``` diff --git a/pkgs/development/interpreters/php/generic.nix b/pkgs/development/interpreters/php/generic.nix index 4a96abcf9b693..82134e14406f8 100644 --- a/pkgs/development/interpreters/php/generic.nix +++ b/pkgs/development/interpreters/php/generic.nix @@ -13,6 +13,7 @@ let , version , sha256 , extraPatches ? [] + , packageOverrides ? (final: prev: {}) # Sapi flags , cgiSupport ? true @@ -49,8 +50,8 @@ let php = generic filteredArgs; php-packages = (callPackage ../../../top-level/php-packages.nix { - php = phpWithExtensions; - }); + phpPackage = phpWithExtensions; + }).overrideScope' packageOverrides; allExtensionFunctions = prevExtensionFunctions ++ [ extensions ]; enabledExtensions = @@ -112,7 +113,8 @@ let phpIni = "${phpWithExtensions}/lib/php.ini"; unwrapped = php; tests = nixosTests.php; - inherit (php-packages) packages extensions buildPecl; + inherit (php-packages) extensions buildPecl; + packages = php-packages.tools; meta = php.meta // { outputsToInstall = [ "out" ]; }; diff --git a/pkgs/top-level/php-packages.nix b/pkgs/top-level/php-packages.nix index d5bebb9bd8474..cc8ba346ae56c 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, pkgs, fetchgit, php, autoconf, pkgconfig, re2c +{ stdenv, lib, pkgs, fetchgit, phpPackage, autoconf, pkgconfig, re2c , gettext, bzip2, curl, libxml2, openssl, gmp, icu64, oniguruma, libsodium , html-tidy, libzip, zlib, pcre, pcre2, libxslt, aspell, openldap, cyrus_sasl , uwimap, pam, libiconv, enchant1, libXpm, gd, libwebp, libjpeg, libpng @@ -6,7 +6,7 @@ , readline, rsync, fetchpatch, valgrind }: -let +lib.makeScope pkgs.newScope (self: with self; { buildPecl = import ../build-support/build-pecl.nix { php = php.unwrapped; inherit lib; @@ -21,15 +21,10 @@ let pcre' = if (lib.versionAtLeast php.version "7.3") then pcre2 else pcre; - callPackage = pkgs.newScope { - inherit mkDerivation php buildPecl pcre'; - }; -in -{ - inherit buildPecl; + php = phpPackage; # This is a set of interactive tools based on PHP. - packages = { + tools = { box = callPackage ../development/php-packages/box { }; composer = callPackage ../development/php-packages/composer { }; @@ -550,4 +545,4 @@ in # Produce the final attribute set of all extensions defined. in builtins.listToAttrs namedExtensions); -} +})