{ inputs, ... }: { # The _module.args definitions are passed on to modules as arguments. E.g. # the module `{ pkgs ... }: { /* config */ }` implicitly uses # `_module.args.pkgs` (defined in this case by flake-parts). perSystem = { system, ... }: { _module.args = { # Note: bringing up https://zimbatm.com/notes/1000-instances-of-nixpkgs # again, the below creates several nixpkgs instances which the # flake-centric CLI will be forced to evaluate e.g. on `nix flake show`. # # This is currently "slow" and "expensive", on a certain scale. # This also isn't "right" in that this hinders dependency injection at # the level of flake inputs. This might get removed in the foreseeable # future. # # Note that you can use these expressions without Nix # (`pkgs.callPackage ./devops/nix/scope.nix { }` is the entry point). pkgsCuda = import inputs.nixpkgs { inherit system; # Ensure dependencies use CUDA consistently (e.g. that openmpi, ucc, # and ucx are built with CUDA support) config.cudaSupport = true; config.allowUnfreePredicate = p: builtins.all ( license: license.free || builtins.elem license.shortName [ "CUDA EULA" "cuDNN EULA" ] ) (p.meta.licenses or [ p.meta.license ]); }; # Ensure dependencies use ROCm consistently pkgsRocm = import inputs.nixpkgs { inherit system; config.rocmSupport = true; }; }; }; }