Project import generated by Copybara.

GitOrigin-RevId: bc5d68306b40b8522ffb69ba6cff91898c2fbbff
This commit is contained in:
Default email 2021-12-06 17:07:01 +01:00
parent f62ee65546
commit ce641f4048
5786 changed files with 236630 additions and 99348 deletions

View file

@ -6,6 +6,13 @@
# #
# For documentation on this file, see https://help.github.com/articles/about-codeowners/ # For documentation on this file, see https://help.github.com/articles/about-codeowners/
# Mentioned users will get code review requests. # Mentioned users will get code review requests.
#
# IMPORTANT NOTE: in order to actually get pinged, commit access is required.
# This also holds true for GitHub teams. Since almost none of our teams have write
# permissions, you need to list all members of the team with commit access individually.
# We still add the team to the list next to its members, this helps keeping things
# in sync. (Put non team members before the team to distinguish them.)
# See https://github.com/NixOS/nixpkgs/issues/124085 for more details
# This file # This file
/.github/CODEOWNERS @edolstra /.github/CODEOWNERS @edolstra
@ -210,11 +217,11 @@
/pkgs/top-level/php-packages.nix @jtojnar @NixOS/php @aanderse @etu @globin @ma27 @talyz /pkgs/top-level/php-packages.nix @jtojnar @NixOS/php @aanderse @etu @globin @ma27 @talyz
# Podman, CRI-O modules and related # Podman, CRI-O modules and related
/nixos/modules/virtualisation/containers.nix @NixOS/podman @zowoq /nixos/modules/virtualisation/containers.nix @NixOS/podman @zowoq @adisbladis
/nixos/modules/virtualisation/cri-o.nix @NixOS/podman @zowoq /nixos/modules/virtualisation/cri-o.nix @NixOS/podman @zowoq @adisbladis
/nixos/modules/virtualisation/podman.nix @NixOS/podman @zowoq /nixos/modules/virtualisation/podman.nix @NixOS/podman @zowoq @adisbladis
/nixos/tests/cri-o.nix @NixOS/podman @zowoq /nixos/tests/cri-o.nix @NixOS/podman @zowoq @adisbladis
/nixos/tests/podman.nix @NixOS/podman @zowoq /nixos/tests/podman.nix @NixOS/podman @zowoq @adisbladis
# Docker tools # Docker tools
/pkgs/build-support/docker @roberth @utdemir /pkgs/build-support/docker @roberth @utdemir
@ -230,6 +237,10 @@
/pkgs/development/go-modules @kalbasit @Mic92 @zowoq /pkgs/development/go-modules @kalbasit @Mic92 @zowoq
/pkgs/development/go-packages @kalbasit @Mic92 @zowoq /pkgs/development/go-packages @kalbasit @Mic92 @zowoq
# GNOME
/pkgs/desktops/gnome @NixOS/GNOME @jtojnar @hedning
/pkgs/desktops/gnome/extensions @piegamesde @NixOS/GNOME @jtojnar @hedning
# Cinnamon # Cinnamon
/pkgs/desktops/cinnamon @mkg20001 /pkgs/desktops/cinnamon @mkg20001

View file

