about summary refs log tree commit diff
path: root/nixos/doc/manual/development/option-declarations.xml
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/doc/manual/development/option-declarations.xml')
-rw-r--r--nixos/doc/manual/development/option-declarations.xml255
1 files changed, 142 insertions, 113 deletions
diff --git a/nixos/doc/manual/development/option-declarations.xml b/nixos/doc/manual/development/option-declarations.xml
index ed718c89eb77..a8f528a0a804 100644
--- a/nixos/doc/manual/development/option-declarations.xml
+++ b/nixos/doc/manual/development/option-declarations.xml
@@ -3,14 +3,12 @@
         xmlns:xi="http://www.w3.org/2001/XInclude"
         version="5.0"
         xml:id="sec-option-declarations">
+ <title>Option Declarations</title>
 
-<title>Option Declarations</title>
-
-<para>An option declaration specifies the name, type and description
-of a NixOS configuration option.  It is invalid to define an option
-that hasn’t been declared in any module.  An option declaration
-generally looks like this:
-
+ <para>
+  An option declaration specifies the name, type and description of a NixOS
+  configuration option. It is invalid to define an option that hasn’t been
+  declared in any module. An option declaration generally looks like this:
 <programlisting>
 options = {
   <replaceable>name</replaceable> = mkOption {
@@ -21,146 +19,177 @@ options = {
   };
 };
 </programlisting>
-
-The attribute names within the <replaceable>name</replaceable>
-attribute path must be camel cased in general but should, as an
-exception, match the
-<link
+  The attribute names within the <replaceable>name</replaceable> attribute path
+  must be camel cased in general but should, as an exception, match the
+  <link
 xlink:href="https://nixos.org/nixpkgs/manual/#sec-package-naming">
-package attribute name</link> when referencing a Nixpkgs package. For
-example, the option <varname>services.nix-serve.bindAddress</varname>
-references the <varname>nix-serve</varname> Nixpkgs package.
-
-</para>
-
-<para>The function <varname>mkOption</varname> accepts the following arguments.
-
-<variablelist>
-
-  <varlistentry>
-    <term><varname>type</varname></term>
+  package attribute name</link> when referencing a Nixpkgs package. For
+  example, the option <varname>services.nix-serve.bindAddress</varname>
+  references the <varname>nix-serve</varname> Nixpkgs package.
+ </para>
+
+ <para>
+  The function <varname>mkOption</varname> accepts the following arguments.
+  <variablelist>
+   <varlistentry>
+    <term><varname>type</varname>
+    </term>
     <listitem>
-      <para>The type of the option (see <xref linkend='sec-option-types' />).
-      It may be omitted, but that’s not advisable since it may lead to errors
-      that are hard to diagnose.</para>
+     <para>
+      The type of the option (see <xref linkend='sec-option-types' />). It may
+      be omitted, but that’s not advisable since it may lead to errors that
+      are hard to diagnose.
+     </para>
     </listitem>
-  </varlistentry>
-
-  <varlistentry>
-    <term><varname>default</varname></term>
+   </varlistentry>
+   <varlistentry>
+    <term><varname>default</varname>
+    </term>
     <listitem>
-      <para>The default value used if no value is defined by any
-      module.  A default is not required; but if a default is not given,
-      then users of the module will have to define the value of the
-      option, otherwise an error will be thrown.</para>
+     <para>
+      The default value used if no value is defined by any module. A default is
+      not required; but if a default is not given, then users of the module
+      will have to define the value of the option, otherwise an error will be
+      thrown.
+     </para>
     </listitem>
-  </varlistentry>
-
-  <varlistentry>
-    <term><varname>example</varname></term>
+   </varlistentry>
+   <varlistentry>
+    <term><varname>example</varname>
+    </term>
     <listitem>
-      <para>An example value that will be shown in the NixOS manual.</para>
+     <para>
+      An example value that will be shown in the NixOS manual.
+     </para>
     </listitem>
-  </varlistentry>
-
-  <varlistentry>
-    <term><varname>description</varname></term>
+   </varlistentry>
+   <varlistentry>
+    <term><varname>description</varname>
+    </term>
     <listitem>
-      <para>A textual description of the option, in DocBook format,
-      that will be included in the NixOS manual.</para>
+     <para>
+      A textual description of the option, in DocBook format, that will be
+      included in the NixOS manual.
+     </para>
     </listitem>
-  </varlistentry>
-
-</variablelist>
-
-</para>
-
-<section xml:id="sec-option-declarations-eot"><title>Extensible Option
-    Types</title>
-
-  <para>Extensible option types is a feature that allow to extend certain types
-    declaration through multiple module files.
-    This feature only work with a restricted set of types, namely
-    <literal>enum</literal> and <literal>submodules</literal> and any composed
-    forms of them.</para>
-
-  <para>Extensible option types can be used for <literal>enum</literal> options
-    that affects multiple modules, or as an alternative to related
-    <literal>enable</literal> options.</para>
+   </varlistentry>
+  </variablelist>
+ </para>
+
+ <section xml:id="sec-option-declarations-eot">
+  <title>Extensible Option Types</title>
+
+  <para>
+   Extensible option types is a feature that allow to extend certain types
+   declaration through multiple module files. This feature only work with a
+   restricted set of types, namely <literal>enum</literal> and
+   <literal>submodules</literal> and any composed forms of them.
+  </para>
 
-  <para>As an example, we will take the case of display managers. There is a
-    central display manager module for generic display manager options and a
-    module file per display manager backend (slim, sddm, gdm ...).
+  <para>
+   Extensible option types can be used for <literal>enum</literal> options that
+   affects multiple modules, or as an alternative to related
+   <literal>enable</literal> options.
   </para>
 
-  <para>There are two approach to this module structure:
+  <para>
+   As an example, we will take the case of display managers. There is a central
+   display manager module for generic display manager options and a module file
+   per display manager backend (slim, sddm, gdm ...).
+  </para>
 
-  <itemizedlist>
-    <listitem><para>Managing the display managers independently by adding an
-        enable option to every display manager module backend. (NixOS)</para>
+  <para>
+   There are two approach to this module structure:
+   <itemizedlist>
+    <listitem>
+     <para>
+      Managing the display managers independently by adding an enable option to
+      every display manager module backend. (NixOS)
+     </para>
     </listitem>
-    <listitem><para>Managing the display managers in the central module by
-        adding an option to select which display manager backend to use.</para>
+    <listitem>
+     <para>
+      Managing the display managers in the central module by adding an option
+      to select which display manager backend to use.
+     </para>
     </listitem>
-  </itemizedlist>
+   </itemizedlist>
   </para>
 
-  <para>Both approaches have problems.</para>
+  <para>
+   Both approaches have problems.
+  </para>
 
-  <para>Making backends independent can quickly become hard to manage. For
-    display managers, there can be only one enabled at a time, but the type
-    system can not enforce this restriction as there is no relation between
-    each backend <literal>enable</literal> option. As a result, this restriction
-    has to be done explicitely by adding assertions in each display manager
-    backend module.</para>
+  <para>
+   Making backends independent can quickly become hard to manage. For display
+   managers, there can be only one enabled at a time, but the type system can
+   not enforce this restriction as there is no relation between each backend
+   <literal>enable</literal> option. As a result, this restriction has to be
+   done explicitely by adding assertions in each display manager backend
+   module.
+  </para>
 
-  <para>On the other hand, managing the display managers backends in the
-    central module will require to change the central module option every time
-    a new backend is added or removed.</para>
+  <para>
+   On the other hand, managing the display managers backends in the central
+   module will require to change the central module option every time a new
+   backend is added or removed.
+  </para>
 
-  <para>By using extensible option types, it is possible to create a placeholder
-    option in the central module (<xref linkend='ex-option-declaration-eot-service'
-      />), and to extend it in each backend module (<xref
-      linkend='ex-option-declaration-eot-backend-slim' />, <xref
-      linkend='ex-option-declaration-eot-backend-sddm' />).</para>
+  <para>
+   By using extensible option types, it is possible to create a placeholder
+   option in the central module
+   (<xref linkend='ex-option-declaration-eot-service'
+      />), and to extend
+   it in each backend module
+   (<xref
+      linkend='ex-option-declaration-eot-backend-slim' />,
+   <xref
+      linkend='ex-option-declaration-eot-backend-sddm' />).
+  </para>
 
-  <para>As a result, <literal>displayManager.enable</literal> option values can
-  be added without changing the main service module file and the type system
-  automatically enforce that there can only be a single display manager
-  enabled.</para>
+  <para>
+   As a result, <literal>displayManager.enable</literal> option values can be
+   added without changing the main service module file and the type system
+   automatically enforce that there can only be a single display manager
+   enabled.
+  </para>
 
-<example xml:id='ex-option-declaration-eot-service'><title>Extensible type
-    placeholder in the service module</title>
+  <example xml:id='ex-option-declaration-eot-service'>
+   <title>Extensible type placeholder in the service module</title>
 <screen>
 services.xserver.displayManager.enable = mkOption {
   description = "Display manager to use";
   type = with types; nullOr (enum [ ]);
-};</screen></example>
+};</screen>
+  </example>
 
