-
-
Notifications
You must be signed in to change notification settings - Fork 15k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
lib/modules: Document _module.args
#165540
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -46,6 +46,7 @@ let | |||||
showFiles | ||||||
showOption | ||||||
unknownModule | ||||||
literalExpression | ||||||
; | ||||||
|
||||||
showDeclPrefix = loc: decl: prefix: | ||||||
|
@@ -140,7 +141,7 @@ rec { | |||||
# this module is used, to avoid conflicts and allow chaining of | ||||||
# extendModules. | ||||||
internalModule = rec { | ||||||
_file = ./modules.nix; | ||||||
_file = "lib/modules.nix"; | ||||||
|
||||||
key = _file; | ||||||
|
||||||
|
@@ -153,8 +154,91 @@ rec { | |||||
# a `_module.args.pkgs = import (fetchTarball { ... }) {}` won't | ||||||
# start a download when `pkgs` wasn't evaluated. | ||||||
type = types.lazyAttrsOf types.raw; | ||||||
internal = true; | ||||||
description = "Arguments passed to each module."; | ||||||
# Only render documentation once at the root of the option tree, | ||||||
# not for all individual submodules. | ||||||
internal = prefix != []; | ||||||
# TODO: Change the type of this option to a submodule with a | ||||||
# freeformType, so that individual arguments can be documented | ||||||
# separately | ||||||
description = '' | ||||||
Additional arguments passed to each module in addition to ones | ||||||
like <literal>lib</literal>, <literal>config</literal>, | ||||||
and <literal>pkgs</literal>, <literal>modulesPath</literal>. | ||||||
</para> | ||||||
<para> | ||||||
This option is also available to all submodules. Submodules do not | ||||||
inherit args from their parent module, nor do they provide args to | ||||||
their parent module or sibling submodules. The sole exception to | ||||||
this is the argument <literal>name</literal> which is provided by | ||||||
parent modules to a submodule and contains the attribute name | ||||||
the submodule is bound to, or a unique generated name if it is | ||||||
not bound to an attribute. | ||||||
</para> | ||||||
<para> | ||||||
Some arguments are already passed by default, of which the | ||||||
following <emphasis>cannot</emphasis> be changed with this option: | ||||||
<itemizedlist> | ||||||
<listitem> | ||||||
<para> | ||||||
<varname>lib</varname>: The nixpkgs library. | ||||||
</para> | ||||||
</listitem> | ||||||
<listitem> | ||||||
<para> | ||||||
<varname>config</varname>: The results of all options after merging the values from all modules together. | ||||||
</para> | ||||||
</listitem> | ||||||
<listitem> | ||||||
<para> | ||||||
<varname>options</varname>: The options declared in all modules. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
</para> | ||||||
</listitem> | ||||||
<listitem> | ||||||
<para> | ||||||
<varname>specialArgs</varname>: The <literal>specialArgs</literal> argument passed to <literal>evalModules</literal>. | ||||||
</para> | ||||||
</listitem> | ||||||
<listitem> | ||||||
<para> | ||||||
All attributes of <varname>specialArgs</varname> | ||||||
</para> | ||||||
<para> | ||||||
Whereas option values can generally depend on other option values | ||||||
thanks to laziness, this does not apply to <literal>imports</literal>, which | ||||||
must be computed statically before anything else. | ||||||
</para> | ||||||
<para> | ||||||
For this reason, callers of the module system can provide <literal>specialArgs</literal> | ||||||
which are available during import resolution. | ||||||
</para> | ||||||
<para> | ||||||
For NixOS, <literal>specialArgs</literal> includes | ||||||
<varname>modulesPath</varname>, which allows you to import | ||||||
extra modules from the nixpkgs package tree without having to | ||||||
somehow make the module aware of the location of the | ||||||
<literal>nixpkgs</literal> or NixOS directories. | ||||||
<programlisting> | ||||||
{ modulesPath, ... }: { | ||||||
imports = [ | ||||||
(modulesPath + "/profiles/minimal.nix") | ||||||
]; | ||||||
} | ||||||
</programlisting> | ||||||
</para> | ||||||
</listitem> | ||||||
</itemizedlist> | ||||||
</para> | ||||||
<para> | ||||||
For NixOS, the default value for this option includes at least this argument: | ||||||
<itemizedlist> | ||||||
<listitem> | ||||||
<para> | ||||||
<varname>pkgs</varname>: The nixpkgs package set according to | ||||||
the <option>nixpkgs.pkgs</option> option. | ||||||
</para> | ||||||
</listitem> | ||||||
</itemizedlist> | ||||||
''; | ||||||
}; | ||||||
|
||||||
_module.check = mkOption { | ||||||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Subtle but important.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems that something is missing from my terminology here. I can't find a word for what's like a level of modules, corresponding to an
evalModules
invocation, whether throughlib
ortypes.submodule
. "Modules" is too vague "configuration" is a little more accurate but deemphasizes theoptions
. "Configuration fixpoint" will send our readers studying for a day ;). Not sure what to do.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"modules are merged according to the longest common option path prefix"? that covers both configurations (prefix 𝜀) and submodules (nested or not)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While that is true, it does not indicate where
config
starts or equivalently: what is the result of "all options" and which options are "all".There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this clarification is needed because it's fairly obvious, submodules have a completely separate option set. This would fit better into the full NixOS documentation, this here should only be a very short explanation, only in relation to
_module.args
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fair enough 🚀