python3.pkgs.pypaBuildHook: fix conflicts

This modifies the pypaBuildHook to not propagate its own python dependencies into the build environment. This prevents package conflicts.

- modify pypa-build-hook.sh to call pyproject-build via an absolute path. This removes the need of putting the dependencies inside the hook's propagatedBuildInputs
- remove the hook's dependencies from propagatedBuildInputs
- add a passthru test to the hook testing for the fix
This commit is contained in:
DavHau
2023-09-12 21:04:26 +02:00
parent d67b405e3d
commit c57e6b692a
4 changed files with 73 additions and 8 deletions
@@ -7,12 +7,15 @@
, packaging
, pyproject-hooks
, tomli
, makeWrapper
}:
let
buildBootstrapPythonModule = basePackage: attrs: stdenv.mkDerivation ({
pname = "${python.libPrefix}-bootstrap-${basePackage.pname}";
inherit (basePackage) version src meta;
nativeBuildInputs = [ makeWrapper ];
buildPhase = ''
runHook preBuild
@@ -38,12 +41,30 @@ let
bootstrap-pyproject-hooks = buildBootstrapPythonModule pyproject-hooks {};
bootstrap-tomli = buildBootstrapPythonModule tomli {};
sitePkgs = python.sitePackages;
in
buildBootstrapPythonModule build {
propagatedBuildInputs = [
bootstrap-packaging
bootstrap-pyproject-hooks
] ++ lib.optionals (python.pythonOlder "3.11") [
bootstrap-tomli
];
# like the installPhase above, but wrapping the pyproject-build command
# to set up PYTHONPATH with the correct dependencies.
# This allows using `pyproject-build` without propagating its dependencies
# into the build environment, which is necessary to prevent
# pythonCatchConflicts from raising false positive alerts.
# This would happen whenever the package to build has a dependency on
# another version of a package that is also a dependency of pyproject-build.
installPhase = ''
runHook preInstall
PYTHONPATH="${installer}/${python.sitePackages}" \
${python.interpreter} -m installer \
--destdir "$out" --prefix "" dist/*.whl
wrapProgram $out/bin/pyproject-build \
--prefix PYTHONPATH : "$out/${sitePkgs}" \
--prefix PYTHONPATH : "${bootstrap-pyproject-hooks}/${sitePkgs}" \
--prefix PYTHONPATH : "${bootstrap-packaging}/${sitePkgs}" \
--prefix PYTHONPATH : "${bootstrap-tomli}/${sitePkgs}"
runHook postInstall
'';
}