@ -20,12 +20,17 @@ Reviewing guidelines: https://nixos.org/manual/nixpkgs/unstable/#chap-reviewing-
- [ ] aarch64-linux - [ ] aarch64-linux
- [ ] x86_64-darwin - [ ] x86_64-darwin
- [ ] aarch64-darwin - [ ] aarch64-darwin
- [ ] For non-Linux: Is `sandbox = true` set in `nix.conf`? (See [Nix manual](https://nixos.org/manual/nix/stable/#sec-conf-file)) - [ ] For non-Linux: Is `sandbox = true` set in `nix.conf`? (See [Nix manual](https://nixos.org/manual/nix/stable/command-ref/conf-file.html))
- [ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside [nixos/tests](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests)) - [ ] Tested, as applicable:
- [ ] Tested compilation of all packages that depend on this change using `nix-shell -p nixpkgs-review --run "nixpkgs-review wip"` - [NixOS test(s)](https://nixos.org/manual/nixos/unstable/index.html#sec-nixos-tests) (look inside [nixos/tests](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests))
- [ ] Tested execution of all binary files (usually in `./result/bin/`) - and/or [package tests](https://nixos.org/manual/nixpkgs/unstable/#sec-package-tests)
- [21.11 Release Notes (or backporting 21.05 Release notes)](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#generating-2111-release-notes) - or, for functions and "core" functionality, tests in [lib/tests](https://github.com/NixOS/nixpkgs/blob/master/lib/tests) or [pkgs/test](https://github.com/NixOS/nixpkgs/blob/master/pkgs/test)
- made sure NixOS tests are [linked](https://nixos.org/manual/nixpkgs/unstable/#ssec-nixos-tests-linking) to the relevant packages
- [ ] Tested compilation of all packages that depend on this change using `nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD"`. Note: all changes have to be committed, also see [nixpkgs-review usage](https://github.com/Mic92/nixpkgs-review#usage)
- [ ] Tested basic functionality of all binary files (usually in `./result/bin/`)
- [22.05 Release Notes (or backporting 21.11 Release notes)](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#generating-2205-release-notes)
- [ ] (Package updates) Added a release notes entry if the change is major or breaking - [ ] (Package updates) Added a release notes entry if the change is major or breaking
- [ ] (Module updates) Added a release notes entry if the change is significant - [ ] (Module updates) Added a release notes entry if the change is significant
- [ ] (Module addition) Added a release notes entry if adding a new NixOS module - [ ] (Module addition) Added a release notes entry if adding a new NixOS module
- [ ] (Release notes changes) Ran `nixos/doc/manual/md-to-db.sh` to update generated release notes
- [ ] Fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md). - [ ] Fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md).

View file

@ -143,6 +143,8 @@
- doc/languages-frameworks/vim.section.md - doc/languages-frameworks/vim.section.md
- pkgs/applications/editors/vim/**/* - pkgs/applications/editors/vim/**/*
- pkgs/misc/vim-plugins/**/* - pkgs/misc/vim-plugins/**/*
- nixos/modules/programs/neovim.nix
- pkgs/applications/editors/neovim/**/*
"6.topic: xfce": "6.topic: xfce":
- nixos/doc/manual/configuration/xfce.xml - nixos/doc/manual/configuration/xfce.xml

View file

@ -15,6 +15,6 @@ jobs:
# we don't limit this action to only NixOS repo since the checks are cheap and useful developer feedback # we don't limit this action to only NixOS repo since the checks are cheap and useful developer feedback
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: cachix/install-nix-action@v14 - uses: cachix/install-nix-action@v16
# explicit list of supportedSystems is needed until aarch64-darwin becomes part of the trunk jobset # explicit list of supportedSystems is needed until aarch64-darwin becomes part of the trunk jobset
- run: nix-build pkgs/top-level/release.nix -A tarball.nixpkgs-basic-release-checks --arg supportedSystems '[ "aarch64-darwin" "aarch64-linux" "x86_64-linux" "x86_64-darwin" ]' - run: nix-build pkgs/top-level/release.nix -A tarball.nixpkgs-basic-release-checks --arg supportedSystems '[ "aarch64-darwin" "aarch64-linux" "x86_64-linux" "x86_64-darwin" ]'

View file

@ -11,36 +11,32 @@ on:
jobs: jobs:
tests: tests:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository_owner == 'NixOS' if: "github.repository_owner == 'NixOS' && !contains(github.event.pull_request.title, '[skip editorconfig]')"
steps: steps:
- name: Get list of changed files from PR - name: Get list of changed files from PR
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
echo 'PR_DIFF<<EOF' >> $GITHUB_ENV
gh api \ gh api \
repos/NixOS/nixpkgs/pulls/${{github.event.number}}/files --paginate \ repos/NixOS/nixpkgs/pulls/${{github.event.number}}/files --paginate \
| jq '.[] | select(.status != "removed") | .filename' \ | jq '.[] | select(.status != "removed") | .filename' \
>> $GITHUB_ENV > "$HOME/changed_files"
echo 'EOF' >> $GITHUB_ENV - name: print list of changed files
run: |
cat "$HOME/changed_files"
- uses: actions/checkout@v2 - uses: actions/checkout@v2
with: with:
# pull_request_target checks out the base branch by default # pull_request_target checks out the base branch by default
ref: refs/pull/${{ github.event.pull_request.number }}/merge ref: refs/pull/${{ github.event.pull_request.number }}/merge
if: env.PR_DIFF - uses: cachix/install-nix-action@v16
- uses: cachix/install-nix-action@v14
if: env.PR_DIFF
with: with:
# nixpkgs commit is pinned so that it doesn't break # nixpkgs commit is pinned so that it doesn't break
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/f93ecc4f6bc60414d8b73dbdf615ceb6a2c604df.tar.gz nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/f93ecc4f6bc60414d8b73dbdf615ceb6a2c604df.tar.gz
- name: install editorconfig-checker - name: install editorconfig-checker
run: nix-env -iA editorconfig-checker -f '<nixpkgs>' run: nix-env -iA editorconfig-checker -f '<nixpkgs>'
if: env.PR_DIFF
- name: Checking EditorConfig - name: Checking EditorConfig
if: env.PR_DIFF
run: | run: |
echo "$PR_DIFF" | xargs editorconfig-checker -disable-indent-size cat "$HOME/changed_files" | xargs -r editorconfig-checker -disable-indent-size
- if: ${{ failure() }} - if: ${{ failure() }}
run: | run: |
echo "::error :: Hey! It looks like your changes don't follow our editorconfig settings. Read https://editorconfig.org/#download to configure your editor so you never see this error again." echo "::error :: Hey! It looks like your changes don't follow our editorconfig settings. Read https://editorconfig.org/#download to configure your editor so you never see this error again."

View file

@ -18,7 +18,7 @@ jobs:
with: with:
# pull_request_target checks out the base branch by default # pull_request_target checks out the base branch by default
ref: refs/pull/${{ github.event.pull_request.number }}/merge ref: refs/pull/${{ github.event.pull_request.number }}/merge
- uses: cachix/install-nix-action@v14 - uses: cachix/install-nix-action@v16
with: with:
# explicitly enable sandbox # explicitly enable sandbox
extra_nix_config: sandbox = true extra_nix_config: sandbox = true

View file

@ -18,7 +18,7 @@ jobs:
with: with:
# pull_request_target checks out the base branch by default # pull_request_target checks out the base branch by default
ref: refs/pull/${{ github.event.pull_request.number }}/merge ref: refs/pull/${{ github.event.pull_request.number }}/merge
- uses: cachix/install-nix-action@v14 - uses: cachix/install-nix-action@v16
with: with:
# explicitly enable sandbox # explicitly enable sandbox
extra_nix_config: sandbox = true extra_nix_config: sandbox = true

View file

@ -19,7 +19,7 @@ jobs:
with: with:
# pull_request_target checks out the base branch by default # pull_request_target checks out the base branch by default
ref: refs/pull/${{ github.event.pull_request.number }}/merge ref: refs/pull/${{ github.event.pull_request.number }}/merge
- uses: cachix/install-nix-action@v14 - uses: cachix/install-nix-action@v16
- name: Check DocBook files generated from Markdown are consistent - name: Check DocBook files generated from Markdown are consistent
run: | run: |
nixos/doc/manual/md-to-db.sh nixos/doc/manual/md-to-db.sh

View file

@ -32,6 +32,10 @@ jobs:
into: staging-next-21.05 into: staging-next-21.05
- from: staging-next-21.05 - from: staging-next-21.05
into: staging-21.05 into: staging-21.05
- from: release-21.11
into: staging-next-21.11
- from: staging-next-21.11
into: staging-21.11
name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }} name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2

View file

@ -3,8 +3,10 @@
.*.swp .*.swp
.*.swo .*.swo
.idea/ .idea/
outputs/
result result
result-* result-*
source/
/doc/NEWS.html /doc/NEWS.html
/doc/NEWS.txt /doc/NEWS.txt
/doc/manual.html /doc/manual.html
@ -21,3 +23,6 @@ __pycache__
# generated by pkgs/common-updater/update-script.nix # generated by pkgs/common-updater/update-script.nix
update-git-commits.txt update-git-commits.txt
# JetBrains IDEA module declaration file
/nixpkgs.iml

View file

@ -1 +1 @@
21.11 22.05

View file

@ -53,10 +53,10 @@ For package version upgrades and such a one-line commit message is usually suffi
Follow these steps to backport a change into a release branch in compliance with the [commit policy](https://nixos.org/nixpkgs/manual/#submitting-changes-stable-release-branches). Follow these steps to backport a change into a release branch in compliance with the [commit policy](https://nixos.org/nixpkgs/manual/#submitting-changes-stable-release-branches).
1. Take note of the commits in which the change was introduced into `master` branch. 1. Take note of the commits in which the change was introduced into `master` branch.
2. Check out the target _release branch_, e.g. `release-20.09`. Do not use a _channel branch_ like `nixos-20.09` or `nixpkgs-20.09`. 2. Check out the target _release branch_, e.g. `release-21.11`. Do not use a _channel branch_ like `nixos-21.11` or `nixpkgs-21.11-darwin`.
3. Create a branch for your change, e.g. `git checkout -b backport`. 3. Create a branch for your change, e.g. `git checkout -b backport`.
4. When the reason to backport is not obvious from the original commit message, use `git cherry-pick -xe <original commit>` and add a reason. Otherwise use `git cherry-pick -x <original commit>`. That's fine for minor version updates that only include security and bug fixes, commits that fixes an otherwise broken package or similar. Please also ensure the commits exists on the master branch; in the case of squashed or rebased merges, the commit hash will change and the new commits can be found in the merge message at the bottom of the master pull request. 4. When the reason to backport is not obvious from the original commit message, use `git cherry-pick -xe <original commit>` and add a reason. Otherwise use `git cherry-pick -x <original commit>`. That's fine for minor version updates that only include security and bug fixes, commits that fixes an otherwise broken package or similar. Please also ensure the commits exists on the master branch; in the case of squashed or rebased merges, the commit hash will change and the new commits can be found in the merge message at the bottom of the master pull request.
5. Push to GitHub and open a backport pull request. Make sure to select the release branch (e.g. `release-20.09`) as the target branch of the pull request, and link to the pull request in which the original change was comitted to `master`. The pull request title should be the commit title with the release version as prefix, e.g. `[20.09]`. 5. Push to GitHub and open a backport pull request. Make sure to select the release branch (e.g. `release-21.11`) as the target branch of the pull request, and link to the pull request in which the original change was comitted to `master`. The pull request title should be the commit title with the release version as prefix, e.g. `[21.11]`.
6. When the backport pull request is merged and you have the necessary privileges you can also replace the label `9.needs: port to stable` with `8.has: port to stable` on the original pull request. This way maintainers can keep track of missing backports easier. 6. When the backport pull request is merged and you have the necessary privileges you can also replace the label `9.needs: port to stable` with `8.has: port to stable` on the original pull request. This way maintainers can keep track of missing backports easier.
## Criteria for Backporting changes ## Criteria for Backporting changes
@ -68,17 +68,17 @@ Anything that does not cause user or downstream dependency regressions can be ba
- Services which require a client to be up-to-date regardless. (E.g. `spotify`, `steam`, or `discord`) - Services which require a client to be up-to-date regardless. (E.g. `spotify`, `steam`, or `discord`)
- Security critical applications (E.g. `firefox`) - Security critical applications (E.g. `firefox`)
## Generating 21.11 Release Notes ## Generating 22.05 Release Notes
(This section also applies to backporting 21.05 release notes: substitute "rl-2111" for "rl-2105".) (This section also applies to backporting 21.11 release notes: substitute "rl-2205" for "rl-2111".)
Documentation in nixpkgs is transitioning to a markdown-centric workflow. Release notes now require a translation step to convert from markdown to a compatible docbook document. Documentation in nixpkgs is transitioning to a markdown-centric workflow. Release notes now require a translation step to convert from markdown to a compatible docbook document.
Steps for updating 21.11 Release notes: Steps for updating 22.05 Release notes:
1. Edit `nixos/doc/manual/release-notes/rl-2111.section.md` with the desired changes 1. Edit `nixos/doc/manual/release-notes/rl-2205.section.md` with the desired changes
2. Run `./nixos/doc/manual/md-to-db.sh` to render `nixos/doc/manual/from_md/release-notes/rl-2111.section.xml` 2. Run `./nixos/doc/manual/md-to-db.sh` to render `nixos/doc/manual/from_md/release-notes/rl-2205.section.xml`
3. Include changes to `rl-2111.section.md` and `rl-2111.section.xml` in the same commit. 3. Include changes to `rl-2205.section.md` and `rl-2205.section.xml` in the same commit.
## Reviewing contributions ## Reviewing contributions

View file

@ -8,7 +8,7 @@
</p> </p>
[Nixpkgs](https://github.com/nixos/nixpkgs) is a collection of over [Nixpkgs](https://github.com/nixos/nixpkgs) is a collection of over
60,000 software packages that can be installed with the 80,000 software packages that can be installed with the
[Nix](https://nixos.org/nix/) package manager. It also implements [Nix](https://nixos.org/nix/) package manager. It also implements
[NixOS](https://nixos.org/nixos/), a purely-functional Linux distribution. [NixOS](https://nixos.org/nixos/), a purely-functional Linux distribution.
@ -46,14 +46,14 @@ Nixpkgs and NixOS are built and tested by our continuous integration
system, [Hydra](https://hydra.nixos.org/). system, [Hydra](https://hydra.nixos.org/).
* [Continuous package builds for unstable/master](https://hydra.nixos.org/jobset/nixos/trunk-combined) * [Continuous package builds for unstable/master](https://hydra.nixos.org/jobset/nixos/trunk-combined)
* [Continuous package builds for the NixOS 21.05 release](https://hydra.nixos.org/jobset/nixos/release-21.05) * [Continuous package builds for the NixOS 21.11 release](https://hydra.nixos.org/jobset/nixos/release-21.11)
* [Tests for unstable/master](https://hydra.nixos.org/job/nixos/trunk-combined/tested#tabs-constituents) * [Tests for unstable/master](https://hydra.nixos.org/job/nixos/trunk-combined/tested#tabs-constituents)
* [Tests for the NixOS 21.05 release](https://hydra.nixos.org/job/nixos/release-21.05/tested#tabs-constituents) * [Tests for the NixOS 21.11 release](https://hydra.nixos.org/job/nixos/release-21.11/tested#tabs-constituents)
Artifacts successfully built with Hydra are published to cache at Artifacts successfully built with Hydra are published to cache at
https://cache.nixos.org/. When successful build and test criteria are https://cache.nixos.org/. When successful build and test criteria are
met, the Nixpkgs expressions are distributed via [Nix met, the Nixpkgs expressions are distributed via [Nix
channels](https://nixos.org/nix/manual/#sec-channels). channels](https://nixos.org/manual/nix/stable/package-management/channels.html).
# Contributing # Contributing

View file

@ -151,6 +151,12 @@ Create a Docker image with many of the store paths being on their own layer to i
: Shell commands to run while creating the archive for the final layer in a fakeroot environment. Unlike `extraCommands`, you can run `chown` to change the owners of the files in the archive, changing fakeroot's state instead of the real filesystem. The latter would require privileges that the build user does not have. Static binaries do not interact with the fakeroot environment. By default all files in the archive will be owned by root. : Shell commands to run while creating the archive for the final layer in a fakeroot environment. Unlike `extraCommands`, you can run `chown` to change the owners of the files in the archive, changing fakeroot's state instead of the real filesystem. The latter would require privileges that the build user does not have. Static binaries do not interact with the fakeroot environment. By default all files in the archive will be owned by root.
`enableFakechroot` _optional_
: Whether to run in `fakeRootCommands` in `fakechroot`, making programs behave as though `/` is the root of the image being created, while files in the Nix store are available as usual. This allows scripts that perform installation in `/` to work as expected. Considering that `fakechroot` is implemented via the same mechanism as `fakeroot`, the same caveats apply.
*Default:* `false`
### Behavior of `contents` in the final image {#dockerTools-buildLayeredImage-arg-contents} ### Behavior of `contents` in the final image {#dockerTools-buildLayeredImage-arg-contents}
Each path directly listed in `contents` will have a symlink in the root of the image. Each path directly listed in `contents` will have a symlink in the root of the image.

View file

@ -47,6 +47,28 @@ These functions write `text` to the Nix store. This is useful for creating scrip
Many more commands wrap `writeTextFile` including `writeText`, `writeTextDir`, `writeScript`, and `writeScriptBin`. These are convenience functions over `writeTextFile`. Many more commands wrap `writeTextFile` including `writeText`, `writeTextDir`, `writeScript`, and `writeScriptBin`. These are convenience functions over `writeTextFile`.
## `writeShellApplication` {#trivial-builder-writeShellApplication}
This can be used to easily produce a shell script that has some dependencies (`runtimeInputs`). It automatically sets the `PATH` of the script to contain all of the listed inputs, sets some sanity shellopts (`errexit`, `nounset`, `pipefail`), and checks the resulting script with [`shellcheck`](https://github.com/koalaman/shellcheck).
For example, look at the following code:
```nix
writeShellApplication {
name = "show-nixos-org";
runtimeInputs = [ curl w3m ];
text = ''
curl -s 'https://nixos.org' | w3m -dump -T text/html
'';
}
```
Unlike with normal `writeShellScriptBin`, there is no need to manually write out `${curl}/bin/curl`, setting the PATH
was handled by `writeShellApplication`. Moreover, the script is being checked with `shellcheck` for more strict
validation.
## `symlinkJoin` {#trivial-builder-symlinkJoin} ## `symlinkJoin` {#trivial-builder-symlinkJoin}
This can be used to put many derivations into the same directory structure. It works by creating a new derivation and adding symlinks to each of the paths listed. It expects two arguments, `name`, and `paths`. `name` is the name used in the Nix store path for the created derivation. `paths` is a list of paths that will be symlinked. These paths can be to Nix store derivations or any other subdirectory contained within. This can be used to put many derivations into the same directory structure. It works by creating a new derivation and adding symlinks to each of the paths listed. It expects two arguments, `name`, and `paths`. `name` is the name used in the Nix store path for the created derivation. `paths` is a list of paths that will be symlinked. These paths can be to Nix store derivations or any other subdirectory contained within.

View file

@ -181,7 +181,7 @@
rev = "${version}"; rev = "${version}";
``` ```
- Filling lists condionally _should_ be done with `lib.optional(s)` instead of using `if cond then [ ... ] else null` or `if cond then [ ... ] else [ ]`. - Building lists conditionally _should_ be done with `lib.optional(s)` instead of using `if cond then [ ... ] else null` or `if cond then [ ... ] else [ ]`.
```nix ```nix
buildInputs = lib.optional stdenv.isDarwin iconv; buildInputs = lib.optional stdenv.isDarwin iconv;

View file

@ -166,7 +166,7 @@ lib.attrsets.setAttrByPath [ "a" "b" ] 3
<xi:include href="./locations.xml" xpointer="lib.attrsets.getAttrFromPath" /> <xi:include href="./locations.xml" xpointer="lib.attrsets.getAttrFromPath" />
<para> <para>
Like [](#function-library-lib.attrsets.attrByPath) except without a default, and it will throw if the value doesn't exist. Like <xref linkend="function-library-lib.attrsets.attrByPath" /> except without a default, and it will throw if the value doesn't exist.
</para> </para>
<variablelist> <variablelist>
@ -1480,7 +1480,7 @@ lib.attrsets.zipAttrsWith
<xi:include href="./locations.xml" xpointer="lib.attrsets.zipAttrs" /> <xi:include href="./locations.xml" xpointer="lib.attrsets.zipAttrs" />
<para> <para>
Merge sets of attributes and combine each attribute value in to a list. Similar to [](#function-library-lib.attrsets.zipAttrsWith) where the merge function returns a list of all values. Merge sets of attributes and combine each attribute value in to a list. Similar to <xref linkend="function-library-lib.attrsets.zipAttrsWith" /> where the merge function returns a list of all values.
</para> </para>
<variablelist> <variablelist>

View file

@ -291,10 +291,10 @@ let
# define packages to install # define packages to install
basePackages = [ basePackages = [
git git
# replace with beam.packages.erlang.elixir_1_11 if you need # replace with beam.packages.erlang.elixir_1_13 if you need
beam.packages.erlang.elixir beam.packages.erlang.elixir
nodejs nodejs
postgresql_13 postgresql_14
# only used for frontend dependencies # only used for frontend dependencies
# you are free to use yarn2nix as well # you are free to use yarn2nix as well
nodePackages.node2nix nodePackages.node2nix
@ -312,10 +312,11 @@ let
mkdir -p .nix-mix .nix-hex mkdir -p .nix-mix .nix-hex
export MIX_HOME=$PWD/.nix-mix export MIX_HOME=$PWD/.nix-mix
export HEX_HOME=$PWD/.nix-mix export HEX_HOME=$PWD/.nix-mix
# make hex from Nixpkgs available
# `mix local.hex` will install hex into MIX_HOME and should take precedence
export MIX_PATH="${beam.packages.erlang.hex}/lib/erlang/lib/hex/ebin"
export PATH=$MIX_HOME/bin:$HEX_HOME/bin:$PATH export PATH=$MIX_HOME/bin:$HEX_HOME/bin:$PATH
# TODO: not sure how to make hex available without installing it afterwards. export LANG=C.UTF-8
mix local.hex --if-missing
export LANG=en_US.UTF-8
# keep your shell history in iex # keep your shell history in iex
export ERL_AFLAGS="-kernel shell_history enabled" export ERL_AFLAGS="-kernel shell_history enabled"

View file

@ -4,12 +4,12 @@
This section uses [Mint](https://github.com/mint-lang/mint) as an example for how to build a Crystal package. This section uses [Mint](https://github.com/mint-lang/mint) as an example for how to build a Crystal package.
If the Crystal project has any dependencies, the first step is to get a `shards.nix` file encoding those. Get a copy of the project and go to its root directory such that its `shard.lock` file is in the current directory, then run `crystal2nix` in it If the Crystal project has any dependencies, the first step is to get a `shards.nix` file encoding those. Get a copy of the project and go to its root directory such that its `shard.lock` file is in the current directory. Executable projects should usually commit the `shard.lock` file, but sometimes that's not the case, which means you need to generate it yourself. With an existing `shard.lock` file, `crystal2nix` can be run.
```bash ```bash
$ git clone https://github.com/mint-lang/mint $ git clone https://github.com/mint-lang/mint
$ cd mint $ cd mint
$ git checkout 0.5.0 $ git checkout 0.5.0
$ if [ ! -f shard.lock ]; then nix-shell -p shards --run "shards lock"; fi
$ nix-shell -p crystal2nix --run crystal2nix $ nix-shell -p crystal2nix --run crystal2nix
``` ```

View file

@ -50,7 +50,7 @@ expression does not protect the Prelude import with a semantic integrity
check, so the first step is to freeze the expression using `dhall freeze`, check, so the first step is to freeze the expression using `dhall freeze`,
like this: like this:
```bash ```ShellSession
$ dhall freeze --inplace ./true.dhall $ dhall freeze --inplace ./true.dhall
``` ```
@ -113,7 +113,7 @@ in
… which we can then build using this command: … which we can then build using this command:
```bash ```ShellSession
$ nix build --file ./example.nix dhallPackages.true $ nix build --file ./example.nix dhallPackages.true
``` ```
@ -121,7 +121,7 @@ $ nix build --file ./example.nix dhallPackages.true
The above package produces the following directory tree: The above package produces the following directory tree:
```bash ```ShellSession
$ tree -a ./result $ tree -a ./result
result result
├── .cache ├── .cache
@ -135,7 +135,7 @@ result
* `source.dhall` contains the result of interpreting our Dhall package: * `source.dhall` contains the result of interpreting our Dhall package:
```bash ```ShellSession
$ cat ./result/source.dhall $ cat ./result/source.dhall
True True
``` ```
@ -143,7 +143,7 @@ result
* The `.cache` subdirectory contains one binary cache product encoding the * The `.cache` subdirectory contains one binary cache product encoding the
same result as `source.dhall`: same result as `source.dhall`:
```bash ```ShellSession
$ dhall decode < ./result/.cache/dhall/122027abdeddfe8503496adeb623466caa47da5f63abd2bc6fa19f6cfcb73ecfed70 $ dhall decode < ./result/.cache/dhall/122027abdeddfe8503496adeb623466caa47da5f63abd2bc6fa19f6cfcb73ecfed70
True True
``` ```
@ -151,7 +151,7 @@ result
* `binary.dhall` contains a Dhall expression which handles fetching and decoding * `binary.dhall` contains a Dhall expression which handles fetching and decoding
the same cache product: the same cache product:
```bash ```ShellSession
$ cat ./result/binary.dhall $ cat ./result/binary.dhall
missing sha256:27abdeddfe8503496adeb623466caa47da5f63abd2bc6fa19f6cfcb73ecfed70 missing sha256:27abdeddfe8503496adeb623466caa47da5f63abd2bc6fa19f6cfcb73ecfed70
$ cp -r ./result/.cache .cache $ cp -r ./result/.cache .cache
@ -168,7 +168,7 @@ to conserve disk space when they are used exclusively as dependencies. For
example, if we build the Prelude package it will only contain the binary example, if we build the Prelude package it will only contain the binary
encoding of the expression: encoding of the expression:
```bash ```ShellSession
$ nix build --file ./example.nix dhallPackages.Prelude $ nix build --file ./example.nix dhallPackages.Prelude
$ tree -a result $ tree -a result
@ -199,7 +199,7 @@ Dhall overlay like this:
… and now the Prelude will contain the fully decoded result of interpreting … and now the Prelude will contain the fully decoded result of interpreting
the Prelude: the Prelude:
```bash ```ShellSession
$ nix build --file ./example.nix dhallPackages.Prelude $ nix build --file ./example.nix dhallPackages.Prelude
$ tree -a result $ tree -a result
@ -302,7 +302,7 @@ Additionally, `buildDhallGitHubPackage` accepts the same arguments as
You can use the `dhall-to-nixpkgs` command-line utility to automate You can use the `dhall-to-nixpkgs` command-line utility to automate
packaging Dhall code. For example: packaging Dhall code. For example:
```bash ```ShellSession
$ nix-env --install --attr haskellPackages.dhall-nixpkgs $ nix-env --install --attr haskellPackages.dhall-nixpkgs
$ nix-env --install --attr nix-prefetch-git # Used by dhall-to-nixpkgs $ nix-env --install --attr nix-prefetch-git # Used by dhall-to-nixpkgs
@ -329,12 +329,12 @@ The utility takes care of automatically detecting remote imports and converting
them to package dependencies. You can also use the utility on local them to package dependencies. You can also use the utility on local
Dhall directories, too: Dhall directories, too:
```bash ```ShellSession
$ dhall-to-nixpkgs directory ~/proj/dhall-semver $ dhall-to-nixpkgs directory ~/proj/dhall-semver
{ buildDhallDirectoryPackage, Prelude }: { buildDhallDirectoryPackage, Prelude }:
buildDhallDirectoryPackage { buildDhallDirectoryPackage {
name = "proj"; name = "proj";
src = /Users/gabriel/proj/dhall-semver; src = ~/proj/dhall-semver;
file = "package.dhall"; file = "package.dhall";
source = false; source = false;
document = false; document = false;
@ -342,6 +342,37 @@ $ dhall-to-nixpkgs directory ~/proj/dhall-semver
} }
``` ```
### Remote imports as fixed-output derivations {#ssec-dhall-remote-imports-as-fod}
`dhall-to-nixpkgs` has the ability to fetch and build remote imports as
fixed-output derivations by using their Dhall integrity check. This is
sometimes easier than manually packaging all remote imports.
This can be used like the following:
```ShellSession
$ dhall-to-nixpkgs directory --fixed-output-derivations ~/proj/dhall-semver
{ buildDhallDirectoryPackage, buildDhallUrl }:
buildDhallDirectoryPackage {
name = "proj";
src = ~/proj/dhall-semver;
file = "package.dhall";
source = false;
document = false;
dependencies = [
(buildDhallUrl {
url = "https://prelude.dhall-lang.org/v17.0.0/package.dhall";
hash = "sha256-ENs8kZwl6QRoM9+Jeo/+JwHcOQ+giT2VjDQwUkvlpD4=";
dhallHash = "sha256:10db3c919c25e9046833df897a8ffe2701dc390fa0893d958c3430524be5a43e";
})
];
}
```
Here, `dhall-semver`'s `Prelude` dependency is fetched and built with the
`buildDhallUrl` helper function, instead of being passed in as a function
argument.
## Overriding dependency versions {#ssec-dhall-overriding-dependency-versions} ## Overriding dependency versions {#ssec-dhall-overriding-dependency-versions}
Suppose that we change our `true.dhall` example expression to depend on an older Suppose that we change our `true.dhall` example expression to depend on an older
@ -359,7 +390,7 @@ in Prelude.Bool.not False
If we try to rebuild that expression the build will fail: If we try to rebuild that expression the build will fail:
``` ```ShellSession
$ nix build --file ./example.nix dhallPackages.true $ nix build --file ./example.nix dhallPackages.true
builder for '/nix/store/0f1hla7ff1wiaqyk1r2ky4wnhnw114fi-true.drv' failed with exit code 1; last 10 log lines: builder for '/nix/store/0f1hla7ff1wiaqyk1r2ky4wnhnw114fi-true.drv' failed with exit code 1; last 10 log lines:
@ -385,7 +416,7 @@ importing the URL.
However, we can override the default Prelude version by using `dhall-to-nixpkgs` However, we can override the default Prelude version by using `dhall-to-nixpkgs`
to create a Dhall package for our desired Prelude: to create a Dhall package for our desired Prelude:
```bash ```ShellSession
$ dhall-to-nixpkgs github https://github.com/dhall-lang/dhall-lang.git \ $ dhall-to-nixpkgs github https://github.com/dhall-lang/dhall-lang.git \
--name Prelude \ --name Prelude \
--directory Prelude \ --directory Prelude \
@ -396,7 +427,7 @@ $ dhall-to-nixpkgs github https://github.com/dhall-lang/dhall-lang.git \
… and then referencing that package in our Dhall overlay, by either overriding … and then referencing that package in our Dhall overlay, by either overriding
the Prelude globally for all packages, like this: the Prelude globally for all packages, like this:
```bash ```nix
dhallOverrides = self: super: { dhallOverrides = self: super: {
true = self.callPackage ./true.nix { }; true = self.callPackage ./true.nix { };
@ -407,7 +438,7 @@ the Prelude globally for all packages, like this:
… or selectively overriding the Prelude dependency for just the `true` package, … or selectively overriding the Prelude dependency for just the `true` package,
like this: like this:
```bash ```nix
dhallOverrides = self: super: { dhallOverrides = self: super: {
true = self.callPackage ./true.nix { true = self.callPackage ./true.nix {
Prelude = self.callPackage ./Prelude.nix { }; Prelude = self.callPackage ./Prelude.nix { };

View file

@ -71,15 +71,19 @@ The `dotnetCorePackages.sdk` contains both a runtime and the full sdk of a given
To package Dotnet applications, you can use `buildDotnetModule`. This has similar arguments to `stdenv.mkDerivation`, with the following additions: To package Dotnet applications, you can use `buildDotnetModule`. This has similar arguments to `stdenv.mkDerivation`, with the following additions:
* `projectFile` has to be used for specifying the dotnet project file relative to the source root. These usually have `.sln` or `.csproj` file extensions. * `projectFile` has to be used for specifying the dotnet project file relative to the source root. These usually have `.sln` or `.csproj` file extensions. This can be an array of multiple projects as well.
* `nugetDeps` has to be used to specify the NuGet dependency file. Unfortunately, these cannot be deterministically fetched without a lockfile. This file should be generated using `nuget-to-nix` tool, which is available in nixpkgs. * `nugetDeps` has to be used to specify the NuGet dependency file. Unfortunately, these cannot be deterministically fetched without a lockfile. This file should be generated using `nuget-to-nix` tool, which is available in nixpkgs.
* `executables` is used to specify which executables get wrapped to `$out/bin`, relative to `$out/lib/$pname`. If this is unset, all executables generated will get installed. If you do not want to install any, set this to `[]`. * `executables` is used to specify which executables get wrapped to `$out/bin`, relative to `$out/lib/$pname`. If this is unset, all executables generated will get installed. If you do not want to install any, set this to `[]`.
* `runtimeDeps` is used to wrap libraries into `LD_LIBRARY_PATH`. This is how dotnet usually handles runtime dependencies. * `runtimeDeps` is used to wrap libraries into `LD_LIBRARY_PATH`. This is how dotnet usually handles runtime dependencies.
* `buildType` is used to change the type of build. Possible values are `Release`, `Debug`, etc. By default, this is set to `Release`. * `buildType` is used to change the type of build. Possible values are `Release`, `Debug`, etc. By default, this is set to `Release`.
* `dotnet-sdk` is useful in cases where you need to change what dotnet SDK is being used. * `dotnet-sdk` is useful in cases where you need to change what dotnet SDK is being used.
* `dotnet-runtime` is useful in cases where you need to change what dotnet runtime is being used. * `dotnet-runtime` is useful in cases where you need to change what dotnet runtime is being used. This can be either a regular dotnet runtime, or an aspnetcore.
* `dotnet-test-sdk` is useful in cases where unit tests expect a different dotnet SDK. By default, this is set to the `dotnet-sdk` attribute.
* `testProjectFile` is useful in cases where the regular project file does not contain the unit tests. By default, this is set to the `projectFile` attribute.
* `disabledTests` is used to disable running specific unit tests. This gets passed as: `dotnet test --filter "FullyQualifiedName!={}"`, to ensure compatibility with all unit test frameworks.
* `dotnetRestoreFlags` can be used to pass flags to `dotnet restore`. * `dotnetRestoreFlags` can be used to pass flags to `dotnet restore`.
* `dotnetBuildFlags` can be used to pass flags to `dotnet build`. * `dotnetBuildFlags` can be used to pass flags to `dotnet build`.
* `dotnetTestFlags` can be used to pass flags to `dotnet test`.
* `dotnetInstallFlags` can be used to pass flags to `dotnet install`. * `dotnetInstallFlags` can be used to pass flags to `dotnet install`.
* `dotnetFlags` can be used to pass flags to all of the above phases. * `dotnetFlags` can be used to pass flags to all of the above phases.

View file

@ -1,5 +1,31 @@
# OCaml {#sec-language-ocaml} # OCaml {#sec-language-ocaml}
## User guide {#sec-language-ocaml-user-guide}
OCaml libraries are available in attribute sets of the form `ocaml-ng.ocamlPackages_X_XX` where X is to be replaced with the desired compiler version. For example, ocamlgraph compiled with OCaml 4.12 can be found in `ocaml-ng.ocamlPackages_4_12.ocamlgraph`. The compiler itself is also located in this set, under the name `ocaml`.
If you don't care about the exact compiler version, `ocamlPackages` is a top-level alias pointing to a recent version of OCaml.
OCaml applications are usually available top-level, and not inside `ocamlPackages`. Notable exceptions are build tools that must be built with the same compiler version as the compiler you intend to use like `dune` or `ocaml-lsp`.
To open a shell able to build a typical OCaml project, put the dependencies in `buildInputs` and add `ocamlPackages.ocaml` and `ocamlPackages.findlib` to `nativeBuildInputs` at least.
For example:
```nix
let
pkgs = import <nixpkgs> {};
# choose the ocaml version you want to use
ocamlPackages = pkgs.ocaml-ng.ocamlPackages_4_12;
in
pkgs.mkShell {
# build tools
nativeBuildInputs = with ocamlPackages; [ ocaml findlib dune_2 ocaml-lsp ];
# dependencies
buildInputs = with ocamlPackages; [ ocamlgraph ];
}
```
## Packaging guide {#sec-language-ocaml-packaging}
OCaml libraries should be installed in `$(out)/lib/ocaml/${ocaml.version}/site-lib/`. Such directories are automatically added to the `$OCAMLPATH` environment variable when building another package that depends on them or when opening a `nix-shell`. OCaml libraries should be installed in `$(out)/lib/ocaml/${ocaml.version}/site-lib/`. Such directories are automatically added to the `$OCAMLPATH` environment variable when building another package that depends on them or when opening a `nix-shell`.
Given that most of the OCaml ecosystem is now built with dune, nixpkgs includes a convenience build support function called `buildDunePackage` that will build an OCaml package using dune, OCaml and findlib and any additional dependencies provided as `buildInputs` or `propagatedBuildInputs`. Given that most of the OCaml ecosystem is now built with dune, nixpkgs includes a convenience build support function called `buildDunePackage` that will build an OCaml package using dune, OCaml and findlib and any additional dependencies provided as `buildInputs` or `propagatedBuildInputs`.

View file

@ -765,7 +765,7 @@ and in this case the `python38` interpreter is automatically used.
### Interpreters {#interpreters} ### Interpreters {#interpreters}
Versions 2.7, 3.6, 3.7, 3.8 and 3.9 of the CPython interpreter are available as Versions 2.7, 3.6, 3.7, 3.8 and 3.9 of the CPython interpreter are available as
respectively `python27`, `python36`, `python37`, `python38` and `python39`. The respectively `python27`, `python37`, `python38` and `python39`. The
aliases `python2` and `python3` correspond to respectively `python27` and aliases `python2` and `python3` correspond to respectively `python27` and
`python39`. The attribute `python` maps to `python2`. The PyPy interpreters `python39`. The attribute `python` maps to `python2`. The PyPy interpreters
compatible with Python 2.7 and 3 are available as `pypy27` and `pypy3`, with compatible with Python 2.7 and 3 are available as `pypy27` and `pypy3`, with
@ -830,10 +830,10 @@ attribute set is created for each available Python interpreter. The available
sets are sets are
* `pkgs.python27Packages` * `pkgs.python27Packages`
* `pkgs.python36Packages`
* `pkgs.python37Packages` * `pkgs.python37Packages`
* `pkgs.python38Packages` * `pkgs.python38Packages`
* `pkgs.python39Packages` * `pkgs.python39Packages`
* `pkgs.python310Packages`
* `pkgs.pypyPackages` * `pkgs.pypyPackages`
and the aliases and the aliases

View file

@ -13,7 +13,7 @@ into your `configuration.nix` or bring them into scope with `nix-shell -p rustc
For other versions such as daily builds (beta and nightly), For other versions such as daily builds (beta and nightly),
use either `rustup` from nixpkgs (which will manage the rust installation in your home directory), use either `rustup` from nixpkgs (which will manage the rust installation in your home directory),
or use Mozilla's [Rust nightlies overlay](#using-the-rust-nightlies-overlay). or use a community maintained [Rust overlay](#using-community-rust-overlays).
## Compiling Rust applications with Cargo {#compiling-rust-applications-with-cargo} ## Compiling Rust applications with Cargo {#compiling-rust-applications-with-cargo}
@ -186,6 +186,33 @@ added. To find the correct hash, you can first use `lib.fakeSha256` or
`lib.fakeHash` as a stub hash. Building the package (and thus the `lib.fakeHash` as a stub hash. Building the package (and thus the
vendored dependencies) will then inform you of the correct hash. vendored dependencies) will then inform you of the correct hash.
### Cargo features {#cargo-features}
You can disable default features using `buildNoDefaultFeatures`, and
extra features can be added with `buildFeatures`.
If you want to use different features for check phase, you can use
`checkNoDefaultFeatures` and `checkFeatures`. They are only passed to
`cargo test` and not `cargo build`. If left unset, they default to
`buildNoDefaultFeatures` and `buildFeatures`.
For example:
```nix
rustPlatform.buildRustPackage rec {
pname = "myproject";
version = "1.0.0";
buildNoDefaultFeatures = true;
buildFeatures = [ "color" "net" ];
# disable network features in tests
checkFeatures = [ "color" ];
# ...
}
```
### Cross compilation {#cross-compilation} ### Cross compilation {#cross-compilation}
By default, Rust packages are compiled for the host platform, just like any By default, Rust packages are compiled for the host platform, just like any
@ -261,7 +288,7 @@ rustPlatform.buildRustPackage {
Please note that the code will be compiled twice here: once in `release` mode Please note that the code will be compiled twice here: once in `release` mode
for the `buildPhase`, and again in `debug` mode for the `checkPhase`. for the `buildPhase`, and again in `debug` mode for the `checkPhase`.
Test flags, e.g., `--features xxx/yyy`, can be passed to `cargo test` via the Test flags, e.g., `--package foo`, can be passed to `cargo test` via the
`cargoTestFlags` attribute. `cargoTestFlags` attribute.
Another attribute, called `checkFlags`, is used to pass arguments to the test Another attribute, called `checkFlags`, is used to pass arguments to the test
@ -411,7 +438,7 @@ you of the correct hash.
`rustPlatform` provides the following hooks to automate Cargo builds: `rustPlatform` provides the following hooks to automate Cargo builds:
* `cargoSetupHook`: configure Cargo to use depenencies vendored * `cargoSetupHook`: configure Cargo to use dependencies vendored
through `fetchCargoTarball`. This hook uses the `cargoDeps` through `fetchCargoTarball`. This hook uses the `cargoDeps`
environment variable to find the vendored dependencies. If a project environment variable to find the vendored dependencies. If a project
already vendors its dependencies, the variable `cargoVendorDir` can already vendors its dependencies, the variable `cargoVendorDir` can
@ -421,18 +448,20 @@ you of the correct hash.
* `cargoBuildHook`: use Cargo to build a crate. If the crate to be * `cargoBuildHook`: use Cargo to build a crate. If the crate to be
built is a crate in e.g. a Cargo workspace, the relative path to the built is a crate in e.g. a Cargo workspace, the relative path to the
crate to build can be set through the optional `buildAndTestSubdir` crate to build can be set through the optional `buildAndTestSubdir`
environment variable. Additional Cargo build flags can be passed environment variable. Features can be specified with
through `cargoBuildFlags`. `cargoBuildNoDefaultFeatures` and `cargoBuildFeatures`. Additional
Cargo build flags can be passed through `cargoBuildFlags`.
* `maturinBuildHook`: use [Maturin](https://github.com/PyO3/maturin) * `maturinBuildHook`: use [Maturin](https://github.com/PyO3/maturin)
to build a Python wheel. Similar to `cargoBuildHook`, the optional to build a Python wheel. Similar to `cargoBuildHook`, the optional
variable `buildAndTestSubdir` can be used to build a crate in a variable `buildAndTestSubdir` can be used to build a crate in a
Cargo workspace. Additional maturin flags can be passed through Cargo workspace. Additional Maturin flags can be passed through
`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`. Additional flags can be passed to can be set using `cargoCheckType`. Features can be specified with
the tests using `checkFlags` and `checkFlagsArray`. By default, `cargoCheckNoDefaultFeaatures` and `cargoCheckFeatures`. Additional
tests are run in parallel. This can be disabled by setting flags can be passed to the tests using `checkFlags` and
`dontUseCargoParallelTests`. `checkFlagsArray`. By default, tests are run in parallel. This can
be disabled by setting `dontUseCargoParallelTests`.
* `cargoInstallHook`: install binaries and static/shared libraries * `cargoInstallHook`: install binaries and static/shared libraries
that were built using `cargoBuildHook`. that were built using `cargoBuildHook`.
@ -447,7 +476,7 @@ dependencies. The build itself is then performed by
The following example outlines how the `tokenizers` Python package is The following example outlines how the `tokenizers` Python package is
built. Since the Python package is in the `source/bindings/python` built. Since the Python package is in the `source/bindings/python`
directory of the *tokenizers* project's source archive, we use directory of the `tokenizers` project's source archive, we use
`sourceRoot` to point the tooling to this directory: `sourceRoot` to point the tooling to this directory:
```nix ```nix
@ -672,7 +701,7 @@ Some crates require external libraries. For crates from
`defaultCrateOverrides` package in nixpkgs itself. `defaultCrateOverrides` package in nixpkgs itself.
Starting from that file, one can add more overrides, to add features Starting from that file, one can add more overrides, to add features
or build inputs by overriding the hello crate in a seperate file. or build inputs by overriding the hello crate in a separate file.
```nix ```nix
with import <nixpkgs> {}; with import <nixpkgs> {};
@ -729,7 +758,7 @@ with import <nixpkgs> {};
Actually, the overrides introduced in the previous section are more Actually, the overrides introduced in the previous section are more
general. A number of other parameters can be overridden: general. A number of other parameters can be overridden:
- The version of rustc used to compile the crate: - The version of `rustc` used to compile the crate:
```nix ```nix
(hello {}).override { rust = pkgs.rust; }; (hello {}).override { rust = pkgs.rust; };
@ -742,7 +771,7 @@ general. A number of other parameters can be overridden:
(hello {}).override { release = false; }; (hello {}).override { release = false; };
``` ```
- Whether to print the commands sent to rustc when building - Whether to print the commands sent to `rustc` when building
(equivalent to `--verbose` in cargo: (equivalent to `--verbose` in cargo:
```nix ```nix
@ -871,11 +900,87 @@ rustc 1.26.0-nightly (188e693b3 2018-03-26)
To see that you are using nightly. To see that you are using nightly.
## Using the Rust nightlies overlay {#using-the-rust-nightlies-overlay} ## Using community Rust overlays {#using-community-rust-overlays}
Mozilla provides an overlay for nixpkgs to bring a nightly version of Rust into scope. There are two community maintained approaches to Rust toolchain management:
This overlay can _also_ be used to install recent unstable or stable versions - [oxalica's Rust overlay](https://github.com/oxalica/rust-overlay)
of Rust, if desired. - [fenix](https://github.com/nix-community/fenix)
Oxalica's overlay allows you to select a particular Rust version and components.
See [their documentation](https://github.com/oxalica/rust-overlay#rust-overlay) for more
detailed usage.
Fenix is an alternative to `rustup` and can also be used as an overlay.
Both oxalica's overlay and fenix better integrate with nix and cache optimizations.
Because of this and ergonomics, either of those community projects
should be preferred to the Mozilla's Rust overlay (`nixpkgs-mozilla`).
### How to select a specific `rustc` and toolchain version {#how-to-select-a-specific-rustc-and-toolchain-version}
You can consume the oxalica overlay and use it to grab a specific Rust toolchain version.
Here is an example `shell.nix` showing how to grab the current stable toolchain:
```nix
{ pkgs ? import <nixpkgs> {
overlays = [
(import (fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"))
];
}
}:
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
pkg-config
rust-bin.stable.latest.minimal
];
}
```
You can try this out by:
1. Saving that to `shell.nix`
2. Executing `nix-shell --pure --command 'rustc --version'`
As of writing, this prints out `rustc 1.56.0 (09c42c458 2021-10-18)`.
### How to use an overlay toolchain in a derivation {#how-to-use-an-overlay-toolchain-in-a-derivation}
You can also use an overlay's Rust toolchain with `buildRustPackage`.
The below snippet demonstrates invoking `buildRustPackage` with an oxalica overlay selected Rust toolchain:
```nix
with import <nixpkgs> {
overlays = [
(import (fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"))
];
};
rustPlatform.buildRustPackage rec {
pname = "ripgrep";
version = "12.1.1";
nativeBuildInputs = [
rust-bin.stable.latest.minimal
];
src = fetchFromGitHub {
owner = "BurntSushi";
repo = "ripgrep";
rev = version;
sha256 = "1hqps7l5qrjh9f914r5i6kmcz6f1yb951nv4lby0cjnp5l253kps";
};
cargoSha256 = "03wf9r2csi6jpa7v5sw5lpxkrk4wfzwmzx7k3991q3bdjzcwnnwp";
meta = with lib; {
description = "A fast line-oriented regex search tool, similar to ag and ack";
homepage = "https://github.com/BurntSushi/ripgrep";
license = licenses.unlicense;
maintainers = [ maintainers.tailhook ];
};
}
```
Follow the below steps to try that snippet.
1. create a new directory
1. save the above snippet as `default.nix` in that directory
1. cd into that directory and run `nix-build`
### Rust overlay installation {#rust-overlay-installation} ### Rust overlay installation {#rust-overlay-installation}
@ -883,27 +988,15 @@ You can use this overlay by either changing your local nixpkgs configuration,
or by adding the overlay declaratively in a nix expression, e.g. in `configuration.nix`. or by adding the overlay declaratively in a nix expression, e.g. in `configuration.nix`.
For more information see [the manual on installing overlays](#sec-overlays-install). For more information see [the manual on installing overlays](#sec-overlays-install).
#### Imperative rust overlay installation {#imperative-rust-overlay-installation} ### Declarative Rust overlay installation {#declarative-rust-overlay-installation}
Clone [nixpkgs-mozilla](https://github.com/mozilla/nixpkgs-mozilla),
and create a symbolic link to the file
[rust-overlay.nix](https://github.com/mozilla/nixpkgs-mozilla/blob/master/rust-overlay.nix)
in the `~/.config/nixpkgs/overlays` directory.
```ShellSession
$ git clone https://github.com/mozilla/nixpkgs-mozilla.git
$ mkdir -p ~/.config/nixpkgs/overlays
$ ln -s $(pwd)/nixpkgs-mozilla/rust-overlay.nix ~/.config/nixpkgs/overlays/rust-overlay.nix
```
### Declarative rust overlay installation {#declarative-rust-overlay-installation}
This snippet shows how to use oxalica's Rust overlay.
Add the following to your `configuration.nix`, `home-configuration.nix`, `shell.nix`, or similar: Add the following to your `configuration.nix`, `home-configuration.nix`, `shell.nix`, or similar:
```nix ```nix
{ pkgs ? import <nixpkgs> { { pkgs ? import <nixpkgs> {
overlays = [ overlays = [
(import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz)) (import (builtins.fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"))
# Further overlays go here # Further overlays go here
]; ];
}; };
@ -911,36 +1004,3 @@ Add the following to your `configuration.nix`, `home-configuration.nix`, `shell.
``` ```
Note that this will fetch the latest overlay version when rebuilding your system. Note that this will fetch the latest overlay version when rebuilding your system.
### Rust overlay usage {#rust-overlay-usage}
The overlay contains attribute sets corresponding to different versions of the rust toolchain, such as:
* `latest.rustChannels.stable`
* `latest.rustChannels.nightly`
* a function `rustChannelOf`, called as `(rustChannelOf { date = "2018-04-11"; channel = "nightly"; })`, or...
* `(nixpkgs.rustChannelOf { rustToolchain = ./rust-toolchain; })` if you have a local `rust-toolchain` file (see https://github.com/mozilla/nixpkgs-mozilla#using-in-nix-expressions for an example)
Each of these contain packages such as `rust`, which contains your usual rust development tools with the respective toolchain chosen.
For example, you might want to add `latest.rustChannels.stable.rust` to the list of packages in your configuration.
Imperatively, the latest stable version can be installed with the following command:
```ShellSession
$ nix-env -Ai nixpkgs.latest.rustChannels.stable.rust
```
Or using the attribute with nix-shell:
```ShellSession
$ nix-shell -p nixpkgs.latest.rustChannels.stable.rust
```
Substitute the `nixpkgs` prefix with `nixos` on NixOS.
To install the beta or nightly channel, "stable" should be substituted by
"nightly" or "beta", or
use the function provided by this overlay to pull a version based on a
build date.
The overlay automatically updates itself as it uses the same source as
[rustup](https://www.rustup.rs/).

View file

@ -112,7 +112,7 @@ self: super:
This overlay uses Intel's MKL library for both BLAS and LAPACK interfaces. Note that the same can be accomplished at runtime using `LD_LIBRARY_PATH` of `libblas.so.3` and `liblapack.so.3`. For instance: This overlay uses Intel's MKL library for both BLAS and LAPACK interfaces. Note that the same can be accomplished at runtime using `LD_LIBRARY_PATH` of `libblas.so.3` and `liblapack.so.3`. For instance:
```ShellSession ```ShellSession
$ LD_LIBRARY_PATH=$(nix-build -A mkl)/lib:$LD_LIBRARY_PATH nix-shell -p octave --run octave $ LD_LIBRARY_PATH=$(nix-build -A mkl)/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH nix-shell -p octave --run octave
``` ```
Intel MKL requires an `openmp` implementation when running with multiple processors. By default, `mkl` will use Intel's `iomp` implementation if no other is specified, but this is a runtime-only dependency and binary compatible with the LLVM implementation. To use that one instead, Intel recommends users set it with `LD_PRELOAD`. Note that `mkl` is only available on `x86_64-linux` and `x86_64-darwin`. Moreover, Hydra is not building and distributing pre-compiled binaries using it. Intel MKL requires an `openmp` implementation when running with multiple processors. By default, `mkl` will use Intel's `iomp` implementation if no other is specified, but this is a runtime-only dependency and binary compatible with the LLVM implementation. To use that one instead, Intel recommends users set it with `LD_PRELOAD`. Note that `mkl` is only available on `x86_64-linux` and `x86_64-darwin`. Moreover, Hydra is not building and distributing pre-compiled binaries using it.

View file

@ -119,7 +119,7 @@ let
mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
mkAliasOptionModule doRename; mkAliasOptionModule mkDerivedConfig doRename;
inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions
mergeDefaultOption mergeOneOption mergeEqualOption getValues mergeDefaultOption mergeOneOption mergeEqualOption getValues
getFiles optionAttrSetToDocList optionAttrSetToDocList' getFiles optionAttrSetToDocList optionAttrSetToDocList'

View file

@ -663,9 +663,6 @@ rec {
/* Test if two lists have no common element. /* Test if two lists have no common element.
It should be slightly more efficient than (intersectLists a b == []) It should be slightly more efficient than (intersectLists a b == [])
*/ */
mutuallyExclusive = a: b: mutuallyExclusive = a: b: length a == 0 || !(any (x: elem x a) b);
(builtins.length a) == 0 ||
(!(builtins.elem (builtins.head a) b) &&
mutuallyExclusive (builtins.tail a) b);
} }

View file

@ -52,15 +52,43 @@ in
rec { rec {
/* Evaluate a set of modules. The result is a set of two /*
attributes: options: the nested set of all option declarations, Evaluate a set of modules. The result is a set with the attributes:
and config: the nested set of all option values.
options: The nested set of all option declarations,
config: The nested set of all option values.
type: A module system type representing the module set as a submodule,
to be extended by configuration from the containing module set.
This is also available as the module argument moduleType.
extendModules: A function similar to evalModules but building on top
of the module set. Its arguments, modules and specialArgs are
added to the existing values.
Using extendModules a few times has no performance impact as long
as you only reference the final options and config.
If you do reference multiple config (or options) from before and
after extendModules, performance is the same as with multiple
evalModules invocations, because the new modules' ability to
override existing configuration fundamentally requires a new
fixpoint to be constructed.
This is also available as a module argument.
_module: A portion of the configuration tree which is elided from
config. It contains some values that are mostly internal to the
module system implementation.
!!! Please think twice before adding to this argument list! The more !!! Please think twice before adding to this argument list! The more
that is specified here instead of in the modules themselves the harder that is specified here instead of in the modules themselves the harder
it is to transparently move a set of modules to be a submodule of another it is to transparently move a set of modules to be a submodule of another
config (as the proper arguments need to be replicated at each call to config (as the proper arguments need to be replicated at each call to
evalModules) and the less declarative the module set is. */ evalModules) and the less declarative the module set is. */
evalModules = { modules evalModules = evalModulesArgs@
{ modules
, prefix ? [] , prefix ? []
, # This should only be used for special arguments that need to be evaluated , # This should only be used for special arguments that need to be evaluated
# when resolving module structure (like in imports). For everything else, # when resolving module structure (like in imports). For everything else,
@ -120,7 +148,10 @@ rec {
}; };
config = { config = {
_module.args = args; _module.args = {
inherit extendModules;
moduleType = type;
} // args;
}; };
}; };
@ -183,10 +214,28 @@ rec {
else throw baseMsg else throw baseMsg
else null; else null;
result = builtins.seq checkUnmatched { checked = builtins.seq checkUnmatched;
inherit options;
config = removeAttrs config [ "_module" ]; extendModules = extendArgs@{
inherit (config) _module; modules ? [],
specialArgs ? {},
prefix ? [],
}:
evalModules (evalModulesArgs // {
modules = evalModulesArgs.modules ++ modules;
specialArgs = evalModulesArgs.specialArgs or {} // specialArgs;
prefix = extendArgs.prefix or evalModulesArgs.prefix;
});
type = lib.types.submoduleWith {
inherit modules specialArgs;
};
result = {
options = checked options;
config = checked (removeAttrs config [ "_module" ]);
_module = checked (config._module);
inherit extendModules type;
}; };
in result; in result;
@ -912,6 +961,26 @@ rec {
use = id; use = id;
}; };
/* mkDerivedConfig : Option a -> (a -> Definition b) -> Definition b
Create config definitions with the same priority as the definition of another option.
This should be used for option definitions where one option sets the value of another as a convenience.
For instance a config file could be set with a `text` or `source` option, where text translates to a `source`
value using `mkDerivedConfig options.text (pkgs.writeText "filename.conf")`.
It takes care of setting the right priority using `mkOverride`.
*/
# TODO: make the module system error message include information about `opt` in
# error messages about conflicts. E.g. introduce a variation of `mkOverride` which
# adds extra location context to the definition object. This will allow context to be added
# to all messages that report option locations "this value was derived from <full option name>
# which was defined in <locations>". It can provide a trace of options that contributed
# to definitions.
mkDerivedConfig = opt: f:
mkOverride
(opt.highestPrio or defaultPriority)
(f opt.value);
doRename = { from, to, visible, warn, use, withPriority ? true }: doRename = { from, to, visible, warn, use, withPriority ? true }:
{ config, options, ... }: { config, options, ... }:
let let

View file

@ -74,7 +74,7 @@ rec {
apply ? null, apply ? null,
# Whether the option is for NixOS developers only. # Whether the option is for NixOS developers only.
internal ? null, internal ? null,
# Whether the option shows up in the manual. # Whether the option shows up in the manual. Default: true. Use false to hide the option and any sub-options from submodules. Use "shallow" to hide only sub-options.
visible ? null, visible ? null,
# Whether the option can be set only once # Whether the option can be set only once
readOnly ? null, readOnly ? null,
@ -180,7 +180,10 @@ rec {
description = opt.description or (lib.warn "Option `${name}' has no description." "This option has no description."); description = opt.description or (lib.warn "Option `${name}' has no description." "This option has no description.");
declarations = filter (x: x != unknownModule) opt.declarations; declarations = filter (x: x != unknownModule) opt.declarations;
internal = opt.internal or false; internal = opt.internal or false;
visible = opt.visible or true; visible =
if (opt?visible && opt.visible == "shallow")
then true
else opt.visible or true;
readOnly = opt.readOnly or false; readOnly = opt.readOnly or false;
type = opt.type.description or null; type = opt.type.description or null;
} }
@ -192,8 +195,9 @@ rec {
subOptions = subOptions =
let ss = opt.type.getSubOptions opt.loc; let ss = opt.type.getSubOptions opt.loc;
in if ss != {} then optionAttrSetToDocList' opt.loc ss else []; in if ss != {} then optionAttrSetToDocList' opt.loc ss else [];
subOptionsVisible = docOption.visible && opt.visible or null != "shallow";
in in
[ docOption ] ++ optionals docOption.visible subOptions) (collect isOption options); [ docOption ] ++ optionals subOptionsVisible subOptions) (collect isOption options);
/* This function recursively removes all derivation attributes from /* This function recursively removes all derivation attributes from

View file

@ -369,7 +369,7 @@ rec {
Example: Example:
escapeXML ''"test" 'test' < & >'' escapeXML ''"test" 'test' < & >''
=> "\\[\\^a-z]\\*" => "&quot;test&quot; &apos;test&apos; &lt; &amp; &gt;"
*/ */
escapeXML = builtins.replaceStrings escapeXML = builtins.replaceStrings
["\"" "'" "<" ">" "&"] ["\"" "'" "<" ">" "&"]

View file

@ -258,6 +258,12 @@ rec {
platform = {}; platform = {};
}; };
x86_64-darwin = {
config = "x86_64-apple-darwin";
xcodePlatform = "MacOSX";
platform = {};
};
# #
# Windows # Windows
# #

View file

@ -20,15 +20,17 @@ rec {
name = "PowerNV"; name = "PowerNV";
baseConfig = "powernv_defconfig"; baseConfig = "powernv_defconfig";
target = "zImage"; target = "vmlinux";
installTarget = "install";
file = "vmlinux";
autoModules = true; autoModules = true;
# avoid driver/FS trouble arising from unusual page size # avoid driver/FS trouble arising from unusual page size
extraConfig = '' extraConfig = ''
PPC_64K_PAGES n PPC_64K_PAGES n
PPC_4K_PAGES y PPC_4K_PAGES y
IPV6 y IPV6 y
ATA_BMDMA y
ATA_SFF y
VIRTIO_MENU y
''; '';
}; };
}; };

View file

@ -1,8 +1,11 @@
#!/bin/sh #!/usr/bin/env bash
# #
# This script is used to test that the module system is working as expected. # This script is used to test that the module system is working as expected.
# By default it test the version of nixpkgs which is defined in the NIX_PATH. # By default it test the version of nixpkgs which is defined in the NIX_PATH.
set -o errexit -o noclobber -o nounset -o pipefail
shopt -s failglob inherit_errexit
# https://stackoverflow.com/a/246128/6605742 # https://stackoverflow.com/a/246128/6605742
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
@ -13,101 +16,96 @@ fail=0
evalConfig() { evalConfig() {
local attr=$1 local attr=$1
shift; shift
local script="import ./default.nix { modules = [ $@ ];}" local script="import ./default.nix { modules = [ $* ];}"
nix-instantiate --timeout 1 -E "$script" -A "$attr" --eval-only --show-trace --read-write-mode nix-instantiate --timeout 1 -E "$script" -A "$attr" --eval-only --show-trace --read-write-mode
} }
reportFailure() { reportFailure() {
local attr=$1 local attr=$1
shift; shift
local script="import ./default.nix { modules = [ $@ ];}" local script="import ./default.nix { modules = [ $* ];}"
echo 2>&1 "$ nix-instantiate -E '$script' -A '$attr' --eval-only" echo 2>&1 "$ nix-instantiate -E '$script' -A '$attr' --eval-only"
evalConfig "$attr" "$@" evalConfig "$attr" "$@" || true
fail=$((fail + 1)) ((++fail))
} }
checkConfigOutput() { checkConfigOutput() {
local outputContains=$1 local outputContains=$1
shift; shift
if evalConfig "$@" 2>/dev/null | grep --silent "$outputContains" ; then if evalConfig "$@" 2>/dev/null | grep --silent "$outputContains" ; then
pass=$((pass + 1)) ((++pass))
return 0;
else else
echo 2>&1 "error: Expected result matching '$outputContains', while evaluating" echo 2>&1 "error: Expected result matching '$outputContains', while evaluating"
reportFailure "$@" reportFailure "$@"
return 1
fi fi
} }
checkConfigError() { checkConfigError() {
local errorContains=$1 local errorContains=$1
local err="" local err=""
shift; shift
if err==$(evalConfig "$@" 2>&1 >/dev/null); then if err="$(evalConfig "$@" 2>&1 >/dev/null)"; then
echo 2>&1 "error: Expected error code, got exit code 0, while evaluating" echo 2>&1 "error: Expected error code, got exit code 0, while evaluating"
reportFailure "$@" reportFailure "$@"
return 1
else else
if echo "$err" | grep -zP --silent "$errorContains" ; then if echo "$err" | grep -zP --silent "$errorContains" ; then
pass=$((pass + 1)) ((++pass))
return 0;
else else
echo 2>&1 "error: Expected error matching '$errorContains', while evaluating" echo 2>&1 "error: Expected error matching '$errorContains', while evaluating"
reportFailure "$@" reportFailure "$@"
return 1
fi fi
fi fi
} }
# Check boolean option. # Check boolean option.
checkConfigOutput "false" config.enable ./declare-enable.nix checkConfigOutput '^false$' config.enable ./declare-enable.nix
checkConfigError 'The option .* does not exist. Definition values:\n- In .*: true' config.enable ./define-enable.nix checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*: true' config.enable ./define-enable.nix
# Check integer types. # Check integer types.
# unsigned # unsigned
checkConfigOutput "42" config.value ./declare-int-unsigned-value.nix ./define-value-int-positive.nix checkConfigOutput '^42$' config.value ./declare-int-unsigned-value.nix ./define-value-int-positive.nix
checkConfigError 'A definition for option .* is not of type.*unsigned integer.*. Definition values:\n- In .*: -23' config.value ./declare-int-unsigned-value.nix ./define-value-int-negative.nix checkConfigError 'A definition for option .* is not of type.*unsigned integer.*. Definition values:\n\s*- In .*: -23' config.value ./declare-int-unsigned-value.nix ./define-value-int-negative.nix
# positive # positive
checkConfigError 'A definition for option .* is not of type.*positive integer.*. Definition values:\n- In .*: 0' config.value ./declare-int-positive-value.nix ./define-value-int-zero.nix checkConfigError 'A definition for option .* is not of type.*positive integer.*. Definition values:\n\s*- In .*: 0' config.value ./declare-int-positive-value.nix ./define-value-int-zero.nix
# between # between
checkConfigOutput "42" config.value ./declare-int-between-value.nix ./define-value-int-positive.nix checkConfigOutput '^42$' config.value ./declare-int-between-value.nix ./define-value-int-positive.nix
checkConfigError 'A definition for option .* is not of type.*between.*-21 and 43.*inclusive.*. Definition values:\n- In .*: -23' config.value ./declare-int-between-value.nix ./define-value-int-negative.nix checkConfigError 'A definition for option .* is not of type.*between.*-21 and 43.*inclusive.*. Definition values:\n\s*- In .*: -23' config.value ./declare-int-between-value.nix ./define-value-int-negative.nix
# Check either types # Check either types
# types.either # types.either
checkConfigOutput "42" config.value ./declare-either.nix ./define-value-int-positive.nix checkConfigOutput '^42$' config.value ./declare-either.nix ./define-value-int-positive.nix
checkConfigOutput "\"24\"" config.value ./declare-either.nix ./define-value-string.nix checkConfigOutput '^"24"$' config.value ./declare-either.nix ./define-value-string.nix
# types.oneOf # types.oneOf
checkConfigOutput "42" config.value ./declare-oneOf.nix ./define-value-int-positive.nix checkConfigOutput '^42$' config.value ./declare-oneOf.nix ./define-value-int-positive.nix
checkConfigOutput "[ ]" config.value ./declare-oneOf.nix ./define-value-list.nix checkConfigOutput '^\[ \]$' config.value ./declare-oneOf.nix ./define-value-list.nix
checkConfigOutput "\"24\"" config.value ./declare-oneOf.nix ./define-value-string.nix checkConfigOutput '^"24"$' config.value ./declare-oneOf.nix ./define-value-string.nix
# Check mkForce without submodules. # Check mkForce without submodules.
set -- config.enable ./declare-enable.nix ./define-enable.nix set -- config.enable ./declare-enable.nix ./define-enable.nix
checkConfigOutput "true" "$@" checkConfigOutput '^true$' "$@"
checkConfigOutput "false" "$@" ./define-force-enable.nix checkConfigOutput '^false$' "$@" ./define-force-enable.nix
checkConfigOutput "false" "$@" ./define-enable-force.nix checkConfigOutput '^false$' "$@" ./define-enable-force.nix
# Check mkForce with option and submodules. # Check mkForce with option and submodules.
checkConfigError 'attribute .*foo.* .* not found' config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix checkConfigError 'attribute .*foo.* .* not found' config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix
checkConfigOutput 'false' config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix checkConfigOutput '^false$' config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix
set -- config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo-enable.nix set -- config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo-enable.nix
checkConfigOutput 'true' "$@" checkConfigOutput '^true$' "$@"
checkConfigOutput 'false' "$@" ./define-force-attrsOfSub-foo-enable.nix checkConfigOutput '^false$' "$@" ./define-force-attrsOfSub-foo-enable.nix
checkConfigOutput 'false' "$@" ./define-attrsOfSub-force-foo-enable.nix checkConfigOutput '^false$' "$@" ./define-attrsOfSub-force-foo-enable.nix
checkConfigOutput 'false' "$@" ./define-attrsOfSub-foo-force-enable.nix checkConfigOutput '^false$' "$@" ./define-attrsOfSub-foo-force-enable.nix
checkConfigOutput 'false' "$@" ./define-attrsOfSub-foo-enable-force.nix checkConfigOutput '^false$' "$@" ./define-attrsOfSub-foo-enable-force.nix
# Check overriding effect of mkForce on submodule definitions. # Check overriding effect of mkForce on submodule definitions.
checkConfigError 'attribute .*bar.* .* not found' config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix checkConfigError 'attribute .*bar.* .* not found' config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix
checkConfigOutput 'false' config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix ./define-attrsOfSub-bar.nix checkConfigOutput '^false$' config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix ./define-attrsOfSub-bar.nix
set -- config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix ./define-attrsOfSub-bar-enable.nix set -- config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix ./define-attrsOfSub-bar-enable.nix
checkConfigOutput 'true' "$@" checkConfigOutput '^true$' "$@"
checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-force-attrsOfSub-foo-enable.nix checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-force-attrsOfSub-foo-enable.nix
checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-attrsOfSub-force-foo-enable.nix checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-attrsOfSub-force-foo-enable.nix
checkConfigOutput 'true' "$@" ./define-attrsOfSub-foo-force-enable.nix checkConfigOutput '^true$' "$@" ./define-attrsOfSub-foo-force-enable.nix
checkConfigOutput 'true' "$@" ./define-attrsOfSub-foo-enable-force.nix checkConfigOutput '^true$' "$@" ./define-attrsOfSub-foo-enable-force.nix
# Check mkIf with submodules. # Check mkIf with submodules.
checkConfigError 'attribute .*foo.* .* not found' config.attrsOfSub.foo.enable ./declare-enable.nix ./declare-attrsOfSub-any-enable.nix checkConfigError 'attribute .*foo.* .* not found' config.attrsOfSub.foo.enable ./declare-enable.nix ./declare-attrsOfSub-any-enable.nix
@ -115,24 +113,24 @@ set -- config.attrsOfSub.foo.enable ./declare-enable.nix ./declare-attrsOfSub-an
checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-if-attrsOfSub-foo-enable.nix checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-if-attrsOfSub-foo-enable.nix
checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-attrsOfSub-if-foo-enable.nix checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-attrsOfSub-if-foo-enable.nix
checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-attrsOfSub-foo-if-enable.nix checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-attrsOfSub-foo-if-enable.nix
checkConfigOutput 'false' "$@" ./define-attrsOfSub-foo-enable-if.nix checkConfigOutput '^false$' "$@" ./define-attrsOfSub-foo-enable-if.nix
checkConfigOutput 'true' "$@" ./define-enable.nix ./define-if-attrsOfSub-foo-enable.nix checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-if-attrsOfSub-foo-enable.nix
checkConfigOutput 'true' "$@" ./define-enable.nix ./define-attrsOfSub-if-foo-enable.nix checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-if-foo-enable.nix
checkConfigOutput 'true' "$@" ./define-enable.nix ./define-attrsOfSub-foo-if-enable.nix checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-if-enable.nix
checkConfigOutput 'true' "$@" ./define-enable.nix ./define-attrsOfSub-foo-enable-if.nix checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-enable-if.nix
# Check disabledModules with config definitions and option declarations. # Check disabledModules with config definitions and option declarations.
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
checkConfigError "The option .*enable.* does not exist. Definition values:\n- 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
# Check _module.args. # Check _module.args.
set -- config.enable ./declare-enable.nix ./define-enable-with-custom-arg.nix set -- config.enable ./declare-enable.nix ./define-enable-with-custom-arg.nix
checkConfigError 'while evaluating the module argument .*custom.* in .*define-enable-with-custom-arg.nix.*:' "$@" checkConfigError 'while evaluating the module argument .*custom.* in .*define-enable-with-custom-arg.nix.*:' "$@"
checkConfigOutput "true" "$@" ./define-_module-args-custom.nix checkConfigOutput '^true$' "$@" ./define-_module-args-custom.nix
# Check that using _module.args on imports cause infinite recursions, with # Check that using _module.args on imports cause infinite recursions, with
# the proper error context. # the proper error context.
@ -142,71 +140,78 @@ checkConfigError 'infinite recursion encountered' "$@"
# Check _module.check. # Check _module.check.
set -- config.enable ./declare-enable.nix ./define-enable.nix ./define-attrsOfSub-foo.nix set -- config.enable ./declare-enable.nix ./define-enable.nix ./define-attrsOfSub-foo.nix
checkConfigError 'The option .* does not exist. Definition values:\n- In .*' "$@" checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*' "$@"
checkConfigOutput "true" "$@" ./define-module-check.nix checkConfigOutput '^true$' "$@" ./define-module-check.nix
# Check coerced value. # Check coerced value.
checkConfigOutput "\"42\"" config.value ./declare-coerced-value.nix checkConfigOutput '^"42"$' config.value ./declare-coerced-value.nix
checkConfigOutput "\"24\"" config.value ./declare-coerced-value.nix ./define-value-string.nix checkConfigOutput '^"24"$' config.value ./declare-coerced-value.nix ./define-value-string.nix
checkConfigError 'A definition for option .* is not.*string or signed integer convertible to it.*. Definition values:\n- In .*: \[ \]' config.value ./declare-coerced-value.nix ./define-value-list.nix checkConfigError 'A definition for option .* is not.*string or signed integer convertible to it.*. Definition values:\n\s*- In .*: \[ \]' config.value ./declare-coerced-value.nix ./define-value-list.nix
# Check coerced value with unsound coercion # Check coerced value with unsound coercion
checkConfigOutput "12" config.value ./declare-coerced-value-unsound.nix checkConfigOutput '^12$' config.value ./declare-coerced-value-unsound.nix
checkConfigError 'A definition for option .* is not of type .*. Definition values:\n- In .*: "1000"' config.value ./declare-coerced-value-unsound.nix ./define-value-string-bigint.nix checkConfigError 'A definition for option .* is not of type .*. Definition values:\n\s*- In .*: "1000"' config.value ./declare-coerced-value-unsound.nix ./define-value-string-bigint.nix
checkConfigError 'unrecognised JSON value' config.value ./declare-coerced-value-unsound.nix ./define-value-string-arbitrary.nix checkConfigError 'json.exception.parse_error' config.value ./declare-coerced-value-unsound.nix ./define-value-string-arbitrary.nix
# Check mkAliasOptionModule. # Check mkAliasOptionModule.
checkConfigOutput "true" config.enable ./alias-with-priority.nix checkConfigOutput '^true$' config.enable ./alias-with-priority.nix
checkConfigOutput "true" config.enableAlias ./alias-with-priority.nix checkConfigOutput '^true$' config.enableAlias ./alias-with-priority.nix
checkConfigOutput "false" config.enable ./alias-with-priority-can-override.nix checkConfigOutput '^false$' config.enable ./alias-with-priority-can-override.nix
checkConfigOutput "false" config.enableAlias ./alias-with-priority-can-override.nix checkConfigOutput '^false$' config.enableAlias ./alias-with-priority-can-override.nix
# submoduleWith # submoduleWith
## specialArgs should work ## specialArgs should work
checkConfigOutput "foo" config.submodule.foo ./declare-submoduleWith-special.nix checkConfigOutput '^"foo"$' config.submodule.foo ./declare-submoduleWith-special.nix
## shorthandOnlyDefines config behaves as expected ## shorthandOnlyDefines config behaves as expected
checkConfigOutput "true" config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-shorthand.nix checkConfigOutput '^true$' config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-shorthand.nix
checkConfigError 'is not of type `boolean' config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-noshorthand.nix checkConfigError 'is not of type `boolean' config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-noshorthand.nix
checkConfigError "You're trying to declare a value of type \`bool'\nrather than an attribute-set for the option" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-shorthand.nix checkConfigError "You're trying to declare a value of type \`bool'\n\s*rather than an attribute-set for the option" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-shorthand.nix
checkConfigOutput "true" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-noshorthand.nix checkConfigOutput '^true$' config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-noshorthand.nix
## submoduleWith should merge all modules in one swoop ## submoduleWith should merge all modules in one swoop
checkConfigOutput "true" config.submodule.inner ./declare-submoduleWith-modules.nix checkConfigOutput '^true$' config.submodule.inner ./declare-submoduleWith-modules.nix
checkConfigOutput "true" config.submodule.outer ./declare-submoduleWith-modules.nix checkConfigOutput '^true$' config.submodule.outer ./declare-submoduleWith-modules.nix
# Should also be able to evaluate the type name (which evaluates freeformType, # Should also be able to evaluate the type name (which evaluates freeformType,
# which evaluates all the modules defined by the type) # which evaluates all the modules defined by the type)
checkConfigOutput "submodule" options.submodule.type.description ./declare-submoduleWith-modules.nix checkConfigOutput '^"submodule"$' options.submodule.type.description ./declare-submoduleWith-modules.nix
## submodules can be declared using (evalModules {...}).type
checkConfigOutput '^true$' config.submodule.inner ./declare-submodule-via-evalModules.nix
checkConfigOutput '^true$' config.submodule.outer ./declare-submodule-via-evalModules.nix
# Should also be able to evaluate the type name (which evaluates freeformType,
# which evaluates all the modules defined by the type)
checkConfigOutput '^"submodule"$' options.submodule.type.description ./declare-submodule-via-evalModules.nix
## Paths should be allowed as values and work as expected ## Paths should be allowed as values and work as expected
checkConfigOutput "true" config.submodule.enable ./declare-submoduleWith-path.nix checkConfigOutput '^true$' config.submodule.enable ./declare-submoduleWith-path.nix
# Check that disabledModules works recursively and correctly # Check that disabledModules works recursively and correctly
checkConfigOutput "true" config.enable ./disable-recursive/main.nix checkConfigOutput '^true$' config.enable ./disable-recursive/main.nix
checkConfigOutput "true" config.enable ./disable-recursive/{main.nix,disable-foo.nix} checkConfigOutput '^true$' config.enable ./disable-recursive/{main.nix,disable-foo.nix}
checkConfigOutput "true" config.enable ./disable-recursive/{main.nix,disable-bar.nix} checkConfigOutput '^true$' config.enable ./disable-recursive/{main.nix,disable-bar.nix}
checkConfigError 'The option .* does not exist. Definition values:\n- In .*: true' config.enable ./disable-recursive/{main.nix,disable-foo.nix,disable-bar.nix} checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*: true' config.enable ./disable-recursive/{main.nix,disable-foo.nix,disable-bar.nix}
# Check that imports can depend on derivations # Check that imports can depend on derivations
checkConfigOutput "true" config.enable ./import-from-store.nix checkConfigOutput '^true$' config.enable ./import-from-store.nix
# Check that configs can be conditional on option existence # Check that configs can be conditional on option existence
checkConfigOutput true config.enable ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix checkConfigOutput '^true$' config.enable ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix
checkConfigOutput 360 config.value ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix checkConfigOutput '^360$' config.value ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix
checkConfigOutput 7 config.value ./define-option-dependently.nix ./declare-int-positive-value.nix checkConfigOutput '^7$' config.value ./define-option-dependently.nix ./declare-int-positive-value.nix
checkConfigOutput true config.set.enable ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix checkConfigOutput '^true$' config.set.enable ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix
checkConfigOutput 360 config.set.value ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix checkConfigOutput '^360$' config.set.value ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix
checkConfigOutput 7 config.set.value ./define-option-dependently-nested.nix ./declare-int-positive-value-nested.nix checkConfigOutput '^7$' config.set.value ./define-option-dependently-nested.nix ./declare-int-positive-value-nested.nix
# Check attrsOf and lazyAttrsOf. Only lazyAttrsOf should be lazy, and only # Check attrsOf and lazyAttrsOf. Only lazyAttrsOf should be lazy, and only
# attrsOf should work with conditional definitions # attrsOf should work with conditional definitions
# In addition, lazyAttrsOf should honor an options emptyValue # In addition, lazyAttrsOf should honor an options emptyValue
checkConfigError "is not lazy" config.isLazy ./declare-attrsOf.nix ./attrsOf-lazy-check.nix checkConfigError "is not lazy" config.isLazy ./declare-attrsOf.nix ./attrsOf-lazy-check.nix
checkConfigOutput "true" config.isLazy ./declare-lazyAttrsOf.nix ./attrsOf-lazy-check.nix checkConfigOutput '^true$' config.isLazy ./declare-lazyAttrsOf.nix ./attrsOf-lazy-check.nix
checkConfigOutput "true" config.conditionalWorks ./declare-attrsOf.nix ./attrsOf-conditional-check.nix checkConfigOutput '^true$' config.conditionalWorks ./declare-attrsOf.nix ./attrsOf-conditional-check.nix
checkConfigOutput "false" config.conditionalWorks ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix checkConfigOutput '^false$' config.conditionalWorks ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix
checkConfigOutput "empty" config.value.foo ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix checkConfigOutput '^"empty"$' config.value.foo ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix
# Even with multiple assignments, a type error should be thrown if any of them aren't valid # Even with multiple assignments, a type error should be thrown if any of them aren't valid
@ -215,64 +220,69 @@ checkConfigError 'A definition for option .* is not of type .*' \
## Freeform modules ## Freeform modules
# Assigning without a declared option should work # Assigning without a declared option should work
checkConfigOutput 24 config.value ./freeform-attrsOf.nix ./define-value-string.nix checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix
# No freeform assigments shouldn't make it error # No freeform assigments shouldn't make it error
checkConfigOutput '{ }' config ./freeform-attrsOf.nix checkConfigOutput '^{ }$' config ./freeform-attrsOf.nix
# but only if the type matches # but only if the type matches
checkConfigError 'A definition for option .* is not of type .*' config.value ./freeform-attrsOf.nix ./define-value-list.nix checkConfigError 'A definition for option .* is not of type .*' config.value ./freeform-attrsOf.nix ./define-value-list.nix
# and properties should be applied # and properties should be applied
checkConfigOutput yes config.value ./freeform-attrsOf.nix ./define-value-string-properties.nix checkConfigOutput '^"yes"$' config.value ./freeform-attrsOf.nix ./define-value-string-properties.nix
# Options should still be declarable, and be able to have a type that doesn't match the freeform type # Options should still be declarable, and be able to have a type that doesn't match the freeform type
checkConfigOutput false config.enable ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix checkConfigOutput '^false$' config.enable ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix
checkConfigOutput 24 config.value ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix
# and this should work too with nested values # and this should work too with nested values
checkConfigOutput false config.nest.foo ./freeform-attrsOf.nix ./freeform-nested.nix checkConfigOutput '^false$' config.nest.foo ./freeform-attrsOf.nix ./freeform-nested.nix
checkConfigOutput bar config.nest.bar ./freeform-attrsOf.nix ./freeform-nested.nix checkConfigOutput '^"bar"$' config.nest.bar ./freeform-attrsOf.nix ./freeform-nested.nix
# Check whether a declared option can depend on an freeform-typed one # Check whether a declared option can depend on an freeform-typed one
checkConfigOutput null config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix checkConfigOutput '^null$' config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix
checkConfigOutput 24 config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix ./define-value-string.nix checkConfigOutput '^"24"$' config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix ./define-value-string.nix
# Check whether an freeform-typed value can depend on a declared option, this can only work with lazyAttrsOf # Check whether an freeform-typed value can depend on a declared option, this can only work with lazyAttrsOf
checkConfigError 'infinite recursion encountered' config.foo ./freeform-attrsOf.nix ./freeform-unstr-dep-str.nix checkConfigError 'infinite recursion encountered' config.foo ./freeform-attrsOf.nix ./freeform-unstr-dep-str.nix
checkConfigError 'The option .* is used but not defined' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix checkConfigError 'The option .* is used but not defined' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix
checkConfigOutput 24 config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix ./define-value-string.nix checkConfigOutput '^"24"$' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix ./define-value-string.nix
## types.anything ## types.anything
# Check that attribute sets are merged recursively # Check that attribute sets are merged recursively
checkConfigOutput null config.value.foo ./types-anything/nested-attrs.nix checkConfigOutput '^null$' config.value.foo ./types-anything/nested-attrs.nix
checkConfigOutput null config.value.l1.foo ./types-anything/nested-attrs.nix checkConfigOutput '^null$' config.value.l1.foo ./types-anything/nested-attrs.nix
checkConfigOutput null config.value.l1.l2.foo ./types-anything/nested-attrs.nix checkConfigOutput '^null$' config.value.l1.l2.foo ./types-anything/nested-attrs.nix
checkConfigOutput null config.value.l1.l2.l3.foo ./types-anything/nested-attrs.nix checkConfigOutput '^null$' config.value.l1.l2.l3.foo ./types-anything/nested-attrs.nix
# Attribute sets that are coercible to strings shouldn't be recursed into # Attribute sets that are coercible to strings shouldn't be recursed into
checkConfigOutput foo config.value.outPath ./types-anything/attrs-coercible.nix checkConfigOutput '^"foo"$' config.value.outPath ./types-anything/attrs-coercible.nix
# Multiple lists aren't concatenated together # Multiple lists aren't concatenated together
checkConfigError 'The option .* has conflicting definitions' config.value ./types-anything/lists.nix checkConfigError 'The option .* has conflicting definitions' config.value ./types-anything/lists.nix
# Check that all equalizable atoms can be used as long as all definitions are equal # Check that all equalizable atoms can be used as long as all definitions are equal
checkConfigOutput 0 config.value.int ./types-anything/equal-atoms.nix checkConfigOutput '^0$' config.value.int ./types-anything/equal-atoms.nix
checkConfigOutput false config.value.bool ./types-anything/equal-atoms.nix checkConfigOutput '^false$' config.value.bool ./types-anything/equal-atoms.nix
checkConfigOutput '""' config.value.string ./types-anything/equal-atoms.nix checkConfigOutput '^""$' config.value.string ./types-anything/equal-atoms.nix
checkConfigOutput / config.value.path ./types-anything/equal-atoms.nix checkConfigOutput '^/$' config.value.path ./types-anything/equal-atoms.nix
checkConfigOutput null config.value.null ./types-anything/equal-atoms.nix checkConfigOutput '^null$' config.value.null ./types-anything/equal-atoms.nix
checkConfigOutput 0.1 config.value.float ./types-anything/equal-atoms.nix checkConfigOutput '^0.1$' config.value.float ./types-anything/equal-atoms.nix
# Functions can't be merged together # Functions can't be merged together
checkConfigError "The option .value.multiple-lambdas.<function body>. has conflicting option types" config.applied.multiple-lambdas ./types-anything/functions.nix checkConfigError "The option .value.multiple-lambdas.<function body>. has conflicting option types" config.applied.multiple-lambdas ./types-anything/functions.nix
checkConfigOutput '<LAMBDA>' config.value.single-lambda ./types-anything/functions.nix checkConfigOutput '^<LAMBDA>$' config.value.single-lambda ./types-anything/functions.nix
checkConfigOutput 'null' config.applied.merging-lambdas.x ./types-anything/functions.nix checkConfigOutput '^null$' config.applied.merging-lambdas.x ./types-anything/functions.nix
checkConfigOutput 'null' config.applied.merging-lambdas.y ./types-anything/functions.nix checkConfigOutput '^null$' config.applied.merging-lambdas.y ./types-anything/functions.nix
# Check that all mk* modifiers are applied # Check that all mk* modifiers are applied
checkConfigError 'attribute .* not found' config.value.mkiffalse ./types-anything/mk-mods.nix checkConfigError 'attribute .* not found' config.value.mkiffalse ./types-anything/mk-mods.nix
checkConfigOutput '{ }' config.value.mkiftrue ./types-anything/mk-mods.nix checkConfigOutput '^{ }$' config.value.mkiftrue ./types-anything/mk-mods.nix
checkConfigOutput 1 config.value.mkdefault ./types-anything/mk-mods.nix checkConfigOutput '^1$' config.value.mkdefault ./types-anything/mk-mods.nix
checkConfigOutput '{ }' config.value.mkmerge ./types-anything/mk-mods.nix checkConfigOutput '^{ }$' config.value.mkmerge ./types-anything/mk-mods.nix
checkConfigOutput true config.value.mkbefore ./types-anything/mk-mods.nix checkConfigOutput '^true$' config.value.mkbefore ./types-anything/mk-mods.nix
checkConfigOutput 1 config.value.nested.foo ./types-anything/mk-mods.nix checkConfigOutput '^1$' config.value.nested.foo ./types-anything/mk-mods.nix
checkConfigOutput baz config.value.nested.bar.baz ./types-anything/mk-mods.nix checkConfigOutput '^"baz"$' config.value.nested.bar.baz ./types-anything/mk-mods.nix
## types.functionTo ## types.functionTo
checkConfigOutput "input is input" config.result ./functionTo/trivial.nix checkConfigOutput '^"input is input"$' config.result ./functionTo/trivial.nix
checkConfigOutput "a b" config.result ./functionTo/merging-list.nix checkConfigOutput '^"a b"$' config.result ./functionTo/merging-list.nix
checkConfigError 'A definition for option .fun.\[function body\]. is not of type .string.. Definition values:\n- In .*wrong-type.nix' config.result ./functionTo/wrong-type.nix checkConfigError 'A definition for option .fun.\[function body\]. is not of type .string.. Definition values:\n\s*- In .*wrong-type.nix' config.result ./functionTo/wrong-type.nix
checkConfigOutput "b a" config.result ./functionTo/list-order.nix checkConfigOutput '^"b a"$' config.result ./functionTo/list-order.nix
checkConfigOutput "a c" config.result ./functionTo/merging-attrs.nix checkConfigOutput '^"a c"$' config.result ./functionTo/merging-attrs.nix
# moduleType
checkConfigOutput '^"a b"$' config.resultFoo ./declare-variants.nix ./define-variant.nix
checkConfigOutput '^"a y z"$' config.resultFooBar ./declare-variants.nix ./define-variant.nix
checkConfigOutput '^"a b c"$' config.resultFooFoo ./declare-variants.nix ./define-variant.nix
cat <<EOF cat <<EOF
====== module tests ====== ====== module tests ======
@ -280,7 +290,7 @@ $pass Pass
$fail Fail $fail Fail
EOF EOF
if test $fail -ne 0; then if [ "$fail" -ne 0 ]; then
exit 1 exit 1
fi fi
exit 0 exit 0

View file

@ -0,0 +1,28 @@
{ lib, ... }: {
options.submodule = lib.mkOption {
inherit (lib.evalModules {
modules = [
{
options.inner = lib.mkOption {
type = lib.types.bool;
default = false;
};
}
];
}) type;
default = {};
};
config.submodule = lib.mkMerge [
({ lib, ... }: {
options.outer = lib.mkOption {
type = lib.types.bool;
default = false;
};
})
{
inner = true;
outer = true;
}
];
}

View file

@ -0,0 +1,9 @@
{ lib, moduleType, ... }:
let inherit (lib) mkOption types;
in
{
options.variants = mkOption {
type = types.lazyAttrsOf moduleType;
default = {};
};
}

View file

@ -0,0 +1,22 @@
{ config, lib, ... }:
let inherit (lib) types mkOption attrNames;
in
{
options = {
attrs = mkOption { type = types.attrsOf lib.types.int; };
result = mkOption { };
resultFoo = mkOption { };
resultFooBar = mkOption { };
resultFooFoo = mkOption { };
};
config = {
attrs.a = 1;
variants.foo.attrs.b = 1;
variants.bar.attrs.y = 1;
variants.foo.variants.bar.attrs.z = 1;
variants.foo.variants.foo.attrs.c = 3;
resultFoo = lib.concatMapStringsSep " " toString (attrNames config.variants.foo.attrs);
resultFooBar = lib.concatMapStringsSep " " toString (attrNames config.variants.foo.variants.bar.attrs);
resultFooFoo = lib.concatMapStringsSep " " toString (attrNames config.variants.foo.variants.foo.attrs);
};
}

View file

@ -23,6 +23,10 @@ pkgs.runCommand "nixpkgs-lib-tests" {
export NIX_STORE_DIR=$TEST_ROOT/store export NIX_STORE_DIR=$TEST_ROOT/store
export PAGER=cat export PAGER=cat
cacheDir=$TEST_ROOT/binary-cache cacheDir=$TEST_ROOT/binary-cache
mkdir -p $NIX_CONF_DIR
echo "experimental-features = nix-command" >> $NIX_CONF_DIR/nix.conf
nix-store --init nix-store --init
cp -r ${../.} lib cp -r ${../.} lib

View file

@ -1,5 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
shopt -s inherit_errexit
# Use # Use
# || die # || die
@ -9,27 +10,28 @@ die() {
} }
if test -n "${TEST_LIB:-}"; then if test -n "${TEST_LIB:-}"; then
export NIX_PATH=nixpkgs="$(dirname "$TEST_LIB")" NIX_PATH=nixpkgs="$(dirname "$TEST_LIB")"
else else
export NIX_PATH=nixpkgs="$(cd $(dirname ${BASH_SOURCE[0]})/../..; pwd)" NIX_PATH=nixpkgs="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.."; pwd)"
fi fi
export NIX_PATH
work="$(mktemp -d)" work="$(mktemp -d)"
clean_up() { clean_up() {
rm -rf "$work" rm -rf "$work"
} }
trap clean_up EXIT trap clean_up EXIT
cd $work cd "$work"
touch {README.md,module.o,foo.bar} touch {README.md,module.o,foo.bar}
# nix-instantiate doesn't write out the source, only computing the hash, so # nix-instantiate doesn't write out the source, only computing the hash, so
# this uses the experimental nix command instead. # this uses the experimental nix command instead.
dir="$(nix eval --raw '(with import <nixpkgs/lib>; "${ dir="$(nix eval --impure --raw --expr '(with import <nixpkgs/lib>; "${
cleanSource ./. cleanSource ./.
}")')" }")')"
(cd $dir; find) | sort -f | diff -U10 - <(cat <<EOF (cd "$dir"; find) | sort -f | diff -U10 - <(cat <<EOF
. .
./foo.bar ./foo.bar
./README.md ./README.md
@ -37,20 +39,20 @@ EOF
) || die "cleanSource 1" ) || die "cleanSource 1"
dir="$(nix eval --raw '(with import <nixpkgs/lib>; "${ dir="$(nix eval --impure --raw --expr '(with import <nixpkgs/lib>; "${
cleanSourceWith { src = '"$work"'; filter = path: type: ! hasSuffix ".bar" path; } cleanSourceWith { src = '"$work"'; filter = path: type: ! hasSuffix ".bar" path; }
}")')" }")')"
(cd $dir; find) | sort -f | diff -U10 - <(cat <<EOF (cd "$dir"; find) | sort -f | diff -U10 - <(cat <<EOF
. .
./module.o ./module.o
./README.md ./README.md
EOF EOF
) || die "cleanSourceWith 1" ) || die "cleanSourceWith 1"
dir="$(nix eval --raw '(with import <nixpkgs/lib>; "${ dir="$(nix eval --impure --raw --expr '(with import <nixpkgs/lib>; "${
cleanSourceWith { src = cleanSource '"$work"'; filter = path: type: ! hasSuffix ".bar" path; } cleanSourceWith { src = cleanSource '"$work"'; filter = path: type: ! hasSuffix ".bar" path; }
}")')" }")')"
(cd $dir; find) | sort -f | diff -U10 - <(cat <<EOF (cd "$dir"; find) | sort -f | diff -U10 - <(cat <<EOF
. .
./README.md ./README.md
EOF EOF

View file

@ -171,7 +171,7 @@ rec {
On each release the first letter is bumped and a new animal is chosen On each release the first letter is bumped and a new animal is chosen
starting with that new letter. starting with that new letter.
*/ */
codeName = "Porcupine"; codeName = "Quokka";
/* Returns the current nixpkgs version suffix as string. */ /* Returns the current nixpkgs version suffix as string. */
versionSuffix = versionSuffix =

View file

@ -505,17 +505,36 @@ rec {
then setFunctionArgs (args: unify (value args)) (functionArgs value) then setFunctionArgs (args: unify (value args)) (functionArgs value)
else unify (if shorthandOnlyDefinesConfig then { config = value; } else value); else unify (if shorthandOnlyDefinesConfig then { config = value; } else value);
allModules = defs: modules ++ imap1 (n: { value, file }: allModules = defs: imap1 (n: { value, file }:
if isAttrs value || isFunction value then if isAttrs value || isFunction value then
# Annotate the value with the location of its definition for better error messages # Annotate the value with the location of its definition for better error messages
coerce (lib.modules.unifyModuleSyntax file "${toString file}-${toString n}") value coerce (lib.modules.unifyModuleSyntax file "${toString file}-${toString n}") value
else value else value
) defs; ) defs;
freeformType = (evalModules { base = evalModules {
inherit modules specialArgs; inherit specialArgs;
args.name = "name"; modules = [{
})._module.freeformType; # This is a work-around for the fact that some sub-modules,
# such as the one included in an attribute set, expects an "args"
# attribute to be given to the sub-module. As the option
# evaluation does not have any specific attribute name yet, we
# provide a default for the documentation and the freeform type.
#
# This is necessary as some option declaration might use the
# "name" attribute given as argument of the submodule and use it
# as the default of option declarations.
#
# We use lookalike unicode single angle quotation marks because
# of the docbook transformation the options receive. In all uses
# &gt; and &lt; wouldn't be encoded correctly so the encoded values
# would be used, and use of `<` and `>` would break the XML document.
# It shouldn't cause an issue since this is cosmetic for the manual.
_module.args.name = lib.mkOptionDefault "name";
}] ++ modules;
};
freeformType = base._module.freeformType;
in in
mkOptionType rec { mkOptionType rec {
@ -523,32 +542,13 @@ rec {
description = freeformType.description or name; description = freeformType.description or name;
check = x: isAttrs x || isFunction x || path.check x; check = x: isAttrs x || isFunction x || path.check x;
merge = loc: defs: merge = loc: defs:
(evalModules { (base.extendModules {
modules = allModules defs; modules = [ { _module.args.name = last loc; } ] ++ allModules defs;
inherit specialArgs;
args.name = last loc;
prefix = loc; prefix = loc;
}).config; }).config;
emptyValue = { value = {}; }; emptyValue = { value = {}; };
getSubOptions = prefix: (evalModules getSubOptions = prefix: (base.extendModules
{ inherit modules prefix specialArgs; { inherit prefix; }).options // optionalAttrs (freeformType != null) {
# This is a work-around due to the fact that some sub-modules,
# such as the one included in an attribute set, expects a "args"
# attribute to be given to the sub-module. As the option
# evaluation does not have any specific attribute name, we
# provide a default one for the documentation.
#
# This is mandatory as some option declaration might use the
# "name" attribute given as argument of the submodule and use it
# as the default of option declarations.
#
# Using lookalike unicode single angle quotation marks because
# of the docbook transformation the options receive. In all uses
# &gt; and &lt; wouldn't be encoded correctly so the encoded values
# would be used, and use of `<` and `>` would break the XML document.
# It shouldn't cause an issue since this is cosmetic for the manual.
args.name = "name";
}).options // optionalAttrs (freeformType != null) {
# Expose the sub options of the freeform type. Note that the option # Expose the sub options of the freeform type. Note that the option
# discovery doesn't care about the attribute name used here, so this # discovery doesn't care about the attribute name used here, so this
# is just to avoid conflicts with potential options from the submodule # is just to avoid conflicts with potential options from the submodule

View file

@ -159,6 +159,7 @@
}; };
abbe = { abbe = {
email = "ashish.is@lostca.se"; email = "ashish.is@lostca.se";
matrix = "@abbe:badti.me";
github = "wahjava"; github = "wahjava";
githubId = 2255192; githubId = 2255192;
name = "Ashish SHUKLA"; name = "Ashish SHUKLA";
@ -602,6 +603,12 @@
fingerprint = "7931 EB4E 4712 D7BE 04F8 6D34 07EE 1FFC A58A 11C5"; fingerprint = "7931 EB4E 4712 D7BE 04F8 6D34 07EE 1FFC A58A 11C5";
}]; }];
}; };
amfl = {
email = "amfl@none.none";
github = "amfl";
githubId = 382798;
name = "amfl";
};
amiddelk = { amiddelk = {
email = "amiddelk@gmail.com"; email = "amiddelk@gmail.com";
github = "amiddelk"; github = "amiddelk";
@ -1151,6 +1158,12 @@
githubId = 56650223; githubId = 56650223;
name = "Artturi N"; name = "Artturi N";
}; };
ayazhafiz = {
email = "ayaz.hafiz.1@gmail.com";
github = "ayazhafiz";
githubId = 262763;
name = "Ayaz Hafiz";
};
b4dm4n = { b4dm4n = {
email = "fabianm88@gmail.com"; email = "fabianm88@gmail.com";
github = "B4dM4n"; github = "B4dM4n";
@ -1551,6 +1564,16 @@
githubId = 87764; githubId = 87764;
name = "Ben Ford"; name = "Ben Ford";
}; };
boppyt = {
email = "boppy@nwcpz.com";
github = "boppyt";
githubId = 71049646;
name = "Zack A";
keys = [{
longkeyid = "rsa4096/0x6310C97DE31D1545";
fingerprint = "E8D7 5C19 9F65 269B 439D F77B 6310 C97D E31D 1545";
}];
};
borisbabic = { borisbabic = {
email = "boris.ivan.babic@gmail.com"; email = "boris.ivan.babic@gmail.com";
github = "borisbabic"; github = "borisbabic";
@ -1657,6 +1680,7 @@
}; };
bryanasdev000 = { bryanasdev000 = {
email = "bryanasdev000@gmail.com"; email = "bryanasdev000@gmail.com";
matrix = "@bryanasdev000:matrix.org";
github = "bryanasdev000"; github = "bryanasdev000";
githubId = 53131727; githubId = 53131727;
name = "Bryan Albuquerque"; name = "Bryan Albuquerque";
@ -2068,6 +2092,17 @@
githubId = 12386805; githubId = 12386805;
name = "Chua Hou"; name = "Chua Hou";
}; };
chuangzhu = {
name = "Chuang Zhu";
email = "chuang@melty.land";
matrix = "@chuangzhu:matrix.org";
github = "chuangzhu";
githubId = 31200881;
keys = [{
longkeyid = "rsa4096/E838CED81CFFD3F9";
fingerprint = "5D03 A5E6 0754 A3E3 CA57 5037 E838 CED8 1CFF D3F9";
}];
};
chvp = { chvp = {
email = "nixpkgs@cvpetegem.be"; email = "nixpkgs@cvpetegem.be";
matrix = "@charlotte:vanpetegem.me"; matrix = "@charlotte:vanpetegem.me";
@ -2332,6 +2367,12 @@
githubId = 12202789; githubId = 12202789;
name = "CrazedProgrammer"; name = "CrazedProgrammer";
}; };
creator54 = {
email = "hi.creator54@gmail.com";
github = "creator54";
githubId = 34543609;
name = "creator54";
};
cript0nauta = { cript0nauta = {
email = "shareman1204@gmail.com"; email = "shareman1204@gmail.com";
github = "cript0nauta"; github = "cript0nauta";
@ -2523,12 +2564,30 @@
githubId = 1298344; githubId = 1298344;
name = "Daniel Fullmer"; name = "Daniel Fullmer";
}; };
danth = {
name = "Daniel Thwaites";
email = "danthwaites30@btinternet.com";
matrix = "@danth:matrix.org";
github = "danth";
githubId = 28959268;
keys = [{
longkeyid = "rsa3072/0xD8AFC4BF05670F9D";
fingerprint = "4779 D1D5 3C97 2EAE 34A5 ED3D D8AF C4BF 0567 0F9D";
}];
};
dan4ik605743 = { dan4ik605743 = {
email = "6057430gu@gmail.com"; email = "6057430gu@gmail.com";
github = "dan4ik605743"; github = "dan4ik605743";
githubId = 86075850; githubId = 86075850;
name = "Danil Danevich"; name = "Danil Danevich";
}; };
darkonion0 = {
name = "Alexandre Peruggia";
email = "darkgenius1@protonmail.com";
matrix = "@alexoo:matrix.org";
github = "DarkOnion0";
githubId = 68606322;
};
das-g = { das-g = {
email = "nixpkgs@raphael.dasgupta.ch"; email = "nixpkgs@raphael.dasgupta.ch";
github = "das-g"; github = "das-g";
@ -2587,6 +2646,12 @@
githubId = 91113; githubId = 91113;
name = "David Kleuker"; name = "David Kleuker";
}; };
davidarmstronglewis = {
email = "davidlewis@mac.com";
github = "davidarmstronglewis";
githubId = 6754950;
name = "David Armstrong Lewis";
};
davidrusu = { davidrusu = {
email = "davidrusu.me@gmail.com"; email = "davidrusu.me@gmail.com";
github = "davidrusu"; github = "davidrusu";
@ -2789,6 +2854,12 @@
githubId = 2439413; githubId = 2439413;
name = "Derek Gonyeo"; name = "Derek Gonyeo";
}; };
dguenther = {
email = "dguenther9@gmail.com";
github = "dguenther";
githubId = 767083;
name = "Derek Guenther";
};
dhkl = { dhkl = {
email = "david@davidslab.com"; email = "david@davidslab.com";
github = "dhl"; github = "dhl";
@ -3035,6 +3106,12 @@
fingerprint = "85F3 72DF 4AF3 EF13 ED34 72A3 0AAF 2901 E804 0715"; fingerprint = "85F3 72DF 4AF3 EF13 ED34 72A3 0AAF 2901 E804 0715";
}]; }];
}; };
drzoidberg = {
email = "jakob@mast3rsoft.com";
github = "jakobneufeld";
githubId = 24791219;
name = "Jakob Neufeld";
};
dschrempf = { dschrempf = {
name = "Dominik Schrempf"; name = "Dominik Schrempf";
email = "dominik.schrempf@gmail.com"; email = "dominik.schrempf@gmail.com";
@ -3227,12 +3304,6 @@
githubId = 119483; githubId = 119483;
name = "Matthew Brown"; name = "Matthew Brown";
}; };
eduardosm = {
email = "esm@eduardosm.net";
github = "eduardosm";
githubId = 761151;
name = "Eduardo Sánchez Muñoz";
};
eduarrrd = { eduarrrd = {
email = "e.bachmakov@gmail.com"; email = "e.bachmakov@gmail.com";
github = "eduarrrd"; github = "eduarrrd";
@ -3277,6 +3348,7 @@
}; };
ekleog = { ekleog = {
email = "leo@gaspard.io"; email = "leo@gaspard.io";
matrix = "@leo:gaspard.ninja";
github = "ekleog"; github = "ekleog";
githubId = 411447; githubId = 411447;
name = "Leo Gaspard"; name = "Leo Gaspard";
@ -3647,10 +3719,14 @@
}; };
expipiplus1 = { expipiplus1 = {
email = "nix@monoid.al"; email = "nix@monoid.al";
matrix = "@joe:monoid.al"; matrix = "@ellie:monoid.al";
github = "expipiplus1"; github = "expipiplus1";
githubId = 857308; githubId = 857308;
name = "Joe Hermaszewski"; name = "Ellie Hermaszewska";
keys = [{
longkeyid = "rsa4096/0xC8116E3A0C1CA76A";
fingerprint = "FC1D 3E4F CBCA 80DF E870 6397 C811 6E3A 0C1C A76A";
}];
}; };
extends = { extends = {
email = "sharosari@gmail.com"; email = "sharosari@gmail.com";
@ -3860,6 +3936,12 @@
githubId = 183879; githubId = 183879;
name = "Florian Klink"; name = "Florian Klink";
}; };
florentc = {
email = "florentc@users.noreply.github.com";
github = "florentc";
githubId = 1149048;
name = "Florent Ch.";
};
FlorianFranzen = { FlorianFranzen = {
email = "Florian.Franzen@gmail.com"; email = "Florian.Franzen@gmail.com";
github = "FlorianFranzen"; github = "FlorianFranzen";
@ -4103,6 +4185,12 @@
githubId = 20208; githubId = 20208;
name = "Rok Garbas"; name = "Rok Garbas";
}; };
gardspirito = {
name = "gardspirito";
email = "nyxoroso@gmail.com";
github = "gardspirito";
githubId = 29687558;
};
garrison = { garrison = {
email = "jim@garrison.cc"; email = "jim@garrison.cc";
github = "garrison"; github = "garrison";
@ -4133,6 +4221,16 @@
githubId = 313929; githubId = 313929;
name = "Gabriel Ebner"; name = "Gabriel Ebner";
}; };
genofire = {
name = "genofire";
email = "geno+dev@fireorbit.de";
github = "genofire";
githubId = 6905586;
keys = [{
longkeyid = "rsa4096/0xFC83907C125BC2BC";
fingerprint = "386E D1BF 848A BB4A 6B4A 3C45 FC83 907C 125B C2BC";
}];
};
georgewhewell = { georgewhewell = {
email = "georgerw@gmail.com"; email = "georgerw@gmail.com";
github = "georgewhewell"; github = "georgewhewell";
@ -4192,6 +4290,12 @@
githubId = 1713676; githubId = 1713676;
name = "Luis G. Torres"; name = "Luis G. Torres";
}; };
GKasparov = {
email = "mizozahr@gmail.com";
github = "GKasparov";
githubId = 60962839;
name = "Mazen Zahr";
};
gleber = { gleber = {
email = "gleber.p@gmail.com"; email = "gleber.p@gmail.com";
github = "gleber"; github = "gleber";
@ -4535,6 +4639,13 @@
githubId = 2405974; githubId = 2405974;
name = "Sébastian Méric de Bellefon"; name = "Sébastian Méric de Bellefon";
}; };
henkkalkwater = {
email = "chris+nixpkgs@netsoj.nl";
github = "HenkKalkwater";
githubId = 4262067;
matrix = "@chris:netsoj.nl";
name = "Chris Josten";
};
henrikolsson = { henrikolsson = {
email = "henrik@fixme.se"; email = "henrik@fixme.se";
github = "henrikolsson"; github = "henrikolsson";
@ -4660,6 +4771,12 @@
githubId = 896431; githubId = 896431;
name = "Chris Hodapp"; name = "Chris Hodapp";
}; };
hollowman6 = {
email = "hollowman@hollowman.ml";
github = "HollowMan6";
githubId = 43995067;
name = "Songlin Jiang";
};
holymonson = { holymonson = {
email = "holymonson@gmail.com"; email = "holymonson@gmail.com";
github = "holymonson"; github = "holymonson";
@ -4921,6 +5038,12 @@
githubId = 4085046; githubId = 4085046;
name = "Imuli"; name = "Imuli";
}; };
ineol = {
email = "leo.stefanesco@gmail.com";
github = "ineol";
githubId = 37965;
name = "Léo Stefanesco";
};
infinisil = { infinisil = {
email = "contact@infinisil.com"; email = "contact@infinisil.com";
matrix = "@infinisil:matrix.org"; matrix = "@infinisil:matrix.org";
@ -4965,6 +5088,13 @@
fingerprint = "1412 816B A9FA F62F D051 1975 D3E1 B013 B463 1293"; fingerprint = "1412 816B A9FA F62F D051 1975 D3E1 B013 B463 1293";
}]; }];
}; };
ius = {
email = "j.de.gram@gmail.com";
name = "Joerie de Gram";
matrix = "@ius:nltrix.net";
github = "ius";
githubId = 529626;
};
ivan = { ivan = {
email = "ivan@ludios.org"; email = "ivan@ludios.org";
github = "ivan"; github = "ivan";
@ -4998,7 +5128,7 @@
}]; }];
}; };
ivankovnatsky = { ivankovnatsky = {
email = "ikovnatsky@protonmail.ch"; email = "75213+ivankovnatsky@users.noreply.github.com";
github = "ivankovnatsky"; github = "ivankovnatsky";
githubId = 75213; githubId = 75213;
name = "Ivan Kovnatsky"; name = "Ivan Kovnatsky";
@ -5182,12 +5312,28 @@
githubId = 221929; githubId = 221929;
name = "Jean-Baptiste Giraudeau"; name = "Jean-Baptiste Giraudeau";
}; };
jceb = {
name = "jceb";
email = "jceb@e-jc.de";
github = "jceb";
githubId = 101593;
};
jchw = { jchw = {
email = "johnwchadwick@gmail.com"; email = "johnwchadwick@gmail.com";
github = "jchv"; github = "jchv";
githubId = 938744; githubId = 938744;
name = "John Chadwick"; name = "John Chadwick";
}; };
jcouyang = {
email = "oyanglulu@gmail.com";
github = "jcouyang";
githubId = 1235045;
name = "Jichao Ouyang";
keys = [{
longkeyid = "rsa2048/0xDA8B833B52604E63";
fingerprint = "A506 C38D 5CC8 47D0 DF01 134A DA8B 833B 5260 4E63";
}];
};
jcumming = { jcumming = {
email = "jack@mudshark.org"; email = "jack@mudshark.org";
github = "jcumming"; github = "jcumming";
@ -5782,6 +5928,16 @@
githubId = 20658981; githubId = 20658981;
name = "Jarosław Wygoda"; name = "Jarosław Wygoda";
}; };
jyooru = {
email = "joel@joel.tokyo";
github = "jyooru";
githubId = 63786778;
name = "Joel";
keys = [{
longkeyid = "rsa4096/18550BD205E9EF64";
fingerprint = "9148 DC9E F4D5 3EB6 A30E 8EF0 1855 0BD2 05E9 EF64";
}];
};
jyp = { jyp = {
email = "jeanphilippe.bernardy@gmail.com"; email = "jeanphilippe.bernardy@gmail.com";
github = "jyp"; github = "jyp";
@ -5851,6 +6007,12 @@
githubId = 3831860; githubId = 3831860;
name = "Arnold Krille"; name = "Arnold Krille";
}; };
kanashimia = {
email = "chad@redpilled.dev";
github = "kanashimia";
githubId = 56224949;
name = "Mia Kanashi";
};
karantan = { karantan = {
name = "Gasper Vozel"; name = "Gasper Vozel";
email = "karantan@gmail.com"; email = "karantan@gmail.com";
@ -6063,6 +6225,12 @@
email = "tierpluspluslists@gmail.com"; email = "tierpluspluslists@gmail.com";
name = "Karn Kallio"; name = "Karn Kallio";
}; };
klden = {
name = "Kenzyme Le";
email = "kl@kenzymele.com";
github = "klDen";
githubId = 5478260;
};
klntsky = { klntsky = {
email = "klntsky@gmail.com"; email = "klntsky@gmail.com";
name = "Vladimir Kalnitsky"; name = "Vladimir Kalnitsky";
@ -6243,6 +6411,12 @@
githubId = 278013; githubId = 278013;
name = "Tomasz Kontusz"; name = "Tomasz Kontusz";
}; };
kubukoz = {
email = "kubukoz@gmail.com";
github = "kubukoz";
githubId = 894884;
name = "Jakub Kozłowski";
};
kurnevsky = { kurnevsky = {
email = "kurnevsky@gmail.com"; email = "kurnevsky@gmail.com";
github = "kurnevsky"; github = "kurnevsky";
@ -6255,6 +6429,13 @@
githubId = 449813; githubId = 449813;
name = "Roman Kuznetsov"; name = "Roman Kuznetsov";
}; };
kvark = {
name = "Dzmitry Malyshau";
email = "kvark@fastmail.com";
matrix = "@kvark:matrix.org";
github = "kvark";
githubId = 107301;
};
kwohlfahrt = { kwohlfahrt = {
email = "kai.wohlfahrt@gmail.com"; email = "kai.wohlfahrt@gmail.com";
github = "kwohlfahrt"; github = "kwohlfahrt";
@ -6446,12 +6627,16 @@
githubId = 4158274; githubId = 4158274;
name = "Michiel Leenaars"; name = "Michiel Leenaars";
}; };
legendofmiracles = { lom = {
email = "legendofmiracles@protonmail.com"; email = "legendofmiracles@protonmail.com";
matrix = "@legendofmiracles:matrix.org"; matrix = "@legendofmiracles:matrix.org";
github = "legendofmiracles"; github = "legendofmiracles";
githubId = 30902201; githubId = 30902201;
name = "legendofmiracles"; name = "legendofmiracles";
keys = [{
longkeyid = "rsa4096/0x19B082B3DEFE5451";
fingerprint = "CC50 F82C 985D 2679 0703 AF15 19B0 82B3 DEFE 5451";
}];
}; };
lejonet = { lejonet = {
email = "daniel@kuehn.se"; email = "daniel@kuehn.se";
@ -6628,6 +6813,12 @@
fingerprint = "5B93 9CFA E8FC 4D8F E07A 3AEA DFE1 D4A0 1733 7E2A"; fingerprint = "5B93 9CFA E8FC 4D8F E07A 3AEA DFE1 D4A0 1733 7E2A";
}]; }];
}; };
lorenzleutgeb = {
email = "lorenz@leutgeb.xyz";
github = "lorenzleutgeb";
githubId = 542154;
name = "Lorenz Leutgeb";
};
luis = { luis = {
email = "luis.nixos@gmail.com"; email = "luis.nixos@gmail.com";
github = "Luis-Hebendanz"; github = "Luis-Hebendanz";
@ -6717,6 +6908,12 @@
githubId = 10626; githubId = 10626;
name = "Andreas Wagner"; name = "Andreas Wagner";
}; };
lrewega = {
email = "lrewega@c32.ca";
github = "lrewega";
githubId = 639066;
name = "Luke Rewega";
};
lromor = { lromor = {
email = "leonardo.romor@gmail.com"; email = "leonardo.romor@gmail.com";
github = "lromor"; github = "lromor";
@ -6897,6 +7094,12 @@
githubId = 109141; githubId = 109141;
name = "Georges Dubus"; name = "Georges Dubus";
}; };
Madouura = {
email = "madouura@gmail.com";
github = "Madouura";
githubId = 93990818;
name = "Madoura";
};
mafo = { mafo = {
email = "Marc.Fontaine@gmx.de"; email = "Marc.Fontaine@gmx.de";
github = "MarcFontaine"; github = "MarcFontaine";
@ -7035,6 +7238,12 @@
githubId = 623509; githubId = 623509;
name = "Martijn Vermaat"; name = "Martijn Vermaat";
}; };
martinetd = {
email = "f.ktfhrvnznqxacf@noclue.notk.org";
github = "martinetd";
githubId = 1729331;
name = "Dominique Martinet";
};
martingms = { martingms = {
email = "martin@mg.am"; email = "martin@mg.am";
github = "martingms"; github = "martingms";
@ -7146,6 +7355,16 @@
githubId = 95194; githubId = 95194;
name = "Mauricio Scheffer"; name = "Mauricio Scheffer";
}; };
max-niederman = {
email = "max@maxniederman.com";
github = "max-niederman";
githubId = 19580458;
name = "Max Niederman";
keys = [{
longkeyid = "rsa3072/0x9AED881481D8444E";
fingerprint = "1DE4 424D BF77 1192 5DC4 CF5E 9AED 8814 81D8 444E";
}];
};
maxdamantus = { maxdamantus = {
email = "maxdamantus@gmail.com"; email = "maxdamantus@gmail.com";
github = "Maxdamantus"; github = "Maxdamantus";
@ -7224,6 +7443,12 @@
githubId = 51356; githubId = 51356;
name = "Mathieu Boespflug"; name = "Mathieu Boespflug";
}; };
mbprtpmnr = {
name = "mbprtpmnr";
email = "mbprtpmnr@pm.me";
github = "mbprtpmnr";
githubId = 88109321;
};
mbrgm = { mbrgm = {
email = "marius@yeai.de"; email = "marius@yeai.de";
github = "mbrgm"; github = "mbrgm";
@ -7485,6 +7710,12 @@
fingerprint = "DB43 2895 CF68 F0CE D4B7 EF60 DA01 5B05 B5A1 1B22"; fingerprint = "DB43 2895 CF68 F0CE D4B7 EF60 DA01 5B05 B5A1 1B22";
}]; }];
}; };
milahu = {
email = "milahu@gmail.com";
github = "milahu";
githubId = 12958815;
name = "Milan Hauth";
};
milesbreslin = { milesbreslin = {
email = "milesbreslin@gmail.com"; email = "milesbreslin@gmail.com";
github = "milesbreslin"; github = "milesbreslin";
@ -7686,6 +7917,7 @@
mohe2015 = { mohe2015 = {
name = "Moritz Hedtke"; name = "Moritz Hedtke";
email = "Moritz.Hedtke@t-online.de"; email = "Moritz.Hedtke@t-online.de";
matrix = "@moritz.hedtke:matrix.org";
github = "mohe2015"; github = "mohe2015";
githubId = 13287984; githubId = 13287984;
keys = [{ keys = [{
@ -7727,6 +7959,12 @@
githubId = 99988; githubId = 99988;
name = "Maarten Hoogendoorn"; name = "Maarten Hoogendoorn";
}; };
MoritzBoehme = {
email = "mail@moritzboeh.me";
github = "MoritzBoehme";
githubId = 42215704;
name = "Moritz Böhme";
};
MostAwesomeDude = { MostAwesomeDude = {
email = "cds@corbinsimpson.com"; email = "cds@corbinsimpson.com";
github = "MostAwesomeDude"; github = "MostAwesomeDude";
@ -8012,6 +8250,17 @@
githubId = 56316606; githubId = 56316606;
name = "Amneesh Singh"; name = "Amneesh Singh";
}; };
nazarewk = {
name = "Krzysztof Nazarewski";
email = "3494992+nazarewk@users.noreply.github.com";
matrix = "@nazarewk:matrix.org";
github = "nazarewk";
githubId = 3494992;
keys = [{
longkeyid = "rsa4096/0x916D8B67241892AE";
fingerprint = "4BFF 0614 03A2 47F0 AA0B 4BC4 916D 8B67 2418 92AE";
}];
};
nbren12 = { nbren12 = {
email = "nbren12@gmail.com"; email = "nbren12@gmail.com";
github = "nbren12"; github = "nbren12";
@ -8265,6 +8514,12 @@
githubId = 7588406; githubId = 7588406;
name = "Andrew R. M."; name = "Andrew R. M.";
}; };
nkalupahana = {
email = "hello@nisa.la";
github = "nkalupahana";
githubId = 7347290;
name = "Nisala Kalupahana";
};
nloomans = { nloomans = {
email = "noah@nixos.noahloomans.com"; email = "noah@nixos.noahloomans.com";
github = "nloomans"; github = "nloomans";
@ -8568,6 +8823,12 @@
githubId = 101514; githubId = 101514;
name = "Orivej Desh"; name = "Orivej Desh";
}; };
ornxka = {
email = "ornxka@littledevil.sh";
github = "ornxka";
githubId = 52086525;
name = "ornxka";
};
oro = { oro = {
email = "marco@orovecchia.at"; email = "marco@orovecchia.at";
github = "oro"; github = "oro";
@ -8673,6 +8934,7 @@
}; };
pamplemousse = { pamplemousse = {
email = "xav.maso@gmail.com"; email = "xav.maso@gmail.com";
matrix = "@pamplemouss_:matrix.org";
github = "Pamplemousse"; github = "Pamplemousse";
githubId = 2647236; githubId = 2647236;
name = "Xavier Maso"; name = "Xavier Maso";
@ -8726,7 +8988,7 @@
name = "pasqui23"; name = "pasqui23";
}; };
patryk27 = { patryk27 = {
email = "wychowaniec.patryk@gmail.com"; email = "pwychowaniec@pm.me";
github = "Patryk27"; github = "Patryk27";
githubId = 3395477; githubId = 3395477;
name = "Patryk Wychowaniec"; name = "Patryk Wychowaniec";
@ -8777,12 +9039,6 @@
githubId = 8641; githubId = 8641;
name = "Pierre Carrier"; name = "Pierre Carrier";
}; };
pengmeiyu = {
email = "pengmyu@gmail.com";
github = "pmeiyu";
githubId = 8529551;
name = "Peng Mei Yu";
};
penguwin = { penguwin = {
email = "penguwin@penguwin.eu"; email = "penguwin@penguwin.eu";
github = "penguwin"; github = "penguwin";
@ -8887,6 +9143,12 @@
githubId = 421510; githubId = 421510;
name = "Noé Rubinstein"; name = "Noé Rubinstein";
}; };
photex = {
email = "photex@gmail.com";
github = "photex";
githubId = 301903;
name = "Chip Collier";
};
phreedom = { phreedom = {
email = "phreedom@yandex.ru"; email = "phreedom@yandex.ru";
github = "phreedom"; github = "phreedom";
@ -9052,6 +9314,12 @@
githubId = 178496; githubId = 178496;
name = "Philipp Middendorf"; name = "Philipp Middendorf";
}; };
pmy = {
email = "pmy@xqzp.net";
github = "pmeiyu";
githubId = 8529551;
name = "Peng Mei Yu";
};
pmyjavec = { pmyjavec = {
email = "pauly@myjavec.com"; email = "pauly@myjavec.com";
github = "pmyjavec"; github = "pmyjavec";
@ -9355,6 +9623,12 @@
githubId = 52847440; githubId = 52847440;
name = "Ryan Burns"; name = "Ryan Burns";
}; };
r3dl3g = {
email = "redleg@rothfuss-web.de";
github = "r3dl3g";
githubId = 35229674;
name = "Armin Rothfuss";
};
raboof = { raboof = {
email = "arnout@bzzt.net"; email = "arnout@bzzt.net";
matrix = "@raboof:matrix.org"; matrix = "@raboof:matrix.org";
@ -9547,12 +9821,28 @@
githubId = 500703; githubId = 500703;
name = "Tadas Barzdžius"; name = "Tadas Barzdžius";
}; };
revol-xut = {
email = "revol-xut@protonmail.com";
name = "Tassilo Tanneberger";
github = "revol-xut";
githubId = 32239737;
keys = [{
longkeyid = "rsa4096/B966009D57E69CC6";
fingerprint = "91EB E870 1639 1323 642A 6803 B966 009D 57E6 9CC6";
}];
};
rexim = { rexim = {
email = "reximkut@gmail.com"; email = "reximkut@gmail.com";
github = "rexim"; github = "rexim";
githubId = 165283; githubId = 165283;
name = "Alexey Kutepov"; name = "Alexey Kutepov";
}; };
rewine = {
email = "lhongxu@outlook.com";
github = "wineee";
githubId = 22803888;
name = "Lu Hongxu";
};
rgrunbla = { rgrunbla = {
email = "remy@grunblatt.org"; email = "remy@grunblatt.org";
github = "rgrunbla"; github = "rgrunbla";
@ -9619,6 +9909,12 @@
githubId = 37246692; githubId = 37246692;
name = "Riley Inman"; name = "Riley Inman";
}; };
riotbib = {
email = "github-nix@lnrt.de";
github = "riotbib";
githubId = 43172581;
name = "Lennart Mühlenmeier";
};
ris = { ris = {
email = "code@humanleg.org.uk"; email = "code@humanleg.org.uk";
github = "risicle"; github = "risicle";
@ -9642,12 +9938,6 @@
} }
]; ];
}; };
rittelle = {
email = "rittelle@posteo.de";
github = "rittelle";
githubId = 33598633;
name = "Lennart Rittel";
};
rixed = { rixed = {
email = "rixed-github@happyleptic.org"; email = "rixed-github@happyleptic.org";
github = "rixed"; github = "rixed";
@ -9832,6 +10122,12 @@
githubId = 592876; githubId = 592876;
name = "Robert W. Pearce"; name = "Robert W. Pearce";
}; };
rprecenth = {
email = "rasmus@precenth.eu";
github = "Prillan";
githubId = 1675190;
name = "Rasmus Précenth";
};
rprospero = { rprospero = {
email = "rprospero+nix@gmail.com"; email = "rprospero+nix@gmail.com";
github = "rprospero"; github = "rprospero";
@ -9850,6 +10146,12 @@
githubId = 373566; githubId = 373566;
name = "Ronuk Raval"; name = "Ronuk Raval";
}; };
rski = {
name = "rski";
email = "rom.skiad+nix@gmail.com";
github = "rski";
githubId = 2960312;
};
rszibele = { rszibele = {
email = "richard@szibele.com"; email = "richard@szibele.com";
github = "rszibele"; github = "rszibele";
@ -9992,6 +10294,17 @@
github = "s1341"; github = "s1341";
githubId = 5682183; githubId = 5682183;
}; };
sagikazarmark = {
name = "Mark Sagi-Kazar";
email = "mark.sagikazar@gmail.com";
matrix = "@mark.sagikazar:matrix.org";
github = "sagikazarmark";
githubId = 1226384;
keys = [{
longkeyid = "rsa4096/0xF251ADDC9D041C7E";
fingerprint = "E628 C811 6FB8 1657 F706 4EA4 F251 ADDC 9D04 1C7E";
}];
};
samalws = { samalws = {
email = "sam@samalws.com"; email = "sam@samalws.com";
name = "Sam Alws"; name = "Sam Alws";
@ -10109,6 +10422,12 @@
githubId = 720864; githubId = 720864;
name = "Sébastien Bourdeauducq"; name = "Sébastien Bourdeauducq";
}; };
sbellem = {
email = "sbellem@gmail.com";
github = "sbellem";
githubId = 125458;
name = "Sylvain Bellemare";
};
sbond75 = { sbond75 = {
name = "sbond75"; name = "sbond75";
email = "43617712+sbond75@users.noreply.github.com"; email = "43617712+sbond75@users.noreply.github.com";
@ -10369,6 +10688,12 @@
githubId = 251028; githubId = 251028;
name = "Shell Turner"; name = "Shell Turner";
}; };
shikanime = {
name = "William Phetsinorath";
email = "deva.shikanime@protonmail.com";
github = "shikanime";
githubId = 22115108;
};
shlevy = { shlevy = {
email = "shea@shealevy.com"; email = "shea@shealevy.com";
github = "shlevy"; github = "shlevy";
@ -10761,6 +11086,12 @@
github = "staccato"; github = "staccato";
githubId = 86573128; githubId = 86573128;
}; };
stackshadow = {
email = "stackshadow@evilbrain.de";
github = "stackshadow";
githubId = 7512804;
name = "Martin Langlotz";
};
steell = { steell = {
email = "steve@steellworks.com"; email = "steve@steellworks.com";
github = "Steell"; github = "Steell";
@ -10910,13 +11241,6 @@
githubId = 2666479; githubId = 2666479;
name = "Y Nguyen"; name = "Y Nguyen";
}; };
superherointj = {
name = "Sérgio G.";
email = "5861043+superherointj@users.noreply.github.com";
matrix = "@superherointj:matrix.org";
github = "superherointj";
githubId = 5861043;
};
SuperSandro2000 = { SuperSandro2000 = {
email = "sandro.jaeckel@gmail.com"; email = "sandro.jaeckel@gmail.com";
matrix = "@sandro:supersandro.de"; matrix = "@sandro:supersandro.de";
@ -11073,6 +11397,16 @@
githubId = 321799; githubId = 321799;
name = "Paul Colomiets"; name = "Paul Colomiets";
}; };
taikx4 = {
email = "taikx4@taikx4szlaj2rsdupcwabg35inbny4jk322ngeb7qwbbhd5i55nf5yyd.onion";
github = "taikx4";
githubId = 94917129;
name = "taikx4";
keys = [{
longkeyid = "ed25519/0xCCD52C7B37BB837E";
fingerprint = "6B02 8103 C4E5 F68C D77C 9E54 CCD5 2C7B 37BB 837E";
}];
};
takagiy = { takagiy = {
email = "takagiy.4dev@gmail.com"; email = "takagiy.4dev@gmail.com";
github = "takagiy"; github = "takagiy";
@ -11256,6 +11590,17 @@
githubId = 1141680; githubId = 1141680;
name = "Thane Gill"; name = "Thane Gill";
}; };
thblt = {
name = "Thibault Polge";
email = "thibault@thb.lt";
matrix = "@thbltp:matrix.org";
github = "thblt";
githubId = 2453136;
keys = [{
longkeyid = "rsa4096/0x63A44817A52EAB7B";
fingerprint = "D2A2 F0A1 E7A8 5E6F B711 DEE5 63A4 4817 A52E AB7B";
}];
};
TheBrainScrambler = { TheBrainScrambler = {
email = "esthromeris@riseup.net"; email = "esthromeris@riseup.net";
github = "TheBrainScrambler"; github = "TheBrainScrambler";
@ -11443,6 +11788,12 @@
fingerprint = "556A 403F B0A2 D423 F656 3424 8489 B911 F9ED 617B"; fingerprint = "556A 403F B0A2 D423 F656 3424 8489 B911 F9ED 617B";
}]; }];
}; };
tmarkovski = {
email = "tmarkovski@gmail.com";
github = "tmarkovski";
githubId = 1280118;
name = "Tomislav Markovski";
};
tmountain = { tmountain = {
email = "tinymountain@gmail.com"; email = "tinymountain@gmail.com";
github = "tmountain"; github = "tmountain";
@ -11612,6 +11963,12 @@
githubId = 1568873; githubId = 1568873;
name = "Torsten Scholak"; name = "Torsten Scholak";
}; };
tshaynik = {
email = "tshaynik@protonmail.com";
github = "tshaynik";
githubId = 15064765;
name = "tshaynik";
};
tstrobel = { tstrobel = {
email = "4ZKTUB6TEP74PYJOPWIR013S2AV29YUBW5F9ZH2F4D5UMJUJ6S@hash.domains"; email = "4ZKTUB6TEP74PYJOPWIR013S2AV29YUBW5F9ZH2F4D5UMJUJ6S@hash.domains";
name = "Thomas Strobel"; name = "Thomas Strobel";
@ -12181,7 +12538,7 @@
githubId = 6016963; githubId = 6016963;
name = "Patrick Winter"; name = "Patrick Winter";
}; };
winterqt = { winter = {
email = "nixos@winter.cafe"; email = "nixos@winter.cafe";
github = "winterqt"; github = "winterqt";
githubId = 78392041; githubId = 78392041;
@ -12531,6 +12888,16 @@
fingerprint = "9270 66BD 8125 A45B 4AC4 0326 6180 7181 F60E FCB2"; fingerprint = "9270 66BD 8125 A45B 4AC4 0326 6180 7181 F60E FCB2";
}]; }];
}; };
yuu = {
email = "yuuyin@protonmail.com";
github = "yuuyins";
githubId = 86538850;
name = "Yuu Yin";
keys = [{
longkeyid = "rsa4096/0x416F303B43C20AC3";
fingerprint = "9F19 3AE8 AA25 647F FC31 46B5 416F 303B 43C2 0AC3";
}];
};
yvesf = { yvesf = {
email = "yvesf+nix@xapek.org"; email = "yvesf+nix@xapek.org";
github = "yvesf"; github = "yvesf";
@ -12654,12 +13021,6 @@
githubId = 1772064; githubId = 1772064;
name = "Tim Zook"; name = "Tim Zook";
}; };
zoomulator = {
email = "zoomulator@gmail.com";
github = "zoomulator";
githubId = 1069303;
name = "Kim Simmons";
};
zopieux = { zopieux = {
email = "zopieux@gmail.com"; email = "zopieux@gmail.com";
github = "zopieux"; github = "zopieux";
@ -12994,17 +13355,16 @@
github = "zupo"; github = "zupo";
githubId = 311580; githubId = 311580;
}; };
rski = { sei40kr = {
name = "rski"; name = "Seong Yong-ju";
email = "rom.skiad+nix@gmail.com"; email = "sei40kr@gmail.com";
github = "rski"; github = "sei40kr";
githubId = 2960312; githubId = 11665236;
}; };
mbprtpmnr = { vdot0x23 = {
name = "mbprtpmnr"; name = "Victor Büttner";
email = "mbprtpmnr@pm.me"; email = "nix.victor@0x23.dk";
github = "mbprtpmnr"; github = "vdot0x23";
githubId = 88109321; githubId = 40716069;
}; };
} }

