about summary refs log tree commit diff
path: root/lib/options.nix
AgeCommit message (Collapse)AuthorFilesLines
2021-08-10lib/options: Better mergeEqualOption error for uncomparable typesSilvan Mosberger1-1/+2
For an option definition that uses `lib.options.mergeEqualOption` underneath, like `types.anything`, an error is thrown when multiple functions are assigned, indicating that functions can't be compared for equivalence: error: The option `test' has conflicting definition values: - In `xxx': <function> - In `xxx': <function> (use '--show-trace' to show detailed location information) However, the error message didn't use the correct files. While above error indicates that both definitions are in the xxx file, that's in fact not true. Above error was generated with options.test = lib.mkOption { type = lib.types.anything; }; imports = [ { _file = "yyy"; test = y: y; } { _file = "xxx"; test = x: x; } ]; With this change, the error uses the correct file locations: error: The option `test' has conflicting definition values: - In `xxx': <function> - In `yyy': <function> (use '--show-trace' to show detailed location information)
2020-12-18Revert "Module-builtin assertions, disabling assertions and submodule ↵Silvan Mosberger1-1/+1
assertions"
2020-11-30lib/options: Don't show internal suboption in the manualSilvan Mosberger1-1/+1
Initially https://github.com/NixOS/nixpkgs/pull/82897 prevented non-visible options from being rendered in the manual, but visible-but-internal options were still being recursed into. This fixes this, aligning the recurse condition here with the one in make-options-doc/default.nix
2020-10-22lib/options.nix: Use merge-friendly inherit syntaxRobert Hensing1-5/+30
2020-10-22lib: Use Nix's static scope checking, fix error message, optimizeRobert Hensing1-5/+9
Nix can perform static scope checking, but whenever code is inside a `with` expression, the analysis breaks down, because it can't know statically what's in the attribute set whose attributes were brought into scope. In those cases, Nix has to assume that everything works out. Except it doesnt. Removing `with` from lib/ revealed an undefined variable in an error message. If that doesn't convince you that we're better off without `with`, I can tell you that this PR results in a 3% evaluation performance improvement because Nix can look up local variables by index. This adds up with applications like the module system. Furthermore, removing `with` makes the binding site of each variable obvious, which helps with comprehension.
2020-10-22lib/options.nix: Use head instead of elemAt _ 0Robert Hensing1-1/+1
2020-09-21lib/modules: Improve error messages using showDefsSilvan Mosberger1-6/+6
2020-09-21lib/options: Introduce showDefsSilvan Mosberger1-0/+18
For pretty-printing definitions, including file and values
2020-09-15lib/options: Fix mergeEqualOption for singular functionsSilvan Mosberger1-0/+4
Previously it would error out for a single function definition
2020-04-14lib/options: fix showOption exampleDaiderd Jordan1-1/+1
2020-04-14Revert "lib/options: Use escapeNixIdentifier for showOption"Daiderd Jordan1-7/+8
This is used in in the manual generation for option identifiers that can be linked. This, unike what the example describes, doesn't preserve quotes which is needed for these identifiers to be valid. This reverts commit 124cccbe3b63122733e02e41e45a383ec48752fd.
2020-04-14lib/options: Relax showOption quotingJan Tojnar1-1/+14
https://github.com/NixOS/nixpkgs/commit/124cccbe3b63122733e02e41e45a383ec48752fd broke the build of NixOS manual. It does not make sense to be as strict as with attributes since we are not limited by the CLI's inability to handle numbers. Placeholders should not be quoted either as they are not part of Nix syntax but a meta-level construct.
2020-04-13lib/options: Use escapeNixIdentifier for showOptionSilvan Mosberger1-8/+1
2020-03-19lib/options: Only recurse into visible sub optionsSilvan Mosberger1-1/+1
2019-08-26lib/options: fix path in commentJan Tojnar1-1/+1
2019-06-05module system: prettify a bit error when unique option defined twicedanbst1-1/+1
The error can be reproduced like: ``` $ nix-instantiate ./nixos -A system --arg configuration ' { fileSystems."/".device = "nodev"; boot.loader.grub.devices = [ "nodev" ]; containers.t.config.imports = [ <nixpkgs/nixos/modules/virtualisation/amazon-image.nix> ]; }' ``` Previously error was: ``` error: The unique option `containers.t.networking.hostName' is defined multiple times, in `/nix/var/nix/profiles/per-user/root/channels/nixpkgs/nixos/modules/virtualisation/amazon-image.nix' and `module at /home/danbst/dev/nixpkgs/nixos/modules/virtualisation/containers.nix:470'. (use '--show-trace' to show detailed location information) ``` Now it is: ``` error: The unique option `containers.t.networking.hostName' is defined multiple times, in: - /nix/var/nix/profiles/per-user/root/channels/nixpkgs/nixos/modules/virtualisation/amazon-image.nix - module at /home/danbst/dev/nixpkgs/nixos/modules/virtualisation/containers.nix:470. (use '--show-trace' to show detailed location information) ``` Related: https://github.com/NixOS/nixpkgs/issues/15747
2019-03-07module system: revert "remove types.optionSet", just deprecate (#56857)Danylo Hlynskyi1-0/+2
The explicit remove helped to uncover some hidden uses of `optionSet` in NixOps. However it makes life harder for end-users of NixOps - it will be impossible to deploy 19.03 systems with old NixOps, but there is no new release of NixOps with `optionSet` fixes. Also, "deprecation" process isn't well defined. Even that `optionSet` was declared "deprecated" for many years, it was never announced. Hence, I leave "deprecation" announce. Then, 3 releases after announce, we can announce removal of this feature. This type has to be removed, not `throw`-ed in runtime, because it makes some perfectly fine code to fail. For example: ``` $ nix-instantiate --eval -E '(import <nixpkgs/lib>).types' --strict trace: `types.list` is deprecated; use `types.listOf` instead error: types.optionSet is deprecated; use types.submodule instead (use '--show-trace' to show detailed location information) ```
2019-03-05lib: optionAttrSetToDocList: warn instead of throwing on options without ↵Jan Malakhovski1-1/+1
descriptions For convenience, it's not like not having a description is deadly or something.
2019-01-31types.optionSet: deprecate and remove last usagesdanbst1-2/+0
2018-10-29lib/options: Update documentation comments for docs generationVincent Ambo1-67/+88
Documents functions in `lib.options` for docs generation with nixdoc. The formatting change in the `mkOption` arguments is due to the way `nixdoc` parses documentation comments on pattern arguments. It's not ideal, but it works.
2018-10-02docs: lib/options.nix function documentationTobias Pflug1-0/+39
2018-03-05lib/options: teach showOptions about funny option namesGraham Christensen1-1/+14
Handle the case where options have funny symbols inside of them. Example: If I reference the following attribute without it being defined: security.acme.certs."example.com".webroot I now get the error: The option `security.acme.certs."example.com".webroot' is used but not defined. where before I got: The option `security.acme.certs.example.com.webroot' is used but not defined. which is not true.
2018-02-11lib: export option location in `optionAttrSetToDocList`Jan Malakhovski1-0/+1
2018-02-09nixos, lib: implement relatedPackages optionJan Malakhovski1-4/+5
This allows one to specify "related packages" in NixOS that get rendered into the configuration.nix(5) man page. The interface philosophy is pretty much stolen from TeX bibliography. See the next several commits for examples.
2017-12-23Revert "nixos: doc: implement related packages in the manual"Graham Christensen1-5/+4
2017-12-07nixos, lib: implement relatedPackages optionJan Malakhovski1-4/+5
This allows one to specify "related packages" in NixOS that get rendered into the configuration.nix(5) man page. The interface philosophy is pretty much stolen from TeX bibliography.
2017-09-16Convert libs to a fixed-pointGraham Christensen1-6/+5
This does break the API of being able to import any lib file and get its libs, however I'm not sure people did this. I made this while exploring being able to swap out docFn with a stub in #2305, to avoid functor performance problems. I don't know if that is going to move forward (or if it is a problem or not,) but after doing all this work figured I'd put it up anyway :) Two notable advantages to this approach: 1. when a lib inherits another lib's functions, it doesn't automatically get put in to the scope of lib 2. when a lib implements a new obscure functions, it doesn't automatically get put in to the scope of lib Using the test script (later in this commit) I got the following diff on the API: + diff master fixed-lib 11764a11765,11766 > .types.defaultFunctor > .types.defaultTypeMerge 11774a11777,11778 > .types.isOptionType > .types.isType 11781a11786 > .types.mkOptionType 11788a11794 > .types.setType 11795a11802 > .types.types This means that this commit _adds_ to the API, however I can't find a way to fix these last remaining discrepancies. At least none are _removed_. Test script (run with nix-repl in the PATH): #!/bin/sh set -eux repl() { suff=${1:-} echo "(import ./lib)$suff" \ | nix-repl 2>&1 } attrs_to_check() { repl "${1:-}" \ | tr ';' $'\n' \ | grep "\.\.\." \ | cut -d' ' -f2 \ | sed -e "s/^/${1:-}./" \ | sort } summ() { repl "${1:-}" \ | tr ' ' $'\n' \ | sort \ | uniq } deep_summ() { suff="${1:-}" depth="${2:-4}" depth=$((depth - 1)) summ "$suff" for attr in $(attrs_to_check "$suff" | grep -v "types.types"); do if [ $depth -eq 0 ]; then summ "$attr" | sed -e "s/^/$attr./" else deep_summ "$attr" "$depth" | sed -e "s/^/$attr./" fi done } ( cd nixpkgs #git add . #git commit -m "Auto-commit, sorry" || true git checkout fixed-lib deep_summ > ../fixed-lib git checkout master deep_summ > ../master ) if diff master fixed-lib; then echo "SHALLOW MATCH!" fi ( cd nixpkgs git checkout fixed-lib repl .types )
2016-11-06module system: extensible option typesEric Sagnes1-1/+1
2015-07-30Add read-only optionsEelco Dolstra1-0/+2
These are options that can have only one definition, regardless of priority.
2015-07-23Rename misc.nix -> deprecated.nixEelco Dolstra1-1/+0
2015-07-23Use foldl' instead of fold in some placesEelco Dolstra1-3/+3
2015-07-23optionAttrSetToDocList: O(n^2) -> O(n)Eelco Dolstra1-3/+2
This shaves about 10% off memory consumption of NixOS evaluation.
2015-06-15Make types.bool complain on conflicting definitionsEelco Dolstra1-0/+9
Previously, conflicting definitions would merge to "true". Now they give an error, e.g. error: The option `hardware.enableAllFirmware' has conflicting definitions, in `/etc/nixos/configurations/misc/eelco/stuff.nix' and `/etc/nixos/configurations/misc/eelco/mandark.nix'.
2015-06-15Remove obsolete stuffEelco Dolstra1-14/+0
2015-01-04Add Type information into manual and manpages, fixes #4600Domen Kožar1-0/+1
2014-12-21modules: Add mkSinkUndeclaredOptions.Nicolas B. Pierron1-0/+17
2014-10-05Eliminate some optionals/optionalAttrs calls on the hot pathEelco Dolstra1-3/+3
2013-11-12Add some primops to libEelco Dolstra1-5/+5
2013-10-30Clean up some option examplesEelco Dolstra1-1/+2
2013-10-30Strictly check the arguments to mkOptionEelco Dolstra1-11/+12
And fix various instances of bad arguments.
2013-10-30Show correct position info for errors in submodulesEelco Dolstra1-14/+17
E.g. The unique option `fileSystems./.device' is defined multiple times, in `/etc/nixos/configuration.nix' and `/etc/nixos/foo.nix'. This requires passing file/value tuples to the merge functions.
2013-10-28Remove obsolete function addDefaultOptionValuesEelco Dolstra1-26/+0
2013-10-28Show precise error messages in option merge failuresEelco Dolstra1-10/+11
For instance, if time.timeZone is defined multiple times, you now get the error message: error: user-thrown exception: The unique option `time.timeZone' is defined multiple times, in `/etc/nixos/configurations/misc/eelco/x11vnc.nix' and `/etc/nixos/configuration.nix'. while previously you got: error: user-thrown exception: Multiple definitions of string. Only one is allowed for this option. and only an inspection of the stack trace gave a clue as to what option caused the problem.
2013-10-28Remove uses of the "merge" option attributeEelco Dolstra1-0/+3
It's redundant because you can (and should) specify an option type, or an apply function.
2013-10-28Fix manual generationEelco Dolstra1-25/+23
2013-10-28Remove dead codeEelco Dolstra1-135/+0
2013-10-28Remove uses of mkFixStrictnessEelco Dolstra1-0/+1
mkFixStrictness is no longer needed, woohoo!
2013-10-28Big cleanup of the NixOS module systemEelco Dolstra1-42/+4
The major changes are: * The evaluation is now driven by the declared options. In particular, this fixes the long-standing problem with lack of laziness of disabled option definitions. Thus, a configuration like config = mkIf false { environment.systemPackages = throw "bla"; }; will now evaluate without throwing an error. This also improves performance since we're not evaluating unused option definitions. * The implementation of properties is greatly simplified. * There is a new type constructor "submodule" that replaces "optionSet". Unlike "optionSet", "submodule" gets its option declarations as an argument, making it more like "listOf" and other type constructors. A typical use is: foo = mkOption { type = type.attrsOf (type.submodule ( { config, ... }: { bar = mkOption { ... }; xyzzy = mkOption { ... }; })); }; Existing uses of "optionSet" are automatically mapped to "submodule". * Modules are now checked for unsupported attributes: you get an error if a module contains an attribute other than "config", "options" or "imports". * The new implementation is faster and uses much less memory.
2013-10-23Slightly improve option type error messagesEelco Dolstra1-6/+3
2013-10-23Manual: Don't show obsolete/deprecated optionsEelco Dolstra1-0/+1