Project import generated by Copybara.

GitOrigin-RevId: 74a1793c659d09d7cf738005308b1f86c90cb59b
This commit is contained in:
Default email 2022-09-09 16:08:57 +02:00
parent e7a2da9f60
commit b450903751
3580 changed files with 96618 additions and 36929 deletions

View file

@ -60,6 +60,13 @@ indent_size = unset
[*.md] [*.md]
trim_trailing_whitespace = unset trim_trailing_whitespace = unset
# binaries
[*.nib]
end_of_line = unset
insert_final_newline = unset
trim_trailing_whitespace = unset
charset = unset
[eggs.nix] [eggs.nix]
trim_trailing_whitespace = unset trim_trailing_whitespace = unset

View file

@ -38,4 +38,4 @@ d08ede042b74b8199dc748323768227b88efcf7c
d1c1a0c656ccd8bd3b25d3c4287f2d075faf3cf3 d1c1a0c656ccd8bd3b25d3c4287f2d075faf3cf3
# fix indentation in meteor default.nix # fix indentation in meteor default.nix
f76b359e4a55267ddd4e9e149e7cc13ae5cad98a a37a6de881ec4c6708e6b88fd16256bbc7f26bbd

View file

@ -122,8 +122,6 @@
# Rust # Rust
/pkgs/development/compilers/rust @Mic92 @LnL7 @zowoq /pkgs/development/compilers/rust @Mic92 @LnL7 @zowoq
/pkgs/build-support/rust @zowoq
/doc/languages-frameworks/rust.section.md @zowoq
# C compilers # C compilers
/pkgs/development/compilers/gcc @matthewbauer /pkgs/development/compilers/gcc @matthewbauer

View file

@ -7,6 +7,8 @@
"6.topic: cinnamon": "6.topic: cinnamon":
- pkgs/desktops/cinnamon/**/* - pkgs/desktops/cinnamon/**/*
- nixos/modules/services/x11/desktop-managers/cinnamon.nix
- nixos/tests/cinnamon.nix
"6.topic: emacs": "6.topic: emacs":
- nixos/modules/services/editors/emacs.nix - nixos/modules/services/editors/emacs.nix

View file

@ -31,6 +31,10 @@ function Code(elem)
tag = 'command' tag = 'command'
elseif elem.attributes['role'] == 'option' then elseif elem.attributes['role'] == 'option' then
tag = 'option' tag = 'option'
elseif elem.attributes['role'] == 'var' then
tag = 'varname'
elseif elem.attributes['role'] == 'env' then
tag = 'envar'
end end
if tag ~= nil then if tag ~= nil then

View file

