The lib
in the NixOS module arguments comes from the module system itself and is the preferred way to reference it in NixOS. It’s the only one that doesn’t depend on pkgs
and therefore doesn’t lead to infinite recursion when you use it to define modules themselves (which might define overlays, which can influence pkgs
).
The pkgs.lib
isn’t related to NixOS. It comes from the fact that pkgs.callPackage
automatically passes arguments defined in the pkgs
scope. So by having pkgs.lib
, you can callPackage
files like { lib }: <expression>
And finally, I had to look this up myself, pkgs.stdenv.lib
is apparently for convenience, although I’m not entirely sure in which cases it’s more convenient, but this is the reasoning given at its definition site: https://github.com/NixOS/nixpkgs/blob/faf5e8ad8cf2a4b4a09f86b1a6474f1c32479af9/pkgs/stdenv/generic/default.nix#L140-L142