View file

@ -37,7 +37,7 @@ let
keyDrv = drv: if canEval drv.drvPath then { key = drv.drvPath; value = drv; } else { }; keyDrv = drv: if canEval drv.drvPath then { key = drv.drvPath; value = drv; } else { };
immediateDependenciesOf = drv: immediateDependenciesOf = drv:
concatLists (mapAttrsToList (n: v: derivationsIn v) (removeAttrs drv ["meta" "passthru"])); concatLists (mapAttrsToList (n: v: derivationsIn v) (removeAttrs drv (["meta" "passthru"] ++ optionals (drv?passthru) (attrNames drv.passthru))));
derivationsIn = x: derivationsIn = x:
if !canEval x then [] if !canEval x then []

View file

@ -73,7 +73,7 @@ lyaml,,,,,,lblasc
markdown,,,,,, markdown,,,,,,
mediator_lua,,,,,, mediator_lua,,,,,,
mpack,,,,,, mpack,,,,,,
moonscript,,,,,,arobyn moonscript,https://github.com/leafo/moonscript.git,dev-1,,,,arobyn
nvim-client,https://github.com/neovim/lua-client.git,,,,, nvim-client,https://github.com/neovim/lua-client.git,,,,,
penlight,https://github.com/lunarmodules/Penlight.git,,,,,alerque penlight,https://github.com/lunarmodules/Penlight.git,,,,,alerque
plenary.nvim,https://github.com/nvim-lua/plenary.nvim.git,,,,lua5_1, plenary.nvim,https://github.com/nvim-lua/plenary.nvim.git,,,,lua5_1,

