Skip to content

patch-shebangs: always --update --host shebangs#481311

Open
doronbehar wants to merge 1 commit intoNixOS:stagingfrom
doronbehar:pkg/curl@cross
Open

patch-shebangs: always --update --host shebangs#481311
doronbehar wants to merge 1 commit intoNixOS:stagingfrom
doronbehar:pkg/curl@cross

Conversation

@doronbehar
Copy link
Contributor

@doronbehar doronbehar commented Jan 18, 2026

Found out this is needed while tracking down nix store references to build platform Bash in a cross compiled output.

Things done

  • Built on platform:
    • x86_64-linux
    • aarch64-linux
    • x86_64-darwin
    • aarch64-darwin
  • Tested, as applicable:
  • Ran nixpkgs-review on this PR. See nixpkgs-review usage.
  • Tested basic functionality of all binary files, usually in ./result/bin/.
  • Nixpkgs Release Notes
    • Package update: when the change is major or breaking.
  • NixOS Release Notes
    • Module addition: when adding a new NixOS module.
    • Module update: when the change is significant.
  • Fits CONTRIBUTING.md, pkgs/README.md, maintainers/README.md and other READMEs.

Add a 👍 reaction to pull requests you find important.

# because patchShebangs doesn't patch already patched scripts.
postPatch = ''
substituteInPlace ./config.guess --replace-fail /usr/bin/uname uname
patchShebangs --host scripts/wcurl
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be done in postInstall/preFixup?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be done in postInstall/preFixup?

As written in the comment above, it has to be done before the shebangs are patched for the build platform, so I think there's no choice but to do it here.

Copy link
Member

@Scrumplex Scrumplex Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess another alternative is to use find or similar to exclude this one from being patched by patchShebangs in patchPhase in the first place

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also just found out about --update

# --update : Update shebang paths that are in Nix store
which will update shebangs even if they already point to the store

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't have a strong preference here but if you strongly prefer the host scripts patching to be done in postFixup with the --update flag, I won't mind.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On a 2nd thought, I wonder why --update wasn't used here:

diff --git i/pkgs/build-support/setup-hooks/patch-shebangs.sh w/pkgs/build-support/setup-hooks/patch-shebangs.sh
index 5bd1f5078ad0..e15be2dc8443 100644
--- i/pkgs/build-support/setup-hooks/patch-shebangs.sh
+++ w/pkgs/build-support/setup-hooks/patch-shebangs.sh
@@ -162,7 +162,7 @@ patchShebangsAuto () {
         if [[ "$output" != out && "$output" = "$outputDev" ]]; then
             patchShebangs --build "$prefix"
         else
-            patchShebangs --host "$prefix"
+            patchShebangs --update --host "$prefix"
         fi
     fi
 }

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm. That could potentially solve this for all packages, huh?

I think this might be worthy of its own discussion and PR.

We gotta do a staging commit anyway so it wouldn't increase the cost in this case.

Copy link
Contributor Author

@doronbehar doronbehar Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc @tie per ebd4619 . Have you considered using --update unconditionally? Also lirc is suffering from the same issue that could be fixed by the above change. On branch master:

