From 4c1f249333bce383f24ee41ab8aa12da970872cd Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Tue, 2 May 2023 12:08:34 +0100 Subject: [PATCH] setuptools-scm: add setup hook for version and sources inclusion Packages using this build-time dependency expect to be able to know their version, which is autogenerated by extracting metadata from the SCM. For example, from Git tags. Also they assume that all SCM-tracked files are included in sdist and bdist, as documented here: - https://setuptools-scm.readthedocs.io/en/latest/usage/#file-finders-hook-makes-most-of-manifestin-unnecessary - https://setuptools.pypa.io/en/latest/userguide/datafiles.html None of these behaviors were happening while on nix builds, where SCM data is stripped off from sources by default. These build hooks should put nix builds closer to normal ones with Python's `build` app. A similar fix was used in https://github.com/nix-community/poetry2nix/pull/1077 (for the version problem only) and has given good results so far. @moduon MT-1075 --- .../python-modules/setuptools-scm/default.nix | 2 ++ .../setuptools-scm/setup-hook.sh | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 pkgs/development/python-modules/setuptools-scm/setup-hook.sh diff --git a/pkgs/development/python-modules/setuptools-scm/default.nix b/pkgs/development/python-modules/setuptools-scm/default.nix index 21fe5c77fbb7..01a1f0ff0d4b 100644 --- a/pkgs/development/python-modules/setuptools-scm/default.nix +++ b/pkgs/development/python-modules/setuptools-scm/default.nix @@ -57,6 +57,8 @@ buildPythonPackage rec { pytest = callPackage ./tests.nix { }; }; + setupHook = ./setup-hook.sh; + meta = with lib; { changelog = "https://github.com/pypa/setuptools_scm/blob/${version}/CHANGELOG.md"; homepage = "https://github.com/pypa/setuptools_scm/"; diff --git a/pkgs/development/python-modules/setuptools-scm/setup-hook.sh b/pkgs/development/python-modules/setuptools-scm/setup-hook.sh new file mode 100644 index 000000000000..f8c30f91ca07 --- /dev/null +++ b/pkgs/development/python-modules/setuptools-scm/setup-hook.sh @@ -0,0 +1,32 @@ +# Let built package know its version. +# Usually, when a package uses setuptools-scm as a build-time dependency, it +# expects to get the package version from SCM data. However, while doing a nix +# build, the source tree doesn't contain SCM data, so we should almost always +# get the version from the derivation attribute. +version-pretend-hook() { + if [ -z "$dontPretendSetuptoolsSCMVersion" -a -z "$SETUPTOOLS_SCM_PRETEND_VERSION" ]; then + echo Setting SETUPTOOLS_SCM_PRETEND_VERSION to $version + export SETUPTOOLS_SCM_PRETEND_VERSION="$version" + fi +} + +# Include all tracked files. +# When a package uses setuptools-scm as a build-time dependency, it usually +# expects it to include all scm-tracked files in the built package, by default. +# This is the official setuptools-scm behavior, documented in +# https://setuptools-scm.readthedocs.io/en/latest/usage/#file-finders-hook-makes-most-of-manifestin-unnecessary +# and https://setuptools.pypa.io/en/latest/userguide/datafiles.html. +# However, while doing a nix build, the source tree doesn't contain SCM data, +# so it would include only `.py` files by default. +# We generate a MANIFEST.in automatically that includes all tracked files to +# emulate this behavior of setuptools-scm. +include-tracked-files-hook() { + if [ -z "$dontIncludeSetuptoolsSCMTrackedFiles" ]; then + echo Including all tracked files automatically + old_manifest="$(if [ -f MANIFEST.in ]; then cat MANIFEST.in; fi)" + echo 'global-include **' > MANIFEST.in + echo "$old_manifest" >> MANIFEST.in + fi +} + +preBuildHooks+=(version-pretend-hook include-tracked-files-hook)