mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-22 06:53:01 +00:00
split moduleClosure in two parts:
* unifyModuleSyntax: handle all kind of module syntax to convert them into a module which has the following form: { imports = [ <paths> ]; options = <attribute set of options declarations>; config = <attribute set (with properties) of option definitions>; } This function assume that there is at most one imported attribute set which correspond to option declarations. * moduleClosure: handle a list of module's paths which are converted with the previous function to do the closure of the imports with the function lazyGenericClosure (which does the same as builtins.genericClosure except that it doesn't evaluate the content of modules). The "key" and "paths" attributes are left to be used as debug information in futur implementation(s). svn path=/nixpkgs/trunk/; revision=17108
This commit is contained in:
parent
5b20a89f11
commit
1557cfd0c6
@ -32,16 +32,10 @@ rec {
|
||||
else
|
||||
f;
|
||||
|
||||
moduleClosure = initModules: args:
|
||||
# Convert module to a set which has imports / options and config
|
||||
# attributes.
|
||||
unifyModuleSyntax = m:
|
||||
let
|
||||
moduleImport = m:
|
||||
(applyIfFunction (importIfPath m) args) // {
|
||||
# used by generic closure to avoid duplicated imports.
|
||||
key = m;
|
||||
};
|
||||
|
||||
removeKeys = list: map (m: removeAttrs m ["key"]) list;
|
||||
|
||||
getImports = m:
|
||||
if m ? config || m ? options then
|
||||
attrByPath ["imports"] [] m
|
||||
@ -51,13 +45,39 @@ rec {
|
||||
getImportedPaths = m: filter isPath (getImports m);
|
||||
getImportedSets = m: filter (x: !isPath x) (getImports m);
|
||||
|
||||
inlineImportedSets = list:
|
||||
lib.concatMap (m:[m] ++ map moduleImport (getImportedSets m)) list;
|
||||
getConfig = m:
|
||||
removeAttrs (delayProperties m) ["require"];
|
||||
in
|
||||
removeKeys (inlineImportedSets (lazyGenericClosure {
|
||||
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
|
||||
moduleImport = m: lib.addErrorContext "Import module ${m}." (
|
||||
(unifyModuleSyntax (applyIfFunction (import m) args)) // {
|
||||
# used by generic closure to avoid duplicated imports.
|
||||
key = m;
|
||||
paths = [ m ];
|
||||
}
|
||||
);
|
||||
|
||||
getImports = m: attrByPath ["imports"] [] m;
|
||||
in
|
||||
lazyGenericClosure {
|
||||
startSet = map moduleImport initModules;
|
||||
operator = m: map moduleImport (getImportedPaths m);
|
||||
}));
|
||||
operator = m: map moduleImport (getImports m);
|
||||
};
|
||||
|
||||
selectDeclsAndDefs = modules:
|
||||
lib.concatMap (m:
|
||||
|
Loading…
Reference in New Issue
Block a user