@ -308,7 +308,44 @@ The parameters relative to the base image have the same synopsis as described in
The `name` argument is the name of the derivation output, which defaults to `fromImage.name`. The `name` argument is the name of the derivation output, which defaults to `fromImage.name`.
## shadowSetup {#ssec-pkgs-dockerTools-shadowSetup} ## Environment Helpers {#ssec-pkgs-dockerTools-helpers}
Some packages expect certain files to be available globally.
When building an image from scratch (i.e. without `fromImage`), these files are missing.
`pkgs.dockerTools` provides some helpers to set up an environment with the necessary files.
You can include them in `copyToRoot` like this:
```nix
buildImage {
name = "environment-example";
copyToRoot = with pkgs.dockerTools; [
usrBinEnv
binSh
caCertificates
fakeNss
];
}
```
### usrBinEnv {#sssec-pkgs-dockerTools-helpers-usrBinEnv}
This provides the `env` utility at `/usr/bin/env`.
### binSh {#sssec-pkgs-dockerTools-helpers-binSh}
This provides `bashInteractive` at `/bin/sh`.
### caCertificates {#sssec-pkgs-dockerTools-helpers-caCertificates}
This sets up `/etc/ssl/certs/ca-certificates.crt`.
### fakeNss {#sssec-pkgs-dockerTools-helpers-fakeNss}
Provides `/etc/passwd` and `/etc/group` that contain root and nobody.
Useful when packaging binaries that insist on using nss to look up
username/groups (like nginx).
### shadowSetup {#ssec-pkgs-dockerTools-shadowSetup}
This constant string is a helper for setting up the base files for managing users and groups, only if such files don't exist already. It is suitable for being used in a [`buildImage` `runAsRoot`](#ex-dockerTools-buildImage-runAsRoot) script for cases like in the example below: This constant string is a helper for setting up the base files for managing users and groups, only if such files don't exist already. It is suitable for being used in a [`buildImage` `runAsRoot`](#ex-dockerTools-buildImage-runAsRoot) script for cases like in the example below:

View file

@ -453,6 +453,9 @@ In the file `pkgs/top-level/all-packages.nix` you can find fetch helpers, these
} }
``` ```
When fetching from GitHub, commits must always be referenced by their full commit hash. This is because GitHub shares commit hashes among all forks and returns `404 Not Found` when a short commit hash is ambiguous. It already happens for some short, 6-character commit hashes in `nixpkgs`.
It is a practical vector for a denial-of-service attack by pushing large amounts of auto generated commits into forks and was already [demonstrated against GitHub Actions Beta](https://blog.teddykatz.com/2019/11/12/github-actions-dos.html).
Find the value to put as `sha256` by running `nix-shell -p nix-prefetch-github --run "nix-prefetch-github --rev 1f795f9f44607cc5bec70d1300150bfefcef2aae NixOS nix"`. Find the value to put as `sha256` by running `nix-shell -p nix-prefetch-github --run "nix-prefetch-github --rev 1f795f9f44607cc5bec70d1300150bfefcef2aae NixOS nix"`.
## Obtaining source hash {#sec-source-hashes} ## Obtaining source hash {#sec-source-hashes}

View file

@ -58,8 +58,10 @@ Additional syntax extensions are available, though not all extensions can be use
A few markups for other kinds of literals are also available: A few markups for other kinds of literals are also available:
- `` {command}`rm -rfi` `` turns into {command}`rm -rfi` - `` {command}`rm -rfi` `` turns into {command}`rm -rfi`
- `` {option}`networking.useDHCP` `` turns into {option}`networking.useDHCP` - `` {env}`XDG_DATA_DIRS` `` turns into {env}`XDG_DATA_DIRS`
- `` {file}`/etc/passwd` `` turns into {file}`/etc/passwd` - `` {file}`/etc/passwd` `` turns into {file}`/etc/passwd`
- `` {option}`networking.useDHCP` `` turns into {option}`networking.useDHCP`
- `` {var}`/etc/passwd` `` turns into {var}`/etc/passwd`
These literal kinds are used mostly in NixOS option documentation. These literal kinds are used mostly in NixOS option documentation.

View file

@ -246,7 +246,7 @@ The `staging` branch is a development branch where mass-rebuilds go. Mass rebuil
### Staging-next branch {#submitting-changes-staging-next-branch} ### Staging-next branch {#submitting-changes-staging-next-branch}
The `staging-next` branch is for stabilizing mass-rebuilds submitted to the `staging` branch prior to merging them into `master`. Mass-rebuilds must go via the `staging` branch. It must only see non-breaking commits that are fixing issues blocking it from being merged into the `master ` branch. The `staging-next` branch is for stabilizing mass-rebuilds submitted to the `staging` branch prior to merging them into `master`. Mass-rebuilds must go via the `staging` branch. It must only see non-breaking commits that are fixing issues blocking it from being merged into the `master` branch.
If the branch is already in a broken state, please refrain from adding extra new breakages. Stabilize it for a few days and then merge into master. If the branch is already in a broken state, please refrain from adding extra new breakages. Stabilize it for a few days and then merge into master.

View file

@ -734,6 +734,63 @@ work in any of the formats supported by `buildPythonPackage` currently,
with the exception of `other` (see `format` in with the exception of `other` (see `format` in
[`buildPythonPackage` parameters](#buildpythonpackage-parameters) for more details). [`buildPythonPackage` parameters](#buildpythonpackage-parameters) for more details).
### Using unittestCheckHook {#using-unittestcheckhook}
`unittestCheckHook` is a hook which will substitute the setuptools `test` command for a `checkPhase` which runs `python -m unittest discover`:
```
checkInputs = [ unittestCheckHook ];
unittestFlags = [ "-s" "tests" "-v" ];
```
##### Using sphinxHook {#using-sphinxhook}
The `sphinxHook` is a helpful tool to build documentation and manpages
using the popular Sphinx documentation generator.
It is setup to automatically find common documentation source paths and
render them using the default `html` style.
```
outputs = [
"out"
"doc"
];
nativeBuildInputs = [
sphinxHook
];
```
The hook will automatically build and install the artifact into the
`doc` output, if it exists. It also provides an automatic diversion
for the artifacts of the `man` builder into the `man` target.
```
outputs = [
"out"
"doc"
"man"
];
# Use multiple builders
sphinxBuilders = [
"singlehtml"
"man"
];
```
Overwrite `sphinxRoot` when the hook is unable to find your
documentation source root.
```
# Configure sphinxRoot for uncommon paths
sphinxRoot = "weird/docs/path";
```
The hook is also available to packages outside the python ecosystem by
referencing it using `python3.pkgs.sphinxHook`.
### Develop local package {#develop-local-package} ### Develop local package {#develop-local-package}
As a Python developer you're likely aware of [development mode](http://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode) As a Python developer you're likely aware of [development mode](http://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode)
@ -1260,16 +1317,18 @@ are used in `buildPythonPackage`.
- `pytestCheckHook` to run tests with `pytest`. See [example usage](#using-pytestcheckhook). - `pytestCheckHook` to run tests with `pytest`. See [example usage](#using-pytestcheckhook).
- `pythonCatchConflictsHook` to check whether a Python package is not already existing. - `pythonCatchConflictsHook` to check whether a Python package is not already existing.
- `pythonImportsCheckHook` to check whether importing the listed modules works. - `pythonImportsCheckHook` to check whether importing the listed modules works.
- `pythonRelaxDepsHook` will relax Python dependencies restrictions for the package.
See [example usage](#using-pythonrelaxdepshook).
- `pythonRemoveBinBytecode` to remove bytecode from the `/bin` folder. - `pythonRemoveBinBytecode` to remove bytecode from the `/bin` folder.
- `setuptoolsBuildHook` to build a wheel using `setuptools`. - `setuptoolsBuildHook` to build a wheel using `setuptools`.
- `setuptoolsCheckHook` to run tests with `python setup.py test`. - `setuptoolsCheckHook` to run tests with `python setup.py test`.
- `sphinxHook` to build documentation and manpages using Sphinx.
- `venvShellHook` to source a Python 3 `venv` at the `venvDir` location. A - `venvShellHook` to source a Python 3 `venv` at the `venvDir` location. A
`venv` is created if it does not yet exist. `postVenvCreation` can be used to `venv` is created if it does not yet exist. `postVenvCreation` can be used to
to run commands only after venv is first created. to run commands only after venv is first created.
- `wheelUnpackHook` to move a wheel to the correct folder so it can be installed - `wheelUnpackHook` to move a wheel to the correct folder so it can be installed
with the `pipInstallHook`. with the `pipInstallHook`.
- `pythonRelaxDepsHook` will relax Python dependencies restrictions for the package. - `unittestCheckHook` will run tests with `python -m unittest discover`. See [example usage](#using-unittestcheckhook).
See [example usage](#using-pythonrelaxdepshook).
### Development mode {#development-mode} ### Development mode {#development-mode}

View file

@ -458,7 +458,7 @@ you of the correct hash.
`maturinBuildFlags`. `maturinBuildFlags`.
* `cargoCheckHook`: run tests using Cargo. The build type for checks * `cargoCheckHook`: run tests using Cargo. The build type for checks
can be set using `cargoCheckType`. Features can be specified with can be set using `cargoCheckType`. Features can be specified with
`cargoCheckNoDefaultFeaatures` and `cargoCheckFeatures`. Additional `cargoCheckNoDefaultFeatures` and `cargoCheckFeatures`. Additional
flags can be passed to the tests using `checkFlags` and flags can be passed to the tests using `checkFlags` and
`checkFlagsArray`. By default, tests are run in parallel. This can `checkFlagsArray`. By default, tests are run in parallel. This can
be disabled by setting `dontUseCargoParallelTests`. be disabled by setting `dontUseCargoParallelTests`.

View file

@ -80,7 +80,7 @@ Right: `"A library for decoding PNG images"`
### `longDescription` {#var-meta-longDescription} ### `longDescription` {#var-meta-longDescription}
An arbitrarily long description of the package. An arbitrarily long description of the package in [CommonMark](https://commonmark.org) Markdown.
### `branch` {#var-meta-branch} ### `branch` {#var-meta-branch}

View file

@ -452,6 +452,8 @@ The list of source files or directories to be unpacked or copied. One of these m
After running `unpackPhase`, the generic builder changes the current directory to the directory created by unpacking the sources. If there are multiple source directories, you should set `sourceRoot` to the name of the intended directory. Set `sourceRoot = ".";` if you use `srcs` and control the unpack phase yourself. After running `unpackPhase`, the generic builder changes the current directory to the directory created by unpacking the sources. If there are multiple source directories, you should set `sourceRoot` to the name of the intended directory. Set `sourceRoot = ".";` if you use `srcs` and control the unpack phase yourself.
By default the `sourceRoot` is set to `"source"`. If you want to point to a sub-directory inside your project, you therefore need to set `sourceRoot = "source/my-sub-directory"`.
##### `setSourceRoot` {#var-stdenv-setSourceRoot} ##### `setSourceRoot` {#var-stdenv-setSourceRoot}
Alternatively to setting `sourceRoot`, you can set `setSourceRoot` to a shell command to be evaluated by the unpack phase after the sources have been unpacked. This command must set `sourceRoot`. Alternatively to setting `sourceRoot`, you can set `setSourceRoot` to a shell command to be evaluated by the unpack phase after the sources have been unpacked. This command must set `sourceRoot`.

View file

@ -148,6 +148,11 @@ in mkLicense lset) ({
fullName = ''BSD 4-clause "Original" or "Old" License''; fullName = ''BSD 4-clause "Original" or "Old" License'';
}; };
bsdOriginalShortened = {
spdxId = "BSD-4-Clause-Shortened";
fullName = "BSD 4 Clause Shortened";
};
bsdOriginalUC = { bsdOriginalUC = {
spdxId = "BSD-4-Clause-UC"; spdxId = "BSD-4-Clause-UC";
fullName = "BSD 4-Clause University of California-Specific"; fullName = "BSD 4-Clause University of California-Specific";
@ -693,6 +698,11 @@ in mkLicense lset) ({
fullName = "SIL Open Font License 1.1"; fullName = "SIL Open Font License 1.1";
}; };
oml = {
spdxId = "OML";
fullName = "Open Market License";
};
openldap = { openldap = {
spdxId = "OLDAP-2.8"; spdxId = "OLDAP-2.8";
fullName = "Open LDAP Public License v2.8"; fullName = "Open LDAP Public License v2.8";
@ -824,6 +834,11 @@ in mkLicense lset) ({
fullName = "TCL/TK License"; fullName = "TCL/TK License";
}; };
ucd = {
fullName = "Unicode Character Database License";
url = "https://fedoraproject.org/wiki/Licensing:UCD";
};
ufl = { ufl = {
fullName = "Ubuntu Font License 1.0"; fullName = "Ubuntu Font License 1.0";
url = "https://ubuntu.com/legal/font-licence"; url = "https://ubuntu.com/legal/font-licence";
@ -878,6 +893,11 @@ in mkLicense lset) ({
free = false; free = false;
}; };
vol-sl = {
fullName = "Volatility Software License, Version 1.0";
url = "https://www.volatilityfoundation.org/license/vsl-v1.0";
};
vsl10 = { vsl10 = {
spdxId = "VSL-1.0"; spdxId = "VSL-1.0";
fullName = "Vovida Software License v1.0"; fullName = "Vovida Software License v1.0";

View file

@ -1,2 +1,2 @@
# Expose the minimum required version for evaluating Nixpkgs # Expose the minimum required version for evaluating Nixpkgs
"2.2" "2.3"

View file

@ -163,84 +163,50 @@ rec {
# TODO: Change the type of this option to a submodule with a # TODO: Change the type of this option to a submodule with a
# freeformType, so that individual arguments can be documented # freeformType, so that individual arguments can be documented
# separately # separately
description = '' description = lib.mdDoc ''
Additional arguments passed to each module in addition to ones Additional arguments passed to each module in addition to ones
like <literal>lib</literal>, <literal>config</literal>, like `lib`, `config`,
and <literal>pkgs</literal>, <literal>modulesPath</literal>. and `pkgs`, `modulesPath`.
</para>
<para>
This option is also available to all submodules. Submodules do not This option is also available to all submodules. Submodules do not
inherit args from their parent module, nor do they provide args to inherit args from their parent module, nor do they provide args to
their parent module or sibling submodules. The sole exception to their parent module or sibling submodules. The sole exception to
this is the argument <literal>name</literal> which is provided by this is the argument `name` which is provided by
parent modules to a submodule and contains the attribute name parent modules to a submodule and contains the attribute name
the submodule is bound to, or a unique generated name if it is the submodule is bound to, or a unique generated name if it is
not bound to an attribute. not bound to an attribute.
</para>
<para>
Some arguments are already passed by default, of which the Some arguments are already passed by default, of which the
following <emphasis>cannot</emphasis> be changed with this option: following *cannot* be changed with this option:
<itemizedlist> - {var}`lib`: The nixpkgs library.
<listitem> - {var}`config`: The results of all options after merging the values from all modules together.
<para> - {var}`options`: The options declared in all modules.
<varname>lib</varname>: The nixpkgs library. - {var}`specialArgs`: The `specialArgs` argument passed to `evalModules`.
</para> - All attributes of {var}`specialArgs`
</listitem>
<listitem> Whereas option values can generally depend on other option values
<para> thanks to laziness, this does not apply to `imports`, which
<varname>config</varname>: The results of all options after merging the values from all modules together. must be computed statically before anything else.
</para>
</listitem> For this reason, callers of the module system can provide `specialArgs`
<listitem> which are available during import resolution.
<para>
<varname>options</varname>: The options declared in all modules. For NixOS, `specialArgs` includes
</para> {var}`modulesPath`, which allows you to import
</listitem> extra modules from the nixpkgs package tree without having to
<listitem> somehow make the module aware of the location of the
<para> `nixpkgs` or NixOS directories.
<varname>specialArgs</varname>: The <literal>specialArgs</literal> argument passed to <literal>evalModules</literal>. ```
</para> { modulesPath, ... }: {
</listitem> imports = [
<listitem> (modulesPath + "/profiles/minimal.nix")
<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: For NixOS, the default value for this option includes at least this argument:
<itemizedlist> - {var}`pkgs`: The nixpkgs package set according to
<listitem> the {option}`nixpkgs.pkgs` option.
<para>
<varname>pkgs</varname>: The nixpkgs package set according to
the <option>nixpkgs.pkgs</option> option.
</para>
</listitem>
</itemizedlist>
''; '';
}; };
@ -248,21 +214,21 @@ rec {
type = types.bool; type = types.bool;
internal = true; internal = true;
default = true; default = true;
description = "Whether to check whether all option definitions have matching declarations."; description = lib.mdDoc "Whether to check whether all option definitions have matching declarations.";
}; };
_module.freeformType = mkOption { _module.freeformType = mkOption {
type = types.nullOr types.optionType; type = types.nullOr types.optionType;
internal = true; internal = true;
default = null; default = null;
description = '' description = lib.mdDoc ''
If set, merge all definitions that don't have an associated option If set, merge all definitions that don't have an associated option
together using this type. The result then gets combined with the together using this type. The result then gets combined with the
values of all declared options to produce the final <literal> values of all declared options to produce the final `
config</literal> value. config` value.
If this is <literal>null</literal>, definitions without an option If this is `null`, definitions without an option
will throw an error unless <option>_module.check</option> is will throw an error unless {option}`_module.check` is
turned off. turned off.
''; '';
}; };
@ -270,7 +236,7 @@ rec {
_module.specialArgs = mkOption { _module.specialArgs = mkOption {
readOnly = true; readOnly = true;
internal = true; internal = true;
description = '' description = lib.mdDoc ''
Externally provided module arguments that can't be modified from Externally provided module arguments that can't be modified from
within a configuration, but can be used in module imports. within a configuration, but can be used in module imports.
''; '';
@ -433,7 +399,9 @@ rec {
# modules recursively. It returns the final list of unique-by-key modules # modules recursively. It returns the final list of unique-by-key modules
filterModules = modulesPath: { disabled, modules }: filterModules = modulesPath: { disabled, modules }:
let let
moduleKey = m: if isString m then toString modulesPath + "/" + m else toString m; moduleKey = m: if isString m && (builtins.substring 0 1 m != "/")
then toString modulesPath + "/" + m
else toString m;
disabledKeys = map moduleKey disabled; disabledKeys = map moduleKey disabled;
keyFilter = filter (attrs: ! elem attrs.key disabledKeys); keyFilter = filter (attrs: ! elem attrs.key disabledKeys);
in map (attrs: attrs.module) (builtins.genericClosure { in map (attrs: attrs.module) (builtins.genericClosure {
@ -1167,7 +1135,7 @@ rec {
{ {
options = setAttrByPath from (mkOption { options = setAttrByPath from (mkOption {
inherit visible; inherit visible;
description = "Alias of <option>${showOption to}</option>."; description = lib.mdDoc "Alias of {option}`${showOption to}`.";
apply = x: use (toOf config); apply = x: use (toOf config);
} // optionalAttrs (toType != null) { } // optionalAttrs (toType != null) {
type = toType; type = toType;

View file

@ -95,7 +95,10 @@ rec {
name: mkOption { name: mkOption {
default = false; default = false;
example = true; example = true;
description = "Whether to enable ${name}."; description =
if name ? _type && name._type == "mdDoc"
then lib.mdDoc "Whether to enable ${name.text}."
else "Whether to enable ${name}.";
type = lib.types.bool; type = lib.types.bool;
}; };
@ -134,7 +137,7 @@ rec {
let default' = if !isList default then [ default ] else default; let default' = if !isList default then [ default ] else default;
in mkOption { in mkOption {
type = lib.types.package; type = lib.types.package;
description = "The ${name} package to use."; description = lib.mdDoc "The ${name} package to use.";
default = attrByPath default' default = attrByPath default'
(throw "${concatStringsSep "." default'} cannot be found in pkgs") pkgs; (throw "${concatStringsSep "." default'} cannot be found in pkgs") pkgs;
defaultText = literalExpression ("pkgs." + concatStringsSep "." default'); defaultText = literalExpression ("pkgs." + concatStringsSep "." default');

View file

@ -65,11 +65,17 @@ rec {
# is why we use the more obscure "bfd" and not "binutils" for this # is why we use the more obscure "bfd" and not "binutils" for this
# choice. # choice.
else "bfd"; else "bfd";
extensions = { extensions = rec {
sharedLibrary = sharedLibrary =
/**/ if final.isDarwin then ".dylib" /**/ if final.isDarwin then ".dylib"
else if final.isWindows then ".dll" else if final.isWindows then ".dll"
else ".so"; else ".so";
staticLibrary =
/**/ if final.isWindows then ".lib"
else ".a";
library =
/**/ if final.isStatic then staticLibrary
else sharedLibrary;
executable = executable =
/**/ if final.isWindows then ".exe" /**/ if final.isWindows then ".exe"
else ""; else "";
@ -93,7 +99,7 @@ rec {
genode = "Genode"; genode = "Genode";
}.${final.parsed.kernel.name} or null; }.${final.parsed.kernel.name} or null;
# uname -p # uname -m
processor = final.parsed.cpu.name; processor = final.parsed.cpu.name;
# uname -r # uname -r
@ -115,6 +121,8 @@ rec {
else if final.isAarch64 then "arm64" else if final.isAarch64 then "arm64"
else if final.isx86_32 then "i386" else if final.isx86_32 then "i386"
else if final.isx86_64 then "x86_64" else if final.isx86_64 then "x86_64"
# linux kernel does not distinguish microblaze/microblazeel
else if final.isMicroBlaze then "microblaze"
else if final.isMips32 then "mips" else if final.isMips32 then "mips"
else if final.isMips64 then "mips" # linux kernel does not distinguish mips32/mips64 else if final.isMips64 then "mips" # linux kernel does not distinguish mips32/mips64
else if final.isPower then "powerpc" else if final.isPower then "powerpc"

View file

@ -26,9 +26,10 @@ let
# Linux # Linux
"aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux"
"armv7l-linux" "i686-linux" "m68k-linux" "mipsel-linux" "mips64el-linux" "armv7l-linux" "i686-linux" "m68k-linux" "microblaze-linux"
"powerpc64-linux" "powerpc64le-linux" "riscv32-linux" "microblazeel-linux" "mipsel-linux" "mips64el-linux" "powerpc64-linux"
"riscv64-linux" "s390-linux" "s390x-linux" "x86_64-linux" "powerpc64le-linux" "riscv32-linux" "riscv64-linux" "s390-linux"
"s390x-linux" "x86_64-linux"
# MMIXware # MMIXware
"mmix-mmixware" "mmix-mmixware"
@ -40,9 +41,9 @@ let
# none # none
"aarch64_be-none" "aarch64-none" "arm-none" "armv6l-none" "avr-none" "i686-none" "aarch64_be-none" "aarch64-none" "arm-none" "armv6l-none" "avr-none" "i686-none"
"msp430-none" "or1k-none" "m68k-none" "powerpc-none" "powerpcle-none" "microblaze-none" "microblazeel-none" "msp430-none" "or1k-none" "m68k-none"
"riscv32-none" "riscv64-none" "rx-none" "s390-none" "s390x-none" "vc4-none" "powerpc-none" "powerpcle-none" "riscv32-none" "riscv64-none" "rx-none"
"x86_64-none" "s390-none" "s390x-none" "vc4-none" "x86_64-none"
# OpenBSD # OpenBSD
"i686-openbsd" "x86_64-openbsd" "i686-openbsd" "x86_64-openbsd"
@ -71,6 +72,7 @@ in {
x86 = filterDoubles predicates.isx86; x86 = filterDoubles predicates.isx86;
i686 = filterDoubles predicates.isi686; i686 = filterDoubles predicates.isi686;
x86_64 = filterDoubles predicates.isx86_64; x86_64 = filterDoubles predicates.isx86_64;
microblaze = filterDoubles predicates.isMicroBlaze;
mips = filterDoubles predicates.isMips; mips = filterDoubles predicates.isMips;
mmix = filterDoubles predicates.isMmix; mmix = filterDoubles predicates.isMmix;
riscv = filterDoubles predicates.isRiscV; riscv = filterDoubles predicates.isRiscV;
@ -94,7 +96,9 @@ in {
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabi; }) ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabi; })
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabihf; }) ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabihf; })
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabin32; }) ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabin32; })
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabi64; }); ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabi64; })
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabielfv1; })
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabielfv2; });
illumos = filterDoubles predicates.isSunOS; illumos = filterDoubles predicates.isSunOS;
linux = filterDoubles predicates.isLinux; linux = filterDoubles predicates.isLinux;
netbsd = filterDoubles predicates.isNetBSD; netbsd = filterDoubles predicates.isNetBSD;

View file

@ -22,12 +22,11 @@ rec {
}; };
ppc64 = { ppc64 = {
config = "powerpc64-unknown-linux-gnu"; config = "powerpc64-unknown-linux-gnuabielfv2";
gcc = { abi = "elfv2"; }; # for gcc configuration
}; };
ppc64-musl = { ppc64-musl = {
config = "powerpc64-unknown-linux-musl"; config = "powerpc64-unknown-linux-musl";
gcc = { abi = "elfv2"; }; # for gcc configuration gcc = { abi = "elfv2"; };
}; };
sheevaplug = { sheevaplug = {

View file

@ -13,10 +13,18 @@ rec {
isx86_64 = { cpu = { family = "x86"; bits = 64; }; }; isx86_64 = { cpu = { family = "x86"; bits = 64; }; };
isPower = { cpu = { family = "power"; }; }; isPower = { cpu = { family = "power"; }; };
isPower64 = { cpu = { family = "power"; bits = 64; }; }; isPower64 = { cpu = { family = "power"; bits = 64; }; };
# This ABI is the default in NixOS PowerPC64 BE, but not on mainline GCC,
# so it sometimes causes issues in certain packages that makes the wrong
# assumption on the used ABI.
isAbiElfv2 = [
{ abi = { abi = "elfv2"; }; }
{ abi = { name = "musl"; }; cpu = { family = "power"; bits = 64; }; }
];
isx86 = { cpu = { family = "x86"; }; }; isx86 = { cpu = { family = "x86"; }; };
isAarch32 = { cpu = { family = "arm"; bits = 32; }; }; isAarch32 = { cpu = { family = "arm"; bits = 32; }; };
isAarch64 = { cpu = { family = "arm"; bits = 64; }; }; isAarch64 = { cpu = { family = "arm"; bits = 64; }; };
isAarch = { cpu = { family = "arm"; }; }; isAarch = { cpu = { family = "arm"; }; };
isMicroBlaze = { cpu = { family = "microblaze"; }; };
isMips = { cpu = { family = "mips"; }; }; isMips = { cpu = { family = "mips"; }; };
isMips32 = { cpu = { family = "mips"; bits = 32; }; }; isMips32 = { cpu = { family = "mips"; bits = 32; }; };
isMips64 = { cpu = { family = "mips"; bits = 64; }; }; isMips64 = { cpu = { family = "mips"; bits = 64; }; };
@ -64,7 +72,7 @@ rec {
isNone = { kernel = kernels.none; }; isNone = { kernel = kernels.none; };
isAndroid = [ { abi = abis.android; } { abi = abis.androideabi; } ]; isAndroid = [ { abi = abis.android; } { abi = abis.androideabi; } ];
isGnu = with abis; map (a: { abi = a; }) [ gnuabi64 gnu gnueabi gnueabihf ]; isGnu = with abis; map (a: { abi = a; }) [ gnuabi64 gnu gnueabi gnueabihf gnuabielfv1 gnuabielfv2 ];
isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf muslabin32 muslabi64 ]; isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf muslabin32 muslabi64 ];
isUClibc = with abis; map (a: { abi = a; }) [ uclibc uclibceabi uclibceabihf ]; isUClibc = with abis; map (a: { abi = a; }) [ uclibc uclibceabi uclibceabihf ];

View file

@ -88,6 +88,9 @@ rec {
i686 = { bits = 32; significantByte = littleEndian; family = "x86"; arch = "i686"; }; i686 = { bits = 32; significantByte = littleEndian; family = "x86"; arch = "i686"; };
x86_64 = { bits = 64; significantByte = littleEndian; family = "x86"; arch = "x86-64"; }; x86_64 = { bits = 64; significantByte = littleEndian; family = "x86"; arch = "x86-64"; };
microblaze = { bits = 32; significantByte = bigEndian; family = "microblaze"; };
microblazeel = { bits = 32; significantByte = littleEndian; family = "microblaze"; };
mips = { bits = 32; significantByte = bigEndian; family = "mips"; }; mips = { bits = 32; significantByte = bigEndian; family = "mips"; };
mipsel = { bits = 32; significantByte = littleEndian; family = "mips"; }; mipsel = { bits = 32; significantByte = littleEndian; family = "mips"; };
mips64 = { bits = 64; significantByte = bigEndian; family = "mips"; }; mips64 = { bits = 64; significantByte = bigEndian; family = "mips"; };
@ -350,6 +353,11 @@ rec {
The "gnu" ABI is ambiguous on 32-bit ARM. Use "gnueabi" or "gnueabihf" instead. The "gnu" ABI is ambiguous on 32-bit ARM. Use "gnueabi" or "gnueabihf" instead.
''; '';
} }
{ assertion = platform: with platform; !(isPower64 && isBigEndian);
message = ''
The "gnu" ABI is ambiguous on big-endian 64-bit PowerPC. Use "gnuabielfv2" or "gnuabielfv1" instead.
'';
}
]; ];
}; };
gnuabi64 = { abi = "64"; }; gnuabi64 = { abi = "64"; };
@ -361,6 +369,9 @@ rec {
gnuabin32 = { abi = "n32"; }; gnuabin32 = { abi = "n32"; };
muslabin32 = { abi = "n32"; }; muslabin32 = { abi = "n32"; };
gnuabielfv2 = { abi = "elfv2"; };
gnuabielfv1 = { abi = "elfv1"; };
musleabi = { float = "soft"; }; musleabi = { float = "soft"; };
musleabihf = { float = "hard"; }; musleabihf = { float = "hard"; };
musl = {}; musl = {};
@ -464,6 +475,8 @@ rec {
if lib.versionAtLeast (parsed.cpu.version or "0") "6" if lib.versionAtLeast (parsed.cpu.version or "0") "6"
then abis.gnueabihf then abis.gnueabihf
else abis.gnueabi else abis.gnueabi
# Default ppc64 BE to ELFv2
else if isPower64 parsed && isBigEndian parsed then abis.gnuabielfv2
else abis.gnu else abis.gnu
else abis.unknown; else abis.unknown;
}; };

View file

@ -130,6 +130,7 @@ checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-enab
set -- config.enable ./define-enable.nix ./declare-enable.nix set -- config.enable ./define-enable.nix ./declare-enable.nix
checkConfigOutput '^true$' "$@" checkConfigOutput '^true$' "$@"
checkConfigOutput '^false$' "$@" ./disable-define-enable.nix checkConfigOutput '^false$' "$@" ./disable-define-enable.nix
checkConfigOutput '^false$' "$@" ./disable-define-enable-string-path.nix
checkConfigError "The option .*enable.* does not exist. Definition values:\n\s*- In .*: true" "$@" ./disable-declare-enable.nix checkConfigError "The option .*enable.* does not exist. Definition values:\n\s*- In .*: true" "$@" ./disable-declare-enable.nix
checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-define-enable.nix ./disable-declare-enable.nix checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-define-enable.nix ./disable-declare-enable.nix
checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-enable-modules.nix checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-enable-modules.nix

View file

@ -0,0 +1,5 @@
{ lib, ... }:
{
disabledModules = [ (toString ./define-enable.nix) ];
}

View file

@ -31,7 +31,7 @@ with lib.systems.doubles; lib.runTests {
testredox = mseteq redox [ "x86_64-redox" ]; testredox = mseteq redox [ "x86_64-redox" ];
testgnu = mseteq gnu (linux /* ++ kfreebsd ++ ... */); testgnu = mseteq gnu (linux /* ++ kfreebsd ++ ... */);
testillumos = mseteq illumos [ "x86_64-solaris" ]; testillumos = mseteq illumos [ "x86_64-solaris" ];
testlinux = mseteq linux [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-linux" "mips64el-linux" "mipsel-linux" "riscv32-linux" "riscv64-linux" "x86_64-linux" "powerpc64-linux" "powerpc64le-linux" "m68k-linux" "s390-linux" "s390x-linux" ]; testlinux = mseteq linux [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-linux" "mips64el-linux" "mipsel-linux" "riscv32-linux" "riscv64-linux" "x86_64-linux" "powerpc64-linux" "powerpc64le-linux" "m68k-linux" "s390-linux" "s390x-linux" "microblaze-linux" "microblazeel-linux" ];
testnetbsd = mseteq netbsd [ "aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd" "i686-netbsd" "m68k-netbsd" "mipsel-netbsd" "powerpc-netbsd" "riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd" ]; testnetbsd = mseteq netbsd [ "aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd" "i686-netbsd" "m68k-netbsd" "mipsel-netbsd" "powerpc-netbsd" "riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd" ];
testopenbsd = mseteq openbsd [ "i686-openbsd" "x86_64-openbsd" ]; testopenbsd = mseteq openbsd [ "i686-openbsd" "x86_64-openbsd" ];
testwindows = mseteq windows [ "i686-cygwin" "x86_64-cygwin" "i686-windows" "x86_64-windows" ]; testwindows = mseteq windows [ "i686-cygwin" "x86_64-cygwin" "i686-windows" "x86_64-windows" ];

View file

@ -115,6 +115,12 @@
githubId = 7414843; githubId = 7414843;
name = "Nicholas von Klitzing"; name = "Nicholas von Klitzing";
}; };
_360ied = {
name = "Brian Zhu";
email = "therealbarryplayer@gmail.com";
github = "360ied";
githubId = 19516527;
};
_13r0ck = { _13r0ck = {
name = "Brock Szuszczewicz"; name = "Brock Szuszczewicz";
email = "bnr@tuta.io"; email = "bnr@tuta.io";
@ -133,6 +139,16 @@
githubId = 1714287; githubId = 1714287;
name = "Owen Shepherd"; name = "Owen Shepherd";
}; };
_4825764518 = {
email = "4825764518@purelymail.com";
matrix = "@kenzie:matrix.kenzi.dev";
github = "4825764518";
githubId = 100122841;
name = "Kenzie";
keys = [{
fingerprint = "D292 365E 3C46 A5AA 75EE B30B 78DB 7EDE 3540 794B";
}];
};
_6AA4FD = { _6AA4FD = {
email = "f6442954@gmail.com"; email = "f6442954@gmail.com";
github = "6AA4FD"; github = "6AA4FD";
@ -309,6 +325,12 @@
githubId = 1174858; githubId = 1174858;
name = "Maxwell Huang-Hobbs"; name = "Maxwell Huang-Hobbs";
}; };
adjacentresearch = {
email = "nate@adjacentresearch.xyz";
github = "0xperp";
githubId = 96147421;
name = "0xperp";
};
adnelson = { adnelson = {
email = "ithinkican@gmail.com"; email = "ithinkican@gmail.com";
github = "adnelson"; github = "adnelson";
@ -478,6 +500,15 @@
github = "akho"; github = "akho";
githubId = 104951; githubId = 104951;
}; };
akkesm = {
name = "Alessandro Barenghi";
email = "alessandro.barenghi@tuta.io";
github = "akkesm";
githubId = 56970006;
keys = [{
fingerprint = "50E2 669C AB38 2F4A 5F72 1667 0D6B FC01 D45E DADD";
}];
};
akru = { akru = {
email = "mail@akru.me"; email = "mail@akru.me";
github = "akru"; github = "akru";
@ -810,6 +841,12 @@
githubId = 7112447; githubId = 7112447;
name = "Andre S. Ramos"; name = "Andre S. Ramos";
}; };
andrevmatos = {
email = "andrevmatos@gmail.com";
github = "andrevmatos";
githubId = 587021;
name = "André V L Matos";
};
andrew-d = { andrew-d = {
email = "andrew@du.nham.ca"; email = "andrew@du.nham.ca";
github = "andrew-d"; github = "andrew-d";
@ -1411,6 +1448,12 @@
githubId = 35324; githubId = 35324;
name = "Badi' Abdul-Wahid"; name = "Badi' Abdul-Wahid";
}; };
baitinq = {
email = "manuelpalenzuelamerino@gmail.com";
name = "Baitinq";
github = "Baitinq";
githubId = 30861839;
};
balodja = { balodja = {
email = "balodja@gmail.com"; email = "balodja@gmail.com";
github = "balodja"; github = "balodja";
@ -2028,6 +2071,12 @@
githubId = 1516457; githubId = 1516457;
name = "Christian Albrecht"; name = "Christian Albrecht";
}; };
CactiChameleon9 = {
email = "h19xjkkp@duck.com";
github = "CactiChameleon9";
githubId = 51231053;
name = "Daniel";
};
callahad = { callahad = {
email = "dan.callahan@gmail.com"; email = "dan.callahan@gmail.com";
github = "callahad"; github = "callahad";
@ -2598,6 +2647,12 @@
githubId = 244239; githubId = 244239;
name = "Mauricio Collares"; name = "Mauricio Collares";
}; };
CompEng0001 = {
email = "sb1501@canterbury.ac.uk";
github = "CompEng0001";
githubId = 40290417;
name = "Seb Blair";
};
copumpkin = { copumpkin = {
email = "pumpkingod@gmail.com"; email = "pumpkingod@gmail.com";
github = "copumpkin"; github = "copumpkin";
@ -2913,7 +2968,7 @@
danth = { danth = {
name = "Daniel Thwaites"; name = "Daniel Thwaites";
email = "danthwaites30@btinternet.com"; email = "danthwaites30@btinternet.com";
matrix = "@danth:pwak.org"; matrix = "@danth:danth.me";
github = "danth"; github = "danth";
githubId = 28959268; githubId = 28959268;
keys = [{ keys = [{
@ -3091,6 +3146,12 @@
github = "delan"; github = "delan";
githubId = 465303; githubId = 465303;
}; };
delehef = {
name = "Franklin Delehelle";
email = "nix@odena.eu";
github = "delehef";
githubId = 1153808;
};
deliciouslytyped = { deliciouslytyped = {
email = "47436522+deliciouslytyped@users.noreply.github.com"; email = "47436522+deliciouslytyped@users.noreply.github.com";
github = "deliciouslytyped"; github = "deliciouslytyped";
@ -4322,6 +4383,12 @@
githubId = 415760; githubId = 415760;
name = "Jonas Höglund"; name = "Jonas Höglund";
}; };
firefly-cpp = {
email = "iztok@iztok-jr-fister.eu";
github = "firefly-cpp";
githubId = 1633361;
name = "Iztok Fister Jr.";
};
fishi0x01 = { fishi0x01 = {
email = "fishi0x01@gmail.com"; email = "fishi0x01@gmail.com";
github = "fishi0x01"; github = "fishi0x01";
@ -4416,6 +4483,12 @@
githubId = 74379; githubId = 74379;
name = "Florian Pester"; name = "Florian Pester";
}; };
fmoda3 = {
email = "fmoda3@mac.com";
github = "fmoda3";
githubId = 1746471;
name = "Frank Moda III";
};
fmthoma = { fmthoma = {
email = "f.m.thoma@googlemail.com"; email = "f.m.thoma@googlemail.com";
github = "fmthoma"; github = "fmthoma";
@ -4851,6 +4924,15 @@
fingerprint = "5214 2D39 A7CE F8FA 872B CA7F DE62 E1E2 A614 5556"; fingerprint = "5214 2D39 A7CE F8FA 872B CA7F DE62 E1E2 A614 5556";
}]; }];
}; };
gp2112 = {
email = "me@guip.dev";
github = "gp2112";
githubId = 26512375;
name = "Guilherme Paixão";
keys = [{
fingerprint = "4382 7E28 86E5 C34F 38D5 7753 8C81 4D62 5FBD 99D1";
}];
};
gpanders = { gpanders = {
name = "Gregory Anders"; name = "Gregory Anders";
email = "greg@gpanders.com"; email = "greg@gpanders.com";
@ -4860,6 +4942,12 @@
fingerprint = "B9D5 0EDF E95E ECD0 C135 00A9 56E9 3C2F B6B0 8BDB"; fingerprint = "B9D5 0EDF E95E ECD0 C135 00A9 56E9 3C2F B6B0 8BDB";
}]; }];
}; };
gpl = {
email = "nixos-6c64ce18-bbbc-414f-8dcb-f9b6b47fe2bc@isopleth.org";
github = "gpl";
githubId = 39648069;
name = "isogram";
};
gpyh = { gpyh = {
email = "yacine.hmito@gmail.com"; email = "yacine.hmito@gmail.com";
github = "yacinehmito"; github = "yacinehmito";
@ -5490,6 +5578,12 @@
githubId = 1550265; githubId = 1550265;
name = "Dominic Steinitz"; name = "Dominic Steinitz";
}; };
ifurther = {
email = "55025025+ifurther@users.noreply.github.com";
github = "ifurther";
githubId = 55025025;
name = "Feather Lin";
};
igsha = { igsha = {
email = "igor.sharonov@gmail.com"; email = "igor.sharonov@gmail.com";
github = "igsha"; github = "igsha";
@ -5601,6 +5695,16 @@
githubId = 510202; githubId = 510202;
name = "Ismaël Bouya"; name = "Ismaël Bouya";
}; };
impl = {
email = "noah@noahfontes.com";
matrix = "@impl:matrix.org";
github = "impl";
githubId = 41129;
name = "Noah Fontes";
keys = [{
fingerprint = "F5B2 BE1B 9AAD 98FE 2916 5597 3665 FFF7 9D38 7BAA";
}];
};
imsofi = { imsofi = {
email = "sofi+git@mailbox.org"; email = "sofi+git@mailbox.org";
github = "imsofi"; github = "imsofi";
@ -5769,6 +5873,16 @@
github = "jacg"; github = "jacg";
githubId = 2570854; githubId = 2570854;
}; };
jakehamilton = {
name = "Jake Hamilton";
email = "jake.hamilton@hey.com";
matrix = "@jakehamilton:matrix.org";
github = "jakehamilton";
githubId = 7005773;
keys = [{
fingerprint = "B982 0250 1720 D540 6A18 2DA8 188E 4945 E85B 2D21";
}];
};
jasoncarr = { jasoncarr = {
email = "jcarr250@gmail.com"; email = "jcarr250@gmail.com";
github = "jasoncarr0"; github = "jasoncarr0";
@ -6456,6 +6570,12 @@
githubId = 752510; githubId = 752510;
name = "Martin Potier"; name = "Martin Potier";
}; };
jqqqqqqqqqq = {
email = "jqqqqqqqqqq@gmail.com";
github = "jqqqqqqqqqq";
githubId = 12872927;
name = "Curtis Jiang";
};
jqueiroz = { jqueiroz = {
email = "nixos@johnjq.com"; email = "nixos@johnjq.com";
github = "jqueiroz"; github = "jqueiroz";
@ -6528,6 +6648,12 @@
githubId = 705123; githubId = 705123;
name = "Jan Tojnar"; name = "Jan Tojnar";
}; };
jtrees = {
email = "me@jtrees.io";
github = "jtrees";
githubId = 5802758;
name = "Joshua Trees";
};
juaningan = { juaningan = {
email = "juaningan@gmail.com"; email = "juaningan@gmail.com";
github = "uningan"; github = "uningan";
@ -6979,12 +7105,6 @@
fingerprint = "8992 44FC D291 5CA2 0A97 802C 156C 88A5 B0A0 4B2A"; fingerprint = "8992 44FC D291 5CA2 0A97 802C 156C 88A5 B0A0 4B2A";
}]; }];
}; };
kiyengar = {
email = "hello@kiyengar.net";
github = "karthikiyengar";
githubId = 8260207;
name = "Karthik Iyengar";
};
kjeremy = { kjeremy = {
email = "kjeremy@gmail.com"; email = "kjeremy@gmail.com";
name = "Jeremy Kolb"; name = "Jeremy Kolb";
@ -8034,11 +8154,11 @@
name = "Michael Fellinger"; name = "Michael Fellinger";
}; };
maralorn = { maralorn = {
email = "malte.brandy@maralorn.de"; email = "mail@maralorn.de";
matrix = "@maralorn:maralorn.de"; matrix = "@maralorn:maralorn.de";
github = "maralorn"; github = "maralorn";
githubId = 1651325; githubId = 1651325;
name = "Malte Brandy"; name = "maralorn";
}; };
marcweber = { marcweber = {
email = "marco-oweber@gmx.de"; email = "marco-oweber@gmx.de";
@ -8587,6 +8707,12 @@
fingerprint = "FEF0 AE2D 5449 3482 5F06 40AA 186A 1EDA C5C6 3F83"; fingerprint = "FEF0 AE2D 5449 3482 5F06 40AA 186A 1EDA C5C6 3F83";
}]; }];
}; };
mightyiam = {
email = "mightyiampresence@gmail.com";
github = "mightyiam";
githubId = 635591;
name = "Shahar Dawn Or";
};
mihnea-s = { mihnea-s = {
email = "mihn.stn@gmail.com"; email = "mihn.stn@gmail.com";
github = "mihnea-s"; github = "mihnea-s";
@ -8935,7 +9061,7 @@
name = "Millian Poquet"; name = "Millian Poquet";
}; };
mpscholten = { mpscholten = {
email = "marc@mpscholten.de"; email = "marc@digitallyinduced.com";
github = "mpscholten"; github = "mpscholten";
githubId = 2072185; githubId = 2072185;
name = "Marc Scholten"; name = "Marc Scholten";
@ -9646,6 +9772,12 @@
github = "numkem"; github = "numkem";
githubId = 332423; githubId = 332423;
}; };
nviets = {
email = "nathan.g.viets@gmail.com";
github = "nviets";
githubId = 16027994;
name = "Nathan Viets";
};
nyanloutre = { nyanloutre = {
email = "paul@nyanlout.re"; email = "paul@nyanlout.re";
github = "nyanloutre"; github = "nyanloutre";
@ -9686,6 +9818,12 @@
githubId = 3359345; githubId = 3359345;
name = "obadz"; name = "obadz";
}; };
oberblastmeister = {
email = "littlebubu.shu@gmail.com";
github = "oberblastmeister";
githubId = 61095988;
name = "Brian Shu";
};
obsidian-systems-maintenance = { obsidian-systems-maintenance = {
name = "Obsidian Systems Maintenance"; name = "Obsidian Systems Maintenance";
email = "maintainer@obsidian.systems"; email = "maintainer@obsidian.systems";
@ -10171,6 +10309,15 @@
githubId = 29493551; githubId = 29493551;
name = "Josh Peters"; name = "Josh Peters";
}; };
peterwilli = {
email = "peter@codebuffet.co";
github = "peterwilli";
githubId = 1212814;
name = "Peter Willemsen";
keys = [{
fingerprint = "A37F D403 88E2 D026 B9F6 9617 5C9D D4BF B96A 28F0";
}];
};
peti = { peti = {
email = "simons@cryp.to"; email = "simons@cryp.to";
github = "peti"; github = "peti";
@ -10942,6 +11089,12 @@
githubId = 7226587; githubId = 7226587;
name = "Théophane Hufschmitt"; name = "Théophane Hufschmitt";
}; };
rehno-lindeque = {
email = "rehno.lindeque+code@gmail.com";
github = "rehno-lindeque";
githubId = 337811;
name = "Rehno Lindeque";
};
relrod = { relrod = {
email = "ricky@elrod.me"; email = "ricky@elrod.me";
github = "relrod"; github = "relrod";
@ -11518,6 +11671,12 @@
fingerprint = "AE8C 0836 FDF6 3FFC 9580 C588 B156 8953 B193 9F1C"; fingerprint = "AE8C 0836 FDF6 3FFC 9580 C588 B156 8953 B193 9F1C";
}]; }];
}; };
samlukeyes123 = {
email = "samlukeyes123@gmail.com";
github = "SamLukeYes";
githubId = 12882091;
name = "Sam L. Yes";
};
samrose = { samrose = {
email = "samuel.rose@gmail.com"; email = "samuel.rose@gmail.com";
github = "samrose"; github = "samrose";
@ -11636,6 +11795,12 @@
githubId = 3958212; githubId = 3958212;
name = "Tom Sorlie"; name = "Tom Sorlie";
}; };
sioodmy = {
name = "Antoni Sokołowski";
email = "81568712+sioodmy@users.noreply.github.com";
github = "sioodmy";
githubId = 81568712;
};
schmitthenner = { schmitthenner = {
email = "development@schmitthenner.eu"; email = "development@schmitthenner.eu";
github = "fkz"; github = "fkz";
@ -13049,6 +13214,12 @@
githubId = 3268082; githubId = 3268082;
name = "Thibaut Marty"; name = "Thibaut Marty";
}; };
thyol = {
name = "thyol";
email = "thyol@pm.me";
github = "thyol";
githubId = 81481634;
};
thmzlt = { thmzlt = {
email = "git@thomazleite.com"; email = "git@thomazleite.com";
github = "thmzlt"; github = "thmzlt";
@ -13500,6 +13671,15 @@
fingerprint = "EE59 5E29 BB5B F2B3 5ED2 3F1C D276 FF74 6700 7335"; fingerprint = "EE59 5E29 BB5B F2B3 5ED2 3F1C D276 FF74 6700 7335";
}]; }];
}; };
unhammer = {
email = "unhammer@fsfe.org";
github = "unhammer";
githubId = 56868;
name = "Kevin Brubeck Unhammer";
keys = [{
fingerprint = "50D4 8796 0B86 3F05 4B6A 12F9 7426 06DE 766A C60C";
}];
};
uniquepointer = { uniquepointer = {
email = "uniquepointer@mailbox.org"; email = "uniquepointer@mailbox.org";
matrix = "@uniquepointer:matrix.org"; matrix = "@uniquepointer:matrix.org";
@ -13704,6 +13884,15 @@
githubId = 245573; githubId = 245573;
name = "Dmitry Kalinkin"; name = "Dmitry Kalinkin";
}; };
victormignot = {
email = "victor.mignot@protonmail.com";
github = "victormignot";
githubId = 58660971;
name = "Victor Mignot";
keys = [{
fingerprint = "CA5D F91A D672 683A 1F65 BBC9 0317 096D 20E0 067B";
}];
};
vidbina = { vidbina = {
email = "vid@bina.me"; email = "vid@bina.me";
github = "vidbina"; github = "vidbina";
@ -13964,6 +14153,15 @@
github = "wentasah"; github = "wentasah";
githubId = 140542; githubId = 140542;
}; };
wesnel = {
name = "Wesley Nelson";
email = "wgn@wesnel.dev";
github = "wesnel";
githubId = 43357387;
keys = [{
fingerprint = "F844 80B2 0CA9 D6CC C7F5 2479 A776 D2AD 099E 8BC0";
}];
};
wheelsandmetal = { wheelsandmetal = {
email = "jakob@schmutz.co.uk"; email = "jakob@schmutz.co.uk";
github = "wheelsandmetal"; github = "wheelsandmetal";
@ -15051,4 +15249,39 @@
github = "yisuidenghua"; github = "yisuidenghua";
githubId = 102890144; githubId = 102890144;
}; };
macalinao = {
email = "me@ianm.com";
name = "Ian Macalinao";
github = "macalinao";
githubId = 401263;
keys = [{
fingerprint = "1147 43F1 E707 6F3E 6F4B 2C96 B9A8 B592 F126 F8E8";
}];
};
tjni = {
email = "43ngvg@masqt.com";
matrix = "@tni:matrix.org";
name = "Theodore Ni";
github = "tjni";
githubId = 3806110;
keys = [{
fingerprint = "4384 B8E1 299F C028 1641 7B8F EC30 EFBE FA7E 84A4";
}];
};
cafkafk = {
email = "cafkafk@cafkafk.com";
matrix = "@cafkafk:matrix.cafkafk.com";
name = "Christina Sørensen";
github = "cafkafk";
githubId = 89321978;
keys = [{
fingerprint = "7B9E E848 D074 AE03 7A0C 651A 8ED4 DEF7 375A 30C8";
}];
};
rb = {
email = "maintainers@cloudposse.com";
github = "nitrocode";
githubId = 7775707;
name = "RB";
};
} }

View file

@ -74,6 +74,15 @@ with lib.maintainers; {
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
bitnomial = {
# Verify additions to this team with at least one already existing member of the team.
members = [
cdepillabout
];
scope = "Group registration for packages maintained by Bitnomial.";
shortName = "Bitnomial employees";
};
blockchains = { blockchains = {
members = [ members = [
mmahut mmahut
@ -107,6 +116,7 @@ with lib.maintainers; {
cinnamon = { cinnamon = {
members = [ members = [
bobby285271
mkg20001 mkg20001
]; ];
scope = "Maintain Cinnamon desktop environment and applications made by the LinuxMint team."; scope = "Maintain Cinnamon desktop environment and applications made by the LinuxMint team.";

View file

@ -120,7 +120,6 @@ to set one. The recommended configuration for modern systems is:
```nix ```nix
services.xserver.videoDrivers = [ "modesetting" ]; services.xserver.videoDrivers = [ "modesetting" ];
services.xserver.useGlamor = true;
``` ```
If you experience screen tearing no matter what, this configuration was If you experience screen tearing no matter what, this configuration was

View file

@ -133,7 +133,6 @@ services.xserver.displayManager.autoLogin.user = &quot;alice&quot;;
</para> </para>
<programlisting language="bash"> <programlisting language="bash">
services.xserver.videoDrivers = [ &quot;modesetting&quot; ]; services.xserver.videoDrivers = [ &quot;modesetting&quot; ];
services.xserver.useGlamor = true;
</programlisting> </programlisting>
<para> <para>
If you experience screen tearing no matter what, this If you experience screen tearing no matter what, this

View file

@ -183,6 +183,14 @@
<link xlink:href="options.html#opt-services.hadoop.hbase.enable">services.hadoop.hbase</link>. <link xlink:href="options.html#opt-services.hadoop.hbase.enable">services.hadoop.hbase</link>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<link xlink:href="https://github.com/messagebird/sachet/">Sachet</link>,
an SMS alerting tool for the Prometheus Alertmanager.
Available as
<link linkend="opt-services.prometheus.sachet.enable">services.prometheus.sachet</link>.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
<link xlink:href="https://github.com/leetronics/infnoise">infnoise</link>, <link xlink:href="https://github.com/leetronics/infnoise">infnoise</link>,
@ -198,6 +206,27 @@
<link xlink:href="options.html#opt-services.kanata.enable">services.kanata</link>. <link xlink:href="options.html#opt-services.kanata.enable">services.kanata</link>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<link xlink:href="https://languagetool.org/">languagetool</link>,
a multilingual grammar, style, and spell checker. Available as
<link xlink:href="options.html#opt-services.languagetool.enable">services.languagetool</link>.
</para>
</listitem>
<listitem>
<para>
<link xlink:href="https://www.getoutline.com/">Outline</link>,
a wiki and knowledge base similar to Notion. Available as
<link linkend="opt-services.outline.enable">services.outline</link>.
</para>
</listitem>
<listitem>
<para>
<link xlink:href="https://netbird.io">netbird</link>, a zero
configuration VPN. Available as
<link xlink:href="options.html#opt-services.netbird.enable">services.netbird</link>.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
<link xlink:href="https://github.com/aiberia/persistent-evdev">persistent-evdev</link>, <link xlink:href="https://github.com/aiberia/persistent-evdev">persistent-evdev</link>,
@ -214,6 +243,14 @@
<link linkend="opt-services.schleuder.enable">services.schleuder</link>. <link linkend="opt-services.schleuder.enable">services.schleuder</link>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<link xlink:href="https://www.dolibarr.org/">Dolibarr</link>,
an enterprise resource planning and customer relationship
manager. Enable using
<link linkend="opt-services.dolibarr.enable">services.dolibarr</link>.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
<link xlink:href="https://www.expressvpn.com">expressvpn</link>, <link xlink:href="https://www.expressvpn.com">expressvpn</link>,
@ -236,11 +273,32 @@
<link xlink:href="options.html#opt-services.patroni.enable">services.patroni</link>. <link xlink:href="options.html#opt-services.patroni.enable">services.patroni</link>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<link xlink:href="https://github.com/prometheus-community/ipmi_exporter">Prometheus
IPMI exporter</link>, an IPMI exporter for Prometheus.
Available as
<link linkend="opt-services.prometheus.exporters.ipmi.enable">services.prometheus.exporters.ipmi</link>.
</para>
</listitem>
<listitem>
<para>
<link xlink:href="https://writefreely.org">WriteFreely</link>,
a simple blogging platform with ActivityPub support. Available
as
<link xlink:href="options.html#opt-services.writefreely.enable">services.writefreely</link>.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sec-release-22.11-incompatibilities"> <section xml:id="sec-release-22.11-incompatibilities">
<title>Backward Incompatibilities</title> <title>Backward Incompatibilities</title>
<itemizedlist> <itemizedlist>
<listitem>
<para>
Nixpkgs now requires Nix 2.3 or newer.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
The <literal>isCompatible</literal> predicate checking CPU The <literal>isCompatible</literal> predicate checking CPU
@ -337,6 +395,17 @@
instead. instead.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The <literal>coq</literal> package and versioned variants
starting at <literal>coq_8_14</literal> no longer include
CoqIDE, which is now available through
<literal>coqPackages.coqide</literal>. It is still possible to
get CoqIDE as part of the <literal>coq</literal> package by
overriding the <literal>buildIde</literal> argument of the
derivation.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
PHP 7.4 is no longer supported due to upstream not supporting PHP 7.4 is no longer supported due to upstream not supporting
@ -349,6 +418,14 @@
<literal>cosigned</literal> binary anymore. <literal>cosigned</literal> binary anymore.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Emacs now uses the Lucid toolkit by default instead of GTK
because of stability and compatibility issues. Users who still
wish to remain using GTK can do so by using
<literal>emacs-gtk</literal>.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
riak package removed along with riak package removed along with
@ -387,6 +464,13 @@
<literal>&quot;wine64&quot;</literal>. <literal>&quot;wine64&quot;</literal>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The <literal>paperless</literal> module now defaults
<literal>PAPERLESS_TIME_ZONE</literal> to your configured
system timezone.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
(Neo)Vim can not be configured with (Neo)Vim can not be configured with
@ -401,6 +485,12 @@
due to upstream dropping support. due to upstream dropping support.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<literal>k3s</literal> supports <literal>clusterInit</literal>
option, and it is enabled by default, for servers.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sec-release-22.11-notable-changes"> <section xml:id="sec-release-22.11-notable-changes">
@ -446,6 +536,12 @@
guide</link> on how to migrate your Neo4j instance. guide</link> on how to migrate your Neo4j instance.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The <literal>services.matrix-synapse</literal> systemd unit
has been hardened.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
Matrix Synapse now requires entries in the Matrix Synapse now requires entries in the
@ -457,6 +553,14 @@
and require manual remediation. and require manual remediation.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The <literal>diamond</literal> package has been update from
0.8.36 to 2.0.15. See the
<link xlink:href="https://github.com/bbuchfink/diamond/releases">upstream
release notes</link> for more details.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
<literal>dockerTools.buildImage</literal> deprecates the <literal>dockerTools.buildImage</literal> deprecates the

View file

@ -68,16 +68,28 @@ In addition to numerous new and upgraded packages, this release has the followin
- [HBase cluster](https://hbase.apache.org/), a distributed, scalable, big data store. Available as [services.hadoop.hbase](options.html#opt-services.hadoop.hbase.enable). - [HBase cluster](https://hbase.apache.org/), a distributed, scalable, big data store. Available as [services.hadoop.hbase](options.html#opt-services.hadoop.hbase.enable).
- [Sachet](https://github.com/messagebird/sachet/), an SMS alerting tool for the Prometheus Alertmanager. Available as [services.prometheus.sachet](#opt-services.prometheus.sachet.enable).
- [infnoise](https://github.com/leetronics/infnoise), a hardware True Random Number Generator dongle. - [infnoise](https://github.com/leetronics/infnoise), a hardware True Random Number Generator dongle.
Available as [services.infnoise](options.html#opt-services.infnoise.enable). Available as [services.infnoise](options.html#opt-services.infnoise.enable).
- [kanata](https://github.com/jtroo/kanata), a tool to improve keyboard comfort and usability with advanced customization. - [kanata](https://github.com/jtroo/kanata), a tool to improve keyboard comfort and usability with advanced customization.
Available as [services.kanata](options.html#opt-services.kanata.enable). Available as [services.kanata](options.html#opt-services.kanata.enable).
- [languagetool](https://languagetool.org/), a multilingual grammar, style, and spell checker.
Available as [services.languagetool](options.html#opt-services.languagetool.enable).
- [Outline](https://www.getoutline.com/), a wiki and knowledge base similar to Notion. Available as [services.outline](#opt-services.outline.enable).
- [netbird](https://netbird.io), a zero configuration VPN.
Available as [services.netbird](options.html#opt-services.netbird.enable).
- [persistent-evdev](https://github.com/aiberia/persistent-evdev), a daemon to add virtual proxy devices that mirror a physical input device but persist even if the underlying hardware is hot-plugged. Available as [services.persistent-evdev](#opt-services.persistent-evdev.enable). - [persistent-evdev](https://github.com/aiberia/persistent-evdev), a daemon to add virtual proxy devices that mirror a physical input device but persist even if the underlying hardware is hot-plugged. Available as [services.persistent-evdev](#opt-services.persistent-evdev.enable).
- [schleuder](https://schleuder.org/), a mailing list manager with PGP support. Enable using [services.schleuder](#opt-services.schleuder.enable). - [schleuder](https://schleuder.org/), a mailing list manager with PGP support. Enable using [services.schleuder](#opt-services.schleuder.enable).
- [Dolibarr](https://www.dolibarr.org/), an enterprise resource planning and customer relationship manager. Enable using [services.dolibarr](#opt-services.dolibarr.enable).
- [expressvpn](https://www.expressvpn.com), the CLI client for ExpressVPN. Available as [services.expressvpn](#opt-services.expressvpn.enable). - [expressvpn](https://www.expressvpn.com), the CLI client for ExpressVPN. Available as [services.expressvpn](#opt-services.expressvpn.enable).
- [Grafana Tempo](https://www.grafana.com/oss/tempo/), a distributed tracing store. Available as [services.tempo](#opt-services.tempo.enable). - [Grafana Tempo](https://www.grafana.com/oss/tempo/), a distributed tracing store. Available as [services.tempo](#opt-services.tempo.enable).
@ -85,10 +97,16 @@ In addition to numerous new and upgraded packages, this release has the followin
- [Patroni](https://github.com/zalando/patroni), a template for PostgreSQL HA with ZooKeeper, etcd or Consul. - [Patroni](https://github.com/zalando/patroni), a template for PostgreSQL HA with ZooKeeper, etcd or Consul.
Available as [services.patroni](options.html#opt-services.patroni.enable). Available as [services.patroni](options.html#opt-services.patroni.enable).
- [Prometheus IPMI exporter](https://github.com/prometheus-community/ipmi_exporter), an IPMI exporter for Prometheus. Available as [services.prometheus.exporters.ipmi](#opt-services.prometheus.exporters.ipmi.enable).
- [WriteFreely](https://writefreely.org), a simple blogging platform with ActivityPub support. Available as [services.writefreely](options.html#opt-services.writefreely.enable).
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. --> <!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
## Backward Incompatibilities {#sec-release-22.11-incompatibilities} ## Backward Incompatibilities {#sec-release-22.11-incompatibilities}
- Nixpkgs now requires Nix 2.3 or newer.
- The `isCompatible` predicate checking CPU compatibility is no longer exposed - The `isCompatible` predicate checking CPU compatibility is no longer exposed
by the platform sets generated using `lib.systems.elaborate`. In most cases by the platform sets generated using `lib.systems.elaborate`. In most cases
you will want to use the new `canExecute` predicate instead which also you will want to use the new `canExecute` predicate instead which also
@ -118,11 +136,20 @@ Available as [services.patroni](options.html#opt-services.patroni.enable).
- `services.hbase` has been renamed to `services.hbase-standalone`. - `services.hbase` has been renamed to `services.hbase-standalone`.
For production HBase clusters, use `services.hadoop.hbase` instead. For production HBase clusters, use `services.hadoop.hbase` instead.
- The `coq` package and versioned variants starting at `coq_8_14` no
longer include CoqIDE, which is now available through
`coqPackages.coqide`. It is still possible to get CoqIDE as part of
the `coq` package by overriding the `buildIde` argument of the
derivation.
- PHP 7.4 is no longer supported due to upstream not supporting this - PHP 7.4 is no longer supported due to upstream not supporting this
version for the entire lifecycle of the 22.11 release. version for the entire lifecycle of the 22.11 release.
- `pkgs.cosign` does not provide the `cosigned` binary anymore. - `pkgs.cosign` does not provide the `cosigned` binary anymore.
- Emacs now uses the Lucid toolkit by default instead of GTK because of stability and compatibility issues.
Users who still wish to remain using GTK can do so by using `emacs-gtk`.
- riak package removed along with `services.riak` module, due to lack of maintainer to update the package. - riak package removed along with `services.riak` module, due to lack of maintainer to update the package.
- xow package removed along with the `hardware.xow` module, due to the project being deprecated in favor of `xone`, which is available via the `hardware.xone` module. - xow package removed along with the `hardware.xow` module, due to the project being deprecated in favor of `xone`, which is available via the `hardware.xone` module.
@ -136,11 +163,15 @@ Available as [services.patroni](options.html#opt-services.patroni.enable).
- The `meta.mainProgram` attribute of packages in `wineWowPackages` now defaults to `"wine64"`. - The `meta.mainProgram` attribute of packages in `wineWowPackages` now defaults to `"wine64"`.
- The `paperless` module now defaults `PAPERLESS_TIME_ZONE` to your configured system timezone.
- (Neo)Vim can not be configured with `configure.pathogen` anymore to reduce maintainance burden. - (Neo)Vim can not be configured with `configure.pathogen` anymore to reduce maintainance burden.
Use `configure.packages` instead. Use `configure.packages` instead.
- `k3s` no longer supports docker as runtime due to upstream dropping support. - `k3s` no longer supports docker as runtime due to upstream dropping support.
- `k3s` supports `clusterInit` option, and it is enabled by default, for servers.
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. --> <!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
## Other Notable Changes {#sec-release-22.11-notable-changes} ## Other Notable Changes {#sec-release-22.11-notable-changes}
@ -155,8 +186,12 @@ Use `configure.packages` instead.
- Neo4j was updated from version 3 to version 4. See this [migration guide](https://neo4j.com/docs/upgrade-migration-guide/current/) on how to migrate your Neo4j instance. - Neo4j was updated from version 3 to version 4. See this [migration guide](https://neo4j.com/docs/upgrade-migration-guide/current/) on how to migrate your Neo4j instance.
- The `services.matrix-synapse` systemd unit has been hardened.
- Matrix Synapse now requires entries in the `state_group_edges` table to be unique, in order to prevent accidentally introducing duplicate information (for example, because a database backup was restored multiple times). If your Synapse database already has duplicate rows in this table, this could fail with an error and require manual remediation. - Matrix Synapse now requires entries in the `state_group_edges` table to be unique, in order to prevent accidentally introducing duplicate information (for example, because a database backup was restored multiple times). If your Synapse database already has duplicate rows in this table, this could fail with an error and require manual remediation.
- The `diamond` package has been update from 0.8.36 to 2.0.15. See the [upstream release notes](https://github.com/bbuchfink/diamond/releases) for more details.
- `dockerTools.buildImage` deprecates the misunderstood `contents` parameter, in favor of `copyToRoot`. - `dockerTools.buildImage` deprecates the misunderstood `contents` parameter, in favor of `copyToRoot`.
Use `copyToRoot = buildEnv { ... };` or similar if you intend to add packages to `/bin`. Use `copyToRoot = buildEnv { ... };` or similar if you intend to add packages to `/bin`.

View file

@ -114,6 +114,10 @@ class Renderer(mistune.renderers.BaseRenderer):
return f"<option>{escape(text)}</option>" return f"<option>{escape(text)}</option>"
def file(self, text): def file(self, text):
return f"<filename>{escape(text)}</filename>" return f"<filename>{escape(text)}</filename>"
def var(self, text):
return f"<varname>{escape(text)}</varname>"
def env(self, text):
return f"<envar>{escape(text)}</envar>"
def manpage(self, page, section): def manpage(self, page, section):
title = f"<refentrytitle>{escape(page)}</refentrytitle>" title = f"<refentrytitle>{escape(page)}</refentrytitle>"
vol = f"<manvolnum>{escape(section)}</manvolnum>" vol = f"<manvolnum>{escape(section)}</manvolnum>"
@ -136,6 +140,20 @@ def p_file(md):
md.inline.register_rule('file', FILE_PATTERN, parse) md.inline.register_rule('file', FILE_PATTERN, parse)
md.inline.rules.append('file') md.inline.rules.append('file')
def p_var(md):
VAR_PATTERN = r'\{var\}`(.*?)`'
def parse(self, m, state):
return ('var', m.group(1))
md.inline.register_rule('var', VAR_PATTERN, parse)
md.inline.rules.append('var')
def p_env(md):
ENV_PATTERN = r'\{env\}`(.*?)`'
def parse(self, m, state):
return ('env', m.group(1))
md.inline.register_rule('env', ENV_PATTERN, parse)
md.inline.rules.append('env')
def p_option(md): def p_option(md):
OPTION_PATTERN = r'\{option\}`(.*?)`' OPTION_PATTERN = r'\{option\}`(.*?)`'
def parse(self, m, state): def parse(self, m, state):
@ -151,7 +169,7 @@ def p_manpage(md):
md.inline.rules.append('manpage') md.inline.rules.append('manpage')
def p_admonition(md): def p_admonition(md):
ADMONITION_PATTERN = re.compile(r'^::: \{([^\n]*?)\}\n(.*?)^:::\n', flags=re.MULTILINE|re.DOTALL) ADMONITION_PATTERN = re.compile(r'^::: \{([^\n]*?)\}\n(.*?)^:::$\n*', flags=re.MULTILINE|re.DOTALL)
def parse(self, m, state): def parse(self, m, state):
return { return {
'type': 'admonition', 'type': 'admonition',
@ -162,7 +180,7 @@ def p_admonition(md):
md.block.rules.append('admonition') md.block.rules.append('admonition')
md = mistune.create_markdown(renderer=Renderer(), plugins=[ md = mistune.create_markdown(renderer=Renderer(), plugins=[
p_command, p_file, p_option, p_manpage, p_admonition p_command, p_file, p_var, p_env, p_option, p_manpage, p_admonition
]) ])
# converts in-place! # converts in-place!

View file

@ -4,29 +4,61 @@
let let
zeroPad = n: zeroPad = n:
lib.optionalString (n < 16) "0" + lib.optionalString (n < 16) "0" +
(if n > 255 (if n > 255
then throw "Can't have more than 255 nets or nodes!" then throw "Can't have more than 255 nets or nodes!"
else lib.toHexString n); else lib.toHexString n);
in in
rec { rec {
qemuNicMac = net: machine: "52:54:00:12:${zeroPad net}:${zeroPad machine}"; qemuNicMac = net: machine: "52:54:00:12:${zeroPad net}:${zeroPad machine}";
qemuNICFlags = nic: net: machine: qemuNICFlags = nic: net: machine:
[ "-device virtio-net-pci,netdev=vlan${toString nic},mac=${qemuNicMac net machine}" [
"-device virtio-net-pci,netdev=vlan${toString nic},mac=${qemuNicMac net machine}"
''-netdev vde,id=vlan${toString nic},sock="$QEMU_VDE_SOCKET_${toString net}"'' ''-netdev vde,id=vlan${toString nic},sock="$QEMU_VDE_SOCKET_${toString net}"''
]; ];
qemuSerialDevice = if pkgs.stdenv.hostPlatform.isx86 || pkgs.stdenv.hostPlatform.isRiscV then "ttyS0" qemuSerialDevice =
else if (with pkgs.stdenv.hostPlatform; isAarch || isPower) then "ttyAMA0" if pkgs.stdenv.hostPlatform.isx86 || pkgs.stdenv.hostPlatform.isRiscV then "ttyS0"
else throw "Unknown QEMU serial device for system '${pkgs.stdenv.hostPlatform.system}'"; else if (with pkgs.stdenv.hostPlatform; isAarch || isPower) then "ttyAMA0"
else throw "Unknown QEMU serial device for system '${pkgs.stdenv.hostPlatform.system}'";
qemuBinary = qemuPkg: { qemuBinary = qemuPkg:
x86_64-linux = "${qemuPkg}/bin/qemu-kvm -cpu max"; let
armv7l-linux = "${qemuPkg}/bin/qemu-system-arm -machine virt,accel=kvm:tcg -cpu max"; hostStdenv = qemuPkg.stdenv;
aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -machine virt,gic-version=max,accel=kvm:tcg -cpu max"; hostSystem = hostStdenv.system;
powerpc64le-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv"; guestSystem = pkgs.stdenv.hostPlatform.system;
powerpc64-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
x86_64-darwin = "${qemuPkg}/bin/qemu-kvm -cpu max"; linuxHostGuestMatrix = {
}.${pkgs.stdenv.hostPlatform.system} or "${qemuPkg}/bin/qemu-kvm"; x86_64-linux = "${qemuPkg}/bin/qemu-kvm -cpu max";
armv7l-linux = "${qemuPkg}/bin/qemu-system-arm -machine virt,accel=kvm:tcg -cpu max";
aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -machine virt,gic-version=max,accel=kvm:tcg -cpu max";
powerpc64le-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
powerpc64-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";
x86_64-darwin = "${qemuPkg}/bin/qemu-kvm -cpu max";
};
otherHostGuestMatrix = {
aarch64-darwin = {
aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -machine virt,gic-version=2,accel=hvf:tcg -cpu max";
};
x86_64-darwin = {
x86_64-linux = "${qemuPkg}/bin/qemu-system-x86_64 -machine type=q35,accel=hvf:tcg -cpu max";
};
};
throwUnsupportedHostSystem =
let
supportedSystems = [ "linux" ] ++ (lib.attrNames otherHostGuestMatrix);
in
throw "Unsupported host system ${hostSystem}, supported: ${lib.concatStringsSep ", " supportedSystems}";
throwUnsupportedGuestSystem = guestMap:
throw "Unsupported guest system ${guestSystem} for host ${hostSystem}, supported: ${lib.concatStringsSep ", " (lib.attrNames guestMap)}";
in
if hostStdenv.isLinux then
linuxHostGuestMatrix.${guestSystem} or "${qemuPkg}/bin/qemu-kvm"
else
let
guestMap = (otherHostGuestMatrix.${hostSystem} or throwUnsupportedHostSystem);
in
(guestMap.${guestSystem} or (throwUnsupportedGuestSystem guestMap));
} }

View file

@ -37,11 +37,11 @@ rec {
initrdContents = types.attrsOf (types.submodule ({ config, options, name, ... }: { initrdContents = types.attrsOf (types.submodule ({ config, options, name, ... }: {
options = { options = {
enable = mkEnableOption "copying of this file and symlinking it" // { default = true; }; enable = mkEnableOption (lib.mdDoc "copying of this file and symlinking it") // { default = true; };
target = mkOption { target = mkOption {
type = types.path; type = types.path;
description = '' description = lib.mdDoc ''
Path of the symlink. Path of the symlink.
''; '';
default = name; default = name;
@ -50,12 +50,12 @@ rec {
text = mkOption { text = mkOption {
default = null; default = null;
type = types.nullOr types.lines; type = types.nullOr types.lines;
description = "Text of the file."; description = lib.mdDoc "Text of the file.";
}; };
source = mkOption { source = mkOption {
type = types.path; type = types.path;
description = "Path of the source file."; description = lib.mdDoc "Path of the source file.";
}; };
}; };

View file

@ -37,24 +37,24 @@ in rec {
enable = mkOption { enable = mkOption {
default = true; default = true;
type = types.bool; type = types.bool;
description = '' description = lib.mdDoc ''
If set to false, this unit will be a symlink to If set to false, this unit will be a symlink to
/dev/null. This is primarily useful to prevent specific /dev/null. This is primarily useful to prevent specific
template instances template instances
(e.g. <literal>serial-getty@ttyS0</literal>) from being (e.g. `serial-getty@ttyS0`) from being
started. Note that <literal>enable=true</literal> does not started. Note that `enable=true` does not
make a unit start by default at boot; if you want that, see make a unit start by default at boot; if you want that, see
<literal>wantedBy</literal>. `wantedBy`.
''; '';
}; };
requiredBy = mkOption { requiredBy = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
Units that require (i.e. depend on and need to go down with) Units that require (i.e. depend on and need to go down with)
this unit. The discussion under <literal>wantedBy</literal> this unit. The discussion under `wantedBy`
applies here as well: inverse <literal>.requires</literal> applies here as well: inverse `.requires`
symlinks are established. symlinks are established.
''; '';
}; };
@ -62,16 +62,16 @@ in rec {
wantedBy = mkOption { wantedBy = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
Units that want (i.e. depend on) this unit. The standard way Units that want (i.e. depend on) this unit. The standard way
to make a unit start by default at boot is to set this option to make a unit start by default at boot is to set this option
to <literal>[ "multi-user.target" ]</literal>. That's despite to `[ "multi-user.target" ]`. That's despite
the fact that the systemd.unit(5) manpage says this option the fact that the systemd.unit(5) manpage says this option
goes in the <literal>[Install]</literal> section that controls goes in the `[Install]` section that controls
the behaviour of <literal>systemctl enable</literal>. Since the behaviour of `systemctl enable`. Since
such a process is stateful and thus contrary to the design of such a process is stateful and thus contrary to the design of
NixOS, setting this option instead causes the equivalent NixOS, setting this option instead causes the equivalent
inverse <literal>.wants</literal> symlink to be present, inverse `.wants` symlink to be present,
establishing the same desired relationship in a stateless way. establishing the same desired relationship in a stateless way.
''; '';
}; };
@ -79,7 +79,7 @@ in rec {
aliases = mkOption { aliases = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = "Aliases of that unit."; description = lib.mdDoc "Aliases of that unit.";
}; };
}; };
@ -89,12 +89,12 @@ in rec {
text = mkOption { text = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
description = "Text of this systemd unit."; description = lib.mdDoc "Text of this systemd unit.";
}; };
unit = mkOption { unit = mkOption {
internal = true; internal = true;
description = "The generated unit."; description = lib.mdDoc "The generated unit.";
}; };
}; };
@ -105,19 +105,19 @@ in rec {
description = mkOption { description = mkOption {
default = ""; default = "";
type = types.singleLineStr; type = types.singleLineStr;
description = "Description of this unit used in systemd messages and progress indicators."; description = lib.mdDoc "Description of this unit used in systemd messages and progress indicators.";
}; };
documentation = mkOption { documentation = mkOption {
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
description = "A list of URIs referencing documentation for this unit or its configuration."; description = lib.mdDoc "A list of URIs referencing documentation for this unit or its configuration.";
}; };
requires = mkOption { requires = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
Start the specified units when this unit is started, and stop Start the specified units when this unit is started, and stop
this unit when the specified units are stopped or fail. this unit when the specified units are stopped or fail.
''; '';
@ -126,7 +126,7 @@ in rec {
wants = mkOption { wants = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
Start the specified units when this unit is started. Start the specified units when this unit is started.
''; '';
}; };
@ -134,7 +134,7 @@ in rec {
after = mkOption { after = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
If the specified units are started at the same time as If the specified units are started at the same time as
this unit, delay this unit until they have started. this unit, delay this unit until they have started.
''; '';
@ -143,7 +143,7 @@ in rec {
before = mkOption { before = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
If the specified units are started at the same time as If the specified units are started at the same time as
this unit, delay them until this unit has started. this unit, delay them until this unit has started.
''; '';
@ -152,7 +152,7 @@ in rec {
bindsTo = mkOption { bindsTo = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
Like requires, but in addition, if the specified units Like requires, but in addition, if the specified units
unexpectedly disappear, this unit will be stopped as well. unexpectedly disappear, this unit will be stopped as well.
''; '';
@ -161,7 +161,7 @@ in rec {
partOf = mkOption { partOf = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
If the specified units are stopped or restarted, then this If the specified units are stopped or restarted, then this
unit is stopped or restarted as well. unit is stopped or restarted as well.
''; '';
@ -170,7 +170,7 @@ in rec {
conflicts = mkOption { conflicts = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
If the specified units are started, then this unit is stopped If the specified units are started, then this unit is stopped
and vice versa. and vice versa.
''; '';
@ -179,7 +179,7 @@ in rec {
requisite = mkOption { requisite = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
Similar to requires. However if the units listed are not started, Similar to requires. However if the units listed are not started,
they will not be started and the transaction will fail. they will not be started and the transaction will fail.
''; '';
@ -189,18 +189,17 @@ in rec {
default = {}; default = {};
example = { RequiresMountsFor = "/data"; }; example = { RequiresMountsFor = "/data"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Unit]</literal> section of the unit. See `[Unit]` section of the unit. See
<citerefentry><refentrytitle>systemd.unit</refentrytitle> {manpage}`systemd.unit(5)` for details.
<manvolnum>5</manvolnum></citerefentry> for details.
''; '';
}; };
onFailure = mkOption { onFailure = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
A list of one or more units that are activated when A list of one or more units that are activated when
this unit enters the "failed" state. this unit enters the "failed" state.
''; '';
@ -209,7 +208,7 @@ in rec {
onSuccess = mkOption { onSuccess = mkOption {
default = []; default = [];
type = types.listOf unitNameType; type = types.listOf unitNameType;
description = '' description = lib.mdDoc ''
A list of one or more units that are activated when A list of one or more units that are activated when
this unit enters the "inactive" state. this unit enters the "inactive" state.
''; '';
@ -217,7 +216,7 @@ in rec {
startLimitBurst = mkOption { startLimitBurst = mkOption {
type = types.int; type = types.int;
description = '' description = lib.mdDoc ''
Configure unit start rate limiting. Units which are started Configure unit start rate limiting. Units which are started
more than startLimitBurst times within an interval time more than startLimitBurst times within an interval time
interval are not permitted to start any more. interval are not permitted to start any more.
@ -226,7 +225,7 @@ in rec {
startLimitIntervalSec = mkOption { startLimitIntervalSec = mkOption {
type = types.int; type = types.int;
description = '' description = lib.mdDoc ''
Configure unit start rate limiting. Units which are started Configure unit start rate limiting. Units which are started
more than startLimitBurst times within an interval time more than startLimitBurst times within an interval time
interval are not permitted to start any more. interval are not permitted to start any more.
@ -245,7 +244,7 @@ in rec {
restartTriggers = mkOption { restartTriggers = mkOption {
default = []; default = [];
type = types.listOf types.unspecified; type = types.listOf types.unspecified;
description = '' description = lib.mdDoc ''
An arbitrary list of items such as derivations. If any item An arbitrary list of items such as derivations. If any item
in the list changes between reconfigurations, the service will in the list changes between reconfigurations, the service will
be restarted. be restarted.
@ -255,7 +254,7 @@ in rec {
reloadTriggers = mkOption { reloadTriggers = mkOption {
default = []; default = [];
type = types.listOf unitOption; type = types.listOf unitOption;
description = '' description = lib.mdDoc ''
An arbitrary list of items such as derivations. If any item An arbitrary list of items such as derivations. If any item
in the list changes between reconfigurations, the service will in the list changes between reconfigurations, the service will
be reloaded. If anything but a reload trigger changes in the be reloaded. If anything but a reload trigger changes in the
@ -273,16 +272,16 @@ in rec {
default = {}; default = {};
type = with types; attrsOf (nullOr (oneOf [ str path package ])); type = with types; attrsOf (nullOr (oneOf [ str path package ]));
example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; }; example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; };
description = "Environment variables passed to the service's processes."; description = lib.mdDoc "Environment variables passed to the service's processes.";
}; };
path = mkOption { path = mkOption {
default = []; default = [];
type = with types; listOf (oneOf [ package str ]); type = with types; listOf (oneOf [ package str ]);
description = '' description = lib.mdDoc ''
Packages added to the service's <envar>PATH</envar> Packages added to the service's {env}`PATH`
environment variable. Both the <filename>bin</filename> environment variable. Both the {file}`bin`
and <filename>sbin</filename> subdirectories of each and {file}`sbin` subdirectories of each
package are added. package are added.
''; '';
}; };
@ -293,30 +292,29 @@ in rec {
{ RestartSec = 5; { RestartSec = 5;
}; };
type = types.addCheck (types.attrsOf unitOption) checkService; type = types.addCheck (types.attrsOf unitOption) checkService;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Service]</literal> section of the unit. See `[Service]` section of the unit. See
<citerefentry><refentrytitle>systemd.service</refentrytitle> {manpage}`systemd.service(5)` for details.
<manvolnum>5</manvolnum></citerefentry> for details.
''; '';
}; };
script = mkOption { script = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = "Shell commands executed as the service's main process."; description = lib.mdDoc "Shell commands executed as the service's main process.";
}; };
scriptArgs = mkOption { scriptArgs = mkOption {
type = types.str; type = types.str;
default = ""; default = "";
description = "Arguments passed to the main process script."; description = lib.mdDoc "Arguments passed to the main process script.";
}; };
preStart = mkOption { preStart = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = '' description = lib.mdDoc ''
Shell commands executed before the service's main process Shell commands executed before the service's main process
is started. is started.
''; '';
@ -325,7 +323,7 @@ in rec {
postStart = mkOption { postStart = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = '' description = lib.mdDoc ''
Shell commands executed after the service's main process Shell commands executed after the service's main process
is started. is started.
''; '';
@ -334,7 +332,7 @@ in rec {
reload = mkOption { reload = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = '' description = lib.mdDoc ''
Shell commands executed when the service's main process Shell commands executed when the service's main process
is reloaded. is reloaded.
''; '';
@ -343,7 +341,7 @@ in rec {
preStop = mkOption { preStop = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = '' description = lib.mdDoc ''
Shell commands executed to stop the service. Shell commands executed to stop the service.
''; '';
}; };
@ -351,7 +349,7 @@ in rec {
postStop = mkOption { postStop = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = '' description = lib.mdDoc ''
Shell commands executed after the service's main process Shell commands executed after the service's main process
has exited. has exited.
''; '';
@ -360,7 +358,7 @@ in rec {
jobScripts = mkOption { jobScripts = mkOption {
type = with types; coercedTo path singleton (listOf path); type = with types; coercedTo path singleton (listOf path);
internal = true; internal = true;
description = "A list of all job script derivations of this unit."; description = lib.mdDoc "A list of all job script derivations of this unit.";
default = []; default = [];
}; };
@ -405,7 +403,7 @@ in rec {
restartIfChanged = mkOption { restartIfChanged = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = '' description = lib.mdDoc ''
Whether the service should be restarted during a NixOS Whether the service should be restarted during a NixOS
configuration switch if its definition has changed. configuration switch if its definition has changed.
''; '';
@ -414,14 +412,14 @@ in rec {
reloadIfChanged = mkOption { reloadIfChanged = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = '' description = lib.mdDoc ''
Whether the service should be reloaded during a NixOS Whether the service should be reloaded during a NixOS
configuration switch if its definition has changed. If configuration switch if its definition has changed. If
enabled, the value of <option>restartIfChanged</option> is enabled, the value of {option}`restartIfChanged` is
ignored. ignored.
This option should not be used anymore in favor of This option should not be used anymore in favor of
<option>reloadTriggers</option> which allows more granular {option}`reloadTriggers` which allows more granular
control of when a service is reloaded and when a service control of when a service is reloaded and when a service
is restarted. is restarted.
''; '';
@ -430,14 +428,14 @@ in rec {
stopIfChanged = mkOption { stopIfChanged = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = '' description = lib.mdDoc ''
If set, a changed unit is restarted by calling If set, a changed unit is restarted by calling
<command>systemctl stop</command> in the old configuration, {command}`systemctl stop` in the old configuration,
then <command>systemctl start</command> in the new one. then {command}`systemctl start` in the new one.
Otherwise, it is restarted in a single step using Otherwise, it is restarted in a single step using
<command>systemctl restart</command> in the new configuration. {command}`systemctl restart` in the new configuration.
The latter is less correct because it runs the The latter is less correct because it runs the
<literal>ExecStop</literal> commands from the new `ExecStop` commands from the new
configuration. configuration.
''; '';
}; };
@ -446,13 +444,12 @@ in rec {
type = with types; either str (listOf str); type = with types; either str (listOf str);
default = []; default = [];
example = "Sun 14:00:00"; example = "Sun 14:00:00";
description = '' description = lib.mdDoc ''
Automatically start this unit at the given date/time, which Automatically start this unit at the given date/time, which
must be in the format described in must be in the format described in
<citerefentry><refentrytitle>systemd.time</refentrytitle> {manpage}`systemd.time(7)`. This is equivalent
<manvolnum>7</manvolnum></citerefentry>. This is equivalent
to adding a corresponding timer unit with to adding a corresponding timer unit with
<option>OnCalendar</option> set to the value given here. {option}`OnCalendar` set to the value given here.
''; '';
apply = v: if isList v then v else [ v ]; apply = v: if isList v then v else [ v ];
}; };
@ -474,9 +471,9 @@ in rec {
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
example = [ "0.0.0.0:993" "/run/my-socket" ]; example = [ "0.0.0.0:993" "/run/my-socket" ];
description = '' description = lib.mdDoc ''
For each item in this list, a <literal>ListenStream</literal> For each item in this list, a `ListenStream`
option in the <literal>[Socket]</literal> section will be created. option in the `[Socket]` section will be created.
''; '';
}; };
@ -484,9 +481,9 @@ in rec {
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
example = [ "0.0.0.0:993" "/run/my-socket" ]; example = [ "0.0.0.0:993" "/run/my-socket" ];
description = '' description = lib.mdDoc ''
For each item in this list, a <literal>ListenDatagram</literal> For each item in this list, a `ListenDatagram`
option in the <literal>[Socket]</literal> section will be created. option in the `[Socket]` section will be created.
''; '';
}; };
@ -494,11 +491,10 @@ in rec {
default = {}; default = {};
example = { ListenStream = "/run/my-socket"; }; example = { ListenStream = "/run/my-socket"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Socket]</literal> section of the unit. See `[Socket]` section of the unit. See
<citerefentry><refentrytitle>systemd.socket</refentrytitle> {manpage}`systemd.socket(5)` for details.
<manvolnum>5</manvolnum></citerefentry> for details.
''; '';
}; };
}; };
@ -527,13 +523,11 @@ in rec {
default = {}; default = {};
example = { OnCalendar = "Sun 14:00:00"; Unit = "foo.service"; }; example = { OnCalendar = "Sun 14:00:00"; Unit = "foo.service"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Timer]</literal> section of the unit. See `[Timer]` section of the unit. See
<citerefentry><refentrytitle>systemd.timer</refentrytitle> {manpage}`systemd.timer(5)` and
<manvolnum>5</manvolnum></citerefentry> and {manpage}`systemd.time(7)` for details.
<citerefentry><refentrytitle>systemd.time</refentrytitle>
<manvolnum>7</manvolnum></citerefentry> for details.
''; '';
}; };
@ -562,11 +556,10 @@ in rec {
default = {}; default = {};
example = { PathChanged = "/some/path"; Unit = "changedpath.service"; }; example = { PathChanged = "/some/path"; Unit = "changedpath.service"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Path]</literal> section of the unit. See `[Path]` section of the unit. See
<citerefentry><refentrytitle>systemd.path</refentrytitle> {manpage}`systemd.path(5)` for details.
<manvolnum>5</manvolnum></citerefentry> for details.
''; '';
}; };
@ -594,13 +587,13 @@ in rec {
what = mkOption { what = mkOption {
example = "/dev/sda1"; example = "/dev/sda1";
type = types.str; type = types.str;
description = "Absolute path of device node, file or other resource. (Mandatory)"; description = lib.mdDoc "Absolute path of device node, file or other resource. (Mandatory)";
}; };
where = mkOption { where = mkOption {
example = "/mnt"; example = "/mnt";
type = types.str; type = types.str;
description = '' description = lib.mdDoc ''
Absolute path of a directory of the mount point. Absolute path of a directory of the mount point.
Will be created if it doesn't exist. (Mandatory) Will be created if it doesn't exist. (Mandatory)
''; '';
@ -610,25 +603,24 @@ in rec {
default = ""; default = "";
example = "ext4"; example = "ext4";
type = types.str; type = types.str;
description = "File system type."; description = lib.mdDoc "File system type.";
}; };
options = mkOption { options = mkOption {
default = ""; default = "";
example = "noatime"; example = "noatime";
type = types.commas; type = types.commas;
description = "Options used to mount the file system."; description = lib.mdDoc "Options used to mount the file system.";
}; };
mountConfig = mkOption { mountConfig = mkOption {
default = {}; default = {};
example = { DirectoryMode = "0775"; }; example = { DirectoryMode = "0775"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Mount]</literal> section of the unit. See `[Mount]` section of the unit. See
<citerefentry><refentrytitle>systemd.mount</refentrytitle> {manpage}`systemd.mount(5)` for details.
<manvolnum>5</manvolnum></citerefentry> for details.
''; '';
}; };
@ -655,7 +647,7 @@ in rec {
where = mkOption { where = mkOption {
example = "/mnt"; example = "/mnt";
type = types.str; type = types.str;
description = '' description = lib.mdDoc ''
Absolute path of a directory of the mount point. Absolute path of a directory of the mount point.
Will be created if it doesn't exist. (Mandatory) Will be created if it doesn't exist. (Mandatory)
''; '';
@ -665,11 +657,10 @@ in rec {
default = {}; default = {};
example = { DirectoryMode = "0775"; }; example = { DirectoryMode = "0775"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Automount]</literal> section of the unit. See `[Automount]` section of the unit. See
<citerefentry><refentrytitle>systemd.automount</refentrytitle> {manpage}`systemd.automount(5)` for details.
<manvolnum>5</manvolnum></citerefentry> for details.
''; '';
}; };
@ -697,11 +688,10 @@ in rec {
default = {}; default = {};
example = { MemoryMax = "2G"; }; example = { MemoryMax = "2G"; };
type = types.attrsOf unitOption; type = types.attrsOf unitOption;
description = '' description = lib.mdDoc ''
Each attribute in this set specifies an option in the Each attribute in this set specifies an option in the
<literal>[Slice]</literal> section of the unit. See `[Slice]` section of the unit. See
<citerefentry><refentrytitle>systemd.slice</refentrytitle> {manpage}`systemd.slice(5)` for details.
<manvolnum>5</manvolnum></citerefentry> for details.
''; '';
}; };

View file

@ -426,7 +426,9 @@ class Machine:
self.monitor.send(message) self.monitor.send(message)
return self.wait_for_monitor_prompt() return self.wait_for_monitor_prompt()
def wait_for_unit(self, unit: str, user: Optional[str] = None) -> None: def wait_for_unit(
self, unit: str, user: Optional[str] = None, timeout: int = 900
) -> None:
"""Wait for a systemd unit to get into "active" state. """Wait for a systemd unit to get into "active" state.
Throws exceptions on "failed" and "inactive" states as well as Throws exceptions on "failed" and "inactive" states as well as
after timing out. after timing out.
@ -456,7 +458,7 @@ class Machine:
unit, f" with user {user}" if user is not None else "" unit, f" with user {user}" if user is not None else ""
) )
): ):
retry(check_active) retry(check_active, timeout)
def get_unit_info(self, unit: str, user: Optional[str] = None) -> Dict[str, str]: def get_unit_info(self, unit: str, user: Optional[str] = None) -> Dict[str, str]:
status, lines = self.systemctl('--no-pager show "{}"'.format(unit), user) status, lines = self.systemctl('--no-pager show "{}"'.format(unit), user)
@ -710,7 +712,7 @@ class Machine:
status, _ = self.execute("nc -z localhost {}".format(port)) status, _ = self.execute("nc -z localhost {}".format(port))
return status != 0 return status != 0
with self.nested("waiting for TCP port {} to be closed"): with self.nested("waiting for TCP port {} to be closed".format(port)):
retry(port_is_closed) retry(port_is_closed)
def start_job(self, jobname: str, user: Optional[str] = None) -> Tuple[int, str]: def start_job(self, jobname: str, user: Optional[str] = None) -> Tuple[int, str]:

View file

@ -23,7 +23,7 @@ in {
options.amazonImage = { options.amazonImage = {
name = mkOption { name = mkOption {
type = types.str; type = types.str;
description = "The name of the generated derivation"; description = lib.mdDoc "The name of the generated derivation";
default = "nixos-amazon-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}"; default = "nixos-amazon-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
}; };
@ -35,7 +35,7 @@ in {
] ]
''; '';
default = []; default = [];
description = '' description = lib.mdDoc ''
This option lists files to be copied to fixed locations in the This option lists files to be copied to fixed locations in the
generated image. Glob patterns work. generated image. Glob patterns work.
''; '';
@ -45,13 +45,13 @@ in {
type = with types; either (enum [ "auto" ]) int; type = with types; either (enum [ "auto" ]) int;
default = if config.ec2.hvm then 2048 else 8192; default = if config.ec2.hvm then 2048 else 8192;
example = 8192; example = 8192;
description = "The size in MB of the image"; description = lib.mdDoc "The size in MB of the image";
}; };
format = mkOption { format = mkOption {
type = types.enum [ "raw" "qcow2" "vpc" ]; type = types.enum [ "raw" "qcow2" "vpc" ];
default = "vpc"; default = "vpc";
description = "The image format to output"; description = lib.mdDoc "The image format to output";
}; };
}; };

View file

@ -16,20 +16,20 @@ in
options.openstackImage = { options.openstackImage = {
name = mkOption { name = mkOption {
type = types.str; type = types.str;
description = "The name of the generated derivation"; description = lib.mdDoc "The name of the generated derivation";
default = "nixos-openstack-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}"; default = "nixos-openstack-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
}; };
sizeMB = mkOption { sizeMB = mkOption {
type = types.int; type = types.int;
default = 8192; default = 8192;
description = "The size in MB of the image"; description = lib.mdDoc "The size in MB of the image";
}; };
format = mkOption { format = mkOption {
type = types.enum [ "raw" "qcow2" ]; type = types.enum [ "raw" "qcow2" ];
default = "qcow2"; default = "qcow2";
description = "The image format to output"; description = lib.mdDoc "The image format to output";
}; };
}; };

View file

@ -64,8 +64,8 @@ in
}; };
colors = mkOption { colors = mkOption {
type = types.listOf types.str; type = with types; listOf (strMatching "[[:xdigit:]]{6}");
default = []; default = [ ];
example = [ example = [
"002b36" "dc322f" "859900" "b58900" "002b36" "dc322f" "859900" "b58900"
"268bd2" "d33682" "2aa198" "eee8d5" "268bd2" "d33682" "2aa198" "eee8d5"

View file

@ -259,7 +259,7 @@ in
internal = true; internal = true;
type = with types; listOf path; type = with types; listOf path;
default = [ ]; default = [ ];
description = '' description = lib.mdDoc ''
Fontconfig configuration packages. Fontconfig configuration packages.
''; '';
}; };

View file

@ -7,7 +7,7 @@ let
in in
{ {
options.networking.iproute2 = { options.networking.iproute2 = {
enable = mkEnableOption "copy IP route configuration files"; enable = mkEnableOption (lib.mdDoc "copy IP route configuration files");
rttablesExtraConfig = mkOption { rttablesExtraConfig = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";

View file

@ -78,7 +78,7 @@ in {
options = { options = {
krb5 = { krb5 = {
enable = mkEnableOption "building krb5.conf, configuration file for Kerberos V"; enable = mkEnableOption (lib.mdDoc "building krb5.conf, configuration file for Kerberos V");
kerberos = mkOption { kerberos = mkOption {
type = types.package; type = types.package;

View file

@ -59,7 +59,7 @@ in
users.ldap = { users.ldap = {
enable = mkEnableOption "authentication against an LDAP server"; enable = mkEnableOption (lib.mdDoc "authentication against an LDAP server");
loginPam = mkOption { loginPam = mkOption {
type = types.bool; type = types.bool;

View file

@ -77,24 +77,21 @@ in
environment.memoryAllocator.provider = mkOption { environment.memoryAllocator.provider = mkOption {
type = types.enum ([ "libc" ] ++ attrNames providers); type = types.enum ([ "libc" ] ++ attrNames providers);
default = "libc"; default = "libc";
description = '' description = lib.mdDoc ''
The system-wide memory allocator. The system-wide memory allocator.
Briefly, the system-wide memory allocator providers are: Briefly, the system-wide memory allocator providers are:
<itemizedlist>
<listitem><para><literal>libc</literal>: the standard allocator provided by libc</para></listitem>
${toString (mapAttrsToList
(name: value: "<listitem><para><literal>${name}</literal>: ${value.description}</para></listitem>")
providers)}
</itemizedlist>
<warning> - `libc`: the standard allocator provided by libc
<para> ${concatStringsSep "\n" (mapAttrsToList
(name: value: "- `${name}`: ${replaceStrings [ "\n" ] [ " " ] value.description}")
providers)}
::: {.warning}
Selecting an alternative allocator (i.e., anything other than Selecting an alternative allocator (i.e., anything other than
<literal>libc</literal>) may result in instability, data loss, `libc`) may result in instability, data loss,
and/or service failure. and/or service failure.
</para> :::
</warning>
''; '';
}; };
}; };

View file

@ -8,83 +8,73 @@ in
{ {
options = { options = {
users.mysql = { users.mysql = {
enable = mkEnableOption "Authentication against a MySQL/MariaDB database"; enable = mkEnableOption (lib.mdDoc "Authentication against a MySQL/MariaDB database");
host = mkOption { host = mkOption {
type = types.str; type = types.str;
example = "localhost"; example = "localhost";
description = "The hostname of the MySQL/MariaDB server"; description = lib.mdDoc "The hostname of the MySQL/MariaDB server";
}; };
database = mkOption { database = mkOption {
type = types.str; type = types.str;
example = "auth"; example = "auth";
description = "The name of the database containing the users"; description = lib.mdDoc "The name of the database containing the users";
}; };
user = mkOption { user = mkOption {
type = types.str; type = types.str;
example = "nss-user"; example = "nss-user";
description = "The username to use when connecting to the database"; description = lib.mdDoc "The username to use when connecting to the database";
}; };
passwordFile = mkOption { passwordFile = mkOption {
type = types.path; type = types.path;
example = "/run/secrets/mysql-auth-db-passwd"; example = "/run/secrets/mysql-auth-db-passwd";
description = "The path to the file containing the password for the user"; description = lib.mdDoc "The path to the file containing the password for the user";
}; };
pam = mkOption { pam = mkOption {
description = "Settings for <literal>pam_mysql</literal>"; description = lib.mdDoc "Settings for `pam_mysql`";
type = types.submodule { type = types.submodule {
options = { options = {
table = mkOption { table = mkOption {
type = types.str; type = types.str;
example = "users"; example = "users";
description = "The name of table that maps unique login names to the passwords."; description = lib.mdDoc "The name of table that maps unique login names to the passwords.";
}; };
updateTable = mkOption { updateTable = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
example = "users_updates"; example = "users_updates";
description = '' description = lib.mdDoc ''
The name of the table used for password alteration. If not defined, the value The name of the table used for password alteration. If not defined, the value
of the <literal>table</literal> option will be used instead. of the `table` option will be used instead.
''; '';
}; };
userColumn = mkOption { userColumn = mkOption {
type = types.str; type = types.str;
example = "username"; example = "username";
description = "The name of the column that contains a unix login name."; description = lib.mdDoc "The name of the column that contains a unix login name.";
}; };
passwordColumn = mkOption { passwordColumn = mkOption {
type = types.str; type = types.str;
example = "password"; example = "password";
description = "The name of the column that contains a (encrypted) password string."; description = lib.mdDoc "The name of the column that contains a (encrypted) password string.";
}; };
statusColumn = mkOption { statusColumn = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
example = "status"; example = "status";
description = '' description = lib.mdDoc ''
The name of the column or an SQL expression that indicates the status of The name of the column or an SQL expression that indicates the status of
the user. The status is expressed by the combination of two bitfields the user. The status is expressed by the combination of two bitfields
shown below: shown below:
<itemizedlist> - `bit 0 (0x01)`:
<listitem> if flagged, `pam_mysql` deems the account to be expired and
<para> returns `PAM_ACCT_EXPIRED`. That is, the account is supposed
<literal>bit 0 (0x01)</literal>: to no longer be available. Note this doesn't mean that `pam_mysql`
if flagged, <literal>pam_mysql</literal> deems the account to be expired and rejects further authentication operations.
returns <literal>PAM_ACCT_EXPIRED</literal>. That is, the account is supposed - `bit 1 (0x02)`:
to no longer be available. Note this doesn't mean that <literal>pam_mysql</literal> if flagged, `pam_mysql` deems the authentication token
rejects further authentication operations. (password) to be expired and returns `PAM_NEW_AUTHTOK_REQD`.
</para> This ends up requiring that the user enter a new password.
</listitem>
<listitem>
<para>
<literal>bit 1 (0x02)</literal>:
if flagged, <literal>pam_mysql</literal> deems the authentication token
(password) to be expired and returns <literal>PAM_NEW_AUTHTOK_REQD</literal>.
This ends up requiring that the user enter a new password.
</para>
</listitem>
</itemizedlist>
''; '';
}; };
passwordCrypt = mkOption { passwordCrypt = mkOption {
@ -101,101 +91,59 @@ in
"8" "sha512" "8" "sha512"
"9" "sha256" "9" "sha256"
]; ];
description = '' description = lib.mdDoc ''
The method to encrypt the user's password: The method to encrypt the user's password:
<itemizedlist> - `0` (or `"plain"`):
<listitem> No encryption. Passwords are stored in plaintext. HIGHLY DISCOURAGED.
<para> - `1` (or `"Y"`):
<literal>0</literal> (or <literal>"plain"</literal>): Use crypt(3) function.
No encryption. Passwords are stored in plaintext. HIGHLY DISCOURAGED. - `2` (or `"mysql"`):
</para> Use the MySQL PASSWORD() function. It is possible that the encryption function used
</listitem> by `pam_mysql` is different from that of the MySQL server, as
<listitem> `pam_mysql` uses the function defined in MySQL's C-client API
<para> instead of using PASSWORD() SQL function in the query.
<literal>1</literal> (or <literal>"Y"</literal>): - `3` (or `"md5"`):
Use crypt(3) function. Use plain hex MD5.
</para> - `4` (or `"sha1"`):
</listitem> Use plain hex SHA1.
<listitem> - `5` (or `"drupal7"`):
<para> Use Drupal7 salted passwords.
<literal>2</literal> (or <literal>"mysql"</literal>): - `6` (or `"joomla15"`):
Use the MySQL PASSWORD() function. It is possible that the encryption function used Use Joomla15 salted passwords.
by <literal>pam_mysql</literal> is different from that of the MySQL server, as - `7` (or `"ssha"`):
<literal>pam_mysql</literal> uses the function defined in MySQL's C-client API Use ssha hashed passwords.
instead of using PASSWORD() SQL function in the query. - `8` (or `"sha512"`):
</para> Use sha512 hashed passwords.
</listitem> - `9` (or `"sha256"`):
<listitem> Use sha256 hashed passwords.
<para>
<literal>3</literal> (or <literal>"md5"</literal>):
Use plain hex MD5.
</para>
</listitem>
<listitem>
<para>
<literal>4</literal> (or <literal>"sha1"</literal>):
Use plain hex SHA1.
</para>
</listitem>
<listitem>
<para>
<literal>5</literal> (or <literal>"drupal7"</literal>):
Use Drupal7 salted passwords.
</para>
</listitem>
<listitem>
<para>
<literal>6</literal> (or <literal>"joomla15"</literal>):
Use Joomla15 salted passwords.
</para>
</listitem>
<listitem>
<para>
<literal>7</literal> (or <literal>"ssha"</literal>):
Use ssha hashed passwords.
</para>
</listitem>
<listitem>
<para>
<literal>8</literal> (or <literal>"sha512"</literal>):
Use sha512 hashed passwords.
</para>
</listitem>
<listitem>
<para>
<literal>9</literal> (or <literal>"sha256"</literal>):
Use sha256 hashed passwords.
</para>
</listitem>
</itemizedlist>
''; '';
}; };
cryptDefault = mkOption { cryptDefault = mkOption {
type = types.nullOr (types.enum [ "md5" "sha256" "sha512" "blowfish" ]); type = types.nullOr (types.enum [ "md5" "sha256" "sha512" "blowfish" ]);
default = null; default = null;
example = "blowfish"; example = "blowfish";
description = "The default encryption method to use for <literal>passwordCrypt = 1</literal>."; description = lib.mdDoc "The default encryption method to use for `passwordCrypt = 1`.";
}; };
where = mkOption { where = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
example = "host.name='web' AND user.active=1"; example = "host.name='web' AND user.active=1";
description = "Additional criteria for the query."; description = lib.mdDoc "Additional criteria for the query.";
}; };
verbose = mkOption { verbose = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = '' description = lib.mdDoc ''
If enabled, produces logs with detailed messages that describes what If enabled, produces logs with detailed messages that describes what
<literal>pam_mysql</literal> is doing. May be useful for debugging. `pam_mysql` is doing. May be useful for debugging.
''; '';
}; };
disconnectEveryOperation = mkOption { disconnectEveryOperation = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = '' description = lib.mdDoc ''
By default, <literal>pam_mysql</literal> keeps the connection to the MySQL By default, `pam_mysql` keeps the connection to the MySQL
database until the session is closed. If this option is set to true it database until the session is closed. If this option is set to true it
disconnects every time the PAM operation has finished. This option may disconnects every time the PAM operation has finished. This option may
be useful in case the session lasts quite long. be useful in case the session lasts quite long.
@ -205,17 +153,17 @@ in
enable = mkOption { enable = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = "Enables logging of authentication attempts in the MySQL database."; description = lib.mdDoc "Enables logging of authentication attempts in the MySQL database.";
}; };
table = mkOption { table = mkOption {
type = types.str; type = types.str;
example = "logs"; example = "logs";
description = "The name of the table to which logs are written."; description = lib.mdDoc "The name of the table to which logs are written.";
}; };
msgColumn = mkOption { msgColumn = mkOption {
type = types.str; type = types.str;
example = "msg"; example = "msg";
description = '' description = lib.mdDoc ''
The name of the column in the log table to which the description The name of the column in the log table to which the description
of the performed operation is stored. of the performed operation is stored.
''; '';
@ -223,7 +171,7 @@ in
userColumn = mkOption { userColumn = mkOption {
type = types.str; type = types.str;
example = "user"; example = "user";
description = '' description = lib.mdDoc ''
The name of the column in the log table to which the name of the The name of the column in the log table to which the name of the
user being authenticated is stored. user being authenticated is stored.
''; '';
@ -231,16 +179,16 @@ in
pidColumn = mkOption { pidColumn = mkOption {
type = types.str; type = types.str;
example = "pid"; example = "pid";
description = '' description = lib.mdDoc ''
The name of the column in the log table to which the pid of the The name of the column in the log table to which the pid of the
process utilising the <literal>pam_mysql's</literal> authentication process utilising the `pam_mysql's` authentication
service is stored. service is stored.
''; '';
}; };
hostColumn = mkOption { hostColumn = mkOption {
type = types.str; type = types.str;
example = "host"; example = "host";
description = '' description = lib.mdDoc ''
The name of the column in the log table to which the name of the user The name of the column in the log table to which the name of the user
being authenticated is stored. being authenticated is stored.
''; '';
@ -248,17 +196,16 @@ in
rHostColumn = mkOption { rHostColumn = mkOption {
type = types.str; type = types.str;
example = "rhost"; example = "rhost";
description = '' description = lib.mdDoc ''
The name of the column in the log table to which the name of the remote The name of the column in the log table to which the name of the remote
host that initiates the session is stored. The value is supposed to be host that initiates the session is stored. The value is supposed to be
set by the PAM-aware application with <literal>pam_set_item(PAM_RHOST) set by the PAM-aware application with `pam_set_item(PAM_RHOST)`.
</literal>.
''; '';
}; };
timeColumn = mkOption { timeColumn = mkOption {
type = types.str; type = types.str;
example = "timestamp"; example = "timestamp";
description = '' description = lib.mdDoc ''
The name of the column in the log table to which the timestamp of the The name of the column in the log table to which the timestamp of the
log entry is stored. log entry is stored.
''; '';
@ -268,11 +215,11 @@ in
}; };
}; };
nss = mkOption { nss = mkOption {
description = '' description = lib.mdDoc ''
Settings for <literal>libnss-mysql</literal>. Settings for `libnss-mysql`.
All examples are from the <link xlink:href="https://github.com/saknopper/libnss-mysql/tree/master/sample/minimal">minimal example</link> All examples are from the [minimal example](https://github.com/saknopper/libnss-mysql/tree/master/sample/minimal)
of <literal>libnss-mysql</literal>, but they are modified with NixOS paths for bash. of `libnss-mysql`, but they are modified with NixOS paths for bash.
''; '';
type = types.submodule { type = types.submodule {
options = { options = {
@ -285,9 +232,8 @@ in
WHERE username='%1$s' \ WHERE username='%1$s' \
LIMIT 1 LIMIT 1
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getpwnam](https://man7.org/linux/man-pages/man3/getpwnam.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getpwnam.3.html">getpwnam</link>
syscall. syscall.
''; '';
}; };
@ -300,9 +246,8 @@ in
WHERE uid='%1$u' \ WHERE uid='%1$u' \
LIMIT 1 LIMIT 1
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getpwuid](https://man7.org/linux/man-pages/man3/getpwuid.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getpwuid.3.html">getpwuid</link>
syscall. syscall.
''; '';
}; };
@ -315,9 +260,8 @@ in
WHERE username='%1$s' \ WHERE username='%1$s' \
LIMIT 1 LIMIT 1
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getspnam](https://man7.org/linux/man-pages/man3/getspnam.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getspnam.3.html">getspnam</link>
syscall. syscall.
''; '';
}; };
@ -327,9 +271,8 @@ in
example = literalExpression '' example = literalExpression ''
SELECT username,'x',uid,'5000','MySQL User', CONCAT('/home/',username),'/run/sw/current-system/bin/bash' FROM users SELECT username,'x',uid,'5000','MySQL User', CONCAT('/home/',username),'/run/sw/current-system/bin/bash' FROM users
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getpwent](https://man7.org/linux/man-pages/man3/getpwent.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getpwent.3.html">getpwent</link>
syscall. syscall.
''; '';
}; };
@ -339,9 +282,8 @@ in
example = literalExpression '' example = literalExpression ''
SELECT username,password,'1','0','99999','0','0','-1','0' FROM users SELECT username,password,'1','0','99999','0','0','-1','0' FROM users
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getspent](https://man7.org/linux/man-pages/man3/getspent.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getspent.3.html">getspent</link>
syscall. syscall.
''; '';
}; };
@ -351,9 +293,8 @@ in
example = literalExpression '' example = literalExpression ''
SELECT name,password,gid FROM groups WHERE name='%1$s' LIMIT 1 SELECT name,password,gid FROM groups WHERE name='%1$s' LIMIT 1
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getgrnam](https://man7.org/linux/man-pages/man3/getgrnam.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getgrnam.3.html">getgrnam</link>
syscall. syscall.
''; '';
}; };
@ -363,9 +304,8 @@ in
example = literalExpression '' example = literalExpression ''
SELECT name,password,gid FROM groups WHERE gid='%1$u' LIMIT 1 SELECT name,password,gid FROM groups WHERE gid='%1$u' LIMIT 1
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getgrgid](https://man7.org/linux/man-pages/man3/getgrgid.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getgrgid.3.html">getgrgid</link>
syscall. syscall.
''; '';
}; };
@ -375,9 +315,8 @@ in
example = literalExpression '' example = literalExpression ''
SELECT name,password,gid FROM groups SELECT name,password,gid FROM groups
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [getgrent](https://man7.org/linux/man-pages/man3/getgrent.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/getgrent.3.html">getgrent</link>
syscall. syscall.
''; '';
}; };
@ -387,9 +326,8 @@ in
example = literalExpression '' example = literalExpression ''
SELECT username FROM grouplist WHERE gid='%1$u' SELECT username FROM grouplist WHERE gid='%1$u'
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [memsbygid](https://man7.org/linux/man-pages/man3/memsbygid.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/memsbygid.3.html">memsbygid</link>
syscall. syscall.
''; '';
}; };
@ -399,9 +337,8 @@ in
example = literalExpression '' example = literalExpression ''
SELECT gid FROM grouplist WHERE username='%1$s' SELECT gid FROM grouplist WHERE username='%1$s'
''; '';
description = '' description = lib.mdDoc ''
SQL query for the <link SQL query for the [gidsbymem](https://man7.org/linux/man-pages/man3/gidsbymem.3.html)
xlink:href="https://man7.org/linux/man-pages/man3/gidsbymem.3.html">gidsbymem</link>
syscall. syscall.
''; '';
}; };

View file

@ -35,7 +35,7 @@ in
networking.hostFiles = lib.mkOption { networking.hostFiles = lib.mkOption {
type = types.listOf types.path; type = types.listOf types.path;
defaultText = literalDocBook "Hosts from <option>networking.hosts</option> and <option>networking.extraHosts</option>"; defaultText = literalMD "Hosts from {option}`networking.hosts` and {option}`networking.extraHosts`";
example = literalExpression ''[ "''${pkgs.my-blocklist-package}/share/my-blocklist/hosts" ]''; example = literalExpression ''[ "''${pkgs.my-blocklist-package}/share/my-blocklist/hosts" ]'';
description = lib.mdDoc '' description = lib.mdDoc ''
Files that should be concatenated together to form {file}`/etc/hosts`. Files that should be concatenated together to form {file}`/etc/hosts`.
@ -141,7 +141,7 @@ in
type = types.attrs; type = types.attrs;
internal = true; internal = true;
default = {}; default = {};
description = '' description = lib.mdDoc ''
Environment variables used for the network proxy. Environment variables used for the network proxy.
''; '';
}; };

View file

@ -27,9 +27,13 @@ with lib;
fonts.fontconfig.enable = false; fonts.fontconfig.enable = false;
nixpkgs.overlays = singleton (const (super: { nixpkgs.overlays = singleton (const (super: {
beam = super.beam_nox;
cairo = super.cairo.override { x11Support = false; }; cairo = super.cairo.override { x11Support = false; };
dbus = super.dbus.override { x11Support = false; }; dbus = super.dbus.override { x11Support = false; };
beam = super.beam_nox; ffmpeg_4 = super.ffmpeg_4.override { sdlSupport = false; vdpauSupport = false; };
ffmpeg_5 = super.ffmpeg_5.override { sdlSupport = false; vdpauSupport = false; };
gobject-introspection = super.gobject-introspection.override { x11Support = false; };
libva = super.libva-minimal;
networkmanager-fortisslvpn = super.networkmanager-fortisslvpn.override { withGnome = false; }; networkmanager-fortisslvpn = super.networkmanager-fortisslvpn.override { withGnome = false; };
networkmanager-iodine = super.networkmanager-iodine.override { withGnome = false; }; networkmanager-iodine = super.networkmanager-iodine.override { withGnome = false; };
networkmanager-l2tp = super.networkmanager-l2tp.override { withGnome = false; }; networkmanager-l2tp = super.networkmanager-l2tp.override { withGnome = false; };
@ -37,7 +41,6 @@ with lib;
networkmanager-openvpn = super.networkmanager-openvpn.override { withGnome = false; }; networkmanager-openvpn = super.networkmanager-openvpn.override { withGnome = false; };
networkmanager-sstp = super.networkmanager-vpnc.override { withGnome = false; }; networkmanager-sstp = super.networkmanager-vpnc.override { withGnome = false; };
networkmanager-vpnc = super.networkmanager-vpnc.override { withGnome = false; }; networkmanager-vpnc = super.networkmanager-vpnc.override { withGnome = false; };
gobject-introspection = super.gobject-introspection.override { x11Support = false; };
qemu = super.qemu.override { gtkSupport = false; spiceSupport = false; sdlSupport = false; }; qemu = super.qemu.override { gtkSupport = false; spiceSupport = false; sdlSupport = false; };
})); }));
}; };

View file

@ -190,17 +190,17 @@ in {
zeroconf = { zeroconf = {
discovery.enable = discovery.enable =
mkEnableOption "discovery of pulseaudio sinks in the local network"; mkEnableOption (lib.mdDoc "discovery of pulseaudio sinks in the local network");
publish.enable = publish.enable =
mkEnableOption "publishing the pulseaudio sink in the local network"; mkEnableOption (lib.mdDoc "publishing the pulseaudio sink in the local network");
}; };
# TODO: enable by default? # TODO: enable by default?
tcp = { tcp = {
enable = mkEnableOption "tcp streaming support"; enable = mkEnableOption (lib.mdDoc "tcp streaming support");
anonymousClients = { anonymousClients = {
allowAll = mkEnableOption "all anonymous clients to stream to the server"; allowAll = mkEnableOption (lib.mdDoc "all anonymous clients to stream to the server");
allowedIpRanges = mkOption { allowedIpRanges = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = []; default = [];
@ -263,7 +263,7 @@ in {
(drv: drv.override { pulseaudio = overriddenPackage; }) (drv: drv.override { pulseaudio = overriddenPackage; })
cfg.extraModules; cfg.extraModules;
modulePaths = builtins.map modulePaths = builtins.map
(drv: "${drv}/${overriddenPackage.pulseDir}/modules") (drv: "${drv}/lib/pulseaudio/modules")
# User-provided extra modules take precedence # User-provided extra modules take precedence
(overriddenModules ++ [ overriddenPackage ]); (overriddenModules ++ [ overriddenPackage ]);
in lib.concatStringsSep ":" modulePaths; in lib.concatStringsSep ":" modulePaths;

View file

@ -27,7 +27,7 @@ in
options = { options = {
qt5 = { qt5 = {
enable = mkEnableOption "Qt5 theming configuration"; enable = mkEnableOption (lib.mdDoc "Qt5 theming configuration");
platformTheme = mkOption { platformTheme = mkOption {
type = types.enum [ type = types.enum [

View file

@ -140,9 +140,9 @@ in
example = literalExpression ''"''${pkgs.dash}/bin/dash"''; example = literalExpression ''"''${pkgs.dash}/bin/dash"'';
type = types.path; type = types.path;
visible = false; visible = false;
description = '' description = lib.mdDoc ''
The shell executable that is linked system-wide to The shell executable that is linked system-wide to
<literal>/bin/sh</literal>. Please note that NixOS assumes all `/bin/sh`. Please note that NixOS assumes all
over the place that shell to be Bash, so override the default over the place that shell to be Bash, so override the default
setting only if you know exactly what you're doing. setting only if you know exactly what you're doing.
''; '';

View file

@ -73,8 +73,8 @@ let
label = mkOption { label = mkOption {
example = "swap"; example = "swap";
type = types.str; type = types.str;
description = '' description = lib.mdDoc ''
Label of the device. Can be used instead of <varname>device</varname>. Label of the device. Can be used instead of {var}`device`.
''; '';
}; };

View file

@ -78,10 +78,11 @@ in
defaultPackages = mkOption { defaultPackages = mkOption {
type = types.listOf types.package; type = types.listOf types.package;
default = defaultPackages; default = defaultPackages;
defaultText = literalDocBook '' defaultText = literalMD ''
these packages, with their <literal>meta.priority</literal> numerically increased these packages, with their `meta.priority` numerically increased
(thus lowering their installation priority): (thus lowering their installation priority):
<programlisting>${defaultPackagesText}</programlisting>
${defaultPackagesText}
''; '';
example = []; example = [];
description = lib.mdDoc '' description = lib.mdDoc ''
@ -131,7 +132,7 @@ in
path = mkOption { path = mkOption {
internal = true; internal = true;
description = '' description = lib.mdDoc ''
The packages you want in the boot environment. The packages you want in the boot environment.
''; '';
}; };

View file

@ -17,35 +17,35 @@ let
]); ]);
passwordDescription = '' passwordDescription = ''
The options <option>hashedPassword</option>, The options {option}`hashedPassword`,
<option>password</option> and <option>passwordFile</option> {option}`password` and {option}`passwordFile`
controls what password is set for the user. controls what password is set for the user.
<option>hashedPassword</option> overrides both {option}`hashedPassword` overrides both
<option>password</option> and <option>passwordFile</option>. {option}`password` and {option}`passwordFile`.
<option>password</option> overrides <option>passwordFile</option>. {option}`password` overrides {option}`passwordFile`.
If none of these three options are set, no password is assigned to If none of these three options are set, no password is assigned to
the user, and the user will not be able to do password logins. the user, and the user will not be able to do password logins.
If the option <option>users.mutableUsers</option> is true, the If the option {option}`users.mutableUsers` is true, the
password defined in one of the three options will only be set when password defined in one of the three options will only be set when
the user is created for the first time. After that, you are free to the user is created for the first time. After that, you are free to
change the password with the ordinary user management commands. If change the password with the ordinary user management commands. If
<option>users.mutableUsers</option> is false, you cannot change {option}`users.mutableUsers` is false, you cannot change
user passwords, they will always be set according to the password user passwords, they will always be set according to the password
options. options.
''; '';
hashedPasswordDescription = '' hashedPasswordDescription = ''
To generate a hashed password run <literal>mkpasswd -m sha-512</literal>. To generate a hashed password run `mkpasswd -m sha-512`.
If set to an empty string (<literal>""</literal>), this user will If set to an empty string (`""`), this user will
be able to log in without being asked for a password (but not via remote be able to log in without being asked for a password (but not via remote
services such as SSH, or indirectly via <command>su</command> or services such as SSH, or indirectly via {command}`su` or
<command>sudo</command>). This should only be used for e.g. bootable {command}`sudo`). This should only be used for e.g. bootable
live systems. Note: this is different from setting an empty password, live systems. Note: this is different from setting an empty password,
which can be achieved using <option>users.users.&lt;name?&gt;.password</option>. which can be achieved using {option}`users.users.<name?>.password`.
If set to <literal>null</literal> (default) this user will not If set to `null` (default) this user will not
be able to log in using a password (i.e. via <command>login</command> be able to log in using a password (i.e. via {command}`login`
command). command).
''; '';
@ -234,7 +234,7 @@ let
hashedPassword = mkOption { hashedPassword = mkOption {
type = with types; nullOr (passwdEntry str); type = with types; nullOr (passwdEntry str);
default = null; default = null;
description = '' description = lib.mdDoc ''
Specifies the hashed password for the user. Specifies the hashed password for the user.
${passwordDescription} ${passwordDescription}
${hashedPasswordDescription} ${hashedPasswordDescription}
@ -244,7 +244,7 @@ let
password = mkOption { password = mkOption {
type = with types; nullOr str; type = with types; nullOr str;
default = null; default = null;
description = '' description = lib.mdDoc ''
Specifies the (clear text) password for the user. Specifies the (clear text) password for the user.
Warning: do not set confidential information here Warning: do not set confidential information here
because it is world-readable in the Nix store. This option because it is world-readable in the Nix store. This option
@ -256,11 +256,11 @@ let
passwordFile = mkOption { passwordFile = mkOption {
type = with types; nullOr str; type = with types; nullOr str;
default = null; default = null;
description = '' description = lib.mdDoc ''
The full path to a file that contains the user's password. The password The full path to a file that contains the user's password. The password
file is read on each system activation. The file should contain file is read on each system activation. The file should contain
exactly one line, which should be the password in an encrypted form exactly one line, which should be the password in an encrypted form
that is suitable for the <literal>chpasswd -e</literal> command. that is suitable for the `chpasswd -e` command.
${passwordDescription} ${passwordDescription}
''; '';
}; };
@ -268,13 +268,13 @@ let
initialHashedPassword = mkOption { initialHashedPassword = mkOption {
type = with types; nullOr (passwdEntry str); type = with types; nullOr (passwdEntry str);
default = null; default = null;
description = '' description = lib.mdDoc ''
Specifies the initial hashed password for the user, i.e. the Specifies the initial hashed password for the user, i.e. the
hashed password assigned if the user does not already hashed password assigned if the user does not already
exist. If <option>users.mutableUsers</option> is true, the exist. If {option}`users.mutableUsers` is true, the
password can be changed subsequently using the password can be changed subsequently using the
<command>passwd</command> command. Otherwise, it's {command}`passwd` command. Otherwise, it's
equivalent to setting the <option>hashedPassword</option> option. equivalent to setting the {option}`hashedPassword` option.
${hashedPasswordDescription} ${hashedPasswordDescription}
''; '';
@ -458,25 +458,25 @@ in {
users.mutableUsers = mkOption { users.mutableUsers = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = '' description = lib.mdDoc ''
If set to <literal>true</literal>, you are free to add new users and groups to the system If set to `true`, you are free to add new users and groups to the system
with the ordinary <literal>useradd</literal> and with the ordinary `useradd` and
<literal>groupadd</literal> commands. On system activation, the `groupadd` commands. On system activation, the
existing contents of the <literal>/etc/passwd</literal> and existing contents of the `/etc/passwd` and
<literal>/etc/group</literal> files will be merged with the `/etc/group` files will be merged with the
contents generated from the <literal>users.users</literal> and contents generated from the `users.users` and
<literal>users.groups</literal> options. `users.groups` options.
The initial password for a user will be set The initial password for a user will be set
according to <literal>users.users</literal>, but existing passwords according to `users.users`, but existing passwords
will not be changed. will not be changed.
<warning><para> ::: {.warning}
If set to <literal>false</literal>, the contents of the user and If set to `false`, the contents of the user and
group files will simply be replaced on system activation. This also group files will simply be replaced on system activation. This also
holds for the user passwords; all changed holds for the user passwords; all changed
passwords will be reset according to the passwords will be reset according to the
<literal>users.users</literal> configuration on activation. `users.users` configuration on activation.
</para></warning> :::
''; '';
}; };

View file

@ -33,7 +33,7 @@ in
options.xdg.portal = { options.xdg.portal = {
enable = enable =
mkEnableOption ''<link xlink:href="https://github.com/flatpak/xdg-desktop-portal">xdg desktop integration</link>'' // { mkEnableOption (lib.mdDoc ''[xdg desktop integration](https://github.com/flatpak/xdg-desktop-portal)'') // {
default = false; default = false;
}; };
@ -54,11 +54,11 @@ in
type = types.bool; type = types.bool;
visible = false; visible = false;
default = false; default = false;
description = '' description = lib.mdDoc ''
Sets environment variable <literal>GTK_USE_PORTAL</literal> to <literal>1</literal>. Sets environment variable `GTK_USE_PORTAL` to `1`.
This will force GTK-based programs ran outside Flatpak to respect and use XDG Desktop Portals This will force GTK-based programs ran outside Flatpak to respect and use XDG Desktop Portals
for features like file chooser but it is an unsupported hack that can easily break things. for features like file chooser but it is an unsupported hack that can easily break things.
Defaults to <literal>false</literal> to respect its opt-in nature. Defaults to `false` to respect its opt-in nature.
''; '';
}; };
}; };

View file

@ -12,13 +12,13 @@ in
}; };
options.xdg.portal.lxqt = { options.xdg.portal.lxqt = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
the desktop portal for the LXQt desktop environment. the desktop portal for the LXQt desktop environment.
This will add the <literal>lxqt.xdg-desktop-portal-lxqt</literal> This will add the `lxqt.xdg-desktop-portal-lxqt`
package (with the extra Qt styles) into the package (with the extra Qt styles) into the
<option>xdg.portal.extraPortals</option> option {option}`xdg.portal.extraPortals` option
''; '');
styles = mkOption { styles = mkOption {
type = types.listOf types.package; type = types.listOf types.package;

View file

@ -14,13 +14,13 @@ in
}; };
options.xdg.portal.wlr = { options.xdg.portal.wlr = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
desktop portal for wlroots-based desktops desktop portal for wlroots-based desktops
This will add the <literal>xdg-desktop-portal-wlr</literal> package into This will add the `xdg-desktop-portal-wlr` package into
the <option>xdg.portal.extraPortals</option> option, and provide the the {option}`xdg.portal.extraPortals` option, and provide the
configuration file configuration file
''; '');
settings = mkOption { settings = mkOption {
description = lib.mdDoc '' description = lib.mdDoc ''

View file

@ -73,10 +73,10 @@ in
default = 50; default = 50;
type = types.int; type = types.int;
description = lib.mdDoc '' description = lib.mdDoc ''
Maximum amount of memory that can be used by the zram swap devices Maximum total amount of memory that can be stored in the zram swap devices
(as a percentage of your total memory). Defaults to 1/2 of your total (as a percentage of your total memory). Defaults to 1/2 of your total
RAM. Run `zramctl` to check how good memory is RAM. Run `zramctl` to check how good memory is compressed.
compressed. This doesn't define how much memory will be used by the zram swap devices.
''; '';
}; };
@ -84,8 +84,9 @@ in
default = null; default = null;
type = with types; nullOr int; type = with types; nullOr int;
description = lib.mdDoc '' description = lib.mdDoc ''
Maximum total amount of memory (in bytes) that can be used by the zram Maximum total amount of memory (in bytes) that can be stored in the zram
swap devices. swap devices.
This doesn't define how much memory will be used by the zram swap devices.
''; '';
}; };

View file

@ -7,10 +7,10 @@ in
{ {
options = { options = {
hardware.brillo = { hardware.brillo = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
Enable brillo in userspace. Enable brillo in userspace.
This will allow brightness control from users in the video group. This will allow brightness control from users in the video group.
''; '');
}; };
}; };

View file

@ -13,7 +13,7 @@ in
]; ];
options.hardware.ckb-next = { options.hardware.ckb-next = {
enable = mkEnableOption "the Corsair keyboard/mouse driver"; enable = mkEnableOption (lib.mdDoc "the Corsair keyboard/mouse driver");
gid = mkOption { gid = mkOption {
type = types.nullOr types.int; type = types.nullOr types.int;

View file

@ -7,15 +7,15 @@ let
in in
{ {
options.programs.corectrl = { options.programs.corectrl = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
A tool to overclock amd graphics cards and processors. A tool to overclock amd graphics cards and processors.
Add your user to the corectrl group to run corectrl without needing to enter your password Add your user to the corectrl group to run corectrl without needing to enter your password
''; '');
gpuOverclock = { gpuOverclock = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
true true
''; '');
ppfeaturemask = mkOption { ppfeaturemask = mkOption {
type = types.str; type = types.str;
default = "0xfffd7fff"; default = "0xfffd7fff";

View file

@ -6,7 +6,7 @@ let
in in
with lib; { with lib; {
options.hardware.cpu.amd.sev = { options.hardware.cpu.amd.sev = {
enable = mkEnableOption "access to the AMD SEV device"; enable = mkEnableOption (lib.mdDoc "access to the AMD SEV device");
user = mkOption { user = mkOption {
description = lib.mdDoc "Owner to assign to the SEV device."; description = lib.mdDoc "Owner to assign to the SEV device.";
type = types.str; type = types.str;

View file

@ -20,7 +20,7 @@ in
}; };
options.hardware.cpu.intel.sgx.provision = { options.hardware.cpu.intel.sgx.provision = {
enable = mkEnableOption "access to the Intel SGX provisioning device"; enable = mkEnableOption (lib.mdDoc "access to the Intel SGX provisioning device");
user = mkOption { user = mkOption {
description = lib.mdDoc "Owner to assign to the SGX provisioning device."; description = lib.mdDoc "Owner to assign to the SGX provisioning device.";
type = types.str; type = types.str;

View file

@ -14,6 +14,15 @@ let
''; '';
}; };
filter = mkOption {
type = types.nullOr types.str;
default = null;
example = "*rpi*.dtb";
description = lib.mdDoc ''
Only apply to .dtb files matching glob expression.
'';
};
dtsFile = mkOption { dtsFile = mkOption {
type = types.nullOr types.path; type = types.nullOr types.path;
description = lib.mdDoc '' description = lib.mdDoc ''
@ -150,6 +159,7 @@ in
''; '';
type = types.listOf (types.coercedTo types.path (path: { type = types.listOf (types.coercedTo types.path (path: {
name = baseNameOf path; name = baseNameOf path;
filter = null;
dtboFile = path; dtboFile = path;
}) overlayType); }) overlayType);
description = lib.mdDoc '' description = lib.mdDoc ''
@ -161,7 +171,7 @@ in
default = null; default = null;
type = types.nullOr types.path; type = types.nullOr types.path;
internal = true; internal = true;
description = '' description = lib.mdDoc ''
A path containing the result of applying `overlays` to `kernelPackage`. A path containing the result of applying `overlays` to `kernelPackage`.
''; '';
}; };

View file

@ -3,7 +3,7 @@ let
cfg = config.hardware.flirc; cfg = config.hardware.flirc;
in in
{ {
options.hardware.flirc.enable = lib.mkEnableOption "software to configure a Flirc USB device"; options.hardware.flirc.enable = lib.mkEnableOption (lib.mdDoc "software to configure a Flirc USB device");
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
environment.systemPackages = [ pkgs.flirc ]; environment.systemPackages = [ pkgs.flirc ];

View file

@ -7,7 +7,7 @@ let
in in
{ {
options.hardware.gkraken = { options.hardware.gkraken = {
enable = mkEnableOption "gkraken's udev rules for NZXT AIO liquid coolers"; enable = mkEnableOption (lib.mdDoc "gkraken's udev rules for NZXT AIO liquid coolers");
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -28,7 +28,7 @@ let
cfg = config.hardware.gpgSmartcards; cfg = config.hardware.gpgSmartcards;
in { in {
options.hardware.gpgSmartcards = { options.hardware.gpgSmartcards = {
enable = mkEnableOption "udev rules for gnupg smart cards"; enable = mkEnableOption (lib.mdDoc "udev rules for gnupg smart cards");
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -8,11 +8,11 @@ in
{ {
options.hardware.i2c = { options.hardware.i2c = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
i2c devices support. By default access is granted to users in the "i2c" i2c devices support. By default access is granted to users in the "i2c"
group (will be created if non-existent) and any user with a seat, meaning group (will be created if non-existent) and any user with a seat, meaning
logged on the computer locally. logged on the computer locally.
''; '');
group = mkOption { group = mkOption {
type = types.str; type = types.str;

View file

@ -6,7 +6,7 @@ let
in in
{ {
options.hardware.keyboard.teck = { options.hardware.keyboard.teck = {
enable = mkEnableOption "non-root access to the firmware of TECK keyboards"; enable = mkEnableOption (lib.mdDoc "non-root access to the firmware of TECK keyboards");
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -6,12 +6,12 @@ let
in in
{ {
options.hardware.keyboard.uhk = { options.hardware.keyboard.uhk = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
non-root access to the firmware of UHK keyboards. non-root access to the firmware of UHK keyboards.
You need it when you want to flash a new firmware on the keyboard. You need it when you want to flash a new firmware on the keyboard.
Access to the keyboard is granted to users in the "input" group. Access to the keyboard is granted to users in the "input" group.
You may want to install the uhk-agent package. You may want to install the uhk-agent package.
''; '');
}; };

View file

@ -11,7 +11,7 @@ in {
]; ];
options.hardware.ksm = { options.hardware.ksm = {
enable = mkEnableOption "Kernel Same-Page Merging"; enable = mkEnableOption (lib.mdDoc "Kernel Same-Page Merging");
sleep = mkOption { sleep = mkOption {
type = types.nullOr types.int; type = types.nullOr types.int;
default = null; default = null;

View file

@ -6,7 +6,7 @@ let
cfg = config.hardware.ledger; cfg = config.hardware.ledger;
in { in {
options.hardware.ledger.enable = mkEnableOption "udev rules for Ledger devices"; options.hardware.ledger.enable = mkEnableOption (lib.mdDoc "udev rules for Ledger devices");
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.udev.packages = [ pkgs.ledger-udev-rules ]; services.udev.packages = [ pkgs.ledger-udev-rules ];

View file

@ -19,7 +19,7 @@ in
options.hardware.logitech = { options.hardware.logitech = {
lcd = { lcd = {
enable = mkEnableOption "Logitech LCD Devices"; enable = mkEnableOption (lib.mdDoc "Logitech LCD Devices");
startWhenNeeded = mkOption { startWhenNeeded = mkOption {
type = types.bool; type = types.bool;
@ -41,7 +41,7 @@ in
}; };
wireless = { wireless = {
enable = mkEnableOption "Logitech Wireless Devices"; enable = mkEnableOption (lib.mdDoc "Logitech Wireless Devices");
enableGraphical = mkOption { enableGraphical = mkOption {
type = types.bool; type = types.bool;

View file

@ -71,7 +71,7 @@ in
package = mkOption { package = mkOption {
type = types.package; type = types.package;
internal = true; internal = true;
description = '' description = lib.mdDoc ''
The package that provides the OpenGL implementation. The package that provides the OpenGL implementation.
''; '';
}; };
@ -79,9 +79,9 @@ in
package32 = mkOption { package32 = mkOption {
type = types.package; type = types.package;
internal = true; internal = true;
description = '' description = lib.mdDoc ''
The package that provides the 32-bit OpenGL implementation on The package that provides the 32-bit OpenGL implementation on
64-bit systems. Used when <option>driSupport32Bit</option> is 64-bit systems. Used when {option}`driSupport32Bit` is
set. set.
''; '';
}; };
@ -111,11 +111,11 @@ in
type = types.bool; type = types.bool;
internal = true; internal = true;
default = false; default = false;
description = '' description = lib.mdDoc ''
Whether the <literal>LD_LIBRARY_PATH</literal> environment variable Whether the `LD_LIBRARY_PATH` environment variable
should be set to the locations of driver libraries. Drivers which should be set to the locations of driver libraries. Drivers which
rely on overriding libraries should set this to true. Drivers which rely on overriding libraries should set this to true. Drivers which
support <literal>libglvnd</literal> and other dispatch libraries support `libglvnd` and other dispatch libraries
instead of overriding libraries should not set this. instead of overriding libraries should not set this.
''; '';
}; };

View file

@ -49,9 +49,9 @@ in
{ {
options = { options = {
hardware.openrazer = { hardware.openrazer = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
OpenRazer drivers and userspace daemon. OpenRazer drivers and userspace daemon.
''; '');
verboseLogging = mkOption { verboseLogging = mkOption {
type = types.bool; type = types.bool;

View file

@ -48,7 +48,7 @@ in {
options = { options = {
hardware.raid.HPSmartArray = { hardware.raid.HPSmartArray = {
enable = mkEnableOption "HP Smart Array kernel modules and CLI utility"; enable = mkEnableOption (lib.mdDoc "HP Smart Array kernel modules and CLI utility");
}; };
}; };

View file

@ -5,7 +5,7 @@ let
in in
{ {
options.hardware.saleae-logic = { options.hardware.saleae-logic = {
enable = lib.mkEnableOption "udev rules for Saleae Logic devices"; enable = lib.mkEnableOption (lib.mdDoc "udev rules for Saleae Logic devices");
package = lib.mkOption { package = lib.mkOption {
type = lib.types.package; type = lib.types.package;

View file

@ -36,7 +36,7 @@ in
meta.maintainers = with lib.maintainers; [ peterhoeg ]; meta.maintainers = with lib.maintainers; [ peterhoeg ];
options.hardware.sata.timeout = { options.hardware.sata.timeout = {
enable = mkEnableOption "SATA drive timeouts"; enable = mkEnableOption (lib.mdDoc "SATA drive timeouts");
deciSeconds = mkOption { deciSeconds = mkOption {
example = 70; example = 70;

View file

@ -57,7 +57,7 @@ let
in { in {
options = { options = {
hardware.system76 = { hardware.system76 = {
enableAll = mkEnableOption "all recommended configuration for system76 systems"; enableAll = mkEnableOption (lib.mdDoc "all recommended configuration for system76 systems");
firmware-daemon.enable = mkOption { firmware-daemon.enable = mkOption {
default = cfg.enableAll; default = cfg.enableAll;

View file

@ -8,23 +8,23 @@ let
in in
{ {
options.hardware.tuxedo-keyboard = { options.hardware.tuxedo-keyboard = {
enable = mkEnableOption '' enable = mkEnableOption (lib.mdDoc ''
Enables the tuxedo-keyboard driver. Enables the tuxedo-keyboard driver.
To configure the driver, pass the options to the <option>boot.kernelParams</option> configuration. To configure the driver, pass the options to the {option}`boot.kernelParams` configuration.
There are several parameters you can change. It's best to check at the source code description which options are supported. There are several parameters you can change. It's best to check at the source code description which options are supported.
You can find all the supported parameters at: <link xlink:href="https://github.com/tuxedocomputers/tuxedo-keyboard#kernelparam"/> You can find all the supported parameters at: <https://github.com/tuxedocomputers/tuxedo-keyboard#kernelparam>
In order to use the <literal>custom</literal> lighting with the maximumg brightness and a color of <literal>0xff0a0a</literal> one would put pass <option>boot.kernelParams</option> like this: In order to use the `custom` lighting with the maximumg brightness and a color of `0xff0a0a` one would put pass {option}`boot.kernelParams` like this:
<programlisting> ```
boot.kernelParams = [ boot.kernelParams = [
"tuxedo_keyboard.mode=0" "tuxedo_keyboard.mode=0"
"tuxedo_keyboard.brightness=255" "tuxedo_keyboard.brightness=255"
"tuxedo_keyboard.color_left=0xff0a0a" "tuxedo_keyboard.color_left=0xff0a0a"
]; ];
</programlisting> ```
''; '');
}; };
config = mkIf cfg.enable config = mkIf cfg.enable

View file

@ -10,7 +10,7 @@ let
}; };
in { in {
options.hardware.ubertooth = { options.hardware.ubertooth = {
enable = mkEnableOption "Enable the Ubertooth software and its udev rules."; enable = mkEnableOption (lib.mdDoc "Enable the Ubertooth software and its udev rules.");
group = mkOption { group = mkOption {
type = types.str; type = types.str;

View file

@ -4,7 +4,7 @@ let
cfg = config.hardware.uinput; cfg = config.hardware.uinput;
in { in {
options.hardware.uinput = { options.hardware.uinput = {
enable = lib.mkEnableOption "uinput support"; enable = lib.mkEnableOption (lib.mdDoc "uinput support");
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {

View file

@ -12,7 +12,7 @@ in
{ {
options.hardware.mwProCapture.enable = mkEnableOption "Magewell Pro Capture family kernel module"; options.hardware.mwProCapture.enable = mkEnableOption (lib.mdDoc "Magewell Pro Capture family kernel module");
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -2,7 +2,7 @@
with lib; with lib;
{ {
options.hardware.video.hidpi.enable = mkEnableOption "Font/DPI configuration optimized for HiDPI displays"; options.hardware.video.hidpi.enable = mkEnableOption (lib.mdDoc "Font/DPI configuration optimized for HiDPI displays");
config = mkIf config.hardware.video.hidpi.enable { config = mkIf config.hardware.video.hidpi.enable {
console.font = lib.mkDefault "${pkgs.terminus_font}/share/consolefonts/ter-v32n.psf.gz"; console.font = lib.mkDefault "${pkgs.terminus_font}/share/consolefonts/ter-v32n.psf.gz";

View file

@ -233,11 +233,8 @@ in
} }
{ {
assertion = cfg.powerManagement.enable -> ( assertion = cfg.powerManagement.enable -> versionAtLeast nvidia_x11.version "430.09";
builtins.pathExists (cfg.package.out + "/bin/nvidia-sleep.sh") && message = "Required files for driver based power management only exist on versions >= 430.09.";
builtins.pathExists (cfg.package.out + "/lib/systemd/system-sleep/nvidia")
);
message = "Required files for driver based power management don't exist.";
} }
{ {
@ -260,8 +257,6 @@ in
# - Configure the display manager to run specific `xrandr` commands which will # - Configure the display manager to run specific `xrandr` commands which will
# configure/enable displays connected to the Intel iGPU / AMD APU. # configure/enable displays connected to the Intel iGPU / AMD APU.
services.xserver.useGlamor = mkDefault offloadCfg.enable;
services.xserver.drivers = let services.xserver.drivers = let
in optional primeEnabled { in optional primeEnabled {
name = igpuDriver; name = igpuDriver;

View file

@ -6,7 +6,7 @@ let
cfg = config.services.switcherooControl; cfg = config.services.switcherooControl;
in { in {
options.services.switcherooControl = { options.services.switcherooControl = {
enable = mkEnableOption "switcheroo-control, a D-Bus service to check the availability of dual-GPU"; enable = mkEnableOption (lib.mdDoc "switcheroo-control, a D-Bus service to check the availability of dual-GPU");
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -12,7 +12,7 @@ in
{ {
options.hardware.facetimehd.enable = mkEnableOption "facetimehd kernel module"; options.hardware.facetimehd.enable = mkEnableOption (lib.mdDoc "facetimehd kernel module");
options.hardware.facetimehd.withCalibration = mkOption { options.hardware.facetimehd.withCalibration = mkOption {
default = false; default = false;

View file

@ -3,7 +3,7 @@
with lib; with lib;
{ {
options.hardware.wooting.enable = options.hardware.wooting.enable =
mkEnableOption "Enable support for Wooting keyboards"; mkEnableOption (lib.mdDoc "Enable support for Wooting keyboards");
config = mkIf config.hardware.wooting.enable { config = mkIf config.hardware.wooting.enable {
environment.systemPackages = [ pkgs.wootility ]; environment.systemPackages = [ pkgs.wootility ];

View file

@ -6,7 +6,7 @@ let
in in
{ {
options.hardware.xone = { options.hardware.xone = {
enable = mkEnableOption "the xone driver for Xbox One and Xbobx Series X|S accessories"; enable = mkEnableOption (lib.mdDoc "the xone driver for Xbox One and Xbobx Series X|S accessories");
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -6,7 +6,7 @@ let
in in
{ {
options.hardware.xpadneo = { options.hardware.xpadneo = {
enable = mkEnableOption "the xpadneo driver for Xbox One wireless controllers"; enable = mkEnableOption (lib.mdDoc "the xpadneo driver for Xbox One wireless controllers");
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -32,22 +32,20 @@ in
type = types.nullOr (types.enum [ "ibus" "fcitx" "fcitx5" "nabi" "uim" "hime" "kime" ]); type = types.nullOr (types.enum [ "ibus" "fcitx" "fcitx5" "nabi" "uim" "hime" "kime" ]);
default = null; default = null;
example = "fcitx"; example = "fcitx";
description = '' description = lib.mdDoc ''
Select the enabled input method. Input methods is a software to input symbols that are not available on standard input devices. Select the enabled input method. Input methods is a software to input symbols that are not available on standard input devices.
Input methods are specially used to input Chinese, Japanese and Korean characters. Input methods are specially used to input Chinese, Japanese and Korean characters.
Currently the following input methods are available in NixOS: Currently the following input methods are available in NixOS:
<itemizedlist> - ibus: The intelligent input bus, extra input engines can be added using `i18n.inputMethod.ibus.engines`.
<listitem><para>ibus: The intelligent input bus, extra input engines can be added using <literal>i18n.inputMethod.ibus.engines</literal>.</para></listitem> - fcitx: A customizable lightweight input method, extra input engines can be added using `i18n.inputMethod.fcitx.engines`.
<listitem><para>fcitx: A customizable lightweight input method, extra input engines can be added using <literal>i18n.inputMethod.fcitx.engines</literal>.</para></listitem> - fcitx5: The next generation of fcitx, addons (including engines, dictionaries, skins) can be added using `i18n.inputMethod.fcitx5.addons`.
<listitem><para>fcitx5: The next generation of fcitx, addons (including engines, dictionaries, skins) can be added using <literal>i18n.inputMethod.fcitx5.addons</literal>.</para></listitem> - nabi: A Korean input method based on XIM. Nabi doesn't support Qt 5.
<listitem><para>nabi: A Korean input method based on XIM. Nabi doesn't support Qt 5.</para></listitem> - uim: The universal input method, is a library with a XIM bridge. uim mainly support Chinese, Japanese and Korean.
<listitem><para>uim: The universal input method, is a library with a XIM bridge. uim mainly support Chinese, Japanese and Korean.</para></listitem> - hime: An extremely easy-to-use input method framework.
<listitem><para>hime: An extremely easy-to-use input method framework.</para></listitem> - kime: Koream IME.
<listitem><para>kime: Koream IME.</para></listitem>
</itemizedlist>
''; '';
}; };
@ -55,7 +53,7 @@ in
internal = true; internal = true;
type = types.nullOr types.path; type = types.nullOr types.path;
default = null; default = null;
description = '' description = lib.mdDoc ''
The input method method package. The input method method package.
''; '';
}; };

View file

@ -20,7 +20,7 @@ in {
''; '';
}; };
enableRimeData = mkEnableOption "default rime-data with fcitx5-rime"; enableRimeData = mkEnableOption (lib.mdDoc "default rime-data with fcitx5-rime");
}; };
}; };

View file

@ -58,7 +58,7 @@ in
firmwarePartitionOffset = mkOption { firmwarePartitionOffset = mkOption {
type = types.int; type = types.int;
default = 8; default = 8;
description = '' description = lib.mdDoc ''
Gap in front of the /boot/firmware partition, in mebibytes (1024×1024 Gap in front of the /boot/firmware partition, in mebibytes (1024×1024
bytes). bytes).
Can be increased to make more space for boards requiring to dd u-boot Can be increased to make more space for boards requiring to dd u-boot

View file

@ -1,7 +1,7 @@
{ {
x86_64-linux = "/nix/store/3af6g226v4hsv6x7xzh23d6wqyq0nzjp-nix-2.10.3"; x86_64-linux = "/nix/store/nmq5zcd93qb1yskx42rs910ff0247nn2-nix-2.11.0";
i686-linux = "/nix/store/43xxh2jip6rpdhylc5z9a5fxx54dw206-nix-2.10.3"; i686-linux = "/nix/store/ja6im1sw9a8lzczi10lc0iddffl9kzmn-nix-2.11.0";
aarch64-linux = "/nix/store/6qw3r57nra08ars8j8zyj3fl8lz4cvnd-nix-2.10.3"; aarch64-linux = "/nix/store/myr6fcqa9y4y2fb83zz73dck52vcn81z-nix-2.11.0";
x86_64-darwin = "/nix/store/3b7qrm0qjw57fmznrsvm0ai568i89hc2-nix-2.10.3"; x86_64-darwin = "/nix/store/2pfjz9b22k9997gh7cb0hjk1qa4lxrvy-nix-2.11.0";
aarch64-darwin = "/nix/store/gp7k17iy1n7hgf97qwnxw28c6v9nhb1i-nix-2.10.3"; aarch64-darwin = "/nix/store/lr32i0bdarx1iqsch4sy24jj1jkfw9vf-nix-2.11.0";
} }

View file

@ -11,7 +11,7 @@ with lib;
internal = true; internal = true;
default = []; default = [];
example = [ { assertion = false; message = "you can't enable this for that reason"; } ]; example = [ { assertion = false; message = "you can't enable this for that reason"; } ];
description = '' description = lib.mdDoc ''
This option allows modules to express conditions that must This option allows modules to express conditions that must
hold for the evaluation of the system configuration to hold for the evaluation of the system configuration to
succeed, along with associated error messages for the user. succeed, along with associated error messages for the user.
@ -23,7 +23,7 @@ with lib;
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
example = [ "The `foo' service is deprecated and will go away soon!" ]; example = [ "The `foo' service is deprecated and will go away soon!" ];
description = '' description = lib.mdDoc ''
This option allows modules to show warnings to users during This option allows modules to show warnings to users during
the evaluation of the system configuration. the evaluation of the system configuration.
''; '';

View file

@ -226,15 +226,14 @@ in
nixos.enable = mkOption { nixos.enable = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = '' description = lib.mdDoc ''
Whether to install NixOS's own documentation. Whether to install NixOS's own documentation.
<itemizedlist>
<listitem><para>This includes man pages like - This includes man pages like
<citerefentry><refentrytitle>configuration.nix</refentrytitle><manvolnum>5</manvolnum></citerefentry> if <option>documentation.man.enable</option> is {manpage}`configuration.nix(5)` if {option}`documentation.man.enable` is
set.</para></listitem> set.
<listitem><para>This includes the HTML manual and the <command>nixos-help</command> command if - This includes the HTML manual and the {command}`nixos-help` command if
<option>documentation.doc.enable</option> is set.</para></listitem> {option}`documentation.doc.enable` is set.
</itemizedlist>
''; '';
}; };

View file

@ -30,7 +30,7 @@ let
specialArgs.someArg.myModule = { lib, ... }: { specialArgs.someArg.myModule = { lib, ... }: {
options.foobar = lib.mkOption { options.foobar = lib.mkOption {
type = lib.types.str; type = lib.types.str;
description = "The foobar option was added via specialArgs"; description = lib.mdDoc "The foobar option was added via specialArgs";
default = "qux"; default = "qux";
}; };
}; };

View file

@ -19,7 +19,7 @@ in
ids.uids = lib.mkOption { ids.uids = lib.mkOption {
internal = true; internal = true;
description = '' description = lib.mdDoc ''
The user IDs used in NixOS. The user IDs used in NixOS.
''; '';
type = types.attrsOf types.int; type = types.attrsOf types.int;
@ -27,7 +27,7 @@ in
ids.gids = lib.mkOption { ids.gids = lib.mkOption {
internal = true; internal = true;
description = '' description = lib.mdDoc ''
The group IDs used in NixOS. The group IDs used in NixOS.
''; '';
type = types.attrsOf types.int; type = types.attrsOf types.int;

View file

@ -12,7 +12,7 @@ in
nixos.label = mkOption { nixos.label = mkOption {
type = types.strMatching "[a-zA-Z0-9:_\\.-]*"; type = types.strMatching "[a-zA-Z0-9:_\\.-]*";
description = '' description = lib.mdDoc ''
NixOS version name to be used in the names of generated NixOS version name to be used in the names of generated
outputs and boot labels. outputs and boot labels.
@ -20,25 +20,26 @@ in
this is the option for you. this is the option for you.
It can only contain letters, numbers and the following symbols: It can only contain letters, numbers and the following symbols:
<literal>:</literal>, <literal>_</literal>, <literal>.</literal> and <literal>-</literal>. `:`, `_`, `.` and `-`.
The default is <option>system.nixos.tags</option> separated by The default is {option}`system.nixos.tags` separated by
"-" + "-" + <envar>NIXOS_LABEL_VERSION</envar> environment "-" + "-" + {env}`NIXOS_LABEL_VERSION` environment
variable (defaults to the value of variable (defaults to the value of
<option>system.nixos.version</option>). {option}`system.nixos.version`).
Can be overriden by setting <envar>NIXOS_LABEL</envar>. Can be overriden by setting {env}`NIXOS_LABEL`.
Useful for not loosing track of configurations built from different Useful for not loosing track of configurations built from different
nixos branches/revisions, e.g.: nixos branches/revisions, e.g.:
<screen> ```
#!/bin/sh #!/bin/sh
today=`date +%Y%m%d` today=`date +%Y%m%d`
branch=`(cd nixpkgs ; git branch 2>/dev/null | sed -n '/^\* / { s|^\* ||; p; }')` branch=`(cd nixpkgs ; git branch 2>/dev/null | sed -n '/^\* / { s|^\* ||; p; }')`
revision=`(cd nixpkgs ; git rev-parse HEAD)` revision=`(cd nixpkgs ; git rev-parse HEAD)`
export NIXOS_LABEL_VERSION="$today.$branch-''${revision:0:7}" export NIXOS_LABEL_VERSION="$today.$branch-''${revision:0:7}"
nixos-rebuild switch</screen> nixos-rebuild switch
```
''; '';
}; };
@ -46,19 +47,19 @@ in
type = types.listOf types.str; type = types.listOf types.str;
default = []; default = [];
example = [ "with-xen" ]; example = [ "with-xen" ];
description = '' description = lib.mdDoc ''
Strings to prefix to the default Strings to prefix to the default
<option>system.nixos.label</option>. {option}`system.nixos.label`.
Useful for not loosing track of configurations built with Useful for not loosing track of configurations built with
different options, e.g.: different options, e.g.:
<screen> ```
{ {
system.nixos.tags = [ "with-xen" ]; system.nixos.tags = [ "with-xen" ];
virtualisation.xen.enable = true; virtualisation.xen.enable = true;
} }
</screen> ```
''; '';
}; };

View file

@ -183,8 +183,8 @@ in
pruneNames = mkOption { pruneNames = mkOption {
type = listOf str; type = listOf str;
default = lib.optionals (!isFindutils) [ ".bzr" ".cache" ".git" ".hg" ".svn" ]; default = lib.optionals (!isFindutils) [ ".bzr" ".cache" ".git" ".hg" ".svn" ];
defaultText = literalDocBook '' defaultText = literalMD ''
<literal>[ ".bzr" ".cache" ".git" ".hg" ".svn" ]</literal>, if `[ ".bzr" ".cache" ".git" ".hg" ".svn" ]`, if
supported by the locate implementation (i.e. mlocate or plocate). supported by the locate implementation (i.e. mlocate or plocate).
''; '';
description = lib.mdDoc '' description = lib.mdDoc ''

View file

@ -7,7 +7,7 @@ in
{ {
options = { options = {
documentation.man.man-db = { documentation.man.man-db = {
enable = lib.mkEnableOption "man-db as the default man page viewer" // { enable = lib.mkEnableOption (lib.mdDoc "man-db as the default man page viewer") // {
default = config.documentation.man.enable; default = config.documentation.man.enable;
defaultText = lib.literalExpression "config.documentation.man.enable"; defaultText = lib.literalExpression "config.documentation.man.enable";
example = false; example = false;

Some files were not shown because too many files have changed in this diff Show more