This is one big thing that's preventing us from adopting nix
This is one big thing that's preventing us from adopting nix
However, you can use synthetic firmlinks to define arbitrary root-level paths that _are_ writable.
See `man synthetic.conf` and check out https://derflounder.wordpress.com/2020/01/18/creating-root-l... for an example usage.
PS: It looks like nix has a PR open to test that solution here: https://github.com/NixOS/nix/pull/3212
See `man synthetic.conf`
No, synthetic.conf only creates directories or symlinks. If it actually created firmlinks, the problem would probably be much smaller.
The problem with symlinks is that some builds use realpath. If /nix was a symlink to e.g. /usr/local/nix, this would result in /usr/local/nix being used in this builds. This leads to various build problems [1] and can result in the wrong paths ending up in binaries. If this happens on a builder, the resulting binaries are not portable between macOS + Nix machines.
So, instead the only way to get it currently working is to use synthetic.conf to create a new top-level directory and mount a APFS volume with the Nix store there.
If Apple actually allowed creating firmlinks with synthetic.conf, the Nix installation would be drastically simplified. /nix could just be a firmlink to e.g. /usr/local/nix, since realpath does not report the actual path on firmlinks.
[1] https://github.com/NixOS/nix/issues/2926#issuecomment-559989...
> The main consequence of using a separate prefix for macOS is that you can't have Hydra jobsets anymore containing jobs for macOS and Linux. It would also make it harder to deploy from macOS to Linux.
i.e., if the same package builds for both Linux and macOS, you can't write a single shell script that runs on both Linux Nix and macOS Nix and calls that package? Maybe I'm misunderstanding how people deploy things, but is that a huge problem in practice?
(I don't quite follow the thing about Hydra jobsets. Aren't you building once for Linux and once for macOS anyway? Figuring out how to make the build do that seems like it would subsume any complexity of using /nix vs. /opt/nix.)
Nix has sharp edges but this one is less of a concern than you'd think ime