nix why-depends --all --precise -f. pkgsCross.armv7l-hf-multiplatform.{lirc,buildPackages.runtimeShellPackage.out}
/bn2j09y2zj357y9yy0a0bvb6mhsaj17h-lirc-armv7l-unknown-linux-gnueabihf-0.10.2
├───bin/irexec: …cing command "%s"..../nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh...-c..execvp …
│   bin/lirc-config-tool: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/bash.# vim: set …
│   bin/lirc-make-devinput: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/bash..function h…
│   bin/lirc-postinstall: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/bash.#.# Perform…
│   include/lirc/config.h: … */.#define SH_PATH "/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh"../* Define t…
│   share/doc/lirc/plugindocs/make-ext-driver-toc.sh: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/bash..cat << EOT…
│   share/lirc/contrib/irman2lirc: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh..progname=irm…
│   → /lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3
└───bin/irdb-get: …#!/nix/store/qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-python3-3.13.11-env/bin/python3…
    bin/irtext2udp: …#!/nix/store/qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-python3-3.13.11-env/bin/python3…
    bin/lirc-init-db: …#!/nix/store/qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-python3-3.13.11-env/bin/python3…
    bin/lircd-setup: …#!/nix/store/qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-python3-3.13.11-env/bin/python3…
    bin/pronto2lirc: …#!/nix/store/qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-python3-3.13.11-env/bin/python3…
    lib/python3.13/site-packages/lirc-setup/lirc-setup: …#!/nix/store/qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-/nix/store/qfky2dz3g6h0bvfvh7x9…
    share/lirc/python-pkg/lirc/lirctool: …#!/nix/store/qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-python3-3.13.11-env/bin/python3…
    → /qfky2dz3g6h0bvfvh7x97m27wy7hf2cg-python3-3.13.11-env
    ├───bin/idle: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/idle....# -…
    │   bin/idle3: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/idle3....# …
    │   bin/idle3.13: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/idle3.13...…
    │   bin/pydoc: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/pydoc....# …
    │   bin/pydoc3: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/pydoc3....#…
    │   bin/pydoc3.13: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/pydoc3.13..…
    │   bin/python-config: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/python-conf…
    │   bin/python3-config: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/python3-con…
    │   bin/python3.13: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/python3.13.…
    │   bin/python3.13-config: …YTHONNOUSERSITE=true./nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/bin/python3.13-…
    │   include -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/include
    │   lib/libpython3.13.so -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/libpython3.13.so
    │   lib/libpython3.13.so.1.0 -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/libpython3.13.so.1.0
    │   lib/libpython3.so -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/libpython3.so
    │   lib/pkgconfig -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/pkgconfig
    │   lib/python3.13/EXTERNALLY-MANAGED -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/EXTERNALLY-MANAGED
    │   lib/python3.13/LICENSE.txt -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/LICENSE.txt
    │   lib/python3.13/__future__.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/__future__.py
    │   lib/python3.13/__hello__.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/__hello__.py
    │   lib/python3.13/__phello__ -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/__phello__
    │   lib/python3.13/__pycache__ -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/__pycache__
    │   lib/python3.13/_aix_support.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_aix_support.py
    │   lib/python3.13/_android_support.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_android_support.py
    │   lib/python3.13/_apple_support.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_apple_support.py
    │   lib/python3.13/_collections_abc.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_collections_abc.py
    │   lib/python3.13/_colorize.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_colorize.py
    │   lib/python3.13/_compat_pickle.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_compat_pickle.py
    │   lib/python3.13/_compression.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_compression.py
    │   lib/python3.13/_ios_support.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_ios_support.py
    │   lib/python3.13/_markupbase.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_markupbase.py
    │   lib/python3.13/_opcode_metadata.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_opcode_metadata.py
    │   lib/python3.13/_osx_support.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_osx_support.py
    │   lib/python3.13/_py_abc.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_py_abc.py
    │   lib/python3.13/_pydatetime.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_pydatetime.py
    │   lib/python3.13/_pydecimal.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_pydecimal.py
    │   lib/python3.13/_pyio.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_pyio.py
    │   lib/python3.13/_pylong.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_pylong.py
    │   lib/python3.13/_pyrepl -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_pyrepl
    │   lib/python3.13/_sitebuiltins.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_sitebuiltins.py
    │   lib/python3.13/_strptime.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_strptime.py
    │   lib/python3.13/_sysconfigdata__linux_x86_64-linux-gnu.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_sysconfigdata__linux_x86_64-linux-gnu.py
    │   lib/python3.13/_threading_local.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_threading_local.py
    │   lib/python3.13/_weakrefset.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/_weakrefset.py
    │   lib/python3.13/abc.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/abc.py
    │   lib/python3.13/antigravity.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/antigravity.py
    │   lib/python3.13/argparse.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/argparse.py
    │   lib/python3.13/ast.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/ast.py
    │   lib/python3.13/asyncio -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/asyncio
    │   lib/python3.13/base64.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/base64.py
    │   lib/python3.13/bdb.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/bdb.py
    │   lib/python3.13/bisect.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/bisect.py
    │   lib/python3.13/bz2.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/bz2.py
    │   lib/python3.13/cProfile.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/cProfile.py
    │   lib/python3.13/calendar.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/calendar.py
    │   lib/python3.13/cmd.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/cmd.py
    │   lib/python3.13/code.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/code.py
    │   lib/python3.13/codecs.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/codecs.py
    │   lib/python3.13/codeop.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/codeop.py
    │   lib/python3.13/collections -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/collections
    │   lib/python3.13/colorsys.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/colorsys.py
    │   lib/python3.13/compileall.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/compileall.py
    │   lib/python3.13/concurrent -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/concurrent
    │   lib/python3.13/config-3.13-x86_64-linux-gnu -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/config-3.13-x86_64-linux-gnu
    │   lib/python3.13/configparser.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/configparser.py
    │   lib/python3.13/contextlib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/contextlib.py
    │   lib/python3.13/contextvars.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/contextvars.py
    │   lib/python3.13/copy.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/copy.py
    │   lib/python3.13/copyreg.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/copyreg.py
    │   lib/python3.13/csv.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/csv.py
    │   lib/python3.13/ctypes -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/ctypes
    │   lib/python3.13/curses -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/curses
    │   lib/python3.13/dataclasses.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/dataclasses.py
    │   lib/python3.13/datetime.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/datetime.py
    │   lib/python3.13/dbm -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/dbm
    │   lib/python3.13/decimal.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/decimal.py
    │   lib/python3.13/difflib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/difflib.py
    │   lib/python3.13/dis.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/dis.py
    │   lib/python3.13/doctest.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/doctest.py
    │   lib/python3.13/email -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/email
    │   lib/python3.13/encodings -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/encodings
    │   lib/python3.13/ensurepip -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/ensurepip
    │   lib/python3.13/enum.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/enum.py
    │   lib/python3.13/filecmp.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/filecmp.py
    │   lib/python3.13/fileinput.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/fileinput.py
    │   lib/python3.13/fnmatch.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/fnmatch.py
    │   lib/python3.13/fractions.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/fractions.py
    │   lib/python3.13/ftplib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/ftplib.py
    │   lib/python3.13/functools.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/functools.py
    │   lib/python3.13/genericpath.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/genericpath.py
    │   lib/python3.13/getopt.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/getopt.py
    │   lib/python3.13/getpass.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/getpass.py
    │   lib/python3.13/gettext.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/gettext.py
    │   lib/python3.13/glob.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/glob.py
    │   lib/python3.13/graphlib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/graphlib.py
    │   lib/python3.13/gzip.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/gzip.py
    │   lib/python3.13/hashlib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/hashlib.py
    │   lib/python3.13/heapq.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/heapq.py
    │   lib/python3.13/hmac.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/hmac.py
    │   lib/python3.13/html -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/html
    │   lib/python3.13/http -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/http
    │   lib/python3.13/idlelib -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/idlelib
    │   lib/python3.13/imaplib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/imaplib.py
    │   lib/python3.13/importlib -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/importlib
    │   lib/python3.13/inspect.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/inspect.py
    │   lib/python3.13/io.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/io.py
    │   lib/python3.13/ipaddress.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/ipaddress.py
    │   lib/python3.13/json -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/json
    │   lib/python3.13/keyword.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/keyword.py
    │   lib/python3.13/lib-dynload -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/lib-dynload
    │   lib/python3.13/linecache.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/linecache.py
    │   lib/python3.13/locale.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/locale.py
    │   lib/python3.13/logging -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/logging
    │   lib/python3.13/lzma.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/lzma.py
    │   lib/python3.13/mailbox.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/mailbox.py
    │   lib/python3.13/mimetypes.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/mimetypes.py
    │   lib/python3.13/modulefinder.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/modulefinder.py
    │   lib/python3.13/multiprocessing -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/multiprocessing
    │   lib/python3.13/netrc.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/netrc.py
    │   lib/python3.13/ntpath.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/ntpath.py
    │   lib/python3.13/nturl2path.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/nturl2path.py
    │   lib/python3.13/numbers.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/numbers.py
    │   lib/python3.13/opcode.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/opcode.py
    │   lib/python3.13/operator.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/operator.py
    │   lib/python3.13/optparse.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/optparse.py
    │   lib/python3.13/os.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/os.py
    │   lib/python3.13/pathlib -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pathlib
    │   lib/python3.13/pdb.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pdb.py
    │   lib/python3.13/pickle.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pickle.py
    │   lib/python3.13/pickletools.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pickletools.py
    │   lib/python3.13/pkgutil.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pkgutil.py
    │   lib/python3.13/platform.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/platform.py
    │   lib/python3.13/plistlib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/plistlib.py
    │   lib/python3.13/poplib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/poplib.py
    │   lib/python3.13/posixpath.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/posixpath.py
    │   lib/python3.13/pprint.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pprint.py
    │   lib/python3.13/profile.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/profile.py
    │   lib/python3.13/pstats.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pstats.py
    │   lib/python3.13/pty.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pty.py
    │   lib/python3.13/py_compile.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/py_compile.py
    │   lib/python3.13/pyclbr.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pyclbr.py
    │   lib/python3.13/pydoc.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pydoc.py
    │   lib/python3.13/pydoc_data -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/pydoc_data
    │   lib/python3.13/queue.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/queue.py
    │   lib/python3.13/quopri.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/quopri.py
    │   lib/python3.13/random.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/random.py
    │   lib/python3.13/re -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/re
    │   lib/python3.13/reprlib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/reprlib.py
    │   lib/python3.13/rlcompleter.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/rlcompleter.py
    │   lib/python3.13/runpy.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/runpy.py
    │   lib/python3.13/sched.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/sched.py
    │   lib/python3.13/secrets.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/secrets.py
    │   lib/python3.13/selectors.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/selectors.py
    │   lib/python3.13/shelve.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/shelve.py
    │   lib/python3.13/shlex.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/shlex.py
    │   lib/python3.13/shutil.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/shutil.py
    │   lib/python3.13/signal.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/signal.py
    │   lib/python3.13/site-packages/README.txt -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/site-packages/README.txt
    │   lib/python3.13/site-packages/__pycache__ -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/site-packages/__pycache__
    │   lib/python3.13/site-packages/_sysconfigdata__linux_x86_64-linux-gnu.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/site-packages/_sysconfigdata__linux_x86_64-linux-gnu.py
    │   lib/python3.13/site-packages/sitecustomize.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/site-packages/sitecustomize.py
    │   lib/python3.13/site.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/site.py
    │   lib/python3.13/smtplib.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/smtplib.py
    │   lib/python3.13/socket.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/socket.py
    │   lib/python3.13/socketserver.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/socketserver.py
    │   lib/python3.13/sqlite3 -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/sqlite3
    │   lib/python3.13/sre_compile.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/sre_compile.py
    │   lib/python3.13/sre_constants.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/sre_constants.py
    │   lib/python3.13/sre_parse.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/sre_parse.py
    │   lib/python3.13/ssl.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/ssl.py
    │   lib/python3.13/stat.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/stat.py
    │   lib/python3.13/statistics.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/statistics.py
    │   lib/python3.13/string.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/string.py
    │   lib/python3.13/stringprep.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/stringprep.py
    │   lib/python3.13/struct.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/struct.py
    │   lib/python3.13/subprocess.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/subprocess.py
    │   lib/python3.13/symtable.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/symtable.py
    │   lib/python3.13/sysconfig -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/sysconfig
    │   lib/python3.13/tabnanny.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tabnanny.py
    │   lib/python3.13/tarfile.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tarfile.py
    │   lib/python3.13/tempfile.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tempfile.py
    │   lib/python3.13/test -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/test
    │   lib/python3.13/textwrap.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/textwrap.py
    │   lib/python3.13/this.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/this.py
    │   lib/python3.13/threading.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/threading.py
    │   lib/python3.13/timeit.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/timeit.py
    │   lib/python3.13/tkinter -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tkinter
    │   lib/python3.13/token.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/token.py
    │   lib/python3.13/tokenize.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tokenize.py
    │   lib/python3.13/tomllib -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tomllib
    │   lib/python3.13/trace.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/trace.py
    │   lib/python3.13/traceback.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/traceback.py
    │   lib/python3.13/tracemalloc.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tracemalloc.py
    │   lib/python3.13/tty.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/tty.py
    │   lib/python3.13/turtle.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/turtle.py
    │   lib/python3.13/turtledemo -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/turtledemo
    │   lib/python3.13/types.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/types.py
    │   lib/python3.13/typing.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/typing.py
    │   lib/python3.13/unittest -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/unittest
    │   lib/python3.13/urllib -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/urllib
    │   lib/python3.13/uuid.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/uuid.py
    │   lib/python3.13/venv -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/venv
    │   lib/python3.13/warnings.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/warnings.py
    │   lib/python3.13/wave.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/wave.py
    │   lib/python3.13/weakref.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/weakref.py
    │   lib/python3.13/webbrowser.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/webbrowser.py
    │   lib/python3.13/wsgiref -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/wsgiref
    │   lib/python3.13/xml -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/xml
    │   lib/python3.13/xmlrpc -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/xmlrpc
    │   lib/python3.13/zipapp.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/zipapp.py
    │   lib/python3.13/zipfile -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/zipfile
    │   lib/python3.13/zipimport.py -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/zipimport.py
    │   lib/python3.13/zoneinfo -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/lib/python3.13/zoneinfo
    │   share -> /nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11/share
    │   → /qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11
    │   └───bin/python3.13-config: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh..# Keep this …
    │       lib/python3.13/__pycache__/subprocess.cpython-313.opt-1.pyc: …velz./system/bin/shz=/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/shz.-cr....Nr...…
    │       lib/python3.13/__pycache__/subprocess.cpython-313.opt-2.pyc: …velz./system/bin/shz=/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/shz.-cr....r....…
    │       lib/python3.13/__pycache__/subprocess.cpython-313.pyc: …velz./system/bin/shz=/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/shz.-cr....Nr...…
    │       lib/python3.13/config-3.13-x86_64-linux-gnu/install-sh: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh.# install - i…
    │       lib/python3.13/config-3.13-x86_64-linux-gnu/makesetup: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh.set -e..# Con…
    │       lib/python3.13/ctypes/macholib/fetch_macholib: …#!/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh.svn export --…
    │       lib/python3.13/subprocess.py: …roidapilevel') else '/nix/store/lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3/bin/sh').           …
    │       → /lw117lsr8d585xs63kx5k233impyrq7q-bash-5.3p3
    ├───lib/python3.13/site-packages/_distutils_hack -> /nix/store/bq3172qx0c68yv0i4wy51y1bzln4wndr-python3.13-setuptools-80.9.0/lib/python3.13/site-packages/_distutils_hack
    │   lib/python3.13/site-packages/distutils-precedence.pth -> /nix/store/bq3172qx0c68yv0i4wy51y1bzln4wndr-python3.13-setuptools-80.9.0/lib/python3.13/site-packages/distutils-precedence.pth
    │   lib/python3.13/site-packages/pkg_resources -> /nix/store/bq3172qx0c68yv0i4wy51y1bzln4wndr-python3.13-setuptools-80.9.0/lib/python3.13/site-packages/pkg_resources
    │   lib/python3.13/site-packages/setuptools -> /nix/store/bq3172qx0c68yv0i4wy51y1bzln4wndr-python3.13-setuptools-80.9.0/lib/python3.13/site-packages/setuptools
    │   lib/python3.13/site-packages/setuptools-80.9.0.post0.dist-info -> /nix/store/bq3172qx0c68yv0i4wy51y1bzln4wndr-python3.13-setuptools-80.9.0/lib/python3.13/site-packages/setuptools-80.9.0.post0.dist-info
    │   → /bq3172qx0c68yv0i4wy51y1bzln4wndr-python3.13-setuptools-80.9.0
    │   └───nix-support/propagated-build-inputs: …/nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11 …
    │       → /qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11
    └───lib/python3.13/site-packages/_yaml -> /nix/store/kd51qv297829fis0swh94b906qsg27i0-python3.13-pyyaml-6.0.3/lib/python3.13/site-packages/_yaml
        lib/python3.13/site-packages/pyyaml-6.0.3.dist-info -> /nix/store/kd51qv297829fis0swh94b906qsg27i0-python3.13-pyyaml-6.0.3/lib/python3.13/site-packages/pyyaml-6.0.3.dist-info
        lib/python3.13/site-packages/yaml -> /nix/store/kd51qv297829fis0swh94b906qsg27i0-python3.13-pyyaml-6.0.3/lib/python3.13/site-packages/yaml
        → /kd51qv297829fis0swh94b906qsg27i0-python3.13-pyyaml-6.0.3
        └───nix-support/propagated-build-inputs: …/nix/store/qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11 …
            → /qzc04a3npl70cyyy6flnnrb2ig3kayxm-python3-3.13.11