1 name src ref server version luaversion maintainers
73 markdown
74 mediator_lua
75 mpack
76 moonscript https://github.com/leafo/moonscript.git dev-1 arobyn
77 nvim-client https://github.com/neovim/lua-client.git
78 penlight https://github.com/lunarmodules/Penlight.git alerque
79 plenary.nvim https://github.com/nvim-lua/plenary.nvim.git lua5_1

View file

@ -305,7 +305,7 @@ class CleanEnvironment(object):
def get_current_plugins(editor: Editor) -> List[Plugin]: def get_current_plugins(editor: Editor) -> List[Plugin]:
with CleanEnvironment(): with CleanEnvironment():
cmd = ["nix", "eval", "--json", editor.get_plugins] cmd = ["nix", "eval", "--impure", "--json", "--expr", editor.get_plugins]
log.debug("Running command %s", cmd) log.debug("Running command %s", cmd)
out = subprocess.check_output(cmd) out = subprocess.check_output(cmd)
data = json.loads(out) data = json.loads(out)

View file

@ -114,7 +114,7 @@ async def check_changes(package: Dict, worktree: str, update_info: str):
changes[0]['newVersion'] = json.loads((await obtain_new_version_process.stdout.read()).decode('utf-8')) changes[0]['newVersion'] = json.loads((await obtain_new_version_process.stdout.read()).decode('utf-8'))
if 'files' not in changes[0]: if 'files' not in changes[0]:
changed_files_process = await check_subprocess('git', 'diff', '--name-only', stdout=asyncio.subprocess.PIPE, cwd=worktree) changed_files_process = await check_subprocess('git', 'diff', '--name-only', 'HEAD', stdout=asyncio.subprocess.PIPE, cwd=worktree)
changed_files = (await changed_files_process.stdout.read()).splitlines() changed_files = (await changed_files_process.stdout.read()).splitlines()
changes[0]['files'] = changed_files changes[0]['files'] = changed_files

