lib.modules: add mkDerivedConfig

mkDerivedConfig : Option a -> (a -> Definition b) -> Definition b

Create config definitions with the same priority as the definition of another option.
This should be used for option definitions where one option sets the value of another as a convenience.
For instance a config file could be set with a `text` or `source` option, where text translates to a `source`
value using `mkDerivedConfig options.text (pkgs.writeText "filename.conf")`.

It takes care of setting the right priority using `mkOverride`.

Changed files
+23 -4
lib
nixos
modules
system
etc
+1 -1
lib/default.nix
···
mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
-
mkAliasOptionModule doRename;
+
mkAliasOptionModule mkDerivedConfig doRename;
inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions
mergeDefaultOption mergeOneOption mergeEqualOption getValues
getFiles optionAttrSetToDocList optionAttrSetToDocList'
+20
lib/modules.nix
···
use = id;
};
+
/* mkDerivedConfig : Option a -> (a -> Definition b) -> Definition b
+
+
Create config definitions with the same priority as the definition of another option.
+
This should be used for option definitions where one option sets the value of another as a convenience.
+
For instance a config file could be set with a `text` or `source` option, where text translates to a `source`
+
value using `mkDerivedConfig options.text (pkgs.writeText "filename.conf")`.
+
+
It takes care of setting the right priority using `mkOverride`.
+
*/
+
# TODO: make the module system error message include information about `opt` in
+
# error messages about conflicts. E.g. introduce a variation of `mkOverride` which
+
# adds extra location context to the definition object. This will allow context to be added
+
# to all messages that report option locations "this value was derived from <full option name>
+
# which was defined in <locations>". It can provide a trace of options that contributed
+
# to definitions.
+
mkDerivedConfig = opt: f:
+
mkOverride
+
(opt.highestPrio or defaultPriority)
+
(f opt.value);
+
doRename = { from, to, visible, warn, use, withPriority ? true }:
{ config, options, ... }:
let
+2 -3
nixos/modules/system/etc/etc.nix
···
target = mkDefault name;
source = mkIf (config.text != null) (
let name' = "etc-" + baseNameOf name;
-
in mkOverride
-
(options.text.highestPrio or lib.modules.defaultPriority)
-
(pkgs.writeText name' config.text));
+
in mkDerivedConfig options.text (pkgs.writeText name')
+
);
};
}));