Basically the common problem is that often upstream projects mix scripts for $out and for building in the same directory, and patchShebangs being run during patchPhase is patching the $out intended scripts with build platform Bash.

@nixpkgs-ci nixpkgs-ci bot requested review from Scrumplex and lovek323 January 18, 2026 13:49
@nixpkgs-ci nixpkgs-ci bot added 10.rebuild-linux: 501+ This PR causes many rebuilds on Linux and should normally target the staging branches. 10.rebuild-darwin: 501+ This PR causes many rebuilds on Darwin and should normally target the staging branches. 10.rebuild-darwin: 5001+ This PR causes many rebuilds on Darwin and must target the staging branches. 10.rebuild-linux: 5001+ This PR causes many rebuilds on Linux and must target the staging branches. 2.status: merge-bot eligible This PR can be merged by commenting "@NixOS/nixpkgs-merge-bot merge". labels Jan 18, 2026
@doronbehar doronbehar marked this pull request as draft January 18, 2026 13:50
@doronbehar doronbehar changed the base branch from master to staging January 18, 2026 13:50
@nixpkgs-ci nixpkgs-ci bot removed the 2.status: merge-bot eligible This PR can be merged by commenting "@NixOS/nixpkgs-merge-bot merge". label Jan 18, 2026
@nixpkgs-ci nixpkgs-ci bot closed this Jan 18, 2026
@nixpkgs-ci nixpkgs-ci bot reopened this Jan 18, 2026
github-actions[bot]