View file

@ -93,7 +93,6 @@ with lib.maintainers; {
cstrahan cstrahan
Frostman Frostman
kalbasit kalbasit
mdlayher
mic92 mic92
orivej orivej
rvolosatovs rvolosatovs
@ -200,7 +199,6 @@ with lib.maintainers; {
openstack = { openstack = {
members = [ members = [
angustrau angustrau
superherointj
SuperSandro2000 SuperSandro2000
]; ];
scope = "Maintain the ecosystem around OpenStack"; scope = "Maintain the ecosystem around OpenStack";

View file

@ -58,5 +58,5 @@ a while to finish.
## NixOS Boot Entries {#sect-nixos-gc-boot-entries} ## NixOS Boot Entries {#sect-nixos-gc-boot-entries}
If your `/boot` partition runs out of space, after clearing old profiles If your `/boot` partition runs out of space, after clearing old profiles
you must rebuild your system with `nixos-rebuild` to update the `/boot` you must rebuild your system with `nixos-rebuild boot` or `nixos-rebuild
partition and clear space. switch` to update the `/boot` partition and clear space.

View file

@ -26,7 +26,7 @@ we assign the name `wan` to the interface with MAC address
```nix ```nix
systemd.network.links."10-wan" = { systemd.network.links."10-wan" = {
matchConfig.MACAddress = "52:54:00:12:01:01"; matchConfig.PermanentMACAddress = "52:54:00:12:01:01";
linkConfig.Name = "wan"; linkConfig.Name = "wan";
}; };
``` ```

View file

@ -159,6 +159,17 @@ The following methods are available on machine objects:
`execute` `execute`
: Execute a shell command, returning a list `(status, stdout)`. : Execute a shell command, returning a list `(status, stdout)`.
If the command detaches, it must close stdout, as `execute` will wait
for this to consume all output reliably. This can be achieved by
redirecting stdout to stderr `>&2`, to `/dev/console`, `/dev/null` or
a file. Examples of detaching commands are `sleep 365d &`, where the
shell forks a new process that can write to stdout and `xclip -i`, where
the `xclip` command itself forks without closing stdout.
Takes an optional parameter `check_return` that defaults to `True`.
Setting this parameter to `False` will not check for the return code
and return -1 instead. This can be used for commands that shut down
the VM and would therefore break the pipe that would be used for
retrieving the return code.
`succeed` `succeed`
@ -174,6 +185,9 @@ The following methods are available on machine objects:
- Dereferencing unset variables fail the command. - Dereferencing unset variables fail the command.
- It will wait for stdout to be closed. See `execute` for the
implications.
`fail` `fail`
: Like `succeed`, but raising an exception if the command returns a zero : Like `succeed`, but raising an exception if the command returns a zero

View file

@ -64,7 +64,8 @@ $ nix-store --optimise
<para> <para>
If your <literal>/boot</literal> partition runs out of space, If your <literal>/boot</literal> partition runs out of space,
after clearing old profiles you must rebuild your system with after clearing old profiles you must rebuild your system with
<literal>nixos-rebuild</literal> to update the <literal>nixos-rebuild boot</literal> or
<literal>nixos-rebuild switch</literal> to update the
<literal>/boot</literal> partition and clear space. <literal>/boot</literal> partition and clear space.
</para> </para>
</section> </section>

View file

@ -32,7 +32,7 @@
</para> </para>
<programlisting language="bash"> <programlisting language="bash">
systemd.network.links.&quot;10-wan&quot; = { systemd.network.links.&quot;10-wan&quot; = {
matchConfig.MACAddress = &quot;52:54:00:12:01:01&quot;; matchConfig.PermanentMACAddress = &quot;52:54:00:12:01:01&quot;;
linkConfig.Name = &quot;wan&quot;; linkConfig.Name = &quot;wan&quot;;
}; };
</programlisting> </programlisting>

View file

@ -266,7 +266,23 @@ start_all()
<listitem> <listitem>
<para> <para>
Execute a shell command, returning a list Execute a shell command, returning a list
<literal>(status, stdout)</literal>. <literal>(status, stdout)</literal>. If the command detaches,
it must close stdout, as <literal>execute</literal> will wait
for this to consume all output reliably. This can be achieved
by redirecting stdout to stderr <literal>&gt;&amp;2</literal>,
to <literal>/dev/console</literal>,
<literal>/dev/null</literal> or a file. Examples of detaching
commands are <literal>sleep 365d &amp;</literal>, where the
shell forks a new process that can write to stdout and
<literal>xclip -i</literal>, where the
<literal>xclip</literal> command itself forks without closing
stdout. Takes an optional parameter
<literal>check_return</literal> that defaults to
<literal>True</literal>. Setting this parameter to
<literal>False</literal> will not check for the return code
and return -1 instead. This can be used for commands that shut
down the VM and would therefore break the pipe that would be
used for retrieving the return code.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -300,6 +316,12 @@ start_all()
Dereferencing unset variables fail the command. Dereferencing unset variables fail the command.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
It will wait for stdout to be closed. See
<literal>execute</literal> for the implications.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</listitem> </listitem>
</varlistentry> </varlistentry>

View file

@ -25,8 +25,11 @@
<para> <para>
You are logged-in automatically as <literal>nixos</literal>. The You are logged-in automatically as <literal>nixos</literal>. The
<literal>nixos</literal> user account has an empty password so you <literal>nixos</literal> user account has an empty password so you
can use <literal>sudo</literal> without a password. can use <literal>sudo</literal> without a password:
</para> </para>
<programlisting>
$ sudo -i
</programlisting>
<para> <para>
If you downloaded the graphical ISO image, you can run If you downloaded the graphical ISO image, you can run
<literal>systemctl start display-manager</literal> to start the <literal>systemctl start display-manager</literal> to start the

View file

@ -12,7 +12,7 @@
<listitem> <listitem>
<para> <para>
<emphasis>Stable channels</emphasis>, such as <emphasis>Stable channels</emphasis>, such as
<link xlink:href="https://nixos.org/channels/nixos-21.05"><literal>nixos-21.05</literal></link>. <link xlink:href="https://nixos.org/channels/nixos-21.11"><literal>nixos-21.11</literal></link>.
These only get conservative bug fixes and package upgrades. For These only get conservative bug fixes and package upgrades. For
instance, a channel update may cause the Linux kernel on your instance, a channel update may cause the Linux kernel on your
system to be upgraded from 4.19.34 to 4.19.38 (a minor bug fix), system to be upgraded from 4.19.34 to 4.19.38 (a minor bug fix),
@ -33,7 +33,7 @@
<listitem> <listitem>
<para> <para>
<emphasis>Small channels</emphasis>, such as <emphasis>Small channels</emphasis>, such as
<link xlink:href="https://nixos.org/channels/nixos-21.05-small"><literal>nixos-21.05-small</literal></link> <link xlink:href="https://nixos.org/channels/nixos-21.11-small"><literal>nixos-21.11-small</literal></link>
or or
<link xlink:href="https://nixos.org/channels/nixos-unstable-small"><literal>nixos-unstable-small</literal></link>. <link xlink:href="https://nixos.org/channels/nixos-unstable-small"><literal>nixos-unstable-small</literal></link>.
These are identical to the stable and unstable channels These are identical to the stable and unstable channels
@ -60,8 +60,8 @@
<para> <para>
When you first install NixOS, youre automatically subscribed to the When you first install NixOS, youre automatically subscribed to the
NixOS channel that corresponds to your installation source. For NixOS channel that corresponds to your installation source. For
instance, if you installed from a 21.05 ISO, you will be subscribed instance, if you installed from a 21.11 ISO, you will be subscribed
to the <literal>nixos-21.05</literal> channel. To see which NixOS to the <literal>nixos-21.11</literal> channel. To see which NixOS
channel youre subscribed to, run the following as root: channel youre subscribed to, run the following as root:
</para> </para>
<programlisting> <programlisting>
@ -76,17 +76,17 @@ nixos https://nixos.org/channels/nixos-unstable
</programlisting> </programlisting>
<para> <para>
(Be sure to include the <literal>nixos</literal> parameter at the (Be sure to include the <literal>nixos</literal> parameter at the
end.) For instance, to use the NixOS 21.05 stable channel: end.) For instance, to use the NixOS 21.11 stable channel:
</para> </para>
<programlisting> <programlisting>
# nix-channel --add https://nixos.org/channels/nixos-21.05 nixos # nix-channel --add https://nixos.org/channels/nixos-21.11 nixos
</programlisting> </programlisting>
<para> <para>
If you have a server, you may want to use the <quote>small</quote> If you have a server, you may want to use the <quote>small</quote>
channel instead: channel instead:
</para> </para>
<programlisting> <programlisting>
# nix-channel --add https://nixos.org/channels/nixos-21.05-small nixos # nix-channel --add https://nixos.org/channels/nixos-21.11-small nixos
</programlisting> </programlisting>
<para> <para>
And if you want to live on the bleeding edge: And if you want to live on the bleeding edge:
@ -146,7 +146,7 @@ system.autoUpgrade.allowReboot = true;
also specify a channel explicitly, e.g. also specify a channel explicitly, e.g.
</para> </para>
<programlisting language="bash"> <programlisting language="bash">
system.autoUpgrade.channel = https://nixos.org/channels/nixos-21.05; system.autoUpgrade.channel = https://nixos.org/channels/nixos-21.11;
</programlisting> </programlisting>
</section> </section>
</chapter> </chapter>

View file

@ -1,9 +1,5 @@
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-release-21.11"> <section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-release-21.11">
<title>Release 21.11 (“Porcupine”, 2021.11/??)</title> <title>Release 21.11 (“Porcupine”, 2021/11/30)</title>
<para>
In addition to numerous new and upgraded packages, this release has
the following highlights:
</para>
<itemizedlist spacing="compact"> <itemizedlist spacing="compact">
<listitem> <listitem>
<para> <para>
@ -14,7 +10,26 @@
</itemizedlist> </itemizedlist>
<section xml:id="sec-release-21.11-highlights"> <section xml:id="sec-release-21.11-highlights">
<title>Highlights</title> <title>Highlights</title>
<para>
In addition to numerous new and upgraded packages, this release
has the following highlights:
</para>
<itemizedlist> <itemizedlist>
<listitem>
<para>
Nix has been updated to version 2.4, reference its
<link xlink:href="https://discourse.nixos.org/t/nix-2-4-released/15822">release
notes</link> for more information on what has changed. The
previous version of Nix, 2.3.16, remains available for the
time being in the <literal>nix_2_3</literal> package.
</para>
</listitem>
<listitem>
<para>
<literal>iptables</literal> now uses
<literal>nf_tables</literal> backend.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
PHP now defaults to PHP 8.0, updated from 7.4. PHP now defaults to PHP 8.0, updated from 7.4.
@ -22,7 +37,7 @@
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
kOps now defaults to 1.21.1, which uses containerd as the kops now defaults to 1.21.1, which uses containerd as the
default runtime. default runtime.
</para> </para>
</listitem> </listitem>
@ -46,13 +61,36 @@
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
Activation scripts can now opt int to be run when running Improvements have been made to the Hadoop module and package:
<literal>nixos-rebuild dry-activate</literal> and detect the </para>
dry activation by reading <literal>$NIXOS_ACTION</literal>. <itemizedlist spacing="compact">
This allows activation scripts to output what they would <listitem>
change if the activation was really run. The users/modules <para>
activation script supports this and outputs some of is HDFS and YARN now support production-ready highly
actions. available deployments with automatic failover.
</para>
</listitem>
<listitem>
<para>
Hadoop now defaults to Hadoop 3, updated from 2.
</para>
</listitem>
<listitem>
<para>
JournalNode, ZKFS and HTTPFS services have been added.
</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>
Activation scripts can now, optionally, be run during a
<literal>nixos-rebuild dry-activate</literal> and can detect
the dry activation by reading
<literal>$NIXOS_ACTION</literal>. This allows activation
scripts to output what they would change if the activation was
really run. The users/modules activation script supports this
and outputs some of is actions.
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
@ -94,6 +132,81 @@
Notes</link> for details. Notes</link> for details.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
LXD support was greatly improved:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
building LXD images from configurations is now directly
possible with just nixpkgs
</para>
</listitem>
<listitem>
<para>
hydra is now building nixOS LXD images that can be used
standalone with full nixos-rebuild support
</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>
OpenSSH was updated to version 8.8p1
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
This breaks connections to old SSH daemons as ssh-rsa host
keys and ssh-rsa public keys that were signed with SHA-1
are disabled by default now
</para>
</listitem>
<listitem>
<para>
These can be re-enabled, see the
<link xlink:href="https://www.openssh.com/txt/release-8.8">OpenSSH
changelog</link> for details
</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>
ORY Kratos was updated to version 0.8.0-alpha.3
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
This release requires you to run SQL migrations. Please,
as always, create a backup of your database first!
</para>
</listitem>
<listitem>
<para>
The SDKs are now generated with tag v0alpha2 to reflect
that some signatures have changed in a breaking fashion.
Please update your imports from v0alpha1 to v0alpha2.
</para>
</listitem>
<listitem>
<para>
The SMTPS scheme used in courier config URL with
cleartext/StartTLS/TLS SMTP connection types is now only
supporting implicit TLS. For StartTLS and cleartext SMTP,
please use the SMTP scheme instead.
</para>
</listitem>
<listitem>
<para>
for more details, see
<link xlink:href="https://github.com/ory/kratos/releases/tag/v0.8.0-alpha.1">Release
Notes</link>.
</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sec-release-21.11-new-services"> <section xml:id="sec-release-21.11-new-services">
@ -142,14 +255,14 @@
<para> <para>
<link xlink:href="https://www.isc.org/kea/">Kea</link>, ISCs <link xlink:href="https://www.isc.org/kea/">Kea</link>, ISCs
2nd generation DHCP and DDNS server suite. Available at 2nd generation DHCP and DDNS server suite. Available at
<link xlink:href="options.html#opt-services.kea">services.kea</link>. <link xlink:href="options.html#opt-services.kea.dhcp4">services.kea</link>.
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
<link xlink:href="https://owncast.online/">owncast</link>, <link xlink:href="https://owncast.online/">owncast</link>,
self-hosted video live streaming solution. Available at self-hosted video live streaming solution. Available at
<link xlink:href="options.html#opt-services.owncast">services.owncast</link>. <link xlink:href="options.html#opt-services.owncast.enable">services.owncast</link>.
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
@ -157,7 +270,7 @@
<link xlink:href="https://joinpeertube.org/">PeerTube</link>, <link xlink:href="https://joinpeertube.org/">PeerTube</link>,
developed by Framasoft, is the free and decentralized developed by Framasoft, is the free and decentralized
alternative to video platforms. Available at alternative to video platforms. Available at
<link xlink:href="options.html#opt-services.peertube">services.peertube</link>. <link xlink:href="options.html#opt-services.peertube.enable">services.peertube</link>.
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
@ -381,11 +494,68 @@
<link xlink:href="options.html#opt-services.seafile.enable">services.seafile</link>. <link xlink:href="options.html#opt-services.seafile.enable">services.seafile</link>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<link xlink:href="https://github.com/mchehab/rasdaemon">rasdaemon</link>,
a hardware error logging daemon. Available as
<link linkend="opt-hardware.rasdaemon.enable">hardware.rasdaemon</link>.
</para>
</listitem>
<listitem>
<para>
<literal>code-server</literal>-module now available
</para>
</listitem>
<listitem>
<para>
<link xlink:href="https://github.com/xmrig/xmrig">xmrig</link>,
a high performance, open source, cross platform RandomX,
KawPow, CryptoNight and AstroBWT unified CPU/GPU miner and
RandomX benchmark.
</para>
</listitem>
<listitem>
<para>
Auto nice daemons
<link xlink:href="https://github.com/Nefelim4ag/Ananicy">ananicy</link>
and
<link xlink:href="https://gitlab.com/ananicy-cpp/ananicy-cpp/">ananicy-cpp</link>.
Available as
<link linkend="opt-services.ananicy.enable">services.ananicy</link>.
</para>
</listitem>
<listitem>
<para>
<link xlink:href="https://github.com/prometheus-community/smartctl_exporter">smartctl_exporter</link>,
a Prometheus exporter for
<link xlink:href="https://en.wikipedia.org/wiki/S.M.A.R.T.">S.M.A.R.T.</link>
data. Available as
<link xlink:href="options.html#opt-services.prometheus.exporters.smartctl.enable">services.prometheus.exporters.smartctl</link>.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sec-release-21.11-incompatibilities"> <section xml:id="sec-release-21.11-incompatibilities">
<title>Backward Incompatibilities</title> <title>Backward Incompatibilities</title>
<itemizedlist> <itemizedlist>
<listitem>
<para>
The NixOS VM test framework,
<literal>pkgs.nixosTest</literal>/<literal>make-test-python.nix</literal>,
now requires detaching commands such as
<literal>succeed(&quot;foo &amp;&quot;)</literal> and
<literal>succeed(&quot;foo | xclip -i&quot;)</literal> to
close stdout. This can be done with a redirect such as
<literal>succeed(&quot;foo &gt;&amp;2 &amp;&quot;)</literal>.
This breaking change was necessitated by a race condition
causing tests to fail or hang. It applies to all methods that
invoke commands on the nodes, including
<literal>execute</literal>, <literal>succeed</literal>,
<literal>fail</literal>,
<literal>wait_until_succeeds</literal>,
<literal>wait_until_fails</literal>.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
The <literal>services.wakeonlan</literal> option was removed, The <literal>services.wakeonlan</literal> option was removed,
@ -403,6 +573,14 @@
nobody/nogroup, which is unsafe. nobody/nogroup, which is unsafe.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Since <literal>iptables</literal> now uses
<literal>nf_tables</literal> backend and
<literal>ipset</literal> doesnt support it, some applications
(ferm, shorewall, firehol) may have limited functionality.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
The <literal>paperless</literal> module and package have been The <literal>paperless</literal> module and package have been
@ -490,7 +668,7 @@ Superuser created successfully.
<listitem> <listitem>
<para> <para>
The <literal>staticjinja</literal> package has been upgraded The <literal>staticjinja</literal> package has been upgraded
from 1.0.4 to 4.1.0 from 1.0.4 to 4.1.1
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
@ -549,6 +727,17 @@ Superuser created successfully.
<link xlink:href="options.html#opt-services.geoipupdate.enable">services.geoipupdate</link>. <link xlink:href="options.html#opt-services.geoipupdate.enable">services.geoipupdate</link>.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<literal>ihatemoney</literal> has been updated to version
5.1.1
(<link xlink:href="https://github.com/spiral-project/ihatemoney/blob/5.1.1/CHANGELOG.rst">release
notes</link>). If you serve ihatemoney by HTTP rather than
HTTPS, you must set
<link xlink:href="options.html#opt-services.ihatemoney.secureCookie">services.ihatemoney.secureCookie</link>
to <literal>false</literal>.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
PHP 7.3 is no longer supported due to upstream not supporting PHP 7.3 is no longer supported due to upstream not supporting
@ -1153,6 +1342,21 @@ Superuser created successfully.
would be parsed as 3 parameters. would be parsed as 3 parameters.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<literal>nix.daemonNiceLevel</literal> and
<literal>nix.daemonIONiceLevel</literal> have been removed in
favour of the new options
<link xlink:href="options.html#opt-nix.daemonCPUSchedPolicy"><literal>nix.daemonCPUSchedPolicy</literal></link>,
<link xlink:href="options.html#opt-nix.daemonIOSchedClass"><literal>nix.daemonIOSchedClass</literal></link>
and
<link xlink:href="options.html#opt-nix.daemonIOSchedPriority"><literal>nix.daemonIOSchedPriority</literal></link>.
Please refer to the options documentation and the
<literal>sched(7)</literal> and
<literal>ioprio_set(2)</literal> man pages for guidance on how
to use them.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
The <literal>coursier</literal> packages binary was renamed The <literal>coursier</literal> packages binary was renamed
@ -1170,12 +1374,52 @@ Superuser created successfully.
will no longer work and must be updated. will no longer work and must be updated.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The <literal>fluidsynth_1</literal> attribute has been
removed, as this legacy version is no longer needed in
nixpkgs. The actively maintained 2.x series is available as
<literal>fluidsynth</literal> unchanged.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
Nextcloud 20 (<literal>pkgs.nextcloud20</literal>) has been Nextcloud 20 (<literal>pkgs.nextcloud20</literal>) has been
dropped because it was EOLed by upstream in 2021-10. dropped because it was EOLed by upstream in 2021-10.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The <literal>virtualisation.pathsInNixDB</literal> option was
renamed
<link xlink:href="options.html#opt-virtualisation.additionalPaths"><literal>virtualisation.additionalPaths</literal></link>.
</para>
</listitem>
<listitem>
<para>
The <literal>services.ddclient.password</literal> option was
removed, and replaced with
<literal>services.ddclient.passwordFile</literal>.
</para>
</listitem>
<listitem>
<para>
The default GNAT version has been changed: The
<literal>gnat</literal> attribute now points to
<literal>gnat11</literal> instead of <literal>gnat9</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>retroArchCores</literal> has been removed. This means
that using <literal>nixpkgs.config.retroarch</literal> to
customize RetroArch cores is not supported anymore. Instead,
use package overrides, for example:
<literal>retroarch.override { cores = with libretro; [ citra snes9x ]; };</literal>.
Also, <literal>retroarchFull</literal> derivation is available
for those who want to have all RetroArch cores available.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sec-release-21.11-notable-changes"> <section xml:id="sec-release-21.11-notable-changes">
@ -1199,25 +1443,31 @@ Superuser created successfully.
<para> <para>
In NixOS virtual machines (QEMU), the In NixOS virtual machines (QEMU), the
<literal>virtualisation</literal> module has been updated with <literal>virtualisation</literal> module has been updated with
new options to configure: new options:
</para> </para>
<itemizedlist spacing="compact"> <itemizedlist spacing="compact">
<listitem> <listitem>
<para> <para>
IPv4 port forwarding <link xlink:href="options.html#opt-virtualisation.forwardPorts"><literal>forwardPorts</literal></link>
(<link xlink:href="options.html#opt-virtualisation.forwardPorts"><literal>virtualisation.forwardPorts</literal></link>), to configure IPv4 port forwarding,
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
shared host directories <link xlink:href="options.html#opt-virtualisation.sharedDirectories"><literal>sharedDirectories</literal></link>
(<link xlink:href="options.html#opt-virtualisation.sharedDirectories"><literal>virtualisation.sharedDirectories</literal></link>), to set up shared host directories,
</para> </para>
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
screen resolution <link xlink:href="options.html#opt-virtualisation.resolution"><literal>resolution</literal></link>
(<link xlink:href="options.html#opt-virtualisation.resolution"><literal>virtualisation.resolution</literal></link>). to set the screen resolution,
</para>
</listitem>
<listitem>
<para>
<link xlink:href="options.html#opt-virtualisation.useNixStoreImage"><literal>useNixStoreImage</literal></link>
to use a disk image for the Nix store instead of 9P.
</para> </para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
@ -1470,6 +1720,23 @@ Superuser created successfully.
option. option.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
The
<link xlink:href="options.html#opt-services.smokeping.host">services.smokeping.host</link>
option was added and defaulted to
<literal>localhost</literal>. Before,
<literal>smokeping</literal> listened to all interfaces by
default. NixOS defaults generally aim to provide
non-Internet-exposed defaults for databases and internal
monitoring tools, see e.g.
<link xlink:href="https://github.com/NixOS/nixpkgs/issues/100192">#100192</link>.
Further, the systemd service for <literal>smokeping</literal>
got reworked defaults for increased operational stability, see
<link xlink:href="https://github.com/NixOS/nixpkgs/pull/144127">PR
#144127</link> for details.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
The The
@ -1602,15 +1869,6 @@ Superuser created successfully.
encapsulation. encapsulation.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Changing systemd <literal>.socket</literal> units now restarts
them and stops the service that is activated by them.
Additionally, services with
<literal>stopOnChange = false</literal> dont break anymore
when they are socket-activated.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
The <literal>virtualisation.libvirtd</literal> module has been The <literal>virtualisation.libvirtd</literal> module has been
@ -1653,6 +1911,133 @@ Superuser created successfully.
better user experience and benefit from this change. better user experience and benefit from this change.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
A new option
<literal>services.prometheus.enableReload</literal> has been
added which can be enabled to reload the prometheus service
when its config file changes instead of restarting.
</para>
</listitem>
<listitem>
<para>
The option
<literal>services.prometheus.environmentFile</literal> has
been removed since it was causing
<link xlink:href="https://github.com/NixOS/nixpkgs/issues/126083">issues</link>
and Prometheus now has native support for secret files, i.e.
<literal>basic_auth.password_file</literal> and
<literal>authorization.credentials_file</literal>.
</para>
</listitem>
<listitem>
<para>
Dokuwiki now supports caddy! However
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
the nginx option has been removed, in the new
configuration, please use the
<literal>dokuwiki.webserver = &quot;nginx&quot;</literal>
instead.
</para>
</listitem>
<listitem>
<para>
The <quote>${hostname}</quote> option has been deprecated,
please use
<literal>dokuwiki.sites = [ &quot;${hostname}&quot; ]</literal>
instead
</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>
The
<link xlink:href="options.html#opt-services.unifi.enable">services.unifi</link>
module has been reworked, solving a number of issues. This
leads to several user facing changes:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
The <literal>services.unifi.dataDir</literal> option is
removed and the data is now always located under
<literal>/var/lib/unifi/data</literal>. This is done to
make better use of systemd state direcotiry and thus
making the service restart more reliable.
</para>
</listitem>
<listitem>
<para>
The unifi logs can now be found under:
<literal>/var/log/unifi</literal> instead of
<literal>/var/lib/unifi/logs</literal>.
</para>
</listitem>
<listitem>
<para>
The unifi run directory can now be found under:
<literal>/run/unifi</literal> instead of
<literal>/var/lib/unifi/run</literal>.
</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>
<literal>security.pam.services.&lt;name&gt;.makeHomeDir</literal>
now uses <literal>umask=0077</literal> instead of
<literal>umask=0022</literal> when creating the home
directory.
</para>
</listitem>
<listitem>
<para>
Loki has had another release. Some default values have been
changed for the configuration and some configuration options
have been renamed. For more details, please check
<link xlink:href="https://grafana.com/docs/loki/latest/upgrading/#240">the
upgrade guide</link>.
</para>
</listitem>
<listitem>
<para>
<literal>julia</literal> now refers to
<literal>julia-stable</literal> instead of
<literal>julia-lts</literal>. In practice this means it has
been upgraded from <literal>1.0.4</literal> to
<literal>1.5.4</literal>.
</para>
</listitem>
<listitem>
<para>
RetroArch has been upgraded from version
<literal>1.8.5</literal> to <literal>1.9.13.2</literal>. Since
the previous release was quite old, if youre having issues
after the upgrade, please delete your
<literal>$XDG_CONFIG_HOME/retroarch/retroarch.cfg</literal>
file.
</para>
</listitem>
<listitem>
<para>
hydrus has been upgraded from version <literal>438</literal>
to <literal>463</literal>. Since upgrading between releases
this old is advised against, be sure to have a backup of your
data before upgrading. For details, see
<link xlink:href="https://hydrusnetwork.github.io/hydrus/help/getting_started_installing.html#big_updates">the
hydrus manual</link>.
</para>
</listitem>
<listitem>
<para>
More jdk and jre versions are now exposed via
<literal>java-packages.compiler</literal>.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</section> </section>
</section> </section>

View file

@ -0,0 +1,85 @@
<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-release-22.05">
<title>Release 22.05 (“Quokka”, 2022.05/??)</title>
<para>
In addition to numerous new and upgraded packages, this release has
the following highlights:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
Support is planned until the end of December 2022, handing over
to 22.11.
</para>
</listitem>
</itemizedlist>
<section xml:id="sec-release-22.05-highlights">
<title>Highlights</title>
<para>
</para>
</section>
<section xml:id="sec-release-22.05-new-services">
<title>New Services</title>
<para>
</para>
</section>
<section xml:id="sec-release-22.05-incompatibilities">
<title>Backward Incompatibilities</title>
<itemizedlist>
<listitem>
<para>
<literal>pkgs.ghc</literal> now refers to
<literal>pkgs.targetPackages.haskellPackages.ghc</literal>.
This <emphasis>only</emphasis> makes a difference if you are
cross-compiling and will ensure that
<literal>pkgs.ghc</literal> always runs on the host platform
and compiles for the target platform (similar to
<literal>pkgs.gcc</literal> for example).
<literal>haskellPackages.ghc</literal> still behaves as
before, running on the build platform and compiling for the
host platform (similar to <literal>stdenv.cc</literal>). This
means you dont have to adjust your derivations if you use
<literal>haskellPackages.callPackage</literal>, but when using
<literal>pkgs.callPackage</literal> and taking
<literal>ghc</literal> as an input, you should now use
<literal>buildPackages.ghc</literal> instead to ensure cross
compilation keeps working (or switch to
<literal>haskellPackages.callPackage</literal>).
</para>
</listitem>
<listitem>
<para>
<literal>pkgs.emacsPackages.orgPackages</literal> is removed
because org elpa is deprecated. The packages in the top level
of <literal>pkgs.emacsPackages</literal>, such as org and
org-contrib, refer to the ones in
<literal>pkgs.emacsPackages.elpaPackages</literal> and
<literal>pkgs.emacsPackages.nongnuPackages</literal> where the
new versions will release.
</para>
</listitem>
<listitem>
<para>
The <literal>wafHook</literal> hook now honors
<literal>NIX_BUILD_CORES</literal> when
<literal>enableParallelBuilding</literal> is not set
explicitly. Packages can restore the old behaviour by setting
<literal>enableParallelBuilding=false</literal>.
</para>
</listitem>
<listitem>
<para>
<literal>pkgs.claws-mail-gtk2</literal>, representing Claws
Mails older release version three, was removed in order to
get rid of Python 2. Please switch to
<literal>claws-mail</literal>, which is Claws Mails latest
release based on GTK+3 and Python 3.
</para>
</listitem>
</itemizedlist>
</section>
<section xml:id="sec-release-22.05-notable-changes">
<title>Other Notable Changes</title>
<para>
</para>
</section>
</section>

View file

@ -15,7 +15,10 @@ finished booting, it should have detected most of your hardware.
The NixOS manual is available by running `nixos-help`. The NixOS manual is available by running `nixos-help`.
You are logged-in automatically as `nixos`. The `nixos` user account has You are logged-in automatically as `nixos`. The `nixos` user account has
an empty password so you can use `sudo` without a password. an empty password so you can use `sudo` without a password:
```ShellSession
$ sudo -i
```
If you downloaded the graphical ISO image, you can run `systemctl If you downloaded the graphical ISO image, you can run `systemctl
start display-manager` to start the desktop environment. If you want start display-manager` to start the desktop environment. If you want

View file

@ -6,7 +6,7 @@ expressions and associated binaries. The NixOS channels are updated
automatically from NixOS's Git repository after certain tests have automatically from NixOS's Git repository after certain tests have
passed and all packages have been built. These channels are: passed and all packages have been built. These channels are:
- *Stable channels*, such as [`nixos-21.05`](https://nixos.org/channels/nixos-21.05). - *Stable channels*, such as [`nixos-21.11`](https://nixos.org/channels/nixos-21.11).
These only get conservative bug fixes and package upgrades. For These only get conservative bug fixes and package upgrades. For
instance, a channel update may cause the Linux kernel on your system instance, a channel update may cause the Linux kernel on your system
to be upgraded from 4.19.34 to 4.19.38 (a minor bug fix), but not to be upgraded from 4.19.34 to 4.19.38 (a minor bug fix), but not
@ -19,7 +19,7 @@ passed and all packages have been built. These channels are:
radical changes between channel updates. It's not recommended for radical changes between channel updates. It's not recommended for
production systems. production systems.
- *Small channels*, such as [`nixos-21.05-small`](https://nixos.org/channels/nixos-21.05-small) - *Small channels*, such as [`nixos-21.11-small`](https://nixos.org/channels/nixos-21.11-small)
or [`nixos-unstable-small`](https://nixos.org/channels/nixos-unstable-small). or [`nixos-unstable-small`](https://nixos.org/channels/nixos-unstable-small).
These are identical to the stable and unstable channels described above, These are identical to the stable and unstable channels described above,
except that they contain fewer binary packages. This means they get updated except that they contain fewer binary packages. This means they get updated
@ -38,8 +38,8 @@ newest supported stable release.
When you first install NixOS, you're automatically subscribed to the When you first install NixOS, you're automatically subscribed to the
NixOS channel that corresponds to your installation source. For NixOS channel that corresponds to your installation source. For
instance, if you installed from a 21.05 ISO, you will be subscribed to instance, if you installed from a 21.11 ISO, you will be subscribed to
the `nixos-21.05` channel. To see which NixOS channel you're subscribed the `nixos-21.11` channel. To see which NixOS channel you're subscribed
to, run the following as root: to, run the following as root:
```ShellSession ```ShellSession
@ -54,16 +54,16 @@ To switch to a different NixOS channel, do
``` ```
(Be sure to include the `nixos` parameter at the end.) For instance, to (Be sure to include the `nixos` parameter at the end.) For instance, to
use the NixOS 21.05 stable channel: use the NixOS 21.11 stable channel:
```ShellSession ```ShellSession
# nix-channel --add https://nixos.org/channels/nixos-21.05 nixos # nix-channel --add https://nixos.org/channels/nixos-21.11 nixos
``` ```
If you have a server, you may want to use the "small" channel instead: If you have a server, you may want to use the "small" channel instead:
```ShellSession ```ShellSession
# nix-channel --add https://nixos.org/channels/nixos-21.05-small nixos # nix-channel --add https://nixos.org/channels/nixos-21.11-small nixos
``` ```
And if you want to live on the bleeding edge: And if you want to live on the bleeding edge:
@ -114,5 +114,5 @@ the new generation contains a different kernel, initrd or kernel
modules. You can also specify a channel explicitly, e.g. modules. You can also specify a channel explicitly, e.g.
```nix ```nix
system.autoUpgrade.channel = https://nixos.org/channels/nixos-21.05; system.autoUpgrade.channel = https://nixos.org/channels/nixos-21.11;
``` ```

View file

@ -69,9 +69,14 @@
</arg> </arg>
<arg> <arg>
<group choice='req'>
<arg choice='plain'>
<option>--no-root-password</option>
</arg>
<arg choice='plain'> <arg choice='plain'>
<option>--no-root-passwd</option> <option>--no-root-passwd</option>
</arg> </arg>
</group>
</arg> </arg>
<arg> <arg>
@ -157,7 +162,7 @@
<listitem> <listitem>
<para> <para>
It prompts you for a password for the root account (unless It prompts you for a password for the root account (unless
<option>--no-root-passwd</option> is specified). <option>--no-root-password</option> is specified).
</para> </para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>

View file

@ -1,14 +1,18 @@
# Release 21.11 (“Porcupine”, 2021.11/??) {#sec-release-21.11} # Release 21.11 (“Porcupine”, 2021/11/30) {#sec-release-21.11}
In addition to numerous new and upgraded packages, this release has the following highlights:
- Support is planned until the end of June 2022, handing over to 22.05. - Support is planned until the end of June 2022, handing over to 22.05.
## Highlights {#sec-release-21.11-highlights} ## Highlights {#sec-release-21.11-highlights}
In addition to numerous new and upgraded packages, this release has the following highlights:
- Nix has been updated to version 2.4, reference its [release notes](https://discourse.nixos.org/t/nix-2-4-released/15822) for more information on what has changed. The previous version of Nix, 2.3.16, remains available for the time being in the `nix_2_3` package.
- `iptables` now uses `nf_tables` backend.
- PHP now defaults to PHP 8.0, updated from 7.4. - PHP now defaults to PHP 8.0, updated from 7.4.
- kOps now defaults to 1.21.1, which uses containerd as the default runtime. - kops now defaults to 1.21.1, which uses containerd as the default runtime.
- `python3` now defaults to Python 3.9, updated from Python 3.8. - `python3` now defaults to Python 3.9, updated from Python 3.8.
@ -16,7 +20,12 @@ In addition to numerous new and upgraded packages, this release has the followin
- spark now defaults to spark 3, updated from 2. A [migration guide](https://spark.apache.org/docs/latest/core-migration-guide.html#upgrading-from-core-24-to-30) is available. - spark now defaults to spark 3, updated from 2. A [migration guide](https://spark.apache.org/docs/latest/core-migration-guide.html#upgrading-from-core-24-to-30) is available.
- Activation scripts can now opt int to be run when running `nixos-rebuild dry-activate` and detect the dry activation by reading `$NIXOS_ACTION`. - Improvements have been made to the Hadoop module and package:
- HDFS and YARN now support production-ready highly available deployments with automatic failover.
- Hadoop now defaults to Hadoop 3, updated from 2.
- JournalNode, ZKFS and HTTPFS services have been added.
- Activation scripts can now, optionally, be run during a `nixos-rebuild dry-activate` and can detect the dry activation by reading `$NIXOS_ACTION`.
This allows activation scripts to output what they would change if the activation was really run. This allows activation scripts to output what they would change if the activation was really run.
The users/modules activation script supports this and outputs some of is actions. The users/modules activation script supports this and outputs some of is actions.
@ -33,6 +42,20 @@ In addition to numerous new and upgraded packages, this release has the followin
- GNOME has been upgraded to 41. Please take a look at their [Release Notes](https://help.gnome.org/misc/release-notes/41.0/) for details. - GNOME has been upgraded to 41. Please take a look at their [Release Notes](https://help.gnome.org/misc/release-notes/41.0/) for details.
- LXD support was greatly improved:
- building LXD images from configurations is now directly possible with just nixpkgs
- hydra is now building nixOS LXD images that can be used standalone with full nixos-rebuild support
- OpenSSH was updated to version 8.8p1
- This breaks connections to old SSH daemons as ssh-rsa host keys and ssh-rsa public keys that were signed with SHA-1 are disabled by default now
- These can be re-enabled, see the [OpenSSH changelog](https://www.openssh.com/txt/release-8.8) for details
- ORY Kratos was updated to version 0.8.0-alpha.3
- This release requires you to run SQL migrations. Please, as always, create a backup of your database first!
- The SDKs are now generated with tag v0alpha2 to reflect that some signatures have changed in a breaking fashion. Please update your imports from v0alpha1 to v0alpha2.
- The SMTPS scheme used in courier config URL with cleartext/StartTLS/TLS SMTP connection types is now only supporting implicit TLS. For StartTLS and cleartext SMTP, please use the SMTP scheme instead.
- for more details, see [Release Notes](https://github.com/ory/kratos/releases/tag/v0.8.0-alpha.1).
## New Services {#sec-release-21.11-new-services} ## New Services {#sec-release-21.11-new-services}
- [btrbk](https://digint.ch/btrbk/index.html), a backup tool for btrfs subvolumes, taking advantage of btrfs specific capabilities to create atomic snapshots and transfer them incrementally to your backup locations. Available as [services.btrbk](options.html#opt-services.brtbk.instances). - [btrbk](https://digint.ch/btrbk/index.html), a backup tool for btrfs subvolumes, taking advantage of btrfs specific capabilities to create atomic snapshots and transfer them incrementally to your backup locations. Available as [services.btrbk](options.html#opt-services.brtbk.instances).
@ -45,11 +68,11 @@ In addition to numerous new and upgraded packages, this release has the followin
- [Jibri](https://github.com/jitsi/jibri), a service for recording or streaming a Jitsi Meet conference. Available as [services.jibri](options.html#opt-services.jibri.enable). - [Jibri](https://github.com/jitsi/jibri), a service for recording or streaming a Jitsi Meet conference. Available as [services.jibri](options.html#opt-services.jibri.enable).
- [Kea](https://www.isc.org/kea/), ISCs 2nd generation DHCP and DDNS server suite. Available at [services.kea](options.html#opt-services.kea). - [Kea](https://www.isc.org/kea/), ISCs 2nd generation DHCP and DDNS server suite. Available at [services.kea](options.html#opt-services.kea.dhcp4).
- [owncast](https://owncast.online/), self-hosted video live streaming solution. Available at [services.owncast](options.html#opt-services.owncast). - [owncast](https://owncast.online/), self-hosted video live streaming solution. Available at [services.owncast](options.html#opt-services.owncast.enable).
- [PeerTube](https://joinpeertube.org/), developed by Framasoft, is the free and decentralized alternative to video platforms. Available at [services.peertube](options.html#opt-services.peertube). - [PeerTube](https://joinpeertube.org/), developed by Framasoft, is the free and decentralized alternative to video platforms. Available at [services.peertube](options.html#opt-services.peertube.enable).
- [sourcehut](https://sr.ht), a collection of tools useful for software development. Available as [services.sourcehut](options.html#opt-services.sourcehut.enable). - [sourcehut](https://sr.ht), a collection of tools useful for software development. Available as [services.sourcehut](options.html#opt-services.sourcehut.enable).
@ -116,13 +139,29 @@ In addition to numerous new and upgraded packages, this release has the followin
- [seafile](https://www.seafile.com/en/home/), an open source file syncing & sharing software. Available as [services.seafile](options.html#opt-services.seafile.enable). - [seafile](https://www.seafile.com/en/home/), an open source file syncing & sharing software. Available as [services.seafile](options.html#opt-services.seafile.enable).
- [rasdaemon](https://github.com/mchehab/rasdaemon), a hardware error logging daemon. Available as [hardware.rasdaemon](#opt-hardware.rasdaemon.enable).
- `code-server`-module now available
- [xmrig](https://github.com/xmrig/xmrig), a high performance, open source, cross platform RandomX, KawPow, CryptoNight and AstroBWT unified CPU/GPU miner and RandomX benchmark.
- Auto nice daemons [ananicy](https://github.com/Nefelim4ag/Ananicy) and [ananicy-cpp](https://gitlab.com/ananicy-cpp/ananicy-cpp/). Available as [services.ananicy](#opt-services.ananicy.enable).
- [smartctl_exporter](https://github.com/prometheus-community/smartctl_exporter), a Prometheus exporter for [S.M.A.R.T.](https://en.wikipedia.org/wiki/S.M.A.R.T.) data. Available as [services.prometheus.exporters.smartctl](options.html#opt-services.prometheus.exporters.smartctl.enable).
## Backward Incompatibilities {#sec-release-21.11-incompatibilities} ## Backward Incompatibilities {#sec-release-21.11-incompatibilities}
- The NixOS VM test framework, `pkgs.nixosTest`/`make-test-python.nix`, now requires detaching commands such as `succeed("foo &")` and `succeed("foo | xclip -i")` to close stdout.
This can be done with a redirect such as `succeed("foo >&2 &")`. This breaking change was necessitated by a race condition causing tests to fail or hang.
It applies to all methods that invoke commands on the nodes, including `execute`, `succeed`, `fail`, `wait_until_succeeds`, `wait_until_fails`.
- The `services.wakeonlan` option was removed, and replaced with `networking.interfaces.<name>.wakeOnLan`. - The `services.wakeonlan` option was removed, and replaced with `networking.interfaces.<name>.wakeOnLan`.
- The `security.wrappers` option now requires to always specify an owner, group and whether the setuid/setgid bit should be set. - The `security.wrappers` option now requires to always specify an owner, group and whether the setuid/setgid bit should be set.
This is motivated by the fact that before NixOS 21.11, specifying either setuid or setgid but not owner/group resulted in wrappers owned by nobody/nogroup, which is unsafe. This is motivated by the fact that before NixOS 21.11, specifying either setuid or setgid but not owner/group resulted in wrappers owned by nobody/nogroup, which is unsafe.
- Since `iptables` now uses `nf_tables` backend and `ipset` doesn't support it, some applications (ferm, shorewall, firehol) may have limited functionality.
- The `paperless` module and package have been removed. All users should migrate to the - The `paperless` module and package have been removed. All users should migrate to the
successor `paperless-ng` instead. The Paperless project [has been successor `paperless-ng` instead. The Paperless project [has been
archived](https://github.com/the-paperless-project/paperless/commit/9b0063c9731f7c5f65b1852cb8caff97f5e40ba4) archived](https://github.com/the-paperless-project/paperless/commit/9b0063c9731f7c5f65b1852cb8caff97f5e40ba4)
@ -173,7 +212,7 @@ In addition to numerous new and upgraded packages, this release has the followin
Superuser created successfully. Superuser created successfully.
``` ```
- The `staticjinja` package has been upgraded from 1.0.4 to 4.1.0 - The `staticjinja` package has been upgraded from 1.0.4 to 4.1.1
- Firefox v91 does not support addons with invalid signature anymore. Firefox ESR needs to be used for nix addon support. - Firefox v91 does not support addons with invalid signature anymore. Firefox ESR needs to be used for nix addon support.
@ -202,6 +241,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- `services.geoip-updater` was broken and has been replaced by [services.geoipupdate](options.html#opt-services.geoipupdate.enable). - `services.geoip-updater` was broken and has been replaced by [services.geoipupdate](options.html#opt-services.geoipupdate.enable).
- `ihatemoney` has been updated to version 5.1.1 ([release notes](https://github.com/spiral-project/ihatemoney/blob/5.1.1/CHANGELOG.rst)). If you serve ihatemoney by HTTP rather than HTTPS, you must set [services.ihatemoney.secureCookie](options.html#opt-services.ihatemoney.secureCookie) to `false`.
- PHP 7.3 is no longer supported due to upstream not supporting this version for the entire lifecycle of the 21.11 release. - PHP 7.3 is no longer supported due to upstream not supporting this version for the entire lifecycle of the 21.11 release.
- Those making use of `buildBazelPackage` will need to regenerate the fetch hashes (preferred), or set `fetchConfigured = false;`. - Those making use of `buildBazelPackage` will need to regenerate the fetch hashes (preferred), or set `fetchConfigured = false;`.
@ -355,23 +396,38 @@ In addition to numerous new and upgraded packages, this release has the followin
- `boot.kernelParams` now only accepts one command line parameter per string. This change is aimed to reduce common mistakes like "param = 12", which would be parsed as 3 parameters. - `boot.kernelParams` now only accepts one command line parameter per string. This change is aimed to reduce common mistakes like "param = 12", which would be parsed as 3 parameters.
- `nix.daemonNiceLevel` and `nix.daemonIONiceLevel` have been removed in favour of the new options [`nix.daemonCPUSchedPolicy`](options.html#opt-nix.daemonCPUSchedPolicy), [`nix.daemonIOSchedClass`](options.html#opt-nix.daemonIOSchedClass) and [`nix.daemonIOSchedPriority`](options.html#opt-nix.daemonIOSchedPriority). Please refer to the options documentation and the `sched(7)` and `ioprio_set(2)` man pages for guidance on how to use them.
- The `coursier` package's binary was renamed from `coursier` to `cs`. Completions which haven't worked for a while should now work with the renamed binary. To keep using `coursier`, you can create a shell alias. - The `coursier` package's binary was renamed from `coursier` to `cs`. Completions which haven't worked for a while should now work with the renamed binary. To keep using `coursier`, you can create a shell alias.
- The `services.mosquitto` module has been rewritten to support multiple listeners and per-listener configuration. - The `services.mosquitto` module has been rewritten to support multiple listeners and per-listener configuration.
Module configurations from previous releases will no longer work and must be updated. Module configurations from previous releases will no longer work and must be updated.
- The `fluidsynth_1` attribute has been removed, as this legacy version is no longer needed in nixpkgs. The actively maintained 2.x series is available as `fluidsynth` unchanged.
- Nextcloud 20 (`pkgs.nextcloud20`) has been dropped because it was EOLed by upstream in 2021-10. - Nextcloud 20 (`pkgs.nextcloud20`) has been dropped because it was EOLed by upstream in 2021-10.
- The `virtualisation.pathsInNixDB` option was renamed
[`virtualisation.additionalPaths`](options.html#opt-virtualisation.additionalPaths).
- The `services.ddclient.password` option was removed, and replaced with `services.ddclient.passwordFile`.
- The default GNAT version has been changed: The `gnat` attribute now points to `gnat11`
instead of `gnat9`.
- `retroArchCores` has been removed. This means that using `nixpkgs.config.retroarch` to customize RetroArch cores is not supported anymore. Instead, use package overrides, for example: `retroarch.override { cores = with libretro; [ citra snes9x ]; };`. Also, `retroarchFull` derivation is available for those who want to have all RetroArch cores available.
## Other Notable Changes {#sec-release-21.11-notable-changes} ## Other Notable Changes {#sec-release-21.11-notable-changes}
- The linux kernel package infrastructure was moved out of `all-packages.nix`, and restructured. Linux related functions and attributes now live under the `pkgs.linuxKernel` attribute set. - The linux kernel package infrastructure was moved out of `all-packages.nix`, and restructured. Linux related functions and attributes now live under the `pkgs.linuxKernel` attribute set.
In particular the versioned `linuxPackages_*` package sets (such as `linuxPackages_5_4`) and kernels from `pkgs` were moved there and now live under `pkgs.linuxKernel.packages.*`. The unversioned ones (such as `linuxPackages_latest`) remain untouched. In particular the versioned `linuxPackages_*` package sets (such as `linuxPackages_5_4`) and kernels from `pkgs` were moved there and now live under `pkgs.linuxKernel.packages.*`. The unversioned ones (such as `linuxPackages_latest`) remain untouched.
- In NixOS virtual machines (QEMU), the `virtualisation` module has been updated with new options to configure: - In NixOS virtual machines (QEMU), the `virtualisation` module has been updated with new options:
- IPv4 port forwarding ([`virtualisation.forwardPorts`](options.html#opt-virtualisation.forwardPorts)), - [`forwardPorts`](options.html#opt-virtualisation.forwardPorts) to configure IPv4 port forwarding,
- shared host directories ([`virtualisation.sharedDirectories`](options.html#opt-virtualisation.sharedDirectories)), - [`sharedDirectories`](options.html#opt-virtualisation.sharedDirectories) to set up shared host directories,
- screen resolution ([`virtualisation.resolution`](options.html#opt-virtualisation.resolution)). - [`resolution`](options.html#opt-virtualisation.resolution) to set the screen resolution,
- [`useNixStoreImage`](options.html#opt-virtualisation.useNixStoreImage) to use a disk image for the Nix store instead of 9P.
In addition, the default [`msize`](options.html#opt-virtualisation.msize) parameter in 9P filesystems (including /nix/store and all shared directories) has been increased to 16K for improved performance. In addition, the default [`msize`](options.html#opt-virtualisation.msize) parameter in 9P filesystems (including /nix/store and all shared directories) has been increased to 16K for improved performance.
@ -433,6 +489,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- The [networking.wireless.iwd](options.html#opt-networking.wireless.iwd.enable) module has a new [networking.wireless.iwd.settings](options.html#opt-networking.wireless.iwd.settings) option. - The [networking.wireless.iwd](options.html#opt-networking.wireless.iwd.enable) module has a new [networking.wireless.iwd.settings](options.html#opt-networking.wireless.iwd.settings) option.
- The [services.smokeping.host](options.html#opt-services.smokeping.host) option was added and defaulted to `localhost`. Before, `smokeping` listened to all interfaces by default. NixOS defaults generally aim to provide non-Internet-exposed defaults for databases and internal monitoring tools, see e.g. [#100192](https://github.com/NixOS/nixpkgs/issues/100192). Further, the systemd service for `smokeping` got reworked defaults for increased operational stability, see [PR #144127](https://github.com/NixOS/nixpkgs/pull/144127) for details.
- The [services.syncoid.enable](options.html#opt-services.syncoid.enable) module now properly drops ZFS permissions after usage. Before it delegated permissions to whole pools instead of datasets and didn't clean up after execution. You can manually look this up for your pools by running `zfs allow your-pool-name` and use `zfs unallow syncoid your-pool-name` to clean this up. - The [services.syncoid.enable](options.html#opt-services.syncoid.enable) module now properly drops ZFS permissions after usage. Before it delegated permissions to whole pools instead of datasets and didn't clean up after execution. You can manually look this up for your pools by running `zfs allow your-pool-name` and use `zfs unallow syncoid your-pool-name` to clean this up.
- Zfs: `latestCompatibleLinuxPackages` is now exported on the zfs package. One can use `boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;` to always track the latest compatible kernel with a given version of zfs. - Zfs: `latestCompatibleLinuxPackages` is now exported on the zfs package. One can use `boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;` to always track the latest compatible kernel with a given version of zfs.
@ -464,11 +522,34 @@ In addition to numerous new and upgraded packages, this release has the followin
- `networking.sits` now supports Foo-over-UDP encapsulation. - `networking.sits` now supports Foo-over-UDP encapsulation.
- Changing systemd `.socket` units now restarts them and stops the service that is activated by them. Additionally, services with `stopOnChange = false` don't break anymore when they are socket-activated.
- The `virtualisation.libvirtd` module has been refactored and updated with new options: - The `virtualisation.libvirtd` module has been refactored and updated with new options:
- `virtualisation.libvirtd.qemu*` options (e.g.: `virtualisation.libvirtd.qemuRunAsRoot`) were moved to [`virtualisation.libvirtd.qemu`](options.html#opt-virtualisation.libvirtd.qemu) submodule, - `virtualisation.libvirtd.qemu*` options (e.g.: `virtualisation.libvirtd.qemuRunAsRoot`) were moved to [`virtualisation.libvirtd.qemu`](options.html#opt-virtualisation.libvirtd.qemu) submodule,
- software TPM1/TPM2 support (e.g.: Windows 11 guests) ([`virtualisation.libvirtd.qemu.swtpm`](options.html#opt-virtualisation.libvirtd.qemu.swtpm)), - software TPM1/TPM2 support (e.g.: Windows 11 guests) ([`virtualisation.libvirtd.qemu.swtpm`](options.html#opt-virtualisation.libvirtd.qemu.swtpm)),
- custom OVMF package (e.g.: `pkgs.OVMFFull` with HTTP, CSM and Secure Boot support) ([`virtualisation.libvirtd.qemu.ovmf.package`](options.html#opt-virtualisation.libvirtd.qemu.ovmf.package)). - custom OVMF package (e.g.: `pkgs.OVMFFull` with HTTP, CSM and Secure Boot support) ([`virtualisation.libvirtd.qemu.ovmf.package`](options.html#opt-virtualisation.libvirtd.qemu.ovmf.package)).
- The `cawbird` Twitter client now uses its own API keys to count as different application than upstream builds. This is done to evade application-level rate limiting. While existing accounts continue to work, users may want to remove and re-register their account in the client to enjoy a better user experience and benefit from this change. - The `cawbird` Twitter client now uses its own API keys to count as different application than upstream builds. This is done to evade application-level rate limiting. While existing accounts continue to work, users may want to remove and re-register their account in the client to enjoy a better user experience and benefit from this change.
- A new option `services.prometheus.enableReload` has been added which can be enabled to reload the prometheus service when its config file changes instead of restarting.
- The option `services.prometheus.environmentFile` has been removed since it was causing [issues](https://github.com/NixOS/nixpkgs/issues/126083) and Prometheus now has native support for secret files, i.e. `basic_auth.password_file` and `authorization.credentials_file`.
- Dokuwiki now supports caddy! However
- the nginx option has been removed, in the new configuration, please use the `dokuwiki.webserver = "nginx"` instead.
- The "${hostname}" option has been deprecated, please use `dokuwiki.sites = [ "${hostname}" ]` instead
- The [services.unifi](options.html#opt-services.unifi.enable) module has been reworked, solving a number of issues. This leads to several user facing changes:
- The `services.unifi.dataDir` option is removed and the data is now always located under `/var/lib/unifi/data`. This is done to make better use of systemd state direcotiry and thus making the service restart more reliable.
- The unifi logs can now be found under: `/var/log/unifi` instead of `/var/lib/unifi/logs`.
- The unifi run directory can now be found under: `/run/unifi` instead of `/var/lib/unifi/run`.
- `security.pam.services.<name>.makeHomeDir` now uses `umask=0077` instead of `umask=0022` when creating the home directory.
- Loki has had another release. Some default values have been changed for the configuration and some configuration options have been renamed. For more details, please check [the upgrade guide](https://grafana.com/docs/loki/latest/upgrading/#240).
- `julia` now refers to `julia-stable` instead of `julia-lts`. In practice this means it has been upgraded from `1.0.4` to `1.5.4`.
- RetroArch has been upgraded from version `1.8.5` to `1.9.13.2`. Since the previous release was quite old, if you're having issues after the upgrade, please delete your `$XDG_CONFIG_HOME/retroarch/retroarch.cfg` file.
- hydrus has been upgraded from version `438` to `463`. Since upgrading between releases this old is advised against, be sure to have a backup of your data before upgrading. For details, see [the hydrus manual](https://hydrusnetwork.github.io/hydrus/help/getting_started_installing.html#big_updates).
- More jdk and jre versions are now exposed via `java-packages.compiler`.

View file

@ -0,0 +1,35 @@
# Release 22.05 (“Quokka”, 2022.05/??) {#sec-release-22.05}
In addition to numerous new and upgraded packages, this release has the following highlights:
- Support is planned until the end of December 2022, handing over to 22.11.
## Highlights {#sec-release-22.05-highlights}
## New Services {#sec-release-22.05-new-services}
## Backward Incompatibilities {#sec-release-22.05-incompatibilities}
- `pkgs.ghc` now refers to `pkgs.targetPackages.haskellPackages.ghc`.
This *only* makes a difference if you are cross-compiling and will
ensure that `pkgs.ghc` always runs on the host platform and compiles
for the target platform (similar to `pkgs.gcc` for example).
`haskellPackages.ghc` still behaves as before, running on the build
platform and compiling for the host platform (similar to `stdenv.cc`).
This means you don't have to adjust your derivations if you use
`haskellPackages.callPackage`, but when using `pkgs.callPackage` and
taking `ghc` as an input, you should now use `buildPackages.ghc`
instead to ensure cross compilation keeps working (or switch to
`haskellPackages.callPackage`).
- `pkgs.emacsPackages.orgPackages` is removed because org elpa is deprecated.
The packages in the top level of `pkgs.emacsPackages`, such as org and
org-contrib, refer to the ones in `pkgs.emacsPackages.elpaPackages` and
`pkgs.emacsPackages.nongnuPackages` where the new versions will release.
- The `wafHook` hook now honors `NIX_BUILD_CORES` when `enableParallelBuilding` is not set explicitly. Packages can restore the old behaviour by setting `enableParallelBuilding=false`.
- `pkgs.claws-mail-gtk2`, representing Claws Mail's older release version three, was removed in order to get rid of Python 2.
Please switch to `claws-mail`, which is Claws Mail's latest release based on GTK+3 and Python 3.
## Other Notable Changes {#sec-release-22.05-notable-changes}

View file

@ -51,23 +51,28 @@ let
}; };
}; };
in rec { noUserModules = lib.evalModules {
# Merge the option definitions in all modules, forming the full
# system configuration.
inherit (lib.evalModules {
inherit prefix check; inherit prefix check;
modules = baseModules ++ extraModules ++ [ pkgsModule ] ++ modules; modules = baseModules ++ extraModules ++ [ pkgsModule ];
args = extraArgs; args = extraArgs;
specialArgs = specialArgs =
{ modulesPath = builtins.toString ../modules; } // specialArgs; { modulesPath = builtins.toString ../modules; } // specialArgs;
}) config options _module; };
# These are the extra arguments passed to every module. In # These are the extra arguments passed to every module. In
# particular, Nixpkgs is passed through the "pkgs" argument. # particular, Nixpkgs is passed through the "pkgs" argument.
extraArgs = extraArgs_ // { extraArgs = extraArgs_ // {
inherit baseModules extraModules modules; inherit noUserModules baseModules extraModules modules;
}; };
in rec {
# Merge the option definitions in all modules, forming the full
# system configuration.
inherit (noUserModules.extendModules { inherit modules; })
config options _module type;
inherit extraArgs;
inherit (_module.args) pkgs; inherit (_module.args) pkgs;
} }

View file

@ -44,11 +44,14 @@
# most likely fails as GRUB will probably refuse to install. # most likely fails as GRUB will probably refuse to install.
partitionTableType ? "legacy" partitionTableType ? "legacy"
, # Whether to invoke `switch-to-configuration boot` during image creation
installBootLoader ? true
, # The root file system type. , # The root file system type.
fsType ? "ext4" fsType ? "ext4"
, # Filesystem label , # Filesystem label
label ? "nixos" label ? if onlyNixStore then "nix-store" else "nixos"
, # The initial NixOS configuration file to be copied to , # The initial NixOS configuration file to be copied to
# /etc/nixos/configuration.nix. # /etc/nixos/configuration.nix.
@ -57,10 +60,24 @@
, # Shell code executed after the VM has finished. , # Shell code executed after the VM has finished.
postVM ? "" postVM ? ""
, # Copy the contents of the Nix store to the root of the image and
# skip further setup. Incompatible with `contents`,
# `installBootLoader` and `configFile`.
onlyNixStore ? false
, name ? "nixos-disk-image" , name ? "nixos-disk-image"
, # Disk image format, one of qcow2, qcow2-compressed, vdi, vpc, raw. , # Disk image format, one of qcow2, qcow2-compressed, vdi, vpc, raw.
format ? "raw" format ? "raw"
, # Whether a nix channel based on the current source tree should be
# made available inside the image. Useful for interactive use of nix
# utils, but changes the hash of the image when the sources are
# updated.
copyChannel ? true
, # Additional store paths to copy to the image's store.
additionalPaths ? []
}: }:
assert partitionTableType == "legacy" || partitionTableType == "legacy+gpt" || partitionTableType == "efi" || partitionTableType == "hybrid" || partitionTableType == "none"; assert partitionTableType == "legacy" || partitionTableType == "legacy+gpt" || partitionTableType == "efi" || partitionTableType == "hybrid" || partitionTableType == "none";
@ -71,6 +88,7 @@ assert lib.all
(attrs: ((attrs.user or null) == null) (attrs: ((attrs.user or null) == null)
== ((attrs.group or null) == null)) == ((attrs.group or null) == null))
contents; contents;
assert onlyNixStore -> contents == [] && configFile == null && !installBootLoader;
with lib; with lib;
@ -163,7 +181,14 @@ let format' = format; in let
users = map (x: x.user or "''") contents; users = map (x: x.user or "''") contents;
groups = map (x: x.group or "''") contents; groups = map (x: x.group or "''") contents;
closureInfo = pkgs.closureInfo { rootPaths = [ config.system.build.toplevel channelSources ]; }; basePaths = [ config.system.build.toplevel ]
++ lib.optional copyChannel channelSources;
additionalPaths' = subtractLists basePaths additionalPaths;
closureInfo = pkgs.closureInfo {
rootPaths = basePaths ++ additionalPaths';
};
blockSize = toString (4 * 1024); # ext4fs block size (not block device sector size) blockSize = toString (4 * 1024); # ext4fs block size (not block device sector size)
@ -251,7 +276,13 @@ let format' = format; in let
chmod 755 "$TMPDIR" chmod 755 "$TMPDIR"
echo "running nixos-install..." echo "running nixos-install..."
nixos-install --root $root --no-bootloader --no-root-passwd \ nixos-install --root $root --no-bootloader --no-root-passwd \
--system ${config.system.build.toplevel} --channel ${channelSources} --substituters "" --system ${config.system.build.toplevel} \
${if copyChannel then "--channel ${channelSources}" else "--no-channel-copy"} \
--substituters ""
${optionalString (additionalPaths' != []) ''
nix --extra-experimental-features nix-command copy --to $root --no-check-sigs ${concatStringsSep " " additionalPaths'}
''}
diskImage=nixos.raw diskImage=nixos.raw
@ -320,25 +351,29 @@ let format' = format; in let
''} ''}
echo "copying staging root to image..." echo "copying staging root to image..."
cptofs -p ${optionalString (partitionTableType != "none") "-P ${rootPartition}"} -t ${fsType} -i $diskImage $root/* / || cptofs -p ${optionalString (partitionTableType != "none") "-P ${rootPartition}"} \
-t ${fsType} \
-i $diskImage \
$root${optionalString onlyNixStore builtins.storeDir}/* / ||
(echo >&2 "ERROR: cptofs failed. diskSize might be too small for closure."; exit 1) (echo >&2 "ERROR: cptofs failed. diskSize might be too small for closure."; exit 1)
''; '';
in pkgs.vmTools.runInLinuxVM (
pkgs.runCommand name moveOrConvertImage = ''
{ preVM = prepareImage;
buildInputs = with pkgs; [ util-linux e2fsprogs dosfstools ];
postVM = ''
${if format == "raw" then '' ${if format == "raw" then ''
mv $diskImage $out/${filename} mv $diskImage $out/${filename}
'' else '' '' else ''
${pkgs.qemu}/bin/qemu-img convert -f raw -O ${format} ${compress} $diskImage $out/${filename} ${pkgs.qemu}/bin/qemu-img convert -f raw -O ${format} ${compress} $diskImage $out/${filename}
''} ''}
diskImage=$out/${filename} diskImage=$out/${filename}
${postVM}
''; '';
buildImage = pkgs.vmTools.runInLinuxVM (
pkgs.runCommand name {
preVM = prepareImage;
buildInputs = with pkgs; [ util-linux e2fsprogs dosfstools ];
postVM = moveOrConvertImage + postVM;
memSize = 1024; memSize = 1024;
} } ''
''
export PATH=${binPath}:$PATH export PATH=${binPath}:$PATH
rootDisk=${if partitionTableType != "none" then "/dev/vda${rootPartition}" else "/dev/vda"} rootDisk=${if partitionTableType != "none" then "/dev/vda${rootPartition}" else "/dev/vda"}
@ -368,11 +403,13 @@ in pkgs.vmTools.runInLinuxVM (
cp ${configFile} /mnt/etc/nixos/configuration.nix cp ${configFile} /mnt/etc/nixos/configuration.nix
''} ''}
${lib.optionalString installBootLoader ''
# Set up core system link, GRUB, etc. # Set up core system link, GRUB, etc.
NIXOS_INSTALL_BOOTLOADER=1 nixos-enter --root $mountPoint -- /nix/var/nix/profiles/system/bin/switch-to-configuration boot NIXOS_INSTALL_BOOTLOADER=1 nixos-enter --root $mountPoint -- /nix/var/nix/profiles/system/bin/switch-to-configuration boot
# The above scripts will generate a random machine-id and we don't want to bake a single ID into all our images # The above scripts will generate a random machine-id and we don't want to bake a single ID into all our images
rm -f $mountPoint/etc/machine-id rm -f $mountPoint/etc/machine-id
''}
# Set the ownerships of the contents. The modes are set in preVM. # Set the ownerships of the contents. The modes are set in preVM.
# No globbing on targets, so no need to set -f # No globbing on targets, so no need to set -f
@ -398,4 +435,9 @@ in pkgs.vmTools.runInLinuxVM (
tune2fs -T now -c 0 -i 0 $rootDisk tune2fs -T now -c 0 -i 0 $rootDisk
''} ''}
'' ''
) );
in
if onlyNixStore then
pkgs.runCommand name {}
(prepareImage + moveOrConvertImage + postVM)
else buildImage

View file

@ -241,7 +241,7 @@ let
pkgs.vmTools.override { pkgs.vmTools.override {
rootModules = rootModules =
[ "zfs" "9p" "9pnet_virtio" "virtio_pci" "virtio_blk" ] ++ [ "zfs" "9p" "9pnet_virtio" "virtio_pci" "virtio_blk" ] ++
(pkgs.lib.optional (pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) "rtc_cmos"); (pkgs.lib.optional pkgs.stdenv.hostPlatform.isx86 "rtc_cmos");
kernel = modulesTree; kernel = modulesTree;
} }
).runInLinuxVM ( ).runInLinuxVM (

View file

@ -17,12 +17,12 @@ rec {
''-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.isi686 || pkgs.stdenv.isx86_64 then "ttyS0" qemuSerialDevice = if pkgs.stdenv.hostPlatform.isx86 then "ttyS0"
else if (with pkgs.stdenv.hostPlatform; isAarch32 || isAarch64 || isPower) then "ttyAMA0" else if (with pkgs.stdenv.hostPlatform; isAarch32 || isAarch64 || isPower) then "ttyAMA0"
else throw "Unknown QEMU serial device for system '${pkgs.stdenv.hostPlatform.system}'"; 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"; x86_64-linux = "${qemuPkg}/bin/qemu-kvm -cpu qemu64";
armv7l-linux = "${qemuPkg}/bin/qemu-system-arm -enable-kvm -machine virt -cpu host"; armv7l-linux = "${qemuPkg}/bin/qemu-system-arm -enable-kvm -machine virt -cpu host";
aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -enable-kvm -machine virt,gic-version=host -cpu host"; aarch64-linux = "${qemuPkg}/bin/qemu-system-aarch64 -enable-kvm -machine virt,gic-version=host -cpu host";
powerpc64le-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv"; powerpc64le-linux = "${qemuPkg}/bin/qemu-system-ppc64 -machine powernv";

View file

@ -4,6 +4,7 @@ from queue import Queue, Empty
from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List, Iterable from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List, Iterable
from xml.sax.saxutils import XMLGenerator from xml.sax.saxutils import XMLGenerator
from colorama import Style from colorama import Style
from pathlib import Path
import queue import queue
import io import io
import threading import threading
@ -11,7 +12,6 @@ import argparse
import base64 import base64
import codecs import codecs
import os import os
import pathlib
import ptpython.repl import ptpython.repl
import pty import pty
import re import re
@ -171,7 +171,7 @@ class Logger:
yield yield
self.drain_log_queue() self.drain_log_queue()
toc = time.time() toc = time.time()
self.log("({:.2f} seconds)".format(toc - tic)) self.log("(finished: {}, in {:.2f} seconds)".format(message, toc - tic))
self.xml.endElement("nest") self.xml.endElement("nest")
@ -239,8 +239,8 @@ class StartCommand:
def cmd( def cmd(
self, self,
monitor_socket_path: pathlib.Path, monitor_socket_path: Path,
shell_socket_path: pathlib.Path, shell_socket_path: Path,
allow_reboot: bool = False, # TODO: unused, legacy? allow_reboot: bool = False, # TODO: unused, legacy?
) -> str: ) -> str:
display_opts = "" display_opts = ""
@ -272,8 +272,8 @@ class StartCommand:
@staticmethod @staticmethod
def build_environment( def build_environment(
state_dir: pathlib.Path, state_dir: Path,
shared_dir: pathlib.Path, shared_dir: Path,
) -> dict: ) -> dict:
# We make a copy to not update the current environment # We make a copy to not update the current environment
env = dict(os.environ) env = dict(os.environ)
@ -288,10 +288,10 @@ class StartCommand:
def run( def run(
self, self,
state_dir: pathlib.Path, state_dir: Path,
shared_dir: pathlib.Path, shared_dir: Path,
monitor_socket_path: pathlib.Path, monitor_socket_path: Path,
shell_socket_path: pathlib.Path, shell_socket_path: Path,
) -> subprocess.Popen: ) -> subprocess.Popen:
return subprocess.Popen( return subprocess.Popen(
self.cmd(monitor_socket_path, shell_socket_path), self.cmd(monitor_socket_path, shell_socket_path),
@ -334,7 +334,7 @@ class LegacyStartCommand(StartCommand):
self, self,
netBackendArgs: Optional[str] = None, netBackendArgs: Optional[str] = None,
netFrontendArgs: Optional[str] = None, netFrontendArgs: Optional[str] = None,
hda: Optional[Tuple[pathlib.Path, str]] = None, hda: Optional[Tuple[Path, str]] = None,
cdrom: Optional[str] = None, cdrom: Optional[str] = None,
usb: Optional[str] = None, usb: Optional[str] = None,
bios: Optional[str] = None, bios: Optional[str] = None,
@ -394,11 +394,11 @@ class Machine:
the machine lifecycle with the help of a start script / command.""" the machine lifecycle with the help of a start script / command."""
name: str name: str
tmp_dir: pathlib.Path tmp_dir: Path
shared_dir: pathlib.Path shared_dir: Path
state_dir: pathlib.Path state_dir: Path
monitor_path: pathlib.Path monitor_path: Path
shell_path: pathlib.Path shell_path: Path
start_command: StartCommand start_command: StartCommand
keep_vm_state: bool keep_vm_state: bool
@ -421,7 +421,7 @@ class Machine:
def __init__( def __init__(
self, self,
tmp_dir: pathlib.Path, tmp_dir: Path,
start_command: StartCommand, start_command: StartCommand,
name: str = "machine", name: str = "machine",
keep_vm_state: bool = False, keep_vm_state: bool = False,
@ -463,7 +463,7 @@ class Machine:
hda = None hda = None
if args.get("hda"): if args.get("hda"):
hda_arg: str = args.get("hda", "") hda_arg: str = args.get("hda", "")
hda_arg_path: pathlib.Path = pathlib.Path(hda_arg) hda_arg_path: Path = Path(hda_arg)
hda = (hda_arg_path, args.get("hdaInterface", "")) hda = (hda_arg_path, args.get("hdaInterface", ""))
return LegacyStartCommand( return LegacyStartCommand(
netBackendArgs=args.get("netBackendArgs"), netBackendArgs=args.get("netBackendArgs"),
@ -490,6 +490,7 @@ class Machine:
return rootlog.nested(msg, my_attrs) return rootlog.nested(msg, my_attrs)
def wait_for_monitor_prompt(self) -> str: def wait_for_monitor_prompt(self) -> str:
with self.nested("waiting for monitor prompt"):
assert self.monitor is not None assert self.monitor is not None
answer = "" answer = ""
while True: while True:
@ -502,8 +503,8 @@ class Machine:
return answer return answer
def send_monitor_command(self, command: str) -> str: def send_monitor_command(self, command: str) -> str:
with self.nested("sending monitor command: {}".format(command)):
message = ("{}\n".format(command)).encode() message = ("{}\n".format(command)).encode()
self.log("sending monitor command: {}".format(command))
assert self.monitor is not None assert self.monitor is not None
self.monitor.send(message) self.monitor.send(message)
return self.wait_for_monitor_prompt() return self.wait_for_monitor_prompt()
@ -533,6 +534,11 @@ class Machine:
return state == "active" return state == "active"
with self.nested(
"waiting for unit {}{}".format(
unit, f" with user {user}" if user is not None else ""
)
):
retry(check_active) retry(check_active)
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]:
@ -581,24 +587,45 @@ class Machine:
+ "'{}' but it is in state {}".format(require_state, state) + "'{}' but it is in state {}".format(require_state, state)
) )
def execute(self, command: str) -> Tuple[int, str]: def _next_newline_closed_block_from_shell(self) -> str:
assert self.shell
output_buffer = []
while True:
# This receives up to 4096 bytes from the socket
chunk = self.shell.recv(4096)
if not chunk:
# Probably a broken pipe, return the output we have
break
decoded = chunk.decode()
output_buffer += [decoded]
if decoded[-1] == "\n":
break
return "".join(output_buffer)
def execute(
self, command: str, check_return: bool = True, timeout: Optional[int] = 900
) -> Tuple[int, str]:
self.connect() self.connect()
out_command = "( set -euo pipefail; {} ); echo '|!=EOF' $?\n".format(command) if timeout is not None:
command = "timeout {} sh -c {}".format(timeout, shlex.quote(command))
out_command = f"( set -euo pipefail; {command} ) | (base64 --wrap 0; echo)\n"
assert self.shell assert self.shell
self.shell.send(out_command.encode()) self.shell.send(out_command.encode())
output = "" # Get the output
status_code_pattern = re.compile(r"(.*)\|\!=EOF\s+(\d+)") output = base64.b64decode(self._next_newline_closed_block_from_shell())
while True: if not check_return:
chunk = self.shell.recv(4096).decode(errors="ignore") return (-1, output.decode())
match = status_code_pattern.match(chunk)
if match: # Get the return code
output += match[1] self.shell.send("echo ${PIPESTATUS[0]}\n".encode())
status_code = int(match[2]) rc = int(self._next_newline_closed_block_from_shell().strip())
return (status_code, output)
output += chunk return (rc, output.decode())
def shell_interact(self) -> None: def shell_interact(self) -> None:
"""Allows you to interact with the guest shell """Allows you to interact with the guest shell
@ -613,12 +640,12 @@ class Machine:
pass_fds=[self.shell.fileno()], pass_fds=[self.shell.fileno()],
) )
def succeed(self, *commands: str) -> str: def succeed(self, *commands: str, timeout: Optional[int] = None) -> str:
"""Execute each command and check that it succeeds.""" """Execute each command and check that it succeeds."""
output = "" output = ""
for command in commands: for command in commands:
with self.nested("must succeed: {}".format(command)): with self.nested("must succeed: {}".format(command)):
(status, out) = self.execute(command) (status, out) = self.execute(command, timeout=timeout)
if status != 0: if status != 0:
self.log("output: {}".format(out)) self.log("output: {}".format(out))
raise Exception( raise Exception(
@ -627,12 +654,12 @@ class Machine:
output += out output += out
return output return output
def fail(self, *commands: str) -> str: def fail(self, *commands: str, timeout: Optional[int] = None) -> str:
"""Execute each command and check that it fails.""" """Execute each command and check that it fails."""
output = "" output = ""
for command in commands: for command in commands:
with self.nested("must fail: {}".format(command)): with self.nested("must fail: {}".format(command)):
(status, out) = self.execute(command) (status, out) = self.execute(command, timeout=timeout)
if status == 0: if status == 0:
raise Exception( raise Exception(
"command `{}` unexpectedly succeeded".format(command) "command `{}` unexpectedly succeeded".format(command)
@ -648,14 +675,14 @@ class Machine:
def check_success(_: Any) -> bool: def check_success(_: Any) -> bool:
nonlocal output nonlocal output
status, output = self.execute(command) status, output = self.execute(command, timeout=timeout)
return status == 0 return status == 0
with self.nested("waiting for success: {}".format(command)): with self.nested("waiting for success: {}".format(command)):
retry(check_success, timeout) retry(check_success, timeout)
return output return output
def wait_until_fails(self, command: str) -> str: def wait_until_fails(self, command: str, timeout: int = 900) -> str:
"""Wait until a command returns failure. """Wait until a command returns failure.
Throws an exception on timeout. Throws an exception on timeout.
""" """
@ -663,7 +690,7 @@ class Machine:
def check_failure(_: Any) -> bool: def check_failure(_: Any) -> bool:
nonlocal output nonlocal output
status, output = self.execute(command) status, output = self.execute(command, timeout=timeout)
return status != 0 return status != 0
with self.nested("waiting for failure: {}".format(command)): with self.nested("waiting for failure: {}".format(command)):
@ -736,6 +763,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"):
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]:
@ -798,12 +826,12 @@ class Machine:
"""Copy a file from the host into the guest via the `shared_dir` shared """Copy a file from the host into the guest via the `shared_dir` shared
among all the VMs (using a temporary directory). among all the VMs (using a temporary directory).
""" """
host_src = pathlib.Path(source) host_src = Path(source)
vm_target = pathlib.Path(target) vm_target = Path(target)
with tempfile.TemporaryDirectory(dir=self.shared_dir) as shared_td: with tempfile.TemporaryDirectory(dir=self.shared_dir) as shared_td:
shared_temp = pathlib.Path(shared_td) shared_temp = Path(shared_td)
host_intermediate = shared_temp / host_src.name host_intermediate = shared_temp / host_src.name
vm_shared_temp = pathlib.Path("/tmp/shared") / shared_temp.name vm_shared_temp = Path("/tmp/shared") / shared_temp.name
vm_intermediate = vm_shared_temp / host_src.name vm_intermediate = vm_shared_temp / host_src.name
self.succeed(make_command(["mkdir", "-p", vm_shared_temp])) self.succeed(make_command(["mkdir", "-p", vm_shared_temp]))
@ -820,11 +848,11 @@ class Machine:
all the VMs (using a temporary directory). all the VMs (using a temporary directory).
""" """
# Compute the source, target, and intermediate shared file names # Compute the source, target, and intermediate shared file names
out_dir = pathlib.Path(os.environ.get("out", os.getcwd())) out_dir = Path(os.environ.get("out", os.getcwd()))
vm_src = pathlib.Path(source) vm_src = Path(source)
with tempfile.TemporaryDirectory(dir=self.shared_dir) as shared_td: with tempfile.TemporaryDirectory(dir=self.shared_dir) as shared_td:
shared_temp = pathlib.Path(shared_td) shared_temp = Path(shared_td)
vm_shared_temp = pathlib.Path("/tmp/shared") / shared_temp.name vm_shared_temp = Path("/tmp/shared") / shared_temp.name
vm_intermediate = vm_shared_temp / vm_src.name vm_intermediate = vm_shared_temp / vm_src.name
intermediate = shared_temp / vm_src.name intermediate = shared_temp / vm_src.name
# Copy the file to the shared directory inside VM # Copy the file to the shared directory inside VM
@ -870,7 +898,7 @@ class Machine:
retry(screen_matches) retry(screen_matches)
def wait_for_console_text(self, regex: str) -> None: def wait_for_console_text(self, regex: str) -> None:
self.log("waiting for {} to appear on console".format(regex)) with self.nested("waiting for {} to appear on console".format(regex)):
# Buffer the console output, this is needed # Buffer the console output, this is needed
# to match multiline regexes. # to match multiline regexes.
console = io.StringIO() console = io.StringIO()
@ -888,6 +916,7 @@ class Machine:
def send_key(self, key: str) -> None: def send_key(self, key: str) -> None:
key = CHAR_TO_KEY.get(key, key) key = CHAR_TO_KEY.get(key, key)
self.send_monitor_command("sendkey {}".format(key)) self.send_monitor_command("sendkey {}".format(key))
time.sleep(0.01)
def start(self) -> None: def start(self) -> None:
if self.booted: if self.booted:
@ -895,12 +924,12 @@ class Machine:
self.log("starting vm") self.log("starting vm")
def clear(path: pathlib.Path) -> pathlib.Path: def clear(path: Path) -> Path:
if path.exists(): if path.exists():
path.unlink() path.unlink()
return path return path
def create_socket(path: pathlib.Path) -> socket.socket: def create_socket(path: Path) -> socket.socket:
s = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM) s = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM)
s.bind(str(path)) s.bind(str(path))
s.listen(1) s.listen(1)
@ -998,7 +1027,7 @@ class Machine:
) )
return any(pattern.search(name) for name in names) return any(pattern.search(name) for name in names)
with self.nested("Waiting for a window to appear"): with self.nested("waiting for a window to appear"):
retry(window_is_visible) retry(window_is_visible)
def sleep(self, secs: int) -> None: def sleep(self, secs: int) -> None:
@ -1045,7 +1074,7 @@ class VLan:
""" """
nr: int nr: int
socket_dir: pathlib.Path socket_dir: Path
process: subprocess.Popen process: subprocess.Popen
pid: int pid: int
@ -1054,7 +1083,7 @@ class VLan:
def __repr__(self) -> str: def __repr__(self) -> str:
return f"<Vlan Nr. {self.nr}>" return f"<Vlan Nr. {self.nr}>"
def __init__(self, nr: int, tmp_dir: pathlib.Path): def __init__(self, nr: int, tmp_dir: Path):
self.nr = nr self.nr = nr
self.socket_dir = tmp_dir / f"vde{self.nr}.ctl" self.socket_dir = tmp_dir / f"vde{self.nr}.ctl"
@ -1107,7 +1136,7 @@ class Driver:
): ):
self.tests = tests self.tests = tests
tmp_dir = pathlib.Path(os.environ.get("TMPDIR", tempfile.gettempdir())) tmp_dir = Path(os.environ.get("TMPDIR", tempfile.gettempdir()))
tmp_dir.mkdir(mode=0o700, exist_ok=True) tmp_dir.mkdir(mode=0o700, exist_ok=True)
with rootlog.nested("start all VLans"): with rootlog.nested("start all VLans"):
@ -1167,9 +1196,11 @@ class Driver:
serial_stdout_on=self.serial_stdout_on, serial_stdout_on=self.serial_stdout_on,
Machine=Machine, # for typing Machine=Machine, # for typing
) )
machine_symbols = { machine_symbols = {m.name: m for m in self.machines}
m.name: self.machines[idx] for idx, m in enumerate(self.machines) # If there's exactly one machine, make it available under the name
} # "machine", even if it's not called that.
if len(self.machines) == 1:
(machine_symbols["machine"],) = self.machines
vlan_symbols = { vlan_symbols = {
f"vlan{v.nr}": self.vlans[idx] for idx, v in enumerate(self.vlans) f"vlan{v.nr}": self.vlans[idx] for idx, v in enumerate(self.vlans)
} }
@ -1214,7 +1245,7 @@ class Driver:
"Using legacy create_machine(), please instantiate the" "Using legacy create_machine(), please instantiate the"
"Machine class directly, instead" "Machine class directly, instead"
) )
tmp_dir = pathlib.Path(os.environ.get("TMPDIR", tempfile.gettempdir())) tmp_dir = Path(os.environ.get("TMPDIR", tempfile.gettempdir()))
tmp_dir.mkdir(mode=0o700, exist_ok=True) tmp_dir.mkdir(mode=0o700, exist_ok=True)
if args.get("startCommand"): if args.get("startCommand"):
@ -1300,7 +1331,7 @@ if __name__ == "__main__":
action=EnvDefault, action=EnvDefault,
envvar="testScript", envvar="testScript",
help="the test script to run", help="the test script to run",
type=pathlib.Path, type=Path,
) )
args = arg_parser.parse_args() args = arg_parser.parse_args()

View file

@ -134,7 +134,9 @@ rec {
vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes); vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes);
vms = map (m: m.config.system.build.vm) (lib.attrValues nodes); vms = map (m: m.config.system.build.vm) (lib.attrValues nodes);
nodeHostNames = map (c: c.config.system.name) (lib.attrValues nodes); nodeHostNames = let
nodesList = map (c: c.config.system.name) (lib.attrValues nodes);
in nodesList ++ lib.optional (lib.length nodesList == 1) "machine";
# TODO: This is an implementation error and needs fixing # TODO: This is an implementation error and needs fixing
# the testing famework cannot legitimately restrict hostnames further # the testing famework cannot legitimately restrict hostnames further
@ -209,11 +211,41 @@ rec {
let let
nodes = qemu_pkg: nodes = qemu_pkg:
let let
testScript' =
# Call the test script with the computed nodes.
if lib.isFunction testScript
then testScript { nodes = nodes qemu_pkg; }
else testScript;
build-vms = import ./build-vms.nix { build-vms = import ./build-vms.nix {
inherit system lib pkgs minimal specialArgs; inherit system lib pkgs minimal specialArgs;
extraConfigurations = extraConfigurations ++ [( extraConfigurations = extraConfigurations ++ [(
{ config, ... }:
{ {
virtualisation.qemu.package = qemu_pkg; virtualisation.qemu.package = qemu_pkg;
# Make sure all derivations referenced by the test
# script are available on the nodes. When the store is
# accessed through 9p, this isn't important, since
# everything in the store is available to the guest,
# but when building a root image it is, as all paths
# that should be available to the guest has to be
# copied to the image.
virtualisation.additionalPaths =
lib.optional
# A testScript may evaluate nodes, which has caused
# infinite recursions. The demand cycle involves:
# testScript -->
# nodes -->
# toplevel -->
# additionalPaths -->
# hasContext testScript' -->
# testScript (ad infinitum)
# If we don't need to build an image, we can break this
# cycle by short-circuiting when useNixStoreImage is false.
(config.virtualisation.useNixStoreImage && builtins.hasContext testScript')
(pkgs.writeStringReferencesToFile testScript');
# Ensure we do not use aliases. Ideally this is only set # Ensure we do not use aliases. Ideally this is only set
# when the test framework is used by Nixpkgs NixOS tests. # when the test framework is used by Nixpkgs NixOS tests.
nixpkgs.config.allowAliases = false; nixpkgs.config.allowAliases = false;

View file

@ -10,7 +10,7 @@ rec {
# Check whenever fileSystem is needed for boot. NOTE: Make sure # Check whenever fileSystem is needed for boot. NOTE: Make sure
# pathsNeededForBoot is closed under the parent relationship, i.e. if /a/b/c # pathsNeededForBoot is closed under the parent relationship, i.e. if /a/b/c
# is in the list, put /a and /a/b in as well. # is in the list, put /a and /a/b in as well.
pathsNeededForBoot = [ "/" "/nix" "/nix/store" "/var" "/var/log" "/var/lib" "/var/lib/nixos" "/etc" ]; pathsNeededForBoot = [ "/" "/nix" "/nix/store" "/var" "/var/log" "/var/lib" "/var/lib/nixos" "/etc" "/usr" ];
fsNeededForBoot = fs: fs.neededForBoot || elem fs.mountPoint pathsNeededForBoot; fsNeededForBoot = fs: fs.neededForBoot || elem fs.mountPoint pathsNeededForBoot;
# Check whenever `b` depends on `a` as a fileSystem # Check whenever `b` depends on `a` as a fileSystem

View file

@ -4,6 +4,7 @@ with lib;
let let
cfg = config.amazonImage; cfg = config.amazonImage;
amiBootMode = if config.ec2.efi then "uefi" else "legacy-bios";
in { in {
@ -106,10 +107,12 @@ in {
--arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \ --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
--arg root_logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$rootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \ --arg root_logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$rootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
--arg boot_logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$bootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \ --arg boot_logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$bootDisk" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
--arg boot_mode "${amiBootMode}" \
--arg root "$rootDisk" \ --arg root "$rootDisk" \
--arg boot "$bootDisk" \ --arg boot "$bootDisk" \
'{} '{}
| .label = $system_label | .label = $system_label
| .boot_mode = $boot_mode
| .system = $system | .system = $system
| .disks.boot.logical_bytes = $boot_logical_bytes | .disks.boot.logical_bytes = $boot_logical_bytes
| .disks.boot.file = $boot | .disks.boot.file = $boot
@ -145,9 +148,11 @@ in {
--arg system_label ${lib.escapeShellArg config.system.nixos.label} \ --arg system_label ${lib.escapeShellArg config.system.nixos.label} \
--arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \ --arg system ${lib.escapeShellArg pkgs.stdenv.hostPlatform.system} \
--arg logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$diskImage" | ${pkgs.jq}/bin/jq '."virtual-size"')" \ --arg logical_bytes "$(${pkgs.qemu}/bin/qemu-img info --output json "$diskImage" | ${pkgs.jq}/bin/jq '."virtual-size"')" \
--arg boot_mode "${amiBootMode}" \
--arg file "$diskImage" \ --arg file "$diskImage" \
'{} '{}
| .label = $system_label | .label = $system_label
| .boot_mode = $boot_mode
| .system = $system | .system = $system
| .logical_bytes = $logical_bytes | .logical_bytes = $logical_bytes
| .file = $file | .file = $file

View file

@ -1,6 +1,9 @@
#!/usr/bin/env nix-shell #!/usr/bin/env nix-shell
#!nix-shell -p awscli -p jq -p qemu -i bash #!nix-shell -p awscli -p jq -p qemu -i bash
# shellcheck shell=bash # shellcheck shell=bash
#
# Future Deprecation?
# This entire thing should probably be replaced with a generic terraform config
# Uploads and registers NixOS images built from the # Uploads and registers NixOS images built from the
# <nixos/release.nix> amazonImage attribute. Images are uploaded and # <nixos/release.nix> amazonImage attribute. Images are uploaded and
@ -65,13 +68,18 @@ read_image_info() {
# We handle a single image per invocation, store all attributes in # We handle a single image per invocation, store all attributes in
# globals for convenience. # globals for convenience.
zfs_disks=$(read_image_info .disks) zfs_disks=$(read_image_info .disks)
image_label="$(read_image_info .label)${zfs_disks:+-ZFS}" is_zfs_image=
if jq -e .boot <<< "$zfs_disks"; then
is_zfs_image=1
zfs_boot=".disks.boot"
fi
image_label="$(read_image_info .label)${is_zfs_image:+-ZFS}"
image_system=$(read_image_info .system) image_system=$(read_image_info .system)
image_files=( $(read_image_info "${zfs_disks:+.disks.root}.file") ) image_files=( $(read_image_info ".disks.root.file") )
image_logical_bytes=$(read_image_info "${zfs_disks:+.disks.boot}.logical_bytes") image_logical_bytes=$(read_image_info "${zfs_boot:-.disks.root}.logical_bytes")
if [[ -n "$zfs_disks" ]]; then if [[ -n "$is_zfs_image" ]]; then
image_files+=( $(read_image_info .disks.boot.file) ) image_files+=( $(read_image_info .disks.boot.file) )
fi fi
@ -192,7 +200,7 @@ upload_image() {
for image_file in "${image_files[@]}"; do for image_file in "${image_files[@]}"; do
local aws_path=${image_file#/} local aws_path=${image_file#/}
if [[ -n "$zfs_disks" ]]; then if [[ -n "$is_zfs_image" ]]; then
local suffix=${image_file%.*} local suffix=${image_file%.*}
suffix=${suffix##*.} suffix=${suffix##*.}
fi fi
@ -239,7 +247,7 @@ upload_image() {
"DeviceName=/dev/xvda,Ebs={SnapshotId=$snapshot_id,VolumeSize=$image_logical_gigabytes,DeleteOnTermination=true,VolumeType=gp3}" "DeviceName=/dev/xvda,Ebs={SnapshotId=$snapshot_id,VolumeSize=$image_logical_gigabytes,DeleteOnTermination=true,VolumeType=gp3}"
) )
if [[ -n "$zfs_disks" ]]; then if [[ -n "$is_zfs_image" ]]; then
local root_snapshot_id=$(read_state "$region.$image_label.root.$image_system" snapshot_id) local root_snapshot_id=$(read_state "$region.$image_label.root.$image_system" snapshot_id)
local root_image_logical_bytes=$(read_image_info ".disks.root.logical_bytes") local root_image_logical_bytes=$(read_image_info ".disks.root.logical_bytes")
@ -270,6 +278,7 @@ upload_image() {
--region "$region" \ --region "$region" \
--architecture $amazon_arch \ --architecture $amazon_arch \
--block-device-mappings "${block_device_mappings[@]}" \ --block-device-mappings "${block_device_mappings[@]}" \
--boot-mode $(read_image_info .boot_mode) \
"${extra_flags[@]}" \ "${extra_flags[@]}" \
| jq -r '.ImageId' | jq -r '.ImageId'
) )

View file

@ -0,0 +1,102 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help).
{ config, pkgs, lib, ... }:
with lib;
{
imports =
[ # Include the default lxd configuration.
../../../modules/virtualisation/lxc-container.nix
# Include the container-specific autogenerated configuration.
./lxd.nix
];
# networking.hostName = mkForce "nixos"; # Overwrite the hostname.
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
# Set your time zone.
# time.timeZone = "Europe/Amsterdam";
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
networking.useDHCP = false;
networking.interfaces.eth0.useDHCP = true;
# Configure network proxy if necessary
# networking.proxy.default = "http://user:password@proxy:port/";
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
# Select internationalisation properties.
# i18n.defaultLocale = "en_US.UTF-8";
# console = {
# font = "Lat2-Terminus16";
# keyMap = "us";
# };
# Enable the X11 windowing system.
# services.xserver.enable = true;
# Configure keymap in X11
# services.xserver.layout = "us";
# services.xserver.xkbOptions = "eurosign:e";
# Enable CUPS to print documents.
# services.printing.enable = true;
# Enable sound.
# sound.enable = true;
# hardware.pulseaudio.enable = true;
# Enable touchpad support (enabled default in most desktopManager).
# services.xserver.libinput.enable = true;
# Define a user account. Don't forget to set a password with passwd.
# users.users.jane = {
# isNormalUser = true;
# extraGroups = [ "wheel" ]; # Enable sudo for the user.
# };
# List packages installed in system profile. To search, run:
# $ nix search wget
# environment.systemPackages = with pkgs; [
# vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
# wget
# firefox
# ];
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
# services.openssh.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "21.05"; # Did you read the comment?
# As this is intended as a stadalone image, undo some of the minimal profile stuff
documentation.enable = true;
documentation.nixos.enable = true;
environment.noXlibs = false;
}

View file

@ -0,0 +1,34 @@
{ lib, config, pkgs, ... }:
with lib;
{
imports = [
../../../modules/virtualisation/lxc-container.nix
];
virtualisation.lxc.templates.nix = {
enable = true;
target = "/etc/nixos/lxd.nix";
template = ./nix.tpl;
when = [ "create" "copy" ];
};
# copy the config for nixos-rebuild
system.activationScripts.config = ''
if [ ! -e /etc/nixos/configuration.nix ]; then
mkdir -p /etc/nixos
cat ${./lxd-image-inner.nix} > /etc/nixos/configuration.nix
sed 's|../../../modules/virtualisation/lxc-container.nix|<nixpkgs/nixos/modules/virtualisation/lxc-container.nix>|g' -i /etc/nixos/configuration.nix
fi
'';
# Network
networking.useDHCP = false;
networking.interfaces.eth0.useDHCP = true;
# As this is intended as a stadalone image, undo some of the minimal profile stuff
documentation.enable = true;
documentation.nixos.enable = true;
environment.noXlibs = false;
}

View file

@ -0,0 +1,9 @@
{ lib, config, pkgs, ... }:
with lib;
# WARNING: THIS CONFIGURATION IS AUTOGENERATED AND WILL BE OVERWRITTEN AUTOMATICALLY
{
networking.hostName = "{{ container.name }}";
}

View file

@ -39,6 +39,7 @@ in
decompressFonts = mkOption { decompressFonts = mkOption {
type = types.bool; type = types.bool;
default = config.programs.xwayland.enable; default = config.programs.xwayland.enable;
defaultText = literalExpression "config.programs.xwayland.enable";
description = '' description = ''
Whether to decompress fonts in Whether to decompress fonts in
<filename>/run/current-system/sw/share/X11/fonts</filename>. <filename>/run/current-system/sw/share/X11/fonts</filename>.

View file

@ -6,6 +6,7 @@ with lib;
gtk.iconCache.enable = mkOption { gtk.iconCache.enable = mkOption {
type = types.bool; type = types.bool;
default = config.services.xserver.enable; default = config.services.xserver.enable;
defaultText = literalExpression "config.services.xserver.enable";
description = '' description = ''
Whether to build icon theme caches for GTK applications. Whether to build icon theme caches for GTK applications.
''; '';

View file

@ -14,6 +14,12 @@ with lib;
allLocales = any (x: x == "all") config.i18n.supportedLocales; allLocales = any (x: x == "all") config.i18n.supportedLocales;
locales = config.i18n.supportedLocales; locales = config.i18n.supportedLocales;
}; };
defaultText = literalExpression ''
pkgs.buildPackages.glibcLocales.override {
allLocales = any (x: x == "all") config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
}
'';
example = literalExpression "pkgs.glibcLocales"; example = literalExpression "pkgs.glibcLocales";
description = '' description = ''
Customized pkg.glibcLocales package. Customized pkg.glibcLocales package.

View file

@ -47,6 +47,15 @@ let
''; '';
}; };
allowDiscards = mkOption {
default = false;
type = types.bool;
description = ''
Whether to allow TRIM requests to the underlying device. This option
has security implications; please read the LUKS documentation before
activating it.
'';
};
}; };
}; };
@ -194,7 +203,6 @@ in
]; ];
# Create missing swapfiles. # Create missing swapfiles.
# FIXME: support changing the size of existing swapfiles.
systemd.services = systemd.services =
let let
@ -214,17 +222,14 @@ in
${optionalString (sw.size != null) '' ${optionalString (sw.size != null) ''
currentSize=$(( $(stat -c "%s" "${sw.device}" 2>/dev/null || echo 0) / 1024 / 1024 )) currentSize=$(( $(stat -c "%s" "${sw.device}" 2>/dev/null || echo 0) / 1024 / 1024 ))
if [ "${toString sw.size}" != "$currentSize" ]; then if [ "${toString sw.size}" != "$currentSize" ]; then
fallocate -l ${toString sw.size}M "${sw.device}" ||
dd if=/dev/zero of="${sw.device}" bs=1M count=${toString sw.size} dd if=/dev/zero of="${sw.device}" bs=1M count=${toString sw.size}
if [ "${toString sw.size}" -lt "$currentSize" ]; then
truncate --size "${toString sw.size}M" "${sw.device}"
fi
chmod 0600 ${sw.device} chmod 0600 ${sw.device}
${optionalString (!sw.randomEncryption.enable) "mkswap ${sw.realDevice}"} ${optionalString (!sw.randomEncryption.enable) "mkswap ${sw.realDevice}"}
fi fi
''} ''}
${optionalString sw.randomEncryption.enable '' ${optionalString sw.randomEncryption.enable ''
cryptsetup plainOpen -c ${sw.randomEncryption.cipher} -d ${sw.randomEncryption.source} ${optionalString (sw.discardPolicy != null) "--allow-discards"} ${sw.device} ${sw.deviceName} cryptsetup plainOpen -c ${sw.randomEncryption.cipher} -d ${sw.randomEncryption.source} \
${optionalString sw.randomEncryption.allowDiscards "--allow-discards"} ${sw.device} ${sw.deviceName}
mkswap ${sw.realDevice} mkswap ${sw.realDevice}
''} ''}
''; '';

View file

@ -558,6 +558,7 @@ in {
input.gid = ids.gids.input; input.gid = ids.gids.input;
kvm.gid = ids.gids.kvm; kvm.gid = ids.gids.kvm;
render.gid = ids.gids.render; render.gid = ids.gids.render;
sgx.gid = ids.gids.sgx;
shadow.gid = ids.gids.shadow; shadow.gid = ids.gids.shadow;
}; };

View file

@ -83,7 +83,7 @@ in {
b43Firmware_5_1_138 b43Firmware_5_1_138
b43Firmware_6_30_163_46 b43Firmware_6_30_163_46
b43FirmwareCutter b43FirmwareCutter
] ++ optional (pkgs.stdenv.hostPlatform.isi686 || pkgs.stdenv.hostPlatform.isx86_64) facetimehd-firmware; ] ++ optional pkgs.stdenv.hostPlatform.isx86 facetimehd-firmware;
}) })
(mkIf cfg.wirelessRegulatoryDatabase { (mkIf cfg.wirelessRegulatoryDatabase {
hardware.firmware = [ pkgs.wireless-regdb ]; hardware.firmware = [ pkgs.wireless-regdb ];

View file

@ -0,0 +1,12 @@
{ config, lib, pkgs, ... }:
let
cfg = config.hardware.flirc;
in
{
options.hardware.flirc.enable = lib.mkEnableOption "software to configure a Flirc USB device";
config = lib.mkIf cfg.enable {
environment.systemPackages = [ pkgs.flirc ];
services.udev.packages = [ pkgs.flirc ];
};
}

View file

@ -116,19 +116,14 @@ in {
description = "Ensure NixOS-configured CUPS printers"; description = "Ensure NixOS-configured CUPS printers";
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
requires = [ cupsUnit ]; requires = [ cupsUnit ];
# in contrast to cups.socket, for cups.service, this is actually not enough,
# as the cups service reports its activation before clients can actually interact with it.
# Because of this, commands like `lpinfo -v` will report a bad file descriptor
# due to the missing UNIX socket without sufficient sleep time.
after = [ cupsUnit ]; after = [ cupsUnit ];
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
RemainAfterExit = true;
}; };
# sleep 10 is required to wait until cups.service is actually initialized and has created its UNIX socket file script = concatMapStringsSep "\n" ensurePrinter cfg.ensurePrinters
script = (optionalString (!config.services.printing.startWhenNeeded) "sleep 10\n")
+ (concatMapStringsSep "\n" ensurePrinter cfg.ensurePrinters)
+ optionalString (cfg.ensureDefaultPrinter != null) (ensureDefaultPrinter cfg.ensureDefaultPrinter); + optionalString (cfg.ensureDefaultPrinter != null) (ensureDefaultPrinter cfg.ensureDefaultPrinter);
}; };
}; };

View file

@ -12,6 +12,5 @@ with lib;
boot.loader.systemd-boot.consoleMode = mkDefault "1"; boot.loader.systemd-boot.consoleMode = mkDefault "1";
# TODO Find reasonable defaults X11 & wayland # TODO Find reasonable defaults X11 & wayland
services.xserver.dpi = lib.mkDefault 192;
}; };
} }

View file

@ -179,7 +179,7 @@ in
in mkIf enabled { in mkIf enabled {
assertions = [ assertions = [
{ {
assertion = with config.services.xserver.displayManager; gdm.nvidiaWayland -> cfg.modesetting.enable; assertion = with config.services.xserver.displayManager; (gdm.enable && gdm.nvidiaWayland) -> cfg.modesetting.enable;
message = "You cannot use wayland with GDM without modesetting enabled for NVIDIA drivers, set `hardware.nvidia.modesetting.enable = true`"; message = "You cannot use wayland with GDM without modesetting enabled for NVIDIA drivers, set `hardware.nvidia.modesetting.enable = true`";
} }
@ -284,13 +284,17 @@ in
source = "${nvidia_x11.bin}/share/nvidia/nvidia-application-profiles-rc"; source = "${nvidia_x11.bin}/share/nvidia/nvidia-application-profiles-rc";
}; };
# 'nvidia_x11' installs it's files to /run/opengl-driver/...
environment.etc."egl/egl_external_platform.d".source =
"/run/opengl-driver/share/egl/egl_external_platform.d/";
hardware.opengl.package = mkIf (!offloadCfg.enable) nvidia_x11.out; hardware.opengl.package = mkIf (!offloadCfg.enable) nvidia_x11.out;
hardware.opengl.package32 = mkIf (!offloadCfg.enable) nvidia_x11.lib32; hardware.opengl.package32 = mkIf (!offloadCfg.enable) nvidia_x11.lib32;
hardware.opengl.extraPackages = optional offloadCfg.enable nvidia_x11.out; hardware.opengl.extraPackages = optional offloadCfg.enable nvidia_x11.out;
hardware.opengl.extraPackages32 = optional offloadCfg.enable nvidia_x11.lib32; hardware.opengl.extraPackages32 = optional offloadCfg.enable nvidia_x11.lib32;
environment.systemPackages = [ nvidia_x11.bin ] environment.systemPackages = [ nvidia_x11.bin ]
++ optionals nvidiaSettings [ nvidia_x11.settings ] ++ optionals cfg.nvidiaSettings [ nvidia_x11.settings ]
++ optionals nvidiaPersistencedEnabled [ nvidia_x11.persistenced ]; ++ optionals nvidiaPersistencedEnabled [ nvidia_x11.persistenced ];
systemd.packages = optional cfg.powerManagement.enable nvidia_x11.out; systemd.packages = optional cfg.powerManagement.enable nvidia_x11.out;

View file

@ -467,7 +467,7 @@ let
throw "Unsupported architecture"; throw "Unsupported architecture";
# Syslinux (and isolinux) only supports x86-based architectures. # Syslinux (and isolinux) only supports x86-based architectures.
canx86BiosBoot = pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64; canx86BiosBoot = pkgs.stdenv.hostPlatform.isx86;
in in

View file

@ -1,7 +1,7 @@
{ {
x86_64-linux = "/nix/store/nzp4m3cmm7wawk031byh8jg4cdzjq212-nix-2.3.16"; x86_64-linux = "/nix/store/hapw7q1fkjxvprnkcgw9ppczavg4daj2-nix-2.4";
i686-linux = "/nix/store/zsaza9pwim617ak15fsc31lv65b9w3in-nix-2.3.16"; i686-linux = "/nix/store/8qlvh8pp5j8wgrzj3is2jlbhgrwgsiy9-nix-2.4";
aarch64-linux = "/nix/store/7f6z40gyd405yd50qkyzwilnqw106bx8-nix-2.3.16"; aarch64-linux = "/nix/store/h48lkygcqj4hdibbdnpl67q7ks6vkrd6-nix-2.4";
x86_64-darwin = "/nix/store/c43kyri67ia8mibs0id5ara7gqwlkybf-nix-2.3.16"; x86_64-darwin = "/nix/store/c3mvzszvyzakvcp9spnjvsb8m2bpjk7m-nix-2.4";
aarch64-darwin = "/nix/store/6jwhak3cvsgnbqs540n27g8pxnk427fr-nix-2.3.16"; aarch64-darwin = "/nix/store/hbfqs62r0hga2yr4zi5kc7fzhf71bq9n-nix-2.4";
} }

View file

@ -1,4 +1,5 @@
#! @runtimeShell@ -e #! @runtimeShell@ -e
# shellcheck shell=bash
# Shows the usage of this command to the user # Shows the usage of this command to the user
@ -29,12 +30,12 @@ while [ $# -gt 0 ]; do
nixBuildArgs+=("--option" "$1" "$2"); shift nixBuildArgs+=("--option" "$1" "$2"); shift
;; ;;
*) *)
if [ ! -z "$networkExpr" ]; then if [ -n "$networkExpr" ]; then
echo "Network expression already set!" echo "Network expression already set!"
showUsage showUsage
exit 1 exit 1
fi fi
networkExpr="$(readlink -f $1)" networkExpr="$(readlink -f "$1")"
;; ;;
esac esac
@ -49,4 +50,4 @@ fi
# Build a network of VMs # Build a network of VMs
nix-build '<nixpkgs/nixos/modules/installer/tools/nixos-build-vms/build-vms.nix>' \ nix-build '<nixpkgs/nixos/modules/installer/tools/nixos-build-vms/build-vms.nix>' \
--argstr networkExpr $networkExpr "${nixBuildArgs[@]}" --argstr networkExpr "$networkExpr" "${nixBuildArgs[@]}"

View file

@ -1,4 +1,5 @@
#! @runtimeShell@ #! @runtimeShell@
# shellcheck shell=bash
set -e set -e
@ -60,6 +61,35 @@ chmod 0755 "$mountPoint/dev" "$mountPoint/sys"
mount --rbind /dev "$mountPoint/dev" mount --rbind /dev "$mountPoint/dev"
mount --rbind /sys "$mountPoint/sys" mount --rbind /sys "$mountPoint/sys"
# modified from https://github.com/archlinux/arch-install-scripts/blob/bb04ab435a5a89cd5e5ee821783477bc80db797f/arch-chroot.in#L26-L52
chroot_add_resolv_conf() {
local chrootdir=$1 resolv_conf=$1/etc/resolv.conf
[[ -e /etc/resolv.conf ]] || return 0
# Handle resolv.conf as a symlink to somewhere else.
if [[ -L $chrootdir/etc/resolv.conf ]]; then
# readlink(1) should always give us *something* since we know at this point
# it's a symlink. For simplicity, ignore the case of nested symlinks.
# We also ignore the possibility if `../`s escaping the root.
resolv_conf=$(readlink "$chrootdir/etc/resolv.conf")
if [[ $resolv_conf = /* ]]; then
resolv_conf=$chrootdir$resolv_conf
else
resolv_conf=$chrootdir/etc/$resolv_conf
fi
fi
# ensure file exists to bind mount over
if [[ ! -f $resolv_conf ]]; then
install -Dm644 /dev/null "$resolv_conf" || return 1
fi
mount --bind /etc/resolv.conf "$resolv_conf"
}
chroot_add_resolv_conf "$mountPoint" || print "ERROR: failed to set up resolv.conf"
( (
# If silent, write both stdout and stderr of activation script to /dev/null # If silent, write both stdout and stderr of activation script to /dev/null
# otherwise, write both streams to stderr of this process # otherwise, write both streams to stderr of this process

View file

@ -91,6 +91,11 @@ sub hasCPUFeature {
} }
sub cpuManufacturer {
my $id = shift;
return $cpuinfo =~ /^vendor_id\s*:.* $id$/m;
}
# Determine CPU governor to use # Determine CPU governor to use
if (-e "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors") { if (-e "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors") {
@ -111,6 +116,9 @@ if (-e "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors") {
push @kernelModules, "kvm-intel" if hasCPUFeature "vmx"; push @kernelModules, "kvm-intel" if hasCPUFeature "vmx";
push @kernelModules, "kvm-amd" if hasCPUFeature "svm"; push @kernelModules, "kvm-amd" if hasCPUFeature "svm";
push @attrs, "hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;" if cpuManufacturer "AuthenticAMD";
push @attrs, "hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;" if cpuManufacturer "GenuineIntel";
# Look at the PCI devices and add necessary modules. Note that most # Look at the PCI devices and add necessary modules. Note that most
# modules are auto-detected so we don't need to list them here. # modules are auto-detected so we don't need to list them here.

View file

@ -1,4 +1,5 @@
#! @runtimeShell@ #! @runtimeShell@
# shellcheck shell=bash
set -e set -e
shopt -s nullglob shopt -s nullglob
@ -58,7 +59,7 @@ while [ "$#" -gt 0 ]; do
--no-channel-copy) --no-channel-copy)
noChannelCopy=1 noChannelCopy=1
;; ;;
--no-root-passwd) --no-root-password|--no-root-passwd)
noRootPasswd=1 noRootPasswd=1
;; ;;
--no-bootloader) --no-bootloader)

View file

@ -1,4 +1,5 @@
#! @runtimeShell@ #! @runtimeShell@
# shellcheck shell=bash
case "$1" in case "$1" in
-h|--help) -h|--help)

View file

@ -80,6 +80,10 @@ let
]; ];
}; };
# list of man outputs currently active intended for use as default values
# for man-related options, thus "man" is included unconditionally.
activeManOutputs = [ "man" ] ++ lib.optionals cfg.dev.enable [ "devman" ];
in in
{ {
@ -130,7 +134,7 @@ in
name = "man-paths"; name = "man-paths";
paths = config.environment.systemPackages; paths = config.environment.systemPackages;
pathsToLink = [ "/share/man" ]; pathsToLink = [ "/share/man" ];
extraOutputsToInstall = ["man"]; extraOutputsToInstall = activeManOutputs;
ignoreCollisions = true; ignoreCollisions = true;
}; };
defaultText = literalDocBook "all man pages in <option>config.environment.systemPackages</option>"; defaultText = literalDocBook "all man pages in <option>config.environment.systemPackages</option>";
@ -226,7 +230,7 @@ in
(mkIf cfg.man.enable { (mkIf cfg.man.enable {
environment.systemPackages = [ pkgs.man-db ]; environment.systemPackages = [ pkgs.man-db ];
environment.pathsToLink = [ "/share/man" ]; environment.pathsToLink = [ "/share/man" ];
environment.extraOutputsToInstall = [ "man" ] ++ optional cfg.dev.enable "devman"; environment.extraOutputsToInstall = activeManOutputs;
environment.etc."man_db.conf".text = environment.etc."man_db.conf".text =
let let
manualCache = pkgs.runCommandLocal "man-cache" { } '' manualCache = pkgs.runCommandLocal "man-cache" { } ''

View file

@ -351,6 +351,7 @@ in
hqplayer = 319; hqplayer = 319;
moonraker = 320; moonraker = 320;
distcc = 321; distcc = 321;
webdav = 322;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399! # When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
@ -638,7 +639,7 @@ in
qemu-libvirtd = 301; qemu-libvirtd = 301;
kvm = 302; # default udev rules from systemd requires these kvm = 302; # default udev rules from systemd requires these
render = 303; # default udev rules from systemd requires these render = 303; # default udev rules from systemd requires these
# zeronet = 304; # removed 2019-01-03 sgx = 304; # default udev rules from systemd requires these
lirc = 305; lirc = 305;
lidarr = 306; lidarr = 306;
slurm = 307; slurm = 307;
@ -656,6 +657,7 @@ in
hqplayer = 319; hqplayer = 319;
moonraker = 320; moonraker = 320;
distcc = 321; distcc = 321;
webdav = 322;
# When adding a gid, make sure it doesn't match an existing # When adding a gid, make sure it doesn't match an existing
# uid. Users and groups with the same name should have equal # uid. Users and groups with the same name should have equal

View file

@ -84,12 +84,15 @@ in {
"bdev" "bdev"
"binfmt" "binfmt"
"binfmt_misc" "binfmt_misc"
"ceph"
"cgroup" "cgroup"
"cgroup2"
"cifs" "cifs"
"coda" "coda"
"configfs" "configfs"
"cramfs" "cramfs"
"cpuset" "cpuset"
"curlftpfs"
"debugfs" "debugfs"
"devfs" "devfs"
"devpts" "devpts"
@ -101,6 +104,13 @@ in {
"ftpfs" "ftpfs"
"fuse" "fuse"
"fusectl" "fusectl"
"fusesmb"
"fuse.ceph"
"fuse.glusterfs"
"fuse.gvfsd-fuse"
"fuse.mfs"
"fuse.rclone"
"fuse.rozofs"
"fuse.sshfs" "fuse.sshfs"
"gfs" "gfs"
"gfs2" "gfs2"
@ -110,9 +120,15 @@ in {
"iso9660" "iso9660"
"jffs2" "jffs2"
"lustre" "lustre"
"lustre_lite"
"misc" "misc"
"mfs"
"mqueue" "mqueue"
"ncpfs" "ncpfs"
"nfs"
"NFS"
"nfs4"
"nfsd"
"nnpfs" "nnpfs"
"ocfs" "ocfs"
"ocfs2" "ocfs2"
@ -127,16 +143,14 @@ in {
"smbfs" "smbfs"
"sockfs" "sockfs"
"spufs" "spufs"
"nfs"
"NFS"
"nfs4"
"nfsd"
"sshfs" "sshfs"
"subfs" "subfs"
"supermount" "supermount"
"sysfs" "sysfs"
"tmpfs" "tmpfs"
"tracefs"
"ubifs" "ubifs"
"udev"
"udf" "udf"
"usbfs" "usbfs"
"vboxsf" "vboxsf"
@ -149,7 +163,7 @@ in {
prunePaths = mkOption { prunePaths = mkOption {
type = listOf path; type = listOf path;
default = ["/tmp" "/var/tmp" "/var/cache" "/var/lock" "/var/run" "/var/spool" "/nix/store"]; default = [ "/tmp" "/var/tmp" "/var/cache" "/var/lock" "/var/run" "/var/spool" "/nix/store" "/nix/var/log/nix" ];
description = '' description = ''
Which paths to exclude from indexing Which paths to exclude from indexing
''; '';
@ -157,7 +171,7 @@ in {
pruneNames = mkOption { pruneNames = mkOption {
type = listOf str; type = listOf str;
default = []; default = [ ".bzr" ".cache" ".git" ".hg" ".svn" ];
description = '' description = ''
Directory components which should exclude paths containing them from indexing Directory components which should exclude paths containing them from indexing
''; '';
@ -202,7 +216,7 @@ in {
PRUNEFS="${lib.concatStringsSep " " cfg.pruneFS}" PRUNEFS="${lib.concatStringsSep " " cfg.pruneFS}"
PRUNENAMES="${lib.concatStringsSep " " cfg.pruneNames}" PRUNENAMES="${lib.concatStringsSep " " cfg.pruneNames}"
PRUNEPATHS="${lib.concatStringsSep " " cfg.prunePaths}" PRUNEPATHS="${lib.concatStringsSep " " cfg.prunePaths}"
PRUNE_BIND_MOUNTSFR="${lib.boolToString cfg.pruneBindMounts}" PRUNE_BIND_MOUNTS="${if cfg.pruneBindMounts then "yes" else "no"}"
''; '';
}; };
}; };

View file

@ -37,7 +37,7 @@ in
type = listOfMaintainers; type = listOfMaintainers;
internal = true; internal = true;
default = []; default = [];
example = [ lib.maintainers.all ]; example = literalExpression ''[ lib.maintainers.all ]'';
description = '' description = ''
List of maintainers of each module. This option should be defined at List of maintainers of each module. This option should be defined at
most once per module. most once per module.

View file

@ -49,6 +49,7 @@
./hardware/digitalbitbox.nix ./hardware/digitalbitbox.nix
./hardware/device-tree.nix ./hardware/device-tree.nix
./hardware/gkraken.nix ./hardware/gkraken.nix
./hardware/flirc.nix
./hardware/i2c.nix ./hardware/i2c.nix
./hardware/sensor/hddtemp.nix ./hardware/sensor/hddtemp.nix
./hardware/sensor/iio.nix ./hardware/sensor/iio.nix
@ -128,6 +129,7 @@
./programs/cdemu.nix ./programs/cdemu.nix
./programs/chromium.nix ./programs/chromium.nix
./programs/clickshare.nix ./programs/clickshare.nix
./programs/cnping.nix
./programs/command-not-found/command-not-found.nix ./programs/command-not-found/command-not-found.nix
./programs/criu.nix ./programs/criu.nix
./programs/dconf.nix ./programs/dconf.nix
@ -390,6 +392,7 @@
./services/display-managers/greetd.nix ./services/display-managers/greetd.nix
./services/editors/emacs.nix ./services/editors/emacs.nix
./services/editors/infinoted.nix ./services/editors/infinoted.nix
./services/finance/odoo.nix
./services/games/crossfire-server.nix ./services/games/crossfire-server.nix
./services/games/deliantra-server.nix ./services/games/deliantra-server.nix
./services/games/factorio.nix ./services/games/factorio.nix
@ -420,6 +423,7 @@
./services/hardware/pcscd.nix ./services/hardware/pcscd.nix
./services/hardware/pommed.nix ./services/hardware/pommed.nix
./services/hardware/power-profiles-daemon.nix ./services/hardware/power-profiles-daemon.nix
./services/hardware/rasdaemon.nix
./services/hardware/ratbagd.nix ./services/hardware/ratbagd.nix
./services/hardware/sane.nix ./services/hardware/sane.nix
./services/hardware/sane_extra_backends/brscan4.nix ./services/hardware/sane_extra_backends/brscan4.nix
@ -482,6 +486,9 @@
./services/mail/roundcube.nix ./services/mail/roundcube.nix
./services/mail/sympa.nix ./services/mail/sympa.nix
./services/mail/nullmailer.nix ./services/mail/nullmailer.nix
./services/matrix/mjolnir.nix
./services/matrix/pantalaimon.nix
./services/misc/ananicy.nix
./services/misc/airsonic.nix ./services/misc/airsonic.nix
./services/misc/ankisyncd.nix ./services/misc/ankisyncd.nix
./services/misc/apache-kafka.nix ./services/misc/apache-kafka.nix
@ -584,6 +591,7 @@
./services/misc/safeeyes.nix ./services/misc/safeeyes.nix
./services/misc/sdrplay.nix ./services/misc/sdrplay.nix
./services/misc/sickbeard.nix ./services/misc/sickbeard.nix
./services/misc/signald.nix
./services/misc/siproxd.nix ./services/misc/siproxd.nix
./services/misc/snapper.nix ./services/misc/snapper.nix
./services/misc/sonarr.nix ./services/misc/sonarr.nix
@ -603,6 +611,7 @@
./services/misc/uhub.nix ./services/misc/uhub.nix
./services/misc/weechat.nix ./services/misc/weechat.nix
./services/misc/xmr-stak.nix ./services/misc/xmr-stak.nix
./services/misc/xmrig.nix
./services/misc/zigbee2mqtt.nix ./services/misc/zigbee2mqtt.nix
./services/misc/zoneminder.nix ./services/misc/zoneminder.nix
./services/misc/zookeeper.nix ./services/misc/zookeeper.nix
@ -675,12 +684,15 @@
./services/network-filesystems/tahoe.nix ./services/network-filesystems/tahoe.nix
./services/network-filesystems/diod.nix ./services/network-filesystems/diod.nix
./services/network-filesystems/u9fs.nix ./services/network-filesystems/u9fs.nix
./services/network-filesystems/webdav.nix
./services/network-filesystems/webdav-server-rs.nix
./services/network-filesystems/yandex-disk.nix ./services/network-filesystems/yandex-disk.nix
./services/network-filesystems/xtreemfs.nix ./services/network-filesystems/xtreemfs.nix
./services/network-filesystems/ceph.nix ./services/network-filesystems/ceph.nix
./services/networking/3proxy.nix ./services/networking/3proxy.nix
./services/networking/adguardhome.nix ./services/networking/adguardhome.nix
./services/networking/amuled.nix ./services/networking/amuled.nix
./services/networking/antennas.nix
./services/networking/aria2.nix ./services/networking/aria2.nix
./services/networking/asterisk.nix ./services/networking/asterisk.nix
./services/networking/atftpd.nix ./services/networking/atftpd.nix
@ -768,6 +780,7 @@
./services/networking/libreswan.nix ./services/networking/libreswan.nix
./services/networking/lldpd.nix ./services/networking/lldpd.nix
./services/networking/logmein-hamachi.nix ./services/networking/logmein-hamachi.nix
./services/networking/lxd-image-server.nix
./services/networking/mailpile.nix ./services/networking/mailpile.nix
./services/networking/magic-wormhole-mailbox-server.nix ./services/networking/magic-wormhole-mailbox-server.nix
./services/networking/matterbridge.nix ./services/networking/matterbridge.nix
@ -885,6 +898,7 @@
./services/networking/unbound.nix ./services/networking/unbound.nix
./services/networking/unifi.nix ./services/networking/unifi.nix
./services/video/unifi-video.nix ./services/video/unifi-video.nix
./services/video/rtsp-simple-server.nix
./services/networking/v2ray.nix ./services/networking/v2ray.nix
./services/networking/vsftpd.nix ./services/networking/vsftpd.nix
./services/networking/wasabibackend.nix ./services/networking/wasabibackend.nix
@ -969,6 +983,7 @@
./services/web-apps/atlassian/jira.nix ./services/web-apps/atlassian/jira.nix
./services/web-apps/bookstack.nix ./services/web-apps/bookstack.nix
./services/web-apps/calibre-web.nix ./services/web-apps/calibre-web.nix
./services/web-apps/code-server.nix
./services/web-apps/convos.nix ./services/web-apps/convos.nix
./services/web-apps/cryptpad.nix ./services/web-apps/cryptpad.nix
./services/web-apps/dex.nix ./services/web-apps/dex.nix
@ -991,6 +1006,7 @@
./services/web-apps/jitsi-meet.nix ./services/web-apps/jitsi-meet.nix
./services/web-apps/keycloak.nix ./services/web-apps/keycloak.nix
./services/web-apps/lemmy.nix ./services/web-apps/lemmy.nix
./services/web-apps/invidious.nix
./services/web-apps/limesurvey.nix ./services/web-apps/limesurvey.nix
./services/web-apps/mastodon.nix ./services/web-apps/mastodon.nix
./services/web-apps/mattermost.nix ./services/web-apps/mattermost.nix
@ -1007,6 +1023,7 @@
./services/web-apps/pgpkeyserver-lite.nix ./services/web-apps/pgpkeyserver-lite.nix
./services/web-apps/matomo.nix ./services/web-apps/matomo.nix
./services/web-apps/moinmoin.nix ./services/web-apps/moinmoin.nix
./services/web-apps/openwebrx.nix
./services/web-apps/restya-board.nix ./services/web-apps/restya-board.nix
./services/web-apps/sogo.nix ./services/web-apps/sogo.nix
./services/web-apps/rss-bridge.nix ./services/web-apps/rss-bridge.nix
@ -1182,6 +1199,7 @@
./virtualisation/virtualbox-guest.nix ./virtualisation/virtualbox-guest.nix
./virtualisation/virtualbox-host.nix ./virtualisation/virtualbox-host.nix
./virtualisation/vmware-guest.nix ./virtualisation/vmware-guest.nix
./virtualisation/waydroid.nix
./virtualisation/xen-dom0.nix ./virtualisation/xen-dom0.nix
./virtualisation/xe-guest-utilities.nix ./virtualisation/xe-guest-utilities.nix
] ]

View file

@ -40,6 +40,7 @@
# Tools to create / manipulate filesystems. # Tools to create / manipulate filesystems.
pkgs.ntfsprogs # for resizing NTFS partitions pkgs.ntfsprogs # for resizing NTFS partitions
pkgs.dosfstools pkgs.dosfstools
pkgs.mtools
pkgs.xfsprogs.bin pkgs.xfsprogs.bin
pkgs.jfsutils pkgs.jfsutils
pkgs.f2fs-tools pkgs.f2fs-tools

View file

@ -14,4 +14,6 @@ with lib;
documentation.enable = mkDefault false; documentation.enable = mkDefault false;
documentation.nixos.enable = mkDefault false; documentation.nixos.enable = mkDefault false;
programs.command-not-found.enable = mkDefault false;
} }

View file

@ -1,9 +1,9 @@
{ config, lib, ... }: { config, pkgs, lib, ... }:
{ {
options.programs.bcc.enable = lib.mkEnableOption "bcc"; options.programs.bcc.enable = lib.mkEnableOption "bcc";
config = lib.mkIf config.programs.bcc.enable { config = lib.mkIf config.programs.bcc.enable {
environment.systemPackages = [ config.boot.kernelPackages.bcc ]; environment.systemPackages = [ pkgs.bcc ];
boot.extraModulePackages = [ config.boot.kernelPackages.bcc ]; boot.extraModulePackages = [ pkgs.bcc ];
}; };
} }

View file

@ -0,0 +1,21 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.programs.cnping;
in
{
options = {
programs.cnping = {
enable = mkEnableOption "Whether to install a setcap wrapper for cnping";
};
};
config = mkIf cfg.enable {
security.wrappers.cnping = {
source = "${pkgs.cnping}/bin/cnping";
capabilities = "cap_net_raw+ep";
};
};
}

View file

@ -60,7 +60,7 @@ in
environment.systemPackages = [ pkgs.dconf ]; environment.systemPackages = [ pkgs.dconf ];
# Needed for unwrapped applications # Needed for unwrapped applications
environment.variables.GIO_EXTRA_MODULES = mkIf cfg.enable [ "${pkgs.dconf.lib}/lib/gio/modules" ]; environment.sessionVariables.GIO_EXTRA_MODULES = mkIf cfg.enable [ "${pkgs.dconf.lib}/lib/gio/modules" ];
}; };
} }

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