nixpkgs/pkgs/stdenv
Maximilian Bosch 53c5f08415
stdenv: refactor .attrs.sh detection
Relying on `.attrs.sh` to exist in `$NIX_BUILD_TOP` is problematic
because that's not compatible with how `nix-shell(1)` behaves. It places
`.attrs.{json,sh}` into a temporary directory and makes them accessible via
`$NIX_ATTRS_{SH,JSON}_FILE` in the environment[1]. The sole reason that
`nix-shell(1)` still works with structured-attrs enabled derivations
is that the contents of `.attrs.sh` are sourced into the
shell before sourcing `$stdenv/setup` (if `$stdenv` exists) by `nix-shell`.

However, the assumption that two files called `.attrs.sh` and
`.attrs.json` exist in `$NIX_BUILD_TOP` is wrong in an interactive shell
session and thus an inconsistency between shell debug session and actual
builds which can lead to unexpected problems.

To be precise, we currently have the following problem: an expression
like

  with import ./. {};
  runCommand "foo" { __structuredAttrs = true; foo.bar = [ 1 2 3 ]; }
    ''
      echo "''${__structuredAttrs@Q}"
      touch $out
    ''

prints `1` in its build-log. However when building interactively in a
`nix-shell`, it doesn't.

Because of that, I'm considering to propose a full deprecation of
`$NIX_BUILD_TOP/.attrs.{json,sh}`. A first step is to only mention the
environment variables, but not the actual paths anymore in Nix's
manual[2]. The second step - this patch - is to fix nixpkgs' stdenv
accordingly.

Please note that we cannot check for `-e "$NIX_ATTRS_JSON_FILE"` because
certain outdated Nix minors (that are still in the range of supported
Nix versions in `nixpkgs`) have a bug where `NIX_ATTRS_JSON_FILE` points
to the wrong file while building[3].

Also, for compatibility with Nix 2.3 which doesn't provide these
environment variables at all we still need to check for the existence of
.attrs.json/.attrs.sh here. As soon as we bump nixpkgs' minver to 2.4,
this can be dropped.

Finally, dropped the check for ATTRS_SH_FILE because that was never
relevant. In nix#4770 the ATTRS_SH_FILE variable was introduced[4] and
in a review iteration prefixed with NIX_[5]. In other words, these
variables were never part of a release and you'd only have this problem
if you'd use a Nix from a git revision of my branch from back then. In
other words, that's dead code.

[1] https://github.com/nixos/nix/pull/4770#issuecomment-834718851
[2] https://github.com/NixOS/nix/pull/9032
[3] https://github.com/NixOS/nix/issues/6736
[4] 3944a120ec
[5] 27ce722638
2023-10-04 18:35:30 +02:00
..
cross pkgs: fix typos 2023-05-19 22:31:04 -04:00
custom
cygwin
darwin freshBootstrapTools.bootstrapTools: fix eval on darwin 2023-09-07 04:24:05 +03:00
freebsd config.contentAddressedByDefault: init option 2022-04-27 23:21:32 +03:00
generic stdenv: refactor .attrs.sh detection 2023-10-04 18:35:30 +02:00
linux Merge pull request #258476 from Artturin/bootstrapthingies2 2023-10-02 09:10:31 +03:00
native stdenv: fix stagesNative 2023-07-02 19:07:23 +10:00
nix stdenv/common-path.nix: move to stdenv/generic/ 2022-07-29 18:24:00 -04:00
tests stdenv.tests: Add succeedOnFailure 2022-11-14 19:03:35 +01:00
adapters.nix makeStaticBinaries: Set -DCMAKE_SKIP_INSTALL_RPATH 2023-09-03 18:30:59 +01:00
booter.nix pkgs/stdenv: fix typo in booter.nix docs 2023-09-04 22:24:12 +02:00
default.nix darwin.stdenv: refactor stdenv definition 2023-07-02 17:56:24 -04:00