@ -148,55 +148,61 @@ let
generic' = { version , sha256 , self , selfWithExtensions , . . . } @ args :
let
php = generic ( builtins . removeAttrs args [ " s e l f " " s e l f W i t h E x t e n s i o n s " ] ) ;
filteredArgs = builtins . removeAttrs args [ " s e l f " " s e l f W i t h E x t e n s i o n s " ] ;
php = generic filteredArgs ;
php-packages = ( callPackage ../../../top-level/php-packages.nix {
php = self ;
phpWithExtensions = selfWithExtensions ;
} ) ;
buildEnv = { extensions ? ( _ : [ ] ) , extraConfig ? " " }:
let
getExtName = ext : lib . removePrefix " p h p - " ( 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
# with textClosureList, which is used to put the strings in
# the right order - if a plugin which is dependent on
# another plugin is placed before its dependency, it will
# fail to load.
extensionTexts =
lib . listToAttrs
( map ( ext :
let
extName = getExtName ext ;
type = " ${ lib . optionalString ( ext . zendExtension or false ) " z e n d _ " } e x t e n s i o n " ;
in
lib . nameValuePair extName {
text = " ${ type } = ${ ext } / l i b / p h p / e x t e n s i o n s / ${ extName } . s o " ;
deps = lib . optionals ( ext ? internalDeps )
( map getExtName ext . internalDeps ) ;
} )
enabledExtensions ) ;
extNames = map getExtName enabledExtensions ;
extraInit = writeText " c u s t o m - p h p . i n i " ''
buildEnv = lib . makeOverridable (
{ extensions ? ( _ : [ ] ) , extraConfig ? " " , . . . } @ innerArgs :
let
filteredInnerArgs = builtins . removeAttrs innerArgs [ " e x t e n s i o n s " " e x t r a C o n f i g " ] ;
allArgs = filteredArgs // filteredInnerArgs ;
php = generic allArgs ;
getExtName = ext : lib . removePrefix " p h p - " ( 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
# with textClosureList, which is used to put the strings in
# the right order - if a plugin which is dependent on
# another plugin is placed before its dependency, it will
# fail to load.
extensionTexts =
lib . listToAttrs
( map ( ext :
let
extName = getExtName ext ;
type = " ${ lib . optionalString ( ext . zendExtension or false ) " z e n d _ " } e x t e n s i o n " ;
in
lib . nameValuePair extName {
text = " ${ type } = ${ ext } / l i b / p h p / e x t e n s i o n s / ${ extName } . s o " ;
deps = lib . optionals ( ext ? internalDeps )
( map getExtName ext . internalDeps ) ;
} )
enabledExtensions ) ;
extNames = map getExtName enabledExtensions ;
extraInit = writeText " c u s t o m - p h p . i n i " ''
$ { lib . concatStringsSep " \n "
( lib . textClosureList extensionTexts extNames ) }
$ { extraConfig }
'' ;
in
symlinkJoin {
name = " p h p - w i t h - e x t e n s i o n s - ${ version } " ;
inherit ( php ) version ;
nativeBuildInputs = [ makeWrapper ] ;
passthru = {
inherit buildEnv withExtensions enabledExtensions ;
inherit ( php-packages ) packages extensions ;
} ;
paths = [ php ] ;
postBuild = ''
in
symlinkJoin {
name = " p h p - w i t h - e x t e n s i o n s - ${ version } " ;
inherit ( php ) version ;
nativeBuildInputs = [ makeWrapper ] ;
passthru = {
inherit buildEnv withExtensions enabledExtensions ;
inherit ( php-packages ) packages extensions ;
} ;
paths = [ php ] ;
postBuild = ''
cp $ { extraInit } $ out/lib/custom-php.ini
wrapProgram $ out/bin/php - - set PHP_INI_SCAN_DIR $ out/lib
@ -205,7 +211,7 @@ let
wrapProgram $ out/bin/php-fpm - - set PHP_INI_SCAN_DIR $ out/lib
fi
'' ;
} ;
} ) ;
withExtensions = extensions : buildEnv { inherit extensions ; } ;
in