nixpkgs/pkgs/development/python-modules/setuptools-scm/setup-hook.sh
Jairo Llopis 4c1f249333
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
2023-12-20 20:11:17 +01:00

32 lines
1.6 KiB
Bash

# 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)