-<example xml:id='ex-option-declaration-eot-backend-slim'><title>Extending
-    <literal>services.xserver.displayManager.enable</literal> in the
-    <literal>slim</literal> module</title>
+  <example xml:id='ex-option-declaration-eot-backend-slim'>
+   <title>Extending <literal>services.xserver.displayManager.enable</literal> in the <literal>slim</literal> module</title>
 <screen>
 services.xserver.displayManager.enable = mkOption {
   type = with types; nullOr (enum [ "slim" ]);
-};</screen></example>
+};</screen>
+  </example>
 
-<example xml:id='ex-option-declaration-eot-backend-sddm'><title>Extending
-    <literal>services.xserver.displayManager.enable</literal> in the 
-    <literal>sddm</literal> module</title>
+  <example xml:id='ex-option-declaration-eot-backend-sddm'>
+   <title>Extending <literal>services.xserver.displayManager.enable</literal> in the <literal>sddm</literal> module</title>
 <screen>
 services.xserver.displayManager.enable = mkOption {
   type = with types; nullOr (enum [ "sddm" ]);
-};</screen></example>
-
-<para>The placeholder declaration is a standard <literal>mkOption</literal>
-  declaration, but it is important that extensible option declarations only use
-  the <literal>type</literal> argument.</para>
+};</screen>
+  </example>
 
-<para>Extensible option types work with any of the composed variants of
-  <literal>enum</literal> such as
-  <literal>with types; nullOr (enum [ "foo" "bar" ])</literal>
-  or <literal>with types; listOf (enum [ "foo" "bar" ])</literal>.</para>
+  <para>
+   The placeholder declaration is a standard <literal>mkOption</literal>
+   declaration, but it is important that extensible option declarations only
+   use the <literal>type</literal> argument.
+  </para>
 
-</section>
+  <para>
+   Extensible option types work with any of the composed variants of
+   <literal>enum</literal> such as <literal>with types; nullOr (enum [ "foo"
+   "bar" ])</literal> or <literal>with types; listOf (enum [ "foo" "bar"
+   ])</literal>.
+  </para>
+ </section>
 </section>