diff options
Diffstat (limited to 'pkgs/build-support/php')
14 files changed, 585 insertions, 326 deletions
diff --git a/pkgs/build-support/php/build-composer-project.nix b/pkgs/build-support/php/build-composer-project.nix deleted file mode 100644 index 80c63bcde71b9..0000000000000 --- a/pkgs/build-support/php/build-composer-project.nix +++ /dev/null @@ -1,85 +0,0 @@ -{ callPackage, stdenvNoCC, lib, writeTextDir, php, makeBinaryWrapper, fetchFromGitHub, fetchurl }: - -let - buildComposerProjectOverride = finalAttrs: previousAttrs: - - let - phpDrv = finalAttrs.php or php; - composer = finalAttrs.composer or phpDrv.packages.composer; - composer-local-repo-plugin = callPackage ./pkgs/composer-local-repo-plugin.nix { }; - in - { - composerLock = previousAttrs.composerLock or null; - composerNoDev = previousAttrs.composerNoDev or true; - composerNoPlugins = previousAttrs.composerNoPlugins or true; - composerNoScripts = previousAttrs.composerNoScripts or true; - composerStrictValidation = previousAttrs.composerStrictValidation or true; - - nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ - composer - composer-local-repo-plugin - phpDrv - phpDrv.composerHooks.composerInstallHook - ]; - - buildInputs = (previousAttrs.buildInputs or [ ]) ++ [ - phpDrv - ]; - - patches = previousAttrs.patches or [ ]; - strictDeps = previousAttrs.strictDeps or true; - - # Should we keep these empty phases? - configurePhase = previousAttrs.configurePhase or '' - runHook preConfigure - - runHook postConfigure - ''; - - buildPhase = previousAttrs.buildPhase or '' - runHook preBuild - - runHook postBuild - ''; - - doCheck = previousAttrs.doCheck or true; - checkPhase = previousAttrs.checkPhase or '' - runHook preCheck - - runHook postCheck - ''; - - installPhase = previousAttrs.installPhase or '' - runHook preInstall - - runHook postInstall - ''; - - doInstallCheck = previousAttrs.doInstallCheck or false; - installCheckPhase = previousAttrs.installCheckPhase or '' - runHook preInstallCheck - - runHook postInstallCheck - ''; - - composerRepository = phpDrv.mkComposerRepository { - inherit composer composer-local-repo-plugin; - inherit (finalAttrs) patches pname src vendorHash version; - - composerLock = previousAttrs.composerLock or null; - composerNoDev = previousAttrs.composerNoDev or true; - composerNoPlugins = previousAttrs.composerNoPlugins or true; - composerNoScripts = previousAttrs.composerNoScripts or true; - composerStrictValidation = previousAttrs.composerStrictValidation or true; - }; - - COMPOSER_CACHE_DIR="/dev/null"; - COMPOSER_DISABLE_NETWORK="1"; - COMPOSER_MIRROR_PATH_REPOS="1"; - - meta = previousAttrs.meta or { } // { - platforms = lib.platforms.all; - }; - }; -in -args: (stdenvNoCC.mkDerivation args).overrideAttrs buildComposerProjectOverride diff --git a/pkgs/build-support/php/build-pecl.nix b/pkgs/build-support/php/build-pecl.nix index 6f38a668f3a34..16913a85c63de 100644 --- a/pkgs/build-support/php/build-pecl.nix +++ b/pkgs/build-support/php/build-pecl.nix @@ -1,45 +1,69 @@ -{ stdenv, lib, php, autoreconfHook, fetchurl, re2c, nix-update-script }: +{ + stdenv, + lib, + php, + autoreconfHook, + fetchurl, + re2c, + nix-update-script, +}: -{ pname -, version -, internalDeps ? [ ] -, peclDeps ? [ ] -, buildInputs ? [ ] -, nativeBuildInputs ? [ ] -, postPhpize ? "" -, makeFlags ? [ ] -, src ? fetchurl ({ - url = "https://pecl.php.net/get/${pname}-${version}.tgz"; - } // lib.filterAttrs (attrName: _: lib.elem attrName [ "sha256" "hash" ]) args) -, passthru ? { } -, ... +{ + pname, + version, + internalDeps ? [ ], + peclDeps ? [ ], + buildInputs ? [ ], + nativeBuildInputs ? [ ], + postPhpize ? "", + makeFlags ? [ ], + src ? fetchurl ( + { + url = "https://pecl.php.net/get/${pname}-${version}.tgz"; + } + // lib.filterAttrs ( + attrName: _: + lib.elem attrName [ + "sha256" + "hash" + ] + ) args + ), + passthru ? { }, + ... }@args: -stdenv.mkDerivation (args // { - name = "php-${pname}-${version}"; - extensionName = pname; +stdenv.mkDerivation ( + args + // { + name = "php-${pname}-${version}"; + extensionName = pname; - inherit src; + inherit src; - nativeBuildInputs = [ autoreconfHook re2c ] ++ nativeBuildInputs; - buildInputs = [ php ] ++ peclDeps ++ buildInputs; + nativeBuildInputs = [ + autoreconfHook + re2c + ] ++ nativeBuildInputs; + buildInputs = [ php ] ++ peclDeps ++ buildInputs; - makeFlags = [ "EXTENSION_DIR=$(out)/lib/php/extensions" ] ++ makeFlags; + makeFlags = [ "EXTENSION_DIR=$(out)/lib/php/extensions" ] ++ makeFlags; - autoreconfPhase = '' - phpize - ${postPhpize} - ${lib.concatMapStringsSep "\n" - (dep: "mkdir -p ext; ln -s ${dep.dev}/include ext/${dep.extensionName}") - internalDeps} - ''; - checkPhase = "NO_INTERACTON=yes make test"; + autoreconfPhase = '' + phpize + ${postPhpize} + ${lib.concatMapStringsSep "\n" ( + dep: "mkdir -p ext; ln -s ${dep.dev}/include ext/${dep.extensionName}" + ) internalDeps} + ''; + checkPhase = "NO_INTERACTON=yes make test"; - passthru = passthru // { - # Thes flags were introduced for `nix-update` so that it can update - # PHP extensions correctly. - # See the corresponding PR: https://github.com/Mic92/nix-update/pull/123 - isPhpExtension = true; - updateScript = nix-update-script {}; - }; -}) + passthru = passthru // { + # Thes flags were introduced for `nix-update` so that it can update + # PHP extensions correctly. + # See the corresponding PR: https://github.com/Mic92/nix-update/pull/123 + isPhpExtension = true; + updateScript = nix-update-script { }; + }; + } +) diff --git a/pkgs/build-support/php/builders/default.nix b/pkgs/build-support/php/builders/default.nix new file mode 100644 index 0000000000000..ea9bb33504356 --- /dev/null +++ b/pkgs/build-support/php/builders/default.nix @@ -0,0 +1,9 @@ +{ callPackage, callPackages, ... }: +{ + v1 = { + buildComposerProject = callPackage ./v1/build-composer-project.nix { }; + buildComposerWithPlugin = callPackage ./v1/build-composer-with-plugin.nix { }; + mkComposerRepository = callPackage ./v1/build-composer-repository.nix { }; + composerHooks = callPackages ./v1/hooks { }; + }; +} diff --git a/pkgs/build-support/php/builders/v1/build-composer-project.nix b/pkgs/build-support/php/builders/v1/build-composer-project.nix new file mode 100644 index 0000000000000..698391ad1603c --- /dev/null +++ b/pkgs/build-support/php/builders/v1/build-composer-project.nix @@ -0,0 +1,108 @@ +{ + nix-update-script, + stdenvNoCC, + lib, + php, +}: + +let + buildComposerProjectOverride = + finalAttrs: previousAttrs: + + let + phpDrv = finalAttrs.php or php; + composer = finalAttrs.composer or phpDrv.packages.composer-local-repo-plugin; + in + { + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + + nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ + composer + phpDrv + phpDrv.composerHooks.composerInstallHook + ]; + + buildInputs = (previousAttrs.buildInputs or [ ]) ++ [ phpDrv ]; + + patches = previousAttrs.patches or [ ]; + strictDeps = previousAttrs.strictDeps or true; + + # Should we keep these empty phases? + configurePhase = + previousAttrs.configurePhase or '' + runHook preConfigure + + runHook postConfigure + ''; + + buildPhase = + previousAttrs.buildPhase or '' + runHook preBuild + + runHook postBuild + ''; + + doCheck = previousAttrs.doCheck or true; + checkPhase = + previousAttrs.checkPhase or '' + runHook preCheck + + runHook postCheck + ''; + + installPhase = + previousAttrs.installPhase or '' + runHook preInstall + + runHook postInstall + ''; + + doInstallCheck = previousAttrs.doInstallCheck or false; + installCheckPhase = + previousAttrs.installCheckPhase or '' + runHook preInstallCheck + + runHook postInstallCheck + ''; + + composerRepository = + previousAttrs.composerRepository or (phpDrv.mkComposerRepository { + inherit composer; + inherit (finalAttrs) + patches + pname + src + vendorHash + version + ; + + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + }); + + # Projects providing a lockfile from upstream can be automatically updated. + passthru = previousAttrs.passthru or { } // { + updateScript = + previousAttrs.passthru.updateScript + or (if finalAttrs.composerRepository.composerLock == null then nix-update-script { } else null); + }; + + env = { + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_DISABLE_NETWORK = "1"; + COMPOSER_MIRROR_PATH_REPOS = "1"; + }; + + meta = previousAttrs.meta or { } // { + platforms = lib.platforms.all; + }; + }; +in +args: (stdenvNoCC.mkDerivation args).overrideAttrs buildComposerProjectOverride diff --git a/pkgs/build-support/php/build-composer-repository.nix b/pkgs/build-support/php/builders/v1/build-composer-repository.nix index e359c0829aaf7..037d8bdeb3eb1 100644 --- a/pkgs/build-support/php/build-composer-repository.nix +++ b/pkgs/build-support/php/builders/v1/build-composer-repository.nix @@ -1,4 +1,8 @@ -{ callPackage, stdenvNoCC, lib, writeTextDir, fetchFromGitHub, php }: +{ + stdenvNoCC, + lib, + php, +}: let mkComposerRepositoryOverride = @@ -18,16 +22,27 @@ let let phpDrv = finalAttrs.php or php; - composer = finalAttrs.composer or phpDrv.packages.composer; - composer-local-repo-plugin = callPackage ./pkgs/composer-local-repo-plugin.nix { }; + composer = finalAttrs.composer or phpDrv.packages.composer-local-repo-plugin; in assert (lib.assertMsg (previousAttrs ? src) "mkComposerRepository expects src argument."); - assert (lib.assertMsg (previousAttrs ? vendorHash) "mkComposerRepository expects vendorHash argument."); + assert ( + lib.assertMsg (previousAttrs ? vendorHash) "mkComposerRepository expects vendorHash argument." + ); assert (lib.assertMsg (previousAttrs ? version) "mkComposerRepository expects version argument."); assert (lib.assertMsg (previousAttrs ? pname) "mkComposerRepository expects pname argument."); - assert (lib.assertMsg (previousAttrs ? composerNoDev) "mkComposerRepository expects composerNoDev argument."); - assert (lib.assertMsg (previousAttrs ? composerNoPlugins) "mkComposerRepository expects composerNoPlugins argument."); - assert (lib.assertMsg (previousAttrs ? composerNoScripts) "mkComposerRepository expects composerNoScripts argument."); + assert ( + lib.assertMsg (previousAttrs ? composerNoDev) "mkComposerRepository expects composerNoDev argument." + ); + assert ( + lib.assertMsg ( + previousAttrs ? composerNoPlugins + ) "mkComposerRepository expects composerNoPlugins argument." + ); + assert ( + lib.assertMsg ( + previousAttrs ? composerNoScripts + ) "mkComposerRepository expects composerNoScripts argument." + ); { composerNoDev = previousAttrs.composerNoDev or true; composerNoPlugins = previousAttrs.composerNoPlugins or true; @@ -41,7 +56,6 @@ let nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ composer - composer-local-repo-plugin phpDrv phpDrv.composerHooks.composerRepositoryHook ]; @@ -51,45 +65,53 @@ let strictDeps = previousAttrs.strictDeps or true; # Should we keep these empty phases? - configurePhase = previousAttrs.configurePhase or '' - runHook preConfigure + configurePhase = + previousAttrs.configurePhase or '' + runHook preConfigure - runHook postConfigure - ''; + runHook postConfigure + ''; - buildPhase = previousAttrs.buildPhase or '' - runHook preBuild + buildPhase = + previousAttrs.buildPhase or '' + runHook preBuild - runHook postBuild - ''; + runHook postBuild + ''; doCheck = previousAttrs.doCheck or true; - checkPhase = previousAttrs.checkPhase or '' - runHook preCheck + checkPhase = + previousAttrs.checkPhase or '' + runHook preCheck - runHook postCheck - ''; + runHook postCheck + ''; - installPhase = previousAttrs.installPhase or '' - runHook preInstall + installPhase = + previousAttrs.installPhase or '' + runHook preInstall - runHook postInstall - ''; + runHook postInstall + ''; doInstallCheck = previousAttrs.doInstallCheck or false; - installCheckPhase = previousAttrs.installCheckPhase or '' - runHook preInstallCheck + installCheckPhase = + previousAttrs.installCheckPhase or '' + runHook preInstallCheck - runHook postInstallCheck - ''; + runHook postInstallCheck + ''; - COMPOSER_CACHE_DIR = "/dev/null"; - COMPOSER_MIRROR_PATH_REPOS = "1"; - COMPOSER_HTACCESS_PROTECT = "0"; - COMPOSER_DISABLE_NETWORK = "0"; + env = { + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_MIRROR_PATH_REPOS = "1"; + COMPOSER_HTACCESS_PROTECT = "0"; + COMPOSER_DISABLE_NETWORK = "0"; + }; outputHashMode = "recursive"; - outputHashAlgo = if (finalAttrs ? vendorHash && finalAttrs.vendorHash != "") then null else "sha256"; + outputHashAlgo = + if (finalAttrs ? vendorHash && finalAttrs.vendorHash != "") then null else "sha256"; outputHash = finalAttrs.vendorHash or ""; }; in diff --git a/pkgs/build-support/php/builders/v1/build-composer-with-plugin.nix b/pkgs/build-support/php/builders/v1/build-composer-with-plugin.nix new file mode 100644 index 0000000000000..060b51241e6c8 --- /dev/null +++ b/pkgs/build-support/php/builders/v1/build-composer-with-plugin.nix @@ -0,0 +1,161 @@ +{ + stdenvNoCC, + writeText, + lib, + makeBinaryWrapper, + php, + cacert, + nix-update-script, +}: + +let + composerJsonBuilder = + pluginName: pluginVersion: + writeText "composer.json" ( + builtins.toJSON { + name = "nix/plugin"; + description = "Nix Composer plugin"; + license = "MIT"; + require = { + "${pluginName}" = "${pluginVersion}"; + }; + config = { + "allow-plugins" = { + "${pluginName}" = true; + }; + }; + repositories = [ + { + type = "path"; + url = "./src"; + options = { + versions = { + "${pluginName}" = "${pluginVersion}"; + }; + }; + } + ]; + } + ); + + buildComposerWithPluginOverride = + finalAttrs: previousAttrs: + + let + phpDrv = finalAttrs.php or php; + composer = finalAttrs.composer or phpDrv.packages.composer; + in + { + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + composerGlobal = true; + + nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ + composer + phpDrv + makeBinaryWrapper + ]; + + buildInputs = (previousAttrs.buildInputs or [ ]) ++ [ phpDrv ]; + + patches = previousAttrs.patches or [ ]; + strictDeps = previousAttrs.strictDeps or true; + + # Should we keep these empty phases? + configurePhase = + previousAttrs.configurePhase or '' + runHook preConfigure + + runHook postConfigure + ''; + + buildPhase = + previousAttrs.buildPhase or '' + runHook preBuild + + runHook postBuild + ''; + + doCheck = previousAttrs.doCheck or true; + + checkPhase = + previousAttrs.checkPhase or '' + runHook preCheck + + runHook postCheck + ''; + + installPhase = + previousAttrs.installPhase or '' + runHook preInstall + + makeWrapper ${lib.getExe composer} $out/bin/composer \ + --prefix COMPOSER_HOME : ${finalAttrs.vendor} + + runHook postInstall + ''; + + doInstallCheck = previousAttrs.doInstallCheck or false; + installCheckPhase = + previousAttrs.installCheckPhase or '' + runHook preInstallCheck + + composer global show ${finalAttrs.pname} + + runHook postInstallCheck + ''; + + vendor = previousAttrs.vendor or stdenvNoCC.mkDerivation { + pname = "${finalAttrs.pname}-vendor"; + pluginName = finalAttrs.pname; + + inherit (finalAttrs) version src; + + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + composerGlobal = true; + composerJson = composerJsonBuilder finalAttrs.pname finalAttrs.version; + + nativeBuildInputs = [ + cacert + composer + phpDrv.composerHooks.composerWithPluginVendorHook + ]; + + dontPatchShebangs = true; + doCheck = true; + doInstallCheck = true; + + env = { + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_HTACCESS_PROTECT = "0"; + }; + + outputHashMode = "recursive"; + outputHashAlgo = "sha256"; + outputHash = finalAttrs.vendorHash; + }; + + # Projects providing a lockfile from upstream can be automatically updated. + passthru = previousAttrs.passthru or { } // { + updateScript = + previousAttrs.passthru.updateScript + or (if finalAttrs.vendor.composerLock == null then nix-update-script { } else null); + }; + + env = { + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_DISABLE_NETWORK = "1"; + COMPOSER_MIRROR_PATH_REPOS = "1"; + }; + + meta = previousAttrs.meta or composer.meta; + }; +in +args: (stdenvNoCC.mkDerivation args).overrideAttrs buildComposerWithPluginOverride diff --git a/pkgs/build-support/php/hooks/composer-install-hook.sh b/pkgs/build-support/php/builders/v1/hooks/composer-install-hook.sh index a91263422bc84..44e87d06d3a53 100644 --- a/pkgs/build-support/php/hooks/composer-install-hook.sh +++ b/pkgs/build-support/php/builders/v1/hooks/composer-install-hook.sh @@ -83,7 +83,7 @@ composerInstallBuildHook() { # Since this file cannot be generated in the composer-repository-hook.sh # because the file contains hardcoded nix store paths, we generate it here. - composer-local-repo-plugin --no-ansi build-local-repo-lock -m "${composerRepository}" . + composer build-local-repo-lock -m "${composerRepository}" . echo "Finished composerInstallBuildHook" } diff --git a/pkgs/build-support/php/hooks/composer-repository-hook.sh b/pkgs/build-support/php/builders/v1/hooks/composer-repository-hook.sh index c4fa0d52126c1..ec9777541fc0f 100644 --- a/pkgs/build-support/php/hooks/composer-repository-hook.sh +++ b/pkgs/build-support/php/builders/v1/hooks/composer-repository-hook.sh @@ -63,7 +63,7 @@ composerRepositoryBuildHook() { # Build the local composer repository # The command 'build-local-repo' is provided by the Composer plugin # nix-community/composer-local-repo-plugin. - composer-local-repo-plugin --no-ansi build-local-repo-lock ${composerNoDev:+--no-dev} -r repository + composer build-local-repo-lock ${composerNoDev:+--no-dev} -r repository echo "Finished composerRepositoryBuildHook" } diff --git a/pkgs/build-support/php/builders/v1/hooks/composer-with-plugin-vendor-hook.sh b/pkgs/build-support/php/builders/v1/hooks/composer-with-plugin-vendor-hook.sh new file mode 100644 index 0000000000000..0d88d14094ad4 --- /dev/null +++ b/pkgs/build-support/php/builders/v1/hooks/composer-with-plugin-vendor-hook.sh @@ -0,0 +1,93 @@ +declare composerLock +declare version +declare composerNoDev +declare composerNoPlugins +declare composerNoScripts +declare composerStrictValidation + +preConfigureHooks+=(composerWithPluginConfigureHook) +preBuildHooks+=(composerWithPluginBuildHook) +preCheckHooks+=(composerWithPluginCheckHook) +preInstallHooks+=(composerWithPluginInstallHook) +preInstallCheckHooks+=(composerWithPluginInstallCheckHook) + +source @phpScriptUtils@ + +composerWithPluginConfigureHook() { + echo "Executing composerWithPluginConfigureHook" + + mkdir -p $out + + export COMPOSER_HOME=$out + + if [[ -e "$composerLock" ]]; then + cp $composerLock $out/composer.lock + fi + + cp $composerJson $out/composer.json + cp -ar $src $out/src + + if [[ ! -f "$out/composer.lock" ]]; then + setComposeRootVersion + + composer \ + global \ + --no-install \ + --no-interaction \ + --no-progress \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + update + + echo + echo -e "\e[31mERROR: No composer.lock found\e[0m" + echo + echo -e '\e[31mNo composer.lock file found, consider adding one to your repository to ensure reproducible builds.\e[0m' + echo -e "\e[31mIn the meantime, a composer.lock file has been generated for you in $out/composer.lock\e[0m" + echo + echo -e '\e[31mTo fix the issue:\e[0m' + echo -e "\e[31m1. Copy the composer.lock file from $out/composer.lock to the project's source:\e[0m" + echo -e "\e[31m cp $out/composer.lock <path>\e[0m" + echo -e '\e[31m2. Add the composerLock attribute, pointing to the copied composer.lock file:\e[0m' + echo -e '\e[31m composerLock = ./composer.lock;\e[0m' + echo + + exit 1 + fi + + echo "Finished composerWithPluginConfigureHook" +} + +composerWithPluginBuildHook() { + echo "Executing composerWithPluginBuildHook" + + echo "Finished composerWithPluginBuildHook" +} + +composerWithPluginCheckHook() { + echo "Executing composerWithPluginCheckHook" + + checkComposerValidate + + echo "Finished composerWithPluginCheckHook" +} + +composerWithPluginInstallHook() { + echo "Executing composerWithPluginInstallHook" + + composer \ + global \ + --no-interaction \ + --no-progress \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + install + + echo "Finished composerWithPluginInstallHook" +} + +composerWithPluginInstallCheckHook() { + composer global show $pluginName +} diff --git a/pkgs/build-support/php/builders/v1/hooks/default.nix b/pkgs/build-support/php/builders/v1/hooks/default.nix new file mode 100644 index 0000000000000..d10ff78067278 --- /dev/null +++ b/pkgs/build-support/php/builders/v1/hooks/default.nix @@ -0,0 +1,60 @@ +{ + lib, + makeSetupHook, + jq, + writeShellApplication, + moreutils, + cacert, + buildPackages, +}: + +let + php-script-utils = writeShellApplication { + name = "php-script-utils"; + runtimeInputs = [ jq ]; + text = builtins.readFile ./php-script-utils.bash; + }; +in +{ + composerRepositoryHook = makeSetupHook { + name = "composer-repository-hook.sh"; + propagatedBuildInputs = [ + jq + moreutils + cacert + ]; + substitutions = { + phpScriptUtils = lib.getExe php-script-utils; + }; + } ./composer-repository-hook.sh; + + composerInstallHook = makeSetupHook { + name = "composer-install-hook.sh"; + propagatedBuildInputs = [ + jq + moreutils + cacert + ]; + substitutions = { + # Specify the stdenv's `diff` by abspath to ensure that the user's build + # inputs do not cause us to find the wrong `diff`. + cmp = "${lib.getBin buildPackages.diffutils}/bin/cmp"; + phpScriptUtils = lib.getExe php-script-utils; + }; + } ./composer-install-hook.sh; + + composerWithPluginVendorHook = makeSetupHook { + name = "composer-with-plugin-vendor-hook.sh"; + propagatedBuildInputs = [ + jq + moreutils + cacert + ]; + substitutions = { + # Specify the stdenv's `diff` by abspath to ensure that the user's build + # inputs do not cause us to find the wrong `diff`. + cmp = "${lib.getBin buildPackages.diffutils}/bin/cmp"; + phpScriptUtils = lib.getExe php-script-utils; + }; + } ./composer-with-plugin-vendor-hook.sh; +} diff --git a/pkgs/build-support/php/hooks/php-script-utils.bash b/pkgs/build-support/php/builders/v1/hooks/php-script-utils.bash index bba0242e65d1e..65c0a3b410f69 100644 --- a/pkgs/build-support/php/hooks/php-script-utils.bash +++ b/pkgs/build-support/php/builders/v1/hooks/php-script-utils.bash @@ -1,5 +1,6 @@ declare version declare composerStrictValidation +declare composerGlobal setComposeRootVersion() { set +e # Disable exit on error @@ -13,7 +14,16 @@ setComposeRootVersion() { } checkComposerValidate() { - if ! composer validate --strict --no-ansi --no-interaction --quiet --no-check-all --no-check-lock; then + setComposeRootVersion + + if [ "1" == "${composerGlobal-}" ]; then + global="global"; + else + global=""; + fi + + command="composer ${global} validate --strict --quiet --no-interaction --no-check-all --no-check-lock" + if ! $command; then if [ "1" == "${composerStrictValidation-}" ]; then echo echo -e "\e[31mERROR: composer files validation failed\e[0m" @@ -42,7 +52,8 @@ checkComposerValidate() { fi fi - if ! composer validate --strict --no-ansi --no-interaction --quiet --no-check-all --check-lock; then + command="composer ${global} validate --strict --no-ansi --no-interaction --quiet --no-check-all --check-lock" + if ! $command; then if [ "1" == "${composerStrictValidation-}" ]; then echo echo -e "\e[31mERROR: composer files validation failed\e[0m" diff --git a/pkgs/build-support/php/hooks/default.nix b/pkgs/build-support/php/hooks/default.nix deleted file mode 100644 index ca96b1056db9d..0000000000000 --- a/pkgs/build-support/php/hooks/default.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ lib -, makeSetupHook -, diffutils -, jq -, writeShellApplication -, moreutils -, cacert -, buildPackages -}: - -let - php-script-utils = writeShellApplication { - name = "php-script-utils"; - runtimeInputs = [ jq ]; - text = builtins.readFile ./php-script-utils.bash; - }; -in -{ - composerRepositoryHook = makeSetupHook - { - name = "composer-repository-hook.sh"; - propagatedBuildInputs = [ jq moreutils cacert ]; - substitutions = { - phpScriptUtils = lib.getExe php-script-utils; - }; - } ./composer-repository-hook.sh; - - composerInstallHook = makeSetupHook - { - name = "composer-install-hook.sh"; - propagatedBuildInputs = [ jq moreutils cacert ]; - substitutions = { - # Specify the stdenv's `diff` by abspath to ensure that the user's build - # inputs do not cause us to find the wrong `diff`. - cmp = "${lib.getBin buildPackages.diffutils}/bin/cmp"; - phpScriptUtils = lib.getExe php-script-utils; - }; - } ./composer-install-hook.sh; -} diff --git a/pkgs/build-support/php/pkgs/composer-local-repo-plugin.nix b/pkgs/build-support/php/pkgs/composer-local-repo-plugin.nix deleted file mode 100644 index bfdc3d4f98d1b..0000000000000 --- a/pkgs/build-support/php/pkgs/composer-local-repo-plugin.nix +++ /dev/null @@ -1,113 +0,0 @@ -{ php, callPackage, stdenvNoCC, lib, fetchFromGitHub, makeBinaryWrapper }: - -let - composer = callPackage ./composer-phar.nix { - inherit (php.packages.composer) version pharHash; - }; - - composerKeys = stdenvNoCC.mkDerivation (finalComposerKeysAttrs: { - pname = "composer-keys"; - version = "fa5a62092f33e094073fbda23bbfc7188df3cbc5"; - - src = fetchFromGitHub { - owner = "composer"; - repo = "composer.github.io"; - rev = "${finalComposerKeysAttrs.version}"; - hash = "sha256-3Sfn71LDG1jHwuEIU8iEnV3k6D6QTX7KVIKVaNSuCVE="; - }; - - installPhase = '' - runHook preInstall - - mkdir -p $out - install releases.pub $out/keys.tags.pub - install snapshots.pub $out/keys.dev.pub - - runHook postInstall - ''; - }); -in -stdenvNoCC.mkDerivation (finalAttrs: { - pname = "composer-local-repo-plugin"; - version = "1.1.0"; - - src = fetchFromGitHub { - owner = "nix-community"; - repo = "composer-local-repo-plugin"; - rev = finalAttrs.version; - hash = "sha256-edbn07r/Uc1g0qOuVBZBs6N1bMN5kIfA1b4FCufdw5M="; - }; - - COMPOSER_CACHE_DIR = "/dev/null"; - COMPOSER_MIRROR_PATH_REPOS = "1"; - COMPOSER_HTACCESS_PROTECT = "0"; - COMPOSER_DISABLE_NETWORK = "1"; - - nativeBuildInputs = [ - makeBinaryWrapper - ]; - - buildInputs = [ - composer - ]; - - configurePhase = '' - runHook preConfigure - - export COMPOSER_HOME=${placeholder "out"} - - runHook postConfigure - ''; - - buildPhase = '' - runHook preBuild - - # Configure composer globally - composer global init --quiet --no-interaction --no-ansi \ - --name="nixos/composer" \ - --homepage "https://nixos.org/" \ - --description "Composer with nix-community/composer-local-repo-plugin" \ - --license "MIT" - - composer global config --quiet minimum-stability dev - composer global config --quiet prefer-stable true - composer global config --quiet apcu-autoloader false - composer global config --quiet allow-plugins.nix-community/composer-local-repo-plugin true - composer global config --quiet repo.packagist false - composer global config --quiet repo.plugin path $src - - # Install the local repository plugin - composer global require --quiet --no-ansi --no-interaction nix-community/composer-local-repo-plugin - - runHook postBuild - ''; - - checkPhase = '' - runHook preCheck - - composer global validate --no-ansi - composer global show --no-ansi nix-community/composer-local-repo-plugin - - runHook postCheck - ''; - - installPhase = '' - runHook preInstall - - mkdir -p $out - cp -ar ${composerKeys}/* $out/ - - makeWrapper ${composer}/bin/composer $out/bin/composer-local-repo-plugin \ - --prefix COMPOSER_HOME : $out - - runHook postInstall - ''; - - meta = { - description = "Composer local repo plugin for Composer"; - homepage = "https://github.com/nix-community/composer-local-repo-plugin"; - license = lib.licenses.mit; - maintainers = with lib.maintainers; [ drupol ]; - platforms = lib.platforms.all; - }; -}) diff --git a/pkgs/build-support/php/pkgs/composer-phar.nix b/pkgs/build-support/php/pkgs/composer-phar.nix index f281334ab2d9f..b07c25beec55f 100644 --- a/pkgs/build-support/php/pkgs/composer-phar.nix +++ b/pkgs/build-support/php/pkgs/composer-phar.nix @@ -1,17 +1,16 @@ { - _7zz - , cacert - , curl - , fetchurl - , git - , lib - , makeBinaryWrapper - , php - , stdenvNoCC - , unzip - , xz - , version - , pharHash + _7zz, + curl, + fetchurl, + git, + lib, + makeBinaryWrapper, + php, + stdenvNoCC, + unzip, + xz, + version, + pharHash, }: stdenvNoCC.mkDerivation (finalAttrs: { @@ -32,9 +31,17 @@ stdenvNoCC.mkDerivation (finalAttrs: { mkdir -p $out/bin install -D $src $out/libexec/composer/composer.phar - makeWrapper ${php}/bin/php $out/bin/composer \ + makeWrapper ${lib.getExe php} $out/bin/composer \ --add-flags "$out/libexec/composer/composer.phar" \ - --prefix PATH : ${lib.makeBinPath [ _7zz cacert curl git unzip xz ]} + --prefix PATH : ${ + lib.makeBinPath [ + _7zz + curl + git + unzip + xz + ] + } runHook postInstall ''; @@ -44,6 +51,7 @@ stdenvNoCC.mkDerivation (finalAttrs: { description = "Dependency Manager for PHP, shipped from the PHAR file"; homepage = "https://getcomposer.org/"; license = lib.licenses.mit; + mainProgram = "composer"; maintainers = with lib.maintainers; [ drupol ]; platforms = lib.platforms.all; }; |