From 65c0e4ebf6907c7382b60d087a69805b139193f4 Mon Sep 17 00:00:00 2001 From: Pol Dellaiera Date: Tue, 7 May 2024 15:17:48 +0200 Subject: [PATCH] build-support/php: implement v2 --- pkgs/build-support/php/builders/default.nix | 6 ++ .../builders/v2/build-composer-project.nix | 10 +-- ...pository.nix => build-composer-vendor.nix} | 31 +++----- .../v2/hooks/composer-install-hook.sh | 55 +++------------ ...sitory-hook.sh => composer-vendor-hook.sh} | 70 +++++++++---------- .../php/builders/v2/hooks/default.nix | 6 +- .../builders/v2/hooks/php-script-utils.bash | 2 - pkgs/development/interpreters/php/generic.nix | 2 +- pkgs/top-level/php-packages.nix | 5 ++ 9 files changed, 73 insertions(+), 114 deletions(-) rename pkgs/build-support/php/builders/v2/{build-composer-repository.nix => build-composer-vendor.nix} (70%) rename pkgs/build-support/php/builders/v2/hooks/{composer-repository-hook.sh => composer-vendor-hook.sh} (50%) diff --git a/pkgs/build-support/php/builders/default.nix b/pkgs/build-support/php/builders/default.nix index ea9bb3350435..d8d60ad6da1e 100644 --- a/pkgs/build-support/php/builders/default.nix +++ b/pkgs/build-support/php/builders/default.nix @@ -6,4 +6,10 @@ mkComposerRepository = callPackage ./v1/build-composer-repository.nix { }; composerHooks = callPackages ./v1/hooks { }; }; + + v2 = { + buildComposerProject = callPackage ./v2/build-composer-project.nix { }; + mkComposerVendor = callPackage ./v2/build-composer-vendor.nix { }; + composerHooks = callPackages ./v2/hooks { }; + }; } diff --git a/pkgs/build-support/php/builders/v2/build-composer-project.nix b/pkgs/build-support/php/builders/v2/build-composer-project.nix index 698391ad1603..6013225e7c59 100644 --- a/pkgs/build-support/php/builders/v2/build-composer-project.nix +++ b/pkgs/build-support/php/builders/v2/build-composer-project.nix @@ -11,7 +11,7 @@ let let phpDrv = finalAttrs.php or php; - composer = finalAttrs.composer or phpDrv.packages.composer-local-repo-plugin; + composer = finalAttrs.composer or phpDrv.packages.composer; in { composerLock = previousAttrs.composerLock or null; @@ -23,7 +23,7 @@ let nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ composer phpDrv - phpDrv.composerHooks.composerInstallHook + phpDrv.composerHooks2.composerInstallHook ]; buildInputs = (previousAttrs.buildInputs or [ ]) ++ [ phpDrv ]; @@ -69,8 +69,8 @@ let runHook postInstallCheck ''; - composerRepository = - previousAttrs.composerRepository or (phpDrv.mkComposerRepository { + composerVendor = + previousAttrs.composerVendor or (phpDrv.mkComposerVendor { inherit composer; inherit (finalAttrs) patches @@ -91,7 +91,7 @@ let passthru = previousAttrs.passthru or { } // { updateScript = previousAttrs.passthru.updateScript - or (if finalAttrs.composerRepository.composerLock == null then nix-update-script { } else null); + or (if finalAttrs.composerVendor.composerLock == null then nix-update-script { } else null); }; env = { diff --git a/pkgs/build-support/php/builders/v2/build-composer-repository.nix b/pkgs/build-support/php/builders/v2/build-composer-vendor.nix similarity index 70% rename from pkgs/build-support/php/builders/v2/build-composer-repository.nix rename to pkgs/build-support/php/builders/v2/build-composer-vendor.nix index 037d8bdeb3eb..b68e16e6cc1a 100644 --- a/pkgs/build-support/php/builders/v2/build-composer-repository.nix +++ b/pkgs/build-support/php/builders/v2/build-composer-vendor.nix @@ -5,7 +5,7 @@ }: let - mkComposerRepositoryOverride = + mkComposerVendorOverride = /* We cannot destruct finalAttrs since the attrset below is used to construct it and Nix currently does not support lazy attribute names. @@ -22,27 +22,12 @@ let let phpDrv = finalAttrs.php or php; - composer = finalAttrs.composer or phpDrv.packages.composer-local-repo-plugin; + composer = finalAttrs.composer or phpDrv.packages.composer; in - assert (lib.assertMsg (previousAttrs ? src) "mkComposerRepository expects src 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 ? src) "mkComposerVendor expects src argument."); + assert (lib.assertMsg (previousAttrs ? vendorHash) "mkComposerVendor expects vendorHash argument."); + assert (lib.assertMsg (previousAttrs ? version) "mkComposerVendor expects version argument."); + assert (lib.assertMsg (previousAttrs ? pname) "mkComposerVendor expects pname argument."); { composerNoDev = previousAttrs.composerNoDev or true; composerNoPlugins = previousAttrs.composerNoPlugins or true; @@ -57,7 +42,7 @@ let nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ composer phpDrv - phpDrv.composerHooks.composerRepositoryHook + phpDrv.composerHooks2.composerVendorHook ]; buildInputs = previousAttrs.buildInputs or [ ]; @@ -115,4 +100,4 @@ let outputHash = finalAttrs.vendorHash or ""; }; in -args: (stdenvNoCC.mkDerivation args).overrideAttrs mkComposerRepositoryOverride +args: (stdenvNoCC.mkDerivation args).overrideAttrs mkComposerVendorOverride diff --git a/pkgs/build-support/php/builders/v2/hooks/composer-install-hook.sh b/pkgs/build-support/php/builders/v2/hooks/composer-install-hook.sh index 44e87d06d3a5..7cc176058b50 100644 --- a/pkgs/build-support/php/builders/v2/hooks/composer-install-hook.sh +++ b/pkgs/build-support/php/builders/v2/hooks/composer-install-hook.sh @@ -1,4 +1,4 @@ -declare composerRepository +declare composerVendor declare version declare composerNoDev declare composerNoPlugins @@ -14,29 +14,27 @@ source @phpScriptUtils@ composerInstallConfigureHook() { echo "Executing composerInstallConfigureHook" - if [[ ! -e "${composerRepository}" ]]; then - echo "No local composer repository found." + setComposeRootVersion + + if [[ ! -e "${composerVendor}" ]]; then + echo "No local composer vendor found." exit 1 fi - if [[ -e "$composerLock" ]]; then - cp "$composerLock" composer.lock - fi + install -Dm644 ${composerVendor}/composer.{json,lock} . if [[ ! -f "composer.lock" ]]; then - setComposeRootVersion - composer \ --no-install \ --no-interaction \ --no-progress \ + --optimize-autoloader \ ${composerNoDev:+--no-dev} \ ${composerNoPlugins:+--no-plugins} \ ${composerNoScripts:+--no-scripts} \ update - mkdir -p $out - cp composer.lock $out/ + install -Dm644 composer.lock -t $out/ echo echo -e "\e[31mERROR: No composer.lock found\e[0m" @@ -54,24 +52,7 @@ composerInstallConfigureHook() { exit 1 fi - echo "Validating consistency between composer.lock and ${composerRepository}/composer.lock" - if ! @cmp@ -s "composer.lock" "${composerRepository}/composer.lock"; then - echo - echo -e "\e[31mERROR: vendorHash is out of date\e[0m" - echo - echo -e "\e[31mcomposer.lock is not the same in $composerRepository\e[0m" - echo - echo -e "\e[31mTo fix the issue:\e[0m" - echo -e '\e[31m1. Set vendorHash to an empty string: `vendorHash = "";`\e[0m' - echo -e '\e[31m2. Build the derivation and wait for it to fail with a hash mismatch\e[0m' - echo -e '\e[31m3. Copy the "got: sha256-..." value back into the vendorHash field\e[0m' - echo -e '\e[31m You should have: vendorHash = "sha256-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=";\e[0m' - echo - - exit 1 - fi - - chmod +w composer.json composer.lock + chmod +w composer.{json,lock} echo "Finished composerInstallConfigureHook" } @@ -79,12 +60,6 @@ composerInstallConfigureHook() { composerInstallBuildHook() { echo "Executing composerInstallBuildHook" - setComposeRootVersion - - # 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 build-local-repo-lock -m "${composerRepository}" . - echo "Finished composerInstallBuildHook" } @@ -99,17 +74,7 @@ composerInstallCheckHook() { composerInstallInstallHook() { echo "Executing composerInstallInstallHook" - setComposeRootVersion - - # Finally, run `composer install` to install the dependencies and generate - # the autoloader. - composer \ - --no-interaction \ - --no-progress \ - ${composerNoDev:+--no-dev} \ - ${composerNoPlugins:+--no-plugins} \ - ${composerNoScripts:+--no-scripts} \ - install + cp -ar ${composerVendor}/* . # Copy the relevant files only in the store. mkdir -p "$out"/share/php/"${pname}" diff --git a/pkgs/build-support/php/builders/v2/hooks/composer-repository-hook.sh b/pkgs/build-support/php/builders/v2/hooks/composer-vendor-hook.sh similarity index 50% rename from pkgs/build-support/php/builders/v2/hooks/composer-repository-hook.sh rename to pkgs/build-support/php/builders/v2/hooks/composer-vendor-hook.sh index ec9777541fc0..7a14e544ae0d 100644 --- a/pkgs/build-support/php/builders/v2/hooks/composer-repository-hook.sh +++ b/pkgs/build-support/php/builders/v2/hooks/composer-vendor-hook.sh @@ -5,34 +5,35 @@ declare composerNoPlugins declare composerNoScripts declare composerStrictValidation -preConfigureHooks+=(composerRepositoryConfigureHook) -preBuildHooks+=(composerRepositoryBuildHook) -preCheckHooks+=(composerRepositoryCheckHook) -preInstallHooks+=(composerRepositoryInstallHook) +preConfigureHooks+=(composerVendorConfigureHook) +preBuildHooks+=(composerVendorBuildHook) +preCheckHooks+=(composerVendorCheckHook) +preInstallHooks+=(composerVendorInstallHook) source @phpScriptUtils@ -composerRepositoryConfigureHook() { - echo "Executing composerRepositoryConfigureHook" +composerVendorConfigureHook() { + echo "Executing composerVendorConfigureHook" + + setComposeRootVersion if [[ -e "$composerLock" ]]; then - cp $composerLock composer.lock + echo -e "\e[32mUsing user provided \`composer.lock\` file from \`$composerLock\`\e[0m" + install -Dm644 $composerLock ./composer.lock fi if [[ ! -f "composer.lock" ]]; then - setComposeRootVersion - composer \ --no-install \ --no-interaction \ --no-progress \ + --optimize-autoloader \ ${composerNoDev:+--no-dev} \ ${composerNoPlugins:+--no-plugins} \ ${composerNoScripts:+--no-scripts} \ update - mkdir -p $out - cp composer.lock $out/ + install -Dm644 composer.lock -t $out/ echo echo -e "\e[31mERROR: No composer.lock found\e[0m" @@ -50,42 +51,41 @@ composerRepositoryConfigureHook() { exit 1 fi - echo "Finished composerRepositoryConfigureHook" + chmod +w composer.{json,lock} + + echo "Finished composerVendorConfigureHook" } -composerRepositoryBuildHook() { - echo "Executing composerRepositoryBuildHook" +composerVendorBuildHook() { + echo "Executing composerVendorBuildHook" - mkdir -p repository + composer \ + --apcu-autoloader \ + --apcu-autoloader-prefix="$(jq -r -c 'try ."content-hash"' < composer.lock)" \ + --no-interaction \ + --no-progress \ + --optimize-autoloader \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + install - setComposeRootVersion - - # Build the local composer repository - # The command 'build-local-repo' is provided by the Composer plugin - # nix-community/composer-local-repo-plugin. - composer build-local-repo-lock ${composerNoDev:+--no-dev} -r repository - - echo "Finished composerRepositoryBuildHook" + echo "Finished composerVendorBuildHook" } -composerRepositoryCheckHook() { - echo "Executing composerRepositoryCheckHook" +composerVendorCheckHook() { + echo "Executing composerVendorCheckHook" checkComposerValidate - echo "Finished composerRepositoryCheckHook" + echo "Finished composerVendorCheckHook" } -composerRepositoryInstallHook() { - echo "Executing composerRepositoryInstallHook" +composerVendorInstallHook() { + echo "Executing composerVendorInstallHook" mkdir -p $out + cp -ar composer.{json,lock} $(composer config vendor-dir) $out/ - cp -ar repository/. $out/ - - # Copy the composer.lock files to the output directory, to be able to validate consistency with - # the src composer.lock file where this fixed-output derivation is used - cp composer.lock $out/ - - echo "Finished composerRepositoryInstallHook" + echo "Finished composerVendorInstallHook" } diff --git a/pkgs/build-support/php/builders/v2/hooks/default.nix b/pkgs/build-support/php/builders/v2/hooks/default.nix index 4c0ba1b18801..e4d6dcd8ffc7 100644 --- a/pkgs/build-support/php/builders/v2/hooks/default.nix +++ b/pkgs/build-support/php/builders/v2/hooks/default.nix @@ -16,8 +16,8 @@ let }; in { - composerRepositoryHook = makeSetupHook { - name = "composer-repository-hook.sh"; + composerVendorHook = makeSetupHook { + name = "composer-vendor-hook.sh"; propagatedBuildInputs = [ jq moreutils @@ -26,7 +26,7 @@ in substitutions = { phpScriptUtils = lib.getExe php-script-utils; }; - } ./composer-repository-hook.sh; + } ./composer-vendor-hook.sh; composerInstallHook = makeSetupHook { name = "composer-install-hook.sh"; diff --git a/pkgs/build-support/php/builders/v2/hooks/php-script-utils.bash b/pkgs/build-support/php/builders/v2/hooks/php-script-utils.bash index 65c0a3b410f6..3e8299bf15d3 100644 --- a/pkgs/build-support/php/builders/v2/hooks/php-script-utils.bash +++ b/pkgs/build-support/php/builders/v2/hooks/php-script-utils.bash @@ -14,8 +14,6 @@ setComposeRootVersion() { } checkComposerValidate() { - setComposeRootVersion - if [ "1" == "${composerGlobal-}" ]; then global="global"; else diff --git a/pkgs/development/interpreters/php/generic.nix b/pkgs/development/interpreters/php/generic.nix index 69716f05b6da..8146df5037a3 100644 --- a/pkgs/development/interpreters/php/generic.nix +++ b/pkgs/development/interpreters/php/generic.nix @@ -164,7 +164,7 @@ let nixos = lib.recurseIntoAttrs nixosTests."php${lib.strings.replaceStrings [ "." ] [ "" ] (lib.versions.majorMinor php.version)}"; package = tests.php; }; - inherit (php-packages) extensions buildPecl mkComposerRepository buildComposerProject buildComposerWithPlugin composerHooks mkExtension; + inherit (php-packages) extensions buildPecl mkComposerRepository mkComposerVendor buildComposerProject buildComposerProject2 buildComposerWithPlugin composerHooks composerHooks2 mkExtension; 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 093c47147877..610b3994f1c1 100644 --- a/pkgs/top-level/php-packages.nix +++ b/pkgs/top-level/php-packages.nix @@ -58,6 +58,11 @@ in { inherit (builders.v1) buildComposerProject buildComposerWithPlugin composerHooks mkComposerRepository; + # Next version of the builder + buildComposerProject2 = builders.v2.buildComposerProject; + composerHooks2 = builders.v2.composerHooks; + mkComposerVendor = builders.v2.mkComposerVendor; + # Wrap mkDerivation to prepend pname with "php-" to make names consistent # with how buildPecl does it and make the file easier to overview. mkDerivation = origArgs: