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)