This comment was marked as outdated.

@github-actions github-actions bot dismissed their stale review January 18, 2026 14:17

All good now, thank you!

@nixpkgs-ci nixpkgs-ci bot added 10.rebuild-linux-stdenv This PR causes stdenv to rebuild on Linux and must target a staging branch. 10.rebuild-darwin-stdenv This PR causes stdenv to rebuild on Darwin and must target a staging branch. labels Jan 18, 2026
@doronbehar doronbehar marked this pull request as ready for review January 18, 2026 14:36
@nixpkgs-ci nixpkgs-ci bot requested review from Ericson2314 and pSub January 18, 2026 14:42
@doronbehar doronbehar changed the title curl{,Minimal}: patchShebang of wcurl script with host Bash patch-shebangs: always --update --host shebangs Jan 18, 2026
@doronbehar doronbehar requested a review from Artturin January 20, 2026 10:10
@doronbehar doronbehar force-pushed the pkg/curl@cross branch 2 times, most recently from 47ca363 to 22495d0 Compare January 20, 2026 10:19
@doronbehar doronbehar requested a review from bmillwood January 21, 2026 09:52
@doronbehar doronbehar requested review from qbisi and qweered January 29, 2026 14:39
@doronbehar
Copy link
Contributor Author

Since I didn't get any attention on this, and I feel like it will take months for this to get attention, I opened 2 PRs for the packages I encountered:

