I’m trying to do roughly this in a module:
{config, ...}: {
options.foo = {
# ...
};
imports = someFunc config.foo;
}
but that gives me an infinite recursion error. I don’t understand how that’s possible since I don’t refer to config.foo in someFunc.
Is this possible to do?
No this is impossible because of how the module system works. The imports
line in any module cannot have any dependence on dynamic properties of the module system like config, options, or pkgs. The reason is described here, nixpkgs/modules.nix at edcd3d30564ca6d4c1f2442c4149fa908228243e · NixOS/nixpkgs · GitHub. There are a few arguments that are allowed to be used in imports
known as specialArgs
, one example of this is modulesPath
which lets you reference the path where the default modules available in nixos are stored.
You can find out more about the internals of the module system works by reading the comments in nixpkgs/modules.nix at 44414a98a9911dc6667e58a8deae06d7f1f18b48 · NixOS/nixpkgs · GitHub. I don’t know if there is any proper docs for the module system itself, there are some for NixOS which is based on the module system.
1 Like
Too bad that it’s this way. I’m switching from imperatively generating configs from functions that I put in imports to declaratively storing the function arguments, and this means that where before, merging was automatic and correct, now I have to manually merge generated configs 
EDIT: Actually, that seems to be what mkMerge is for, yey 