2009-07-13 16:18:52 +00:00
|
|
|
# NixOS module handling.
|
|
|
|
|
|
|
|
let lib = import ./default.nix; in
|
|
|
|
|
|
|
|
with { inherit (builtins) head tail; };
|
|
|
|
with import ./trivial.nix;
|
|
|
|
with import ./lists.nix;
|
|
|
|
with import ./misc.nix;
|
|
|
|
with import ./attrsets.nix;
|
|
|
|
with import ./properties.nix;
|
|
|
|
|
|
|
|
rec {
|
|
|
|
|
|
|
|
# Unfortunately this can also be a string.
|
|
|
|
isPath = x: !(
|
|
|
|
builtins.isFunction x
|
|
|
|
|| builtins.isAttrs x
|
|
|
|
|| builtins.isInt x
|
|
|
|
|| builtins.isBool x
|
|
|
|
|| builtins.isList x
|
|
|
|
);
|
|
|
|
|
|
|
|
importIfPath = path:
|
|
|
|
if isPath path then
|
|
|
|
import path
|
|
|
|
else
|
|
|
|
path;
|
|
|
|
|
|
|
|
applyIfFunction = f: arg:
|
|
|
|
if builtins.isFunction f then
|
|
|
|
f arg
|
|
|
|
else
|
|
|
|
f;
|
|
|
|
|
2009-09-14 13:19:00 +00:00
|
|
|
# Convert module to a set which has imports / options and config
|
|
|
|
# attributes.
|
|
|
|
unifyModuleSyntax = m:
|
2009-07-13 16:18:52 +00:00
|
|
|
let
|
|
|
|
getImports = m:
|
|
|
|
if m ? config || m ? options then
|
|
|
|
attrByPath ["imports"] [] m
|
|
|
|
else
|
|
|
|
toList (rmProperties (attrByPath ["require"] [] (delayProperties m)));
|
|
|
|
|
|
|
|
getImportedPaths = m: filter isPath (getImports m);
|
|
|
|
getImportedSets = m: filter (x: !isPath x) (getImports m);
|
|
|
|
|
2009-09-14 13:19:00 +00:00
|
|
|
getConfig = m:
|
|
|
|
removeAttrs (delayProperties m) ["require"];
|
|
|
|
in
|
|
|
|
if m ? config || m ? options then
|
|
|
|
m
|
|
|
|
else
|
|
|
|
{
|
|
|
|
imports = getImportedPaths m;
|
|
|
|
config = getConfig m;
|
|
|
|
} // (
|
|
|
|
if getImportedSets m != [] then
|
|
|
|
assert tail (getImportedSets m) == [];
|
|
|
|
{ options = head (getImportedSets m); }
|
|
|
|
else
|
|
|
|
{}
|
|
|
|
);
|
|
|
|
|
|
|
|
moduleClosure = initModules: args:
|
|
|
|
let
|
2009-09-14 20:10:41 +00:00
|
|
|
moduleImport = m: lib.addErrorContext
|
|
|
|
"Import module ${(if builtins.isAttrs m then "{...}" else m)}." (
|
|
|
|
(unifyModuleSyntax (applyIfFunction
|
|
|
|
(if builtins.isAttrs m then m else import m) args)) // {
|
2009-09-14 13:19:00 +00:00
|
|
|
# used by generic closure to avoid duplicated imports.
|
|
|
|
key = m;
|
|
|
|
paths = [ m ];
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
getImports = m: attrByPath ["imports"] [] m;
|
2009-07-13 16:18:52 +00:00
|
|
|
in
|
2009-09-14 13:19:00 +00:00
|
|
|
lazyGenericClosure {
|
2009-07-13 16:18:52 +00:00
|
|
|
startSet = map moduleImport initModules;
|
2009-09-14 13:19:00 +00:00
|
|
|
operator = m: map moduleImport (getImports m);
|
|
|
|
};
|
2009-07-13 16:18:52 +00:00
|
|
|
|
|
|
|
selectDeclsAndDefs = modules:
|
|
|
|
lib.concatMap (m:
|
|
|
|
if m ? config || m ? options then
|
2009-07-14 16:22:42 +00:00
|
|
|
[ (attrByPath ["options"] {} m) ]
|
|
|
|
++ [ (attrByPath ["config"] {} m) ]
|
2009-07-13 16:18:52 +00:00
|
|
|
else
|
|
|
|
[ m ]
|
|
|
|
) modules;
|
|
|
|
|
2009-09-14 20:10:41 +00:00
|
|
|
}
|