build-support/php: implement v2
This commit is contained in:
parent
b356a808fd
commit
65c0e4ebf6
@ -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 { };
|
||||
};
|
||||
}
|
||||
|
@ -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 = {
|
||||
|
@ -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
|
@ -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}"
|
||||
|
@ -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"
|
||||
}
|
@ -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";
|
||||
|
@ -14,8 +14,6 @@ setComposeRootVersion() {
|
||||
}
|
||||
|
||||
checkComposerValidate() {
|
||||
setComposeRootVersion
|
||||
|
||||
if [ "1" == "${composerGlobal-}" ]; then
|
||||
global="global";
|
||||
else
|
||||
|
@ -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" ];
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user