@tobim tobim requested a review from a team February 22, 2026 13:48
@emilazy
Copy link
Member

emilazy commented Feb 22, 2026

This seems like it would produce incorrect results when you have e.g. a foo-config for the build platform without split outputs and are specifically doing patchShebangs --build on it?

@doronbehar
Copy link
Contributor Author

doronbehar commented Feb 22, 2026

This seems like it would produce incorrect results when you have e.g. a foo-config for the build platform without split outputs and are specifically doing patchShebangs --build on it?

I think that executables like foo-config, that we actually might rely upon, are generated only after the configure phase, in order to know what $prefix etc. to use. I can imagine a situation where it is an executable shell script during the patch/configure phase, and upstream's build scripts embed in it the correct $prefix or whatever. In that case, there shouldn't be a need for us to patch its shebangs, as we are not running it during build, and it would be simpler to let stdenv patch the shebang of it in the standard fixupPhase.

OTH, the (more likely IMO) situation encountered in curl and lirc, is that the upstream source has a directory with shell scripts that are used both for build and host platforms. In that case, there is no choice but to patch the shebangs with --host --update during postFixup, as done in #493000 and #493004 .

There is a 3rd, (very rare IMO) scenario, which is: Along with other build scripts, upstream puts in the source a foo-config executable file, which also gets substituted for values like $prefix during the build; a Nix packager tells the builder to run patchShebangs during patchPhase to make the other build scripts work, and consequently foo-config ends up in $out/bin with a host shebang instead of a build platform shebang (due to this patch).

If the scenario above actually exists, we can always modify that Nix expression to run patchShebangs --update --build $out/bin/foo-config, or even better to split outputs properly.

If this sounds convincing enough, I can write something a bit more concise in the commit message - if it will help.

Many sources of packages mix scripts meant for build and host platforms
in the same folder. Two examples of that are `curl` & `lirc`, installing
on the host platform `wcurl` & several other executables respectively.

When `patchShebangs` runs during patch phase, it uses the build
platform. When it runs automatically upon the outputs in the fixup
phase, there's no reason it shouldn't `--update` the shebangs of the
scripts patched in the patch phase.

The common scenario this addresses is upstream source directories
containing shell scripts used for both build and host platforms. In
such cases, patching with `--host --update` during `postFixup` is
necessary (as done for curl and lirc), since the fixup phase should
reconcile any build-platform shebangs applied earlier.

A concern was raised about `foo-config`-style scripts intended for the
build platform that end up in $out without split outputs. Such cases
are considered rare: these scripts are typically generated after the
configure phase (and thus not affected by an earlier `patchShebangs`
call), or can be handled explicitly via `patchShebangs --update --build
$out/bin/foo-config`, or ideally by splitting outputs properly.
@doronbehar
Copy link
Contributor Author

I rebased, with a better commit message addressing the concern expressed by @emilazy. I'm still waiting for your reply 🙏 on my stand.

@qbisi qbisi requested a review from LordGrimmauld March 3, 2026 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

10.rebuild-darwin: 501+ This PR causes many rebuilds on Darwin and should normally target the staging branches. 10.rebuild-darwin: 5001+ This PR causes many rebuilds on Darwin and must target the staging branches. 10.rebuild-darwin-stdenv This PR causes stdenv to rebuild on Darwin and must target a staging branch. 10.rebuild-linux: 501+ This PR causes many rebuilds on Linux and should normally target the staging branches. 10.rebuild-linux: 5001+ This PR causes many rebuilds on Linux and must target the staging branches. 10.rebuild-linux-stdenv This PR causes stdenv to rebuild on Linux and must target a staging branch.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants