build-support/php: implement v2

This commit is contained in:
Pol Dellaiera 2024-05-07 15:17:48 +02:00
parent b356a808fd
commit 65c0e4ebf6
No known key found for this signature in database
GPG Key ID: D476DFE9C67467CA
9 changed files with 73 additions and 114 deletions

View File

@ -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 { };
};
}

View File

@ -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 = {

View File

@ -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

View File

@ -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}"

View File

@ -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"
}

View File

@ -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";

View File

@ -14,8 +14,6 @@ setComposeRootVersion() {
}
checkComposerValidate() {
setComposeRootVersion
if [ "1" == "${composerGlobal-}" ]; then
global="global";
else

View File

@ -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" ];

View File

@ -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: