From 685107c6c8ed9ffaa74101ebc78489903eaf88c0 Mon Sep 17 00:00:00 2001 From: Cole Helbling Date: Mon, 16 May 2022 11:46:44 -0700 Subject: [PATCH 01/18] flake: use github: reference to nixpkgs This allows flakes that don't override the Nixpkgs input and also have a different flake registry. --- flake.lock | 10 ++++++---- flake.nix | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index cd79fa85e..31c1910df 100644 --- a/flake.lock +++ b/flake.lock @@ -26,9 +26,10 @@ "type": "github" }, "original": { - "id": "nixpkgs", + "owner": "NixOS", "ref": "nixos-21.05-small", - "type": "indirect" + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs-regression": { @@ -41,9 +42,10 @@ "type": "github" }, "original": { - "id": "nixpkgs", + "owner": "NixOS", + "repo": "nixpkgs", "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" + "type": "github" } }, "root": { diff --git a/flake.nix b/flake.nix index dd3a25e9e..b33d7d1b3 100644 --- a/flake.nix +++ b/flake.nix @@ -1,8 +1,8 @@ { description = "The purely functional package manager"; - inputs.nixpkgs.url = "nixpkgs/nixos-21.05-small"; - inputs.nixpkgs-regression.url = "nixpkgs/215d4d0fd80ca5163643b03a33fde804a29cc1e2"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.05-small"; + inputs.nixpkgs-regression.url = "github:NixOS/nixpkgs/215d4d0fd80ca5163643b03a33fde804a29cc1e2"; inputs.lowdown-src = { url = "github:kristapsdz/lowdown"; flake = false; }; outputs = { self, nixpkgs, nixpkgs-regression, lowdown-src }: From c156155239dafd68104a843916d8d737e6e61bed Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Thu, 26 May 2022 10:53:06 +0200 Subject: [PATCH 02/18] createUnixDomainSocket: listen(unix, 5 -> 100) This solves the error error: cannot connect to socket at '/nix/var/nix/daemon-socket/socket': Connection refused on build farm systems that are loaded but operating normally. I've seen this happen on an M1 mac running a loaded hercules-ci-agent. Hercules CI uses multiple worker processes, which may connect to the Nix daemon around the same time. It's not unthinkable that the Nix daemon listening process isn't scheduled until after 6 workers try to connect, especially on a system under load with many workers. Is the increase safe? The number is the number of connections that the kernel will buffer while the listening process hasn't `accept`-ed them yet. It did not - and will not - restrict the total number of daemon forks that a client can create. History The number 5 has remained unchanged since the introduction in nix-worker with 0130ef88ea in 2006. --- src/libutil/util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libutil/util.cc b/src/libutil/util.cc index d4d78329d..1c19938a8 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -1818,7 +1818,7 @@ AutoCloseFD createUnixDomainSocket(const Path & path, mode_t mode) if (chmod(path.c_str(), mode) == -1) throw SysError("changing permissions on '%1%'", path); - if (listen(fdSocket.get(), 5) == -1) + if (listen(fdSocket.get(), 100) == -1) throw SysError("cannot listen on socket '%1%'", path); return fdSocket; From 5b270402032151d478d5c5ecc3d99c12bcab0476 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 26 May 2022 14:49:17 +0200 Subject: [PATCH 03/18] Remove unused Perl dependency --- flake.nix | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/flake.nix b/flake.nix index dd3a25e9e..a6877cb82 100644 --- a/flake.nix +++ b/flake.nix @@ -135,11 +135,6 @@ })) nlohmann_json ]; - - perlDeps = - [ perl - perlPackages.DBDSQLite - ]; }; installScriptFor = systems: @@ -673,7 +668,7 @@ outputs = [ "out" "dev" "doc" ]; nativeBuildInputs = nativeBuildDeps; - buildInputs = buildDeps ++ propagatedDeps ++ awsDeps ++ perlDeps; + buildInputs = buildDeps ++ propagatedDeps ++ awsDeps; inherit configureFlags; From 4de84e095d0f1fa7f3b5db8904496ffd2752d73e Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Wed, 25 May 2022 18:51:04 +0200 Subject: [PATCH 04/18] doc: Introduce pre-processor for adding anchors to text It is now possible to use the following syntax to insert anchors into the text: []{#anchor-name} The anchor will allow linking to the location it is placed by appending #anchor-name to the URL. Additionally, it is possible to create a link pointing to its own location by adding text between the square brackets: [`--add-root`]{#opt-add-root} --- doc/manual/anchors.py | 56 +++++++++++++++++++++++++++++++++++++++++++ doc/manual/book.toml | 3 +++ doc/manual/local.mk | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100755 doc/manual/anchors.py diff --git a/doc/manual/anchors.py b/doc/manual/anchors.py new file mode 100755 index 000000000..2a93b2a67 --- /dev/null +++ b/doc/manual/anchors.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import argparse +import json +import re +import sys + + +empty_anchor_regex = re.compile(r"\[\]\{#(?P[^\}]+?)\}") +anchor_regex = re.compile(r"\[(?P[^\]]+?)\]\{#(?P[^\}]+?)\}") + + +def transform_anchors_html(content): + content = empty_anchor_regex.sub(r'', content) + content = anchor_regex.sub(r'\g', content) + return content + + +def transform_anchors_strip(content): + content = empty_anchor_regex.sub(r'', content) + content = anchor_regex.sub(r'\g', content) + return content + + +def map_contents_recursively(transformer, chapter): + chapter["Chapter"]["content"] = transformer(chapter["Chapter"]["content"]) + for sub_item in chapter["Chapter"]["sub_items"]: + map_contents_recursively(transformer, sub_item) + + +def supports_command(args): + sys.exit(0) + + +def process_command(args): + context, book = json.load(sys.stdin) + transformer = transform_anchors_html if context["renderer"] == "html" else transform_anchors_strip + for section in book["sections"]: + map_contents_recursively(transformer, section) + print(json.dumps(book)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="mdBook preprocessor adding anchors." + ) + parser.set_defaults(command=process_command) + + subparsers = parser.add_subparsers() + + supports_parser = subparsers.add_parser("supports", help="Check if given renderer is supported") + supports_parser.add_argument("renderer", type=str) + supports_parser.set_defaults(command=supports_command) + + args = parser.parse_args() + args.command(args) diff --git a/doc/manual/book.toml b/doc/manual/book.toml index fee41dfb3..75554d11f 100644 --- a/doc/manual/book.toml +++ b/doc/manual/book.toml @@ -1,2 +1,5 @@ [output.html] additional-css = ["custom.css"] + +[preprocessor.anchors] +command = "python3 doc/manual/anchors.py" diff --git a/doc/manual/local.mk b/doc/manual/local.mk index c1ce8aaeb..910d0a03b 100644 --- a/doc/manual/local.mk +++ b/doc/manual/local.mk @@ -97,7 +97,7 @@ doc/manual/generated/man1/nix3-manpages: $(d)/src/command-ref/new-cli done @touch $@ -$(docdir)/manual/index.html: $(MANUAL_SRCS) $(d)/book.toml $(d)/custom.css $(d)/src/SUMMARY.md $(d)/src/command-ref/new-cli $(d)/src/command-ref/conf-file.md $(d)/src/expressions/builtins.md $(call rwildcard, $(d)/src, *.md) +$(docdir)/manual/index.html: $(MANUAL_SRCS) $(d)/book.toml $(d)/anchors.py $(d)/custom.css $(d)/src/SUMMARY.md $(d)/src/command-ref/new-cli $(d)/src/command-ref/conf-file.md $(d)/src/expressions/builtins.md $(call rwildcard, $(d)/src, *.md) $(trace-gen) RUST_LOG=warn mdbook build doc/manual -d $(DESTDIR)$(docdir)/manual endif From 3272afa17b68d25c8070e58819f2e56f075c764d Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Thu, 26 May 2022 16:47:40 +0200 Subject: [PATCH 05/18] doc: Port anchors preprocessor to jq script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python is only pulled into the build closure by Mercurial, which might end up being removed. Let’s port the script to jq, which is more likely to stay. --- doc/manual/anchors.jq | 31 ++++++++++++++++++++++++ doc/manual/anchors.py | 56 ------------------------------------------- doc/manual/book.toml | 3 ++- doc/manual/local.mk | 2 +- flake.nix | 2 +- 5 files changed, 35 insertions(+), 59 deletions(-) create mode 100755 doc/manual/anchors.jq delete mode 100755 doc/manual/anchors.py diff --git a/doc/manual/anchors.jq b/doc/manual/anchors.jq new file mode 100755 index 000000000..72309779c --- /dev/null +++ b/doc/manual/anchors.jq @@ -0,0 +1,31 @@ +"\\[\\]\\{#(?[^\\}]+?)\\}" as $empty_anchor_regex | +"\\[(?[^\\]]+?)\\]\\{#(?[^\\}]+?)\\}" as $anchor_regex | + + +def transform_anchors_html: + . | gsub($empty_anchor_regex; "") + | gsub($anchor_regex; "" + .text + ""); + + +def transform_anchors_strip: + . | gsub($empty_anchor_regex; "") + | gsub($anchor_regex; .text); + + +def map_contents_recursively(transformer): + . + { + Chapter: (.Chapter + { + content: .Chapter.content | transformer, + sub_items: .Chapter.sub_items | map(map_contents_recursively(transformer)), + }), + }; + + +def process_command: + .[0] as $context | + .[1] as $body | + $body + { + sections: $body.sections | map(map_contents_recursively(if $context.renderer == "html" then transform_anchors_html else transform_anchors_strip end)), + }; + +process_command diff --git a/doc/manual/anchors.py b/doc/manual/anchors.py deleted file mode 100755 index 2a93b2a67..000000000 --- a/doc/manual/anchors.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import json -import re -import sys - - -empty_anchor_regex = re.compile(r"\[\]\{#(?P[^\}]+?)\}") -anchor_regex = re.compile(r"\[(?P[^\]]+?)\]\{#(?P[^\}]+?)\}") - - -def transform_anchors_html(content): - content = empty_anchor_regex.sub(r'', content) - content = anchor_regex.sub(r'\g', content) - return content - - -def transform_anchors_strip(content): - content = empty_anchor_regex.sub(r'', content) - content = anchor_regex.sub(r'\g', content) - return content - - -def map_contents_recursively(transformer, chapter): - chapter["Chapter"]["content"] = transformer(chapter["Chapter"]["content"]) - for sub_item in chapter["Chapter"]["sub_items"]: - map_contents_recursively(transformer, sub_item) - - -def supports_command(args): - sys.exit(0) - - -def process_command(args): - context, book = json.load(sys.stdin) - transformer = transform_anchors_html if context["renderer"] == "html" else transform_anchors_strip - for section in book["sections"]: - map_contents_recursively(transformer, section) - print(json.dumps(book)) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="mdBook preprocessor adding anchors." - ) - parser.set_defaults(command=process_command) - - subparsers = parser.add_subparsers() - - supports_parser = subparsers.add_parser("supports", help="Check if given renderer is supported") - supports_parser.add_argument("renderer", type=str) - supports_parser.set_defaults(command=supports_command) - - args = parser.parse_args() - args.command(args) diff --git a/doc/manual/book.toml b/doc/manual/book.toml index 75554d11f..ff6b79c07 100644 --- a/doc/manual/book.toml +++ b/doc/manual/book.toml @@ -2,4 +2,5 @@ additional-css = ["custom.css"] [preprocessor.anchors] -command = "python3 doc/manual/anchors.py" +renderers = ["html"] +command = "jq --from-file doc/manual/anchors.jq" diff --git a/doc/manual/local.mk b/doc/manual/local.mk index 910d0a03b..371ed6f21 100644 --- a/doc/manual/local.mk +++ b/doc/manual/local.mk @@ -97,7 +97,7 @@ doc/manual/generated/man1/nix3-manpages: $(d)/src/command-ref/new-cli done @touch $@ -$(docdir)/manual/index.html: $(MANUAL_SRCS) $(d)/book.toml $(d)/anchors.py $(d)/custom.css $(d)/src/SUMMARY.md $(d)/src/command-ref/new-cli $(d)/src/command-ref/conf-file.md $(d)/src/expressions/builtins.md $(call rwildcard, $(d)/src, *.md) +$(docdir)/manual/index.html: $(MANUAL_SRCS) $(d)/book.toml $(d)/anchors.jq $(d)/custom.css $(d)/src/SUMMARY.md $(d)/src/command-ref/new-cli $(d)/src/command-ref/conf-file.md $(d)/src/expressions/builtins.md $(call rwildcard, $(d)/src, *.md) $(trace-gen) RUST_LOG=warn mdbook build doc/manual -d $(DESTDIR)$(docdir)/manual endif diff --git a/flake.nix b/flake.nix index dd3a25e9e..536fcf9fa 100644 --- a/flake.nix +++ b/flake.nix @@ -102,7 +102,7 @@ # Tests buildPackages.git buildPackages.mercurial # FIXME: remove? only needed for tests - buildPackages.jq + buildPackages.jq # Also for custom mdBook preprocessor. ] ++ lib.optionals stdenv.hostPlatform.isLinux [(buildPackages.util-linuxMinimal or buildPackages.utillinuxMinimal)]; From 7708a34a514ddeb1420886309ae9870d8757f7ce Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Wed, 25 May 2022 12:36:46 +0200 Subject: [PATCH 06/18] doc: Add anchors to long lists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added using the following sed scripts: - For command-ref/opt-common.md: s~- `(--?)([^`]+)`~- [`\1\2`]{#opt-\2}~g - For expressions/builtin-constants.md: s~- `(builtins\.?)([^`]+)`~- [`\1\2`]{#builtins-\2}~g - For expressions/advanced-attributes.md s~^ - `([^`]+)`~ - [`\1`]{#adv-attr-\1}~g and manually adjusted outputHashAlgo & outputHashMode. - For glossary.md s~^ - (`([^`]+)`|(.+)) ?\\~ - [\1]{#gloss-\2\3}\\~g; s~(gloss-\w+) ~\1-~g and manually adjusted anchors for Nix expression, user environment, NAR, ∅ and ε. - For command-ref/env-common.md s~^ - `([^`]+)`~ - [`\1`]{#env-\1}~g' --- doc/manual/src/command-ref/env-common.md | 30 ++++++------- doc/manual/src/command-ref/nix-build.md | 6 +-- doc/manual/src/command-ref/opt-common.md | 42 +++++++++---------- .../src/expressions/advanced-attributes.md | 22 +++++----- .../src/expressions/builtin-constants.md | 2 +- doc/manual/src/glossary.md | 36 ++++++++-------- 6 files changed, 69 insertions(+), 69 deletions(-) diff --git a/doc/manual/src/command-ref/env-common.md b/doc/manual/src/command-ref/env-common.md index 6e2403461..ab048074a 100644 --- a/doc/manual/src/command-ref/env-common.md +++ b/doc/manual/src/command-ref/env-common.md @@ -2,11 +2,11 @@ Most Nix commands interpret the following environment variables: - - `IN_NIX_SHELL`\ + - [`IN_NIX_SHELL`]{#env-IN_NIX_SHELL}\ Indicator that tells if the current environment was set up by `nix-shell`. Since Nix 2.0 the values are `"pure"` and `"impure"` - - `NIX_PATH`\ + - [`NIX_PATH`]{#env-NIX_PATH}\ A colon-separated list of directories used to look up Nix expressions enclosed in angle brackets (i.e., ``). For instance, the value @@ -44,7 +44,7 @@ Most Nix commands interpret the following environment variables: The Nix search path can also be extended using the `-I` option to many Nix commands, which takes precedence over `NIX_PATH`. - - `NIX_IGNORE_SYMLINK_STORE`\ + - [`NIX_IGNORE_SYMLINK_STORE`]{#env-NIX_IGNORE_SYMLINK_STORE}\ Normally, the Nix store directory (typically `/nix/store`) is not allowed to contain any symlink components. This is to prevent “impure” builds. Builders sometimes “canonicalise” paths by @@ -66,41 +66,41 @@ Most Nix commands interpret the following environment variables: Consult the mount 8 manual page for details. - - `NIX_STORE_DIR`\ + - [`NIX_STORE_DIR`]{#env-NIX_STORE_DIR}\ Overrides the location of the Nix store (default `prefix/store`). - - `NIX_DATA_DIR`\ + - [`NIX_DATA_DIR`]{#env-NIX_DATA_DIR}\ Overrides the location of the Nix static data directory (default `prefix/share`). - - `NIX_LOG_DIR`\ + - [`NIX_LOG_DIR`]{#env-NIX_LOG_DIR}\ Overrides the location of the Nix log directory (default `prefix/var/log/nix`). - - `NIX_STATE_DIR`\ + - [`NIX_STATE_DIR`]{#env-NIX_STATE_DIR}\ Overrides the location of the Nix state directory (default `prefix/var/nix`). - - `NIX_CONF_DIR`\ + - [`NIX_CONF_DIR`]{#env-NIX_CONF_DIR}\ Overrides the location of the system Nix configuration directory (default `prefix/etc/nix`). - - `NIX_CONFIG`\ + - [`NIX_CONFIG`]{#env-NIX_CONFIG}\ Applies settings from Nix configuration from the environment. The content is treated as if it was read from a Nix configuration file. Settings are separated by the newline character. - - `NIX_USER_CONF_FILES`\ + - [`NIX_USER_CONF_FILES`]{#env-NIX_USER_CONF_FILES}\ Overrides the location of the user Nix configuration files to load from (defaults to the XDG spec locations). The variable is treated as a list separated by the `:` token. - - `TMPDIR`\ + - [`TMPDIR`]{#env-TMPDIR}\ Use the specified directory to store temporary files. In particular, this includes temporary build directories; these can take up substantial amounts of disk space. The default is `/tmp`. - - `NIX_REMOTE`\ + - [`NIX_REMOTE`]{#env-NIX_REMOTE}\ This variable should be set to `daemon` if you want to use the Nix daemon to execute Nix operations. This is necessary in [multi-user Nix installations](../installation/multi-user.md). If the Nix @@ -108,16 +108,16 @@ Most Nix commands interpret the following environment variables: should be set to `unix://path/to/socket`. Otherwise, it should be left unset. - - `NIX_SHOW_STATS`\ + - [`NIX_SHOW_STATS`]{#env-NIX_SHOW_STATS}\ If set to `1`, Nix will print some evaluation statistics, such as the number of values allocated. - - `NIX_COUNT_CALLS`\ + - [`NIX_COUNT_CALLS`]{#env-NIX_COUNT_CALLS}\ If set to `1`, Nix will print how often functions were called during Nix expression evaluation. This is useful for profiling your Nix expressions. - - `GC_INITIAL_HEAP_SIZE`\ + - [`GC_INITIAL_HEAP_SIZE`]{#env-GC_INITIAL_HEAP_SIZE}\ If Nix has been configured to use the Boehm garbage collector, this variable sets the initial size of the heap in bytes. It defaults to 384 MiB. Setting it to a low value reduces memory consumption, but diff --git a/doc/manual/src/command-ref/nix-build.md b/doc/manual/src/command-ref/nix-build.md index 43de7a6e6..aacb32a25 100644 --- a/doc/manual/src/command-ref/nix-build.md +++ b/doc/manual/src/command-ref/nix-build.md @@ -47,16 +47,16 @@ All options not listed here are passed to `nix-store --realise`, except for `--arg` and `--attr` / `-A` which are passed to `nix-instantiate`. - - `--no-out-link`\ + - [`--no-out-link`]{#opt-no-out-link}\ Do not create a symlink to the output path. Note that as a result the output does not become a root of the garbage collector, and so might be deleted by `nix-store --gc`. - - `--dry-run`\ + - [`--dry-run`]{#opt-dry-run}\ Show what store paths would be built or downloaded. - - `--out-link` / `-o` *outlink*\ + - [`--out-link`]{#opt-out-link} / `-o` *outlink*\ Change the name of the symlink to the output path created from `result` to *outlink*. diff --git a/doc/manual/src/command-ref/opt-common.md b/doc/manual/src/command-ref/opt-common.md index 7ee1a26bc..51d7de18a 100644 --- a/doc/manual/src/command-ref/opt-common.md +++ b/doc/manual/src/command-ref/opt-common.md @@ -2,13 +2,13 @@ Most Nix commands accept the following command-line options: - - `--help`\ + - [`--help`]{#opt-help}\ Prints out a summary of the command syntax and exits. - - `--version`\ + - [`--version`]{#opt-version}\ Prints out the Nix version number on standard output and exits. - - `--verbose` / `-v`\ + - [`--verbose`]{#opt-verbose} / `-v`\ Increases the level of verbosity of diagnostic messages printed on standard error. For each Nix operation, the information printed on standard output is well-defined; any diagnostic information is @@ -37,14 +37,14 @@ Most Nix commands accept the following command-line options: - 5\ “Vomit”: print vast amounts of debug information. - - `--quiet`\ + - [`--quiet`]{#opt-quiet}\ Decreases the level of verbosity of diagnostic messages printed on standard error. This is the inverse option to `-v` / `--verbose`. This option may be specified repeatedly. See the previous verbosity levels list. - - `--log-format` *format*\ + - [`--log-format`]{#opt-log-format} *format*\ This option can be used to change the output of the log format, with *format* being one of: @@ -66,14 +66,14 @@ Most Nix commands accept the following command-line options: - bar-with-logs\ Display the raw logs, with the progress bar at the bottom. - - `--no-build-output` / `-Q`\ + - [`--no-build-output`]{#opt-no-build-output} / `-Q`\ By default, output written by builders to standard output and standard error is echoed to the Nix command's standard error. This option suppresses this behaviour. Note that the builder's standard output and error are always written to a log file in `prefix/nix/var/log/nix`. - - `--max-jobs` / `-j` *number*\ + - [`--max-jobs`]{#opt-max-jobs} / `-j` *number*\ Sets the maximum number of build jobs that Nix will perform in parallel to the specified number. Specify `auto` to use the number of CPUs in the system. The default is specified by the `max-jobs` @@ -83,7 +83,7 @@ Most Nix commands accept the following command-line options: Setting it to `0` disallows building on the local machine, which is useful when you want builds to happen only on remote builders. - - `--cores`\ + - [`--cores`]{#opt-cores}\ Sets the value of the `NIX_BUILD_CORES` environment variable in the invocation of builders. Builders can use this variable at their discretion to control the maximum amount of parallelism. For @@ -94,18 +94,18 @@ Most Nix commands accept the following command-line options: means that the builder should use all available CPU cores in the system. - - `--max-silent-time`\ + - [`--max-silent-time`]{#opt-max-silent-time}\ Sets the maximum number of seconds that a builder can go without producing any data on standard output or standard error. The default is specified by the `max-silent-time` configuration setting. `0` means no time-out. - - `--timeout`\ + - [`--timeout`]{#opt-timeout}\ Sets the maximum number of seconds that a builder can run. The default is specified by the `timeout` configuration setting. `0` means no timeout. - - `--keep-going` / `-k`\ + - [`--keep-going`]{#opt-keep-going} / `-k`\ Keep going in case of failed builds, to the greatest extent possible. That is, if building an input of some derivation fails, Nix will still build the other inputs, but not the derivation @@ -113,13 +113,13 @@ Most Nix commands accept the following command-line options: for builds of substitutes), possibly killing builds in progress (in case of parallel or distributed builds). - - `--keep-failed` / `-K`\ + - [`--keep-failed`]{#opt-keep-failed} / `-K`\ Specifies that in case of a build failure, the temporary directory (usually in `/tmp`) in which the build takes place should not be deleted. The path of the build directory is printed as an informational message. - - `--fallback`\ + - [`--fallback`]{#opt-fallback}\ Whenever Nix attempts to build a derivation for which substitutes are known for each output path, but realising the output paths through the substitutes fails, fall back on building the derivation. @@ -134,12 +134,12 @@ Most Nix commands accept the following command-line options: failure in obtaining the substitutes to lead to a full build from source (with the related consumption of resources). - - `--readonly-mode`\ + - [`--readonly-mode`]{#opt-readonly-mode}\ When this option is used, no attempt is made to open the Nix database. Most Nix operations do need database access, so those operations will fail. - - `--arg` *name* *value*\ + - [`--arg`]{#opt-arg} *name* *value*\ This option is accepted by `nix-env`, `nix-instantiate`, `nix-shell` and `nix-build`. When evaluating Nix expressions, the expression evaluator will automatically try to call functions that @@ -170,13 +170,13 @@ Most Nix commands accept the following command-line options: since the argument is a Nix string literal, you have to escape the quotes.) - - `--argstr` *name* *value*\ + - [`--argstr`]{#opt-argstr} *name* *value*\ This option is like `--arg`, only the value is not a Nix expression but a string. So instead of `--arg system \"i686-linux\"` (the outer quotes are to keep the shell happy) you can say `--argstr system i686-linux`. - - `--attr` / `-A` *attrPath*\ + - [`--attr`]{#opt-attr} / `-A` *attrPath*\ Select an attribute from the top-level Nix expression being evaluated. (`nix-env`, `nix-instantiate`, `nix-build` and `nix-shell` only.) The *attribute path* *attrPath* is a sequence @@ -191,7 +191,7 @@ Most Nix commands accept the following command-line options: attribute of the fourth element of the array in the `foo` attribute of the top-level expression. - - `--expr` / `-E`\ + - [`--expr`]{#opt-expr} / `-E`\ Interpret the command line arguments as a list of Nix expressions to be parsed and evaluated, rather than as a list of file names of Nix expressions. (`nix-instantiate`, `nix-build` and `nix-shell` only.) @@ -202,17 +202,17 @@ Most Nix commands accept the following command-line options: use, give your expression to the `nix-shell -p` convenience flag instead. - - `-I` *path*\ + - [`-I`]{#opt-I} *path*\ Add a path to the Nix expression search path. This option may be given multiple times. See the `NIX_PATH` environment variable for information on the semantics of the Nix search path. Paths added through `-I` take precedence over `NIX_PATH`. - - `--option` *name* *value*\ + - [`--option`]{#opt-option} *name* *value*\ Set the Nix configuration option *name* to *value*. This overrides settings in the Nix configuration file (see nix.conf5). - - `--repair`\ + - [`--repair`]{#opt-repair}\ Fix corrupted or missing store paths by redownloading or rebuilding them. Note that this is slow because it requires computing a cryptographic hash of the contents of every path in the closure of diff --git a/doc/manual/src/expressions/advanced-attributes.md b/doc/manual/src/expressions/advanced-attributes.md index 000595815..2e7e80ed0 100644 --- a/doc/manual/src/expressions/advanced-attributes.md +++ b/doc/manual/src/expressions/advanced-attributes.md @@ -2,7 +2,7 @@ Derivations can declare some infrequently used optional attributes. - - `allowedReferences`\ + - [`allowedReferences`]{#adv-attr-allowedReferences}\ The optional attribute `allowedReferences` specifies a list of legal references (dependencies) of the output of the builder. For example, @@ -17,7 +17,7 @@ Derivations can declare some infrequently used optional attributes. booting Linux don’t have accidental dependencies on other paths in the Nix store. - - `allowedRequisites`\ + - [`allowedRequisites`]{#adv-attr-allowedRequisites}\ This attribute is similar to `allowedReferences`, but it specifies the legal requisites of the whole closure, so all the dependencies recursively. For example, @@ -30,7 +30,7 @@ Derivations can declare some infrequently used optional attributes. runtime dependency than `foobar`, and in addition it enforces that `foobar` itself doesn't introduce any other dependency itself. - - `disallowedReferences`\ + - [`disallowedReferences`]{#adv-attr-disallowedReferences}\ The optional attribute `disallowedReferences` specifies a list of illegal references (dependencies) of the output of the builder. For example, @@ -42,7 +42,7 @@ Derivations can declare some infrequently used optional attributes. enforces that the output of a derivation cannot have a direct runtime dependencies on the derivation `foo`. - - `disallowedRequisites`\ + - [`disallowedRequisites`]{#adv-attr-disallowedRequisites}\ This attribute is similar to `disallowedReferences`, but it specifies illegal requisites for the whole closure, so all the dependencies recursively. For example, @@ -55,7 +55,7 @@ Derivations can declare some infrequently used optional attributes. dependency on `foobar` or any other derivation depending recursively on `foobar`. - - `exportReferencesGraph`\ + - [`exportReferencesGraph`]{#adv-attr-exportReferencesGraph}\ This attribute allows builders access to the references graph of their inputs. The attribute is a list of inputs in the Nix store whose references graph the builder needs to know. The value of @@ -84,7 +84,7 @@ Derivations can declare some infrequently used optional attributes. with a Nix store containing the closure of a bootable NixOS configuration). - - `impureEnvVars`\ + - [`impureEnvVars`]{#adv-attr-impureEnvVars}\ This attribute allows you to specify a list of environment variables that should be passed from the environment of the calling user to the builder. Usually, the environment is cleared completely when the @@ -112,7 +112,7 @@ Derivations can declare some infrequently used optional attributes. > environmental variables come from the environment of the > `nix-build`. - - `outputHash`; `outputHashAlgo`; `outputHashMode`\ + - [`outputHash`]{#adv-attr-outputHash}; [`outputHashAlgo`]{#adv-attr-outputHashAlgo}; [`outputHashMode`]{#adv-attr-outputHashMode}\ These attributes declare that the derivation is a so-called *fixed-output derivation*, which means that a cryptographic hash of the output is already known in advance. When the build of a @@ -208,7 +208,7 @@ Derivations can declare some infrequently used optional attributes. [`nix-hash` command](../command-ref/nix-hash.md) for information about converting to and from base-32 notation.) - - `__contentAddressed` + - [`__contentAddressed`]{#adv-attr-__contentAddressed} If this **experimental** attribute is set to true, then the derivation outputs will be stored in a content-addressed location rather than the traditional input-addressed one. @@ -216,7 +216,7 @@ Derivations can declare some infrequently used optional attributes. Setting this attribute also requires setting `outputHashMode` and `outputHashAlgo` like for *fixed-output derivations* (see above). - - `passAsFile`\ + - [`passAsFile`]{#adv-attr-passAsFile}\ A list of names of attributes that should be passed via files rather than environment variables. For example, if you have @@ -234,7 +234,7 @@ Derivations can declare some infrequently used optional attributes. builder, since most operating systems impose a limit on the size of the environment (typically, a few hundred kilobyte). - - `preferLocalBuild`\ + - [`preferLocalBuild`]{#adv-attr-preferLocalBuild}\ If this attribute is set to `true` and [distributed building is enabled](../advanced-topics/distributed-builds.md), then, if possible, the derivation will be built locally instead of forwarded @@ -242,7 +242,7 @@ Derivations can declare some infrequently used optional attributes. where the cost of doing a download or remote build would exceed the cost of building locally. - - `allowSubstitutes`\ + - [`allowSubstitutes`]{#adv-attr-allowSubstitutes}\ If this attribute is set to `false`, then Nix will always build this derivation; it will not try to substitute its outputs. This is useful for very trivial derivations (such as `writeText` in Nixpkgs) diff --git a/doc/manual/src/expressions/builtin-constants.md b/doc/manual/src/expressions/builtin-constants.md index 1404289e5..78d066a82 100644 --- a/doc/manual/src/expressions/builtin-constants.md +++ b/doc/manual/src/expressions/builtin-constants.md @@ -14,7 +14,7 @@ Here are the constants built into the Nix expression evaluator: This allows a Nix expression to fall back gracefully on older Nix installations that don’t have the desired built-in function. - - `builtins.currentSystem`\ + - [`builtins.currentSystem`]{#builtins-currentSystem}\ The built-in value `currentSystem` evaluates to the Nix platform identifier for the Nix installation on which the expression is being evaluated, such as `"i686-linux"` or `"x86_64-darwin"`. diff --git a/doc/manual/src/glossary.md b/doc/manual/src/glossary.md index 71ff13275..3448b971b 100644 --- a/doc/manual/src/glossary.md +++ b/doc/manual/src/glossary.md @@ -1,48 +1,48 @@ # Glossary - - derivation\ + - [derivation]{#gloss-derivation}\ A description of a build action. The result of a derivation is a store object. Derivations are typically specified in Nix expressions using the [`derivation` primitive](expressions/derivations.md). These are translated into low-level *store derivations* (implicitly by `nix-env` and `nix-build`, or explicitly by `nix-instantiate`). - - store\ + - [store]{#gloss-store}\ The location in the file system where store objects live. Typically `/nix/store`. - - store path\ + - [store path]{#gloss-store-path}\ The location in the file system of a store object, i.e., an immediate child of the Nix store directory. - - store object\ + - [store object]{#gloss-store-object}\ A file that is an immediate child of the Nix store directory. These can be regular files, but also entire directory trees. Store objects can be sources (objects copied from outside of the store), derivation outputs (objects produced by running a build action), or derivations (files describing a build action). - - substitute\ + - [substitute]{#gloss-substitute}\ A substitute is a command invocation stored in the Nix database that describes how to build a store object, bypassing the normal build mechanism (i.e., derivations). Typically, the substitute builds the store object by downloading a pre-built version of the store object from some server. - - purity\ + - [purity]{#gloss-purity}\ The assumption that equal Nix derivations when run always produce the same output. This cannot be guaranteed in general (e.g., a builder can rely on external inputs such as the network or the system time) but the Nix model assumes it. - - Nix expression\ + - [Nix expression]{#gloss-nix-expression}\ A high-level description of software packages and compositions thereof. Deploying software using Nix entails writing Nix expressions for your packages. Nix expressions are translated to derivations that are stored in the Nix store. These derivations can then be built. - - reference\ + - [reference]{#gloss-reference}\ A store path `P` is said to have a reference to a store path `Q` if the store object at `P` contains the path `Q` somewhere. The *references* of a store path are the set of store paths to which it @@ -52,11 +52,11 @@ output paths), whereas an output path only references other output paths. - - reachable\ + - [reachable]{#gloss-reachable}\ A store path `Q` is reachable from another store path `P` if `Q` is in the *closure* of the *references* relation. - - closure\ + - [closure]{#gloss-closure}\ The closure of a store path is the set of store paths that are directly or indirectly “reachable” from that store path; that is, it’s the closure of the path under the *references* relation. For @@ -71,34 +71,34 @@ to path `Q`, then `Q` is in the closure of `P`. Further, if `Q` references `R` then `R` is also in the closure of `P`. - - output path\ + - [output path]{#gloss-output-path}\ A store path produced by a derivation. - - deriver\ + - [deriver]{#gloss-deriver}\ The deriver of an *output path* is the store derivation that built it. - - validity\ + - [validity]{#gloss-validity}\ A store path is considered *valid* if it exists in the file system, is listed in the Nix database as being valid, and if all paths in its closure are also valid. - - user environment\ + - [user environment]{#gloss-user-env}\ An automatically generated store object that consists of a set of symlinks to “active” applications, i.e., other store paths. These are generated automatically by [`nix-env`](command-ref/nix-env.md). See *profiles*. - - profile\ + - [profile]{#gloss-profile}\ A symlink to the current *user environment* of a user, e.g., `/nix/var/nix/profiles/default`. - - NAR\ + - [NAR]{#gloss-nar}\ A *N*ix *AR*chive. This is a serialisation of a path in the Nix store. It can contain regular files, directories and symbolic links. NARs are generated and unpacked using `nix-store --dump` and `nix-store --restore`. - - `∅` \ + - [`∅`]{#gloss-emtpy-set}\ The empty set symbol. In the context of profile history, this denotes a package is not present in a particular version of the profile. - - `ε` \ + - [`ε`]{#gloss-epsilon}\ The epsilon symbol. In the context of a package, this means the version is empty. More precisely, the derivation does not have a version attribute. From a793863b97efde14189b031326e48ac0f448fafc Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Wed, 25 May 2022 13:53:07 +0200 Subject: [PATCH 07/18] doc: Manually insert some anchors --- doc/manual/src/advanced-topics/diff-hook.md | 2 +- doc/manual/src/command-ref/nix-store.md | 2 +- doc/manual/src/expressions/derivations.md | 2 +- doc/manual/src/installation/installing-binary.md | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/manual/src/advanced-topics/diff-hook.md b/doc/manual/src/advanced-topics/diff-hook.md index 7a2622b3d..161e64b2a 100644 --- a/doc/manual/src/advanced-topics/diff-hook.md +++ b/doc/manual/src/advanced-topics/diff-hook.md @@ -101,7 +101,7 @@ In particular, notice the `/nix/store/krpqk0l9ib0ibi1d2w52z293zw455cap-unstable.check` output. Nix has copied the build results to that directory where you can examine it. -> **Note** +> []{#check-dirs-are-unregistered} **Note** > > Check paths are not protected against garbage collection, and this > path will be deleted on the next garbage collection. diff --git a/doc/manual/src/command-ref/nix-store.md b/doc/manual/src/command-ref/nix-store.md index 7db9f0c1c..dc8faba68 100644 --- a/doc/manual/src/command-ref/nix-store.md +++ b/doc/manual/src/command-ref/nix-store.md @@ -22,7 +22,7 @@ This section lists the options that are common to all operations. These options are allowed for every subcommand, though they may not always have an effect. - - `--add-root` *path*\ + - [`--add-root`]{#opt-add-root} *path*\ Causes the result of a realisation (`--realise` and `--force-realise`) to be registered as a root of the garbage collector. *path* will be created as a symlink to the resulting diff --git a/doc/manual/src/expressions/derivations.md b/doc/manual/src/expressions/derivations.md index d26a33b7f..3391ec0d8 100644 --- a/doc/manual/src/expressions/derivations.md +++ b/doc/manual/src/expressions/derivations.md @@ -4,7 +4,7 @@ The most important built-in function is `derivation`, which is used to describe a single derivation (a build action). It takes as input a set, the attributes of which specify the inputs of the build. - - There must be an attribute named `system` whose value must be a + - There must be an attribute named [`system`]{#attr-system} whose value must be a string specifying a Nix system type, such as `"i686-linux"` or `"x86_64-darwin"`. (To figure out your system type, run `nix -vv --version`.) The build can only be performed on a machine and diff --git a/doc/manual/src/installation/installing-binary.md b/doc/manual/src/installation/installing-binary.md index e5fb50088..9fb9c80c3 100644 --- a/doc/manual/src/installation/installing-binary.md +++ b/doc/manual/src/installation/installing-binary.md @@ -186,7 +186,8 @@ and `/etc/zshrc` which you may remove. > read-only root will prevent you from manually deleting the empty `/nix` > mountpoint. -# macOS Installation +# macOS Installation +[]{#sect-macos-installation-change-store-prefix}[]{#sect-macos-installation-encrypted-volume}[]{#sect-macos-installation-symlink}[]{#sect-macos-installation-recommended-notes} We believe we have ironed out how to cleanly support the read-only root From 26d1877d6ec7118180be14fc39b471fa53bc0caa Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Wed, 25 May 2022 08:07:02 +0200 Subject: [PATCH 08/18] doc: Add redirects for the DocBook manual There are still many links to the old manual on the web and having them end up on the Introduction page is a bad user experience. --- doc/manual/book.toml | 1 + doc/manual/redirects.js | 337 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 338 insertions(+) create mode 100644 doc/manual/redirects.js diff --git a/doc/manual/book.toml b/doc/manual/book.toml index ff6b79c07..5f78a7614 100644 --- a/doc/manual/book.toml +++ b/doc/manual/book.toml @@ -1,5 +1,6 @@ [output.html] additional-css = ["custom.css"] +additional-js = ["redirects.js"] [preprocessor.anchors] renderers = ["html"] diff --git a/doc/manual/redirects.js b/doc/manual/redirects.js new file mode 100644 index 000000000..19f928c7e --- /dev/null +++ b/doc/manual/redirects.js @@ -0,0 +1,337 @@ +// Redirects from old DocBook manual. +var redirects = { + "#part-advanced-topics": "advanced-topics/advanced-topics.html", + "#chap-tuning-cores-and-jobs": "advanced-topics/cores-vs-jobs.html", + "#chap-diff-hook": "advanced-topics/diff-hook.html", + "#check-dirs-are-unregistered": "advanced-topics/diff-hook.html#check-dirs-are-unregistered", + "#chap-distributed-builds": "advanced-topics/distributed-builds.html", + "#chap-post-build-hook": "advanced-topics/post-build-hook.html", + "#chap-post-build-hook-caveats": "advanced-topics/post-build-hook.html#implementation-caveats", + "#part-command-ref": "command-ref/command-ref.html", + "#conf-allow-import-from-derivation": "command-ref/conf-file.html#conf-allow-import-from-derivation", + "#conf-allow-new-privileges": "command-ref/conf-file.html#conf-allow-new-privileges", + "#conf-allowed-uris": "command-ref/conf-file.html#conf-allowed-uris", + "#conf-allowed-users": "command-ref/conf-file.html#conf-allowed-users", + "#conf-auto-optimise-store": "command-ref/conf-file.html#conf-auto-optimise-store", + "#conf-binary-cache-public-keys": "command-ref/conf-file.html#conf-binary-cache-public-keys", + "#conf-binary-caches": "command-ref/conf-file.html#conf-binary-caches", + "#conf-build-compress-log": "command-ref/conf-file.html#conf-build-compress-log", + "#conf-build-cores": "command-ref/conf-file.html#conf-build-cores", + "#conf-build-extra-chroot-dirs": "command-ref/conf-file.html#conf-build-extra-chroot-dirs", + "#conf-build-extra-sandbox-paths": "command-ref/conf-file.html#conf-build-extra-sandbox-paths", + "#conf-build-fallback": "command-ref/conf-file.html#conf-build-fallback", + "#conf-build-max-jobs": "command-ref/conf-file.html#conf-build-max-jobs", + "#conf-build-max-log-size": "command-ref/conf-file.html#conf-build-max-log-size", + "#conf-build-max-silent-time": "command-ref/conf-file.html#conf-build-max-silent-time", + "#conf-build-repeat": "command-ref/conf-file.html#conf-build-repeat", + "#conf-build-timeout": "command-ref/conf-file.html#conf-build-timeout", + "#conf-build-use-chroot": "command-ref/conf-file.html#conf-build-use-chroot", + "#conf-build-use-sandbox": "command-ref/conf-file.html#conf-build-use-sandbox", + "#conf-build-use-substitutes": "command-ref/conf-file.html#conf-build-use-substitutes", + "#conf-build-users-group": "command-ref/conf-file.html#conf-build-users-group", + "#conf-builders": "command-ref/conf-file.html#conf-builders", + "#conf-builders-use-substitutes": "command-ref/conf-file.html#conf-builders-use-substitutes", + "#conf-compress-build-log": "command-ref/conf-file.html#conf-compress-build-log", + "#conf-connect-timeout": "command-ref/conf-file.html#conf-connect-timeout", + "#conf-cores": "command-ref/conf-file.html#conf-cores", + "#conf-diff-hook": "command-ref/conf-file.html#conf-diff-hook", + "#conf-enforce-determinism": "command-ref/conf-file.html#conf-enforce-determinism", + "#conf-env-keep-derivations": "command-ref/conf-file.html#conf-env-keep-derivations", + "#conf-extra-binary-caches": "command-ref/conf-file.html#conf-extra-binary-caches", + "#conf-extra-platforms": "command-ref/conf-file.html#conf-extra-platforms", + "#conf-extra-sandbox-paths": "command-ref/conf-file.html#conf-extra-sandbox-paths", + "#conf-extra-substituters": "command-ref/conf-file.html#conf-extra-substituters", + "#conf-fallback": "command-ref/conf-file.html#conf-fallback", + "#conf-fsync-metadata": "command-ref/conf-file.html#conf-fsync-metadata", + "#conf-gc-keep-derivations": "command-ref/conf-file.html#conf-gc-keep-derivations", + "#conf-gc-keep-outputs": "command-ref/conf-file.html#conf-gc-keep-outputs", + "#conf-hashed-mirrors": "command-ref/conf-file.html#conf-hashed-mirrors", + "#conf-http-connections": "command-ref/conf-file.html#conf-http-connections", + "#conf-keep-build-log": "command-ref/conf-file.html#conf-keep-build-log", + "#conf-keep-derivations": "command-ref/conf-file.html#conf-keep-derivations", + "#conf-keep-env-derivations": "command-ref/conf-file.html#conf-keep-env-derivations", + "#conf-keep-outputs": "command-ref/conf-file.html#conf-keep-outputs", + "#conf-max-build-log-size": "command-ref/conf-file.html#conf-max-build-log-size", + "#conf-max-free": "command-ref/conf-file.html#conf-max-free", + "#conf-max-jobs": "command-ref/conf-file.html#conf-max-jobs", + "#conf-max-silent-time": "command-ref/conf-file.html#conf-max-silent-time", + "#conf-min-free": "command-ref/conf-file.html#conf-min-free", + "#conf-narinfo-cache-negative-ttl": "command-ref/conf-file.html#conf-narinfo-cache-negative-ttl", + "#conf-narinfo-cache-positive-ttl": "command-ref/conf-file.html#conf-narinfo-cache-positive-ttl", + "#conf-netrc-file": "command-ref/conf-file.html#conf-netrc-file", + "#conf-plugin-files": "command-ref/conf-file.html#conf-plugin-files", + "#conf-post-build-hook": "command-ref/conf-file.html#conf-post-build-hook", + "#conf-pre-build-hook": "command-ref/conf-file.html#conf-pre-build-hook", + "#conf-repeat": "command-ref/conf-file.html#conf-repeat", + "#conf-require-sigs": "command-ref/conf-file.html#conf-require-sigs", + "#conf-restrict-eval": "command-ref/conf-file.html#conf-restrict-eval", + "#conf-run-diff-hook": "command-ref/conf-file.html#conf-run-diff-hook", + "#conf-sandbox": "command-ref/conf-file.html#conf-sandbox", + "#conf-sandbox-dev-shm-size": "command-ref/conf-file.html#conf-sandbox-dev-shm-size", + "#conf-sandbox-paths": "command-ref/conf-file.html#conf-sandbox-paths", + "#conf-secret-key-files": "command-ref/conf-file.html#conf-secret-key-files", + "#conf-show-trace": "command-ref/conf-file.html#conf-show-trace", + "#conf-stalled-download-timeout": "command-ref/conf-file.html#conf-stalled-download-timeout", + "#conf-substitute": "command-ref/conf-file.html#conf-substitute", + "#conf-substituters": "command-ref/conf-file.html#conf-substituters", + "#conf-system": "command-ref/conf-file.html#conf-system", + "#conf-system-features": "command-ref/conf-file.html#conf-system-features", + "#conf-tarball-ttl": "command-ref/conf-file.html#conf-tarball-ttl", + "#conf-timeout": "command-ref/conf-file.html#conf-timeout", + "#conf-trace-function-calls": "command-ref/conf-file.html#conf-trace-function-calls", + "#conf-trusted-binary-caches": "command-ref/conf-file.html#conf-trusted-binary-caches", + "#conf-trusted-public-keys": "command-ref/conf-file.html#conf-trusted-public-keys", + "#conf-trusted-substituters": "command-ref/conf-file.html#conf-trusted-substituters", + "#conf-trusted-users": "command-ref/conf-file.html#conf-trusted-users", + "#extra-sandbox-paths": "command-ref/conf-file.html#extra-sandbox-paths", + "#sec-conf-file": "command-ref/conf-file.html", + "#env-NIX_PATH": "command-ref/env-common.html#env-NIX_PATH", + "#env-common": "command-ref/env-common.html", + "#envar-remote": "command-ref/env-common.html#env-NIX_REMOTE", + "#sec-common-env": "command-ref/env-common.html", + "#ch-files": "command-ref/files.html", + "#ch-main-commands": "command-ref/main-commands.html", + "#opt-out-link": "command-ref/nix-build.html#opt-out-link", + "#sec-nix-build": "command-ref/nix-build.html", + "#sec-nix-channel": "command-ref/nix-channel.html", + "#sec-nix-collect-garbage": "command-ref/nix-collect-garbage.html", + "#sec-nix-copy-closure": "command-ref/nix-copy-closure.html", + "#sec-nix-daemon": "command-ref/nix-daemon.html", + "#refsec-nix-env-install-examples": "command-ref/nix-env.html#examples", + "#rsec-nix-env-install": "command-ref/nix-env.html#operation---install", + "#rsec-nix-env-set": "command-ref/nix-env.html#operation---set", + "#rsec-nix-env-set-flag": "command-ref/nix-env.html#operation---set-flag", + "#rsec-nix-env-upgrade": "command-ref/nix-env.html#operation---upgrade", + "#sec-nix-env": "command-ref/nix-env.html", + "#ssec-version-comparisons": "command-ref/nix-env.html#versions", + "#sec-nix-hash": "command-ref/nix-hash.html", + "#sec-nix-instantiate": "command-ref/nix-instantiate.html", + "#sec-nix-prefetch-url": "command-ref/nix-prefetch-url.html", + "#sec-nix-shell": "command-ref/nix-shell.html", + "#ssec-nix-shell-shebang": "command-ref/nix-shell.html#use-as-a--interpreter", + "#nixref-queries": "command-ref/nix-store.html#queries", + "#opt-add-root": "command-ref/nix-store.html#opt-add-root", + "#refsec-nix-store-dump": "command-ref/nix-store.html#operation---dump", + "#refsec-nix-store-export": "command-ref/nix-store.html#operation---export", + "#refsec-nix-store-import": "command-ref/nix-store.html#operation---import", + "#refsec-nix-store-query": "command-ref/nix-store.html#operation---query", + "#refsec-nix-store-verify": "command-ref/nix-store.html#operation---verify", + "#rsec-nix-store-gc": "command-ref/nix-store.html#operation---gc", + "#rsec-nix-store-generate-binary-cache-key": "command-ref/nix-store.html#operation---generate-binary-cache-key", + "#rsec-nix-store-realise": "command-ref/nix-store.html#operation---realise", + "#rsec-nix-store-serve": "command-ref/nix-store.html#operation---serve", + "#sec-nix-store": "command-ref/nix-store.html", + "#opt-I": "command-ref/opt-common.html#opt-I", + "#opt-attr": "command-ref/opt-common.html#opt-attr", + "#opt-common": "command-ref/opt-common.html", + "#opt-cores": "command-ref/opt-common.html#opt-cores", + "#opt-log-format": "command-ref/opt-common.html#opt-log-format", + "#opt-max-jobs": "command-ref/opt-common.html#opt-max-jobs", + "#opt-max-silent-time": "command-ref/opt-common.html#opt-max-silent-time", + "#opt-timeout": "command-ref/opt-common.html#opt-timeout", + "#sec-common-options": "command-ref/opt-common.html", + "#ch-utilities": "command-ref/utilities.html", + "#chap-hacking": "contributing/hacking.html", + "#adv-attr-allowSubstitutes": "expressions/advanced-attributes.html#adv-attr-allowSubstitutes", + "#adv-attr-allowedReferences": "expressions/advanced-attributes.html#adv-attr-allowedReferences", + "#adv-attr-allowedRequisites": "expressions/advanced-attributes.html#adv-attr-allowedRequisites", + "#adv-attr-disallowedReferences": "expressions/advanced-attributes.html#adv-attr-disallowedReferences", + "#adv-attr-disallowedRequisites": "expressions/advanced-attributes.html#adv-attr-disallowedRequisites", + "#adv-attr-exportReferencesGraph": "expressions/advanced-attributes.html#adv-attr-exportReferencesGraph", + "#adv-attr-impureEnvVars": "expressions/advanced-attributes.html#adv-attr-impureEnvVars", + "#adv-attr-outputHash": "expressions/advanced-attributes.html#adv-attr-outputHash", + "#adv-attr-outputHashAlgo": "expressions/advanced-attributes.html#adv-attr-outputHashAlgo", + "#adv-attr-outputHashMode": "expressions/advanced-attributes.html#adv-attr-outputHashMode", + "#adv-attr-passAsFile": "expressions/advanced-attributes.html#adv-attr-passAsFile", + "#adv-attr-preferLocalBuild": "expressions/advanced-attributes.html#adv-attr-preferLocalBuild", + "#fixed-output-drvs": "expressions/advanced-attributes.html#adv-attr-outputHash", + "#sec-advanced-attributes": "expressions/advanced-attributes.html", + "#sec-arguments": "expressions/arguments-variables.html", + "#sec-build-script": "expressions/build-script.html", + "#builtin-abort": "expressions/builtins.html#builtins-abort", + "#builtin-add": "expressions/builtins.html#builtins-add", + "#builtin-all": "expressions/builtins.html#builtins-all", + "#builtin-any": "expressions/builtins.html#builtins-any", + "#builtin-attrNames": "expressions/builtins.html#builtins-attrNames", + "#builtin-attrValues": "expressions/builtins.html#builtins-attrValues", + "#builtin-baseNameOf": "expressions/builtins.html#builtins-baseNameOf", + "#builtin-bitAnd": "expressions/builtins.html#builtins-bitAnd", + "#builtin-bitOr": "expressions/builtins.html#builtins-bitOr", + "#builtin-bitXor": "expressions/builtins.html#builtins-bitXor", + "#builtin-builtins": "expressions/builtins.html#builtins-builtins", + "#builtin-compareVersions": "expressions/builtins.html#builtins-compareVersions", + "#builtin-concatLists": "expressions/builtins.html#builtins-concatLists", + "#builtin-concatStringsSep": "expressions/builtins.html#builtins-concatStringsSep", + "#builtin-currentSystem": "expressions/builtins.html#builtins-currentSystem", + "#builtin-deepSeq": "expressions/builtins.html#builtins-deepSeq", + "#builtin-derivation": "expressions/builtins.html#builtins-derivation", + "#builtin-dirOf": "expressions/builtins.html#builtins-dirOf", + "#builtin-div": "expressions/builtins.html#builtins-div", + "#builtin-elem": "expressions/builtins.html#builtins-elem", + "#builtin-elemAt": "expressions/builtins.html#builtins-elemAt", + "#builtin-fetchGit": "expressions/builtins.html#builtins-fetchGit", + "#builtin-fetchTarball": "expressions/builtins.html#builtins-fetchTarball", + "#builtin-fetchurl": "expressions/builtins.html#builtins-fetchurl", + "#builtin-filterSource": "expressions/builtins.html#builtins-filterSource", + "#builtin-foldl-prime": "expressions/builtins.html#builtins-foldl-prime", + "#builtin-fromJSON": "expressions/builtins.html#builtins-fromJSON", + "#builtin-functionArgs": "expressions/builtins.html#builtins-functionArgs", + "#builtin-genList": "expressions/builtins.html#builtins-genList", + "#builtin-getAttr": "expressions/builtins.html#builtins-getAttr", + "#builtin-getEnv": "expressions/builtins.html#builtins-getEnv", + "#builtin-hasAttr": "expressions/builtins.html#builtins-hasAttr", + "#builtin-hashFile": "expressions/builtins.html#builtins-hashFile", + "#builtin-hashString": "expressions/builtins.html#builtins-hashString", + "#builtin-head": "expressions/builtins.html#builtins-head", + "#builtin-import": "expressions/builtins.html#builtins-import", + "#builtin-intersectAttrs": "expressions/builtins.html#builtins-intersectAttrs", + "#builtin-isAttrs": "expressions/builtins.html#builtins-isAttrs", + "#builtin-isBool": "expressions/builtins.html#builtins-isBool", + "#builtin-isFloat": "expressions/builtins.html#builtins-isFloat", + "#builtin-isFunction": "expressions/builtins.html#builtins-isFunction", + "#builtin-isInt": "expressions/builtins.html#builtins-isInt", + "#builtin-isList": "expressions/builtins.html#builtins-isList", + "#builtin-isNull": "expressions/builtins.html#builtins-isNull", + "#builtin-isString": "expressions/builtins.html#builtins-isString", + "#builtin-length": "expressions/builtins.html#builtins-length", + "#builtin-lessThan": "expressions/builtins.html#builtins-lessThan", + "#builtin-listToAttrs": "expressions/builtins.html#builtins-listToAttrs", + "#builtin-map": "expressions/builtins.html#builtins-map", + "#builtin-match": "expressions/builtins.html#builtins-match", + "#builtin-mul": "expressions/builtins.html#builtins-mul", + "#builtin-parseDrvName": "expressions/builtins.html#builtins-parseDrvName", + "#builtin-path": "expressions/builtins.html#builtins-path", + "#builtin-pathExists": "expressions/builtins.html#builtins-pathExists", + "#builtin-placeholder": "expressions/builtins.html#builtins-placeholder", + "#builtin-readDir": "expressions/builtins.html#builtins-readDir", + "#builtin-readFile": "expressions/builtins.html#builtins-readFile", + "#builtin-removeAttrs": "expressions/builtins.html#builtins-removeAttrs", + "#builtin-replaceStrings": "expressions/builtins.html#builtins-replaceStrings", + "#builtin-seq": "expressions/builtins.html#builtins-seq", + "#builtin-sort": "expressions/builtins.html#builtins-sort", + "#builtin-split": "expressions/builtins.html#builtins-split", + "#builtin-splitVersion": "expressions/builtins.html#builtins-splitVersion", + "#builtin-stringLength": "expressions/builtins.html#builtins-stringLength", + "#builtin-sub": "expressions/builtins.html#builtins-sub", + "#builtin-substring": "expressions/builtins.html#builtins-substring", + "#builtin-tail": "expressions/builtins.html#builtins-tail", + "#builtin-throw": "expressions/builtins.html#builtins-throw", + "#builtin-toFile": "expressions/builtins.html#builtins-toFile", + "#builtin-toJSON": "expressions/builtins.html#builtins-toJSON", + "#builtin-toPath": "expressions/builtins.html#builtins-toPath", + "#builtin-toString": "expressions/builtins.html#builtins-toString", + "#builtin-toXML": "expressions/builtins.html#builtins-toXML", + "#builtin-trace": "expressions/builtins.html#builtins-trace", + "#builtin-tryEval": "expressions/builtins.html#builtins-tryEval", + "#builtin-typeOf": "expressions/builtins.html#builtins-typeOf", + "#ssec-builtins": "expressions/builtins.html", + "#attr-system": "expressions/derivations.html#attr-system", + "#ssec-derivation": "expressions/derivations.html", + "#ch-expression-language": "expressions/expression-language.html", + "#sec-expression-syntax": "expressions/expression-syntax.html", + "#sec-generic-builder": "expressions/generic-builder.html", + "#sec-constructs": "expressions/language-constructs.html", + "#sect-let-expressions": "expressions/language-constructs.html#let-expressions", + "#ss-functions": "expressions/language-constructs.html#functions", + "#sec-language-operators": "expressions/language-operators.html", + "#table-operators": "expressions/language-operators.html", + "#ssec-values": "expressions/language-values.html", + "#sec-building-simple": "expressions/simple-building-testing.html", + "#ch-simple-expression": "expressions/simple-expression.html", + "#chap-writing-nix-expressions": "expressions/writing-nix-expressions.html", + "#gloss-closure": "glossary.html#gloss-closure", + "#gloss-derivation": "glossary.html#gloss-derivation", + "#gloss-deriver": "glossary.html#gloss-deriver", + "#gloss-nar": "glossary.html#gloss-nar", + "#gloss-output-path": "glossary.html#gloss-output-path", + "#gloss-profile": "glossary.html#gloss-profile", + "#gloss-reachable": "glossary.html#gloss-reachable", + "#gloss-reference": "glossary.html#gloss-reference", + "#gloss-substitute": "glossary.html#gloss-substitute", + "#gloss-user-env": "glossary.html#gloss-user-env", + "#gloss-validity": "glossary.html#gloss-validity", + "#part-glossary": "glossary.html", + "#sec-building-source": "installation/building-source.html", + "#ch-env-variables": "installation/env-variables.html", + "#sec-installer-proxy-settings": "installation/env-variables.html#proxy-environment-variables", + "#sec-nix-ssl-cert-file": "installation/env-variables.html#nix_ssl_cert_file", + "#sec-nix-ssl-cert-file-with-nix-daemon-and-macos": "installation/env-variables.html#nix_ssl_cert_file-with-macos-and-the-nix-daemon", + "#chap-installation": "installation/installation.html", + "#ch-installing-binary": "installation/installing-binary.html", + "#sect-macos-installation": "installation/installing-binary.html#macos-installation", + "#sect-macos-installation-change-store-prefix": "installation/installing-binary.html#macos-installation", + "#sect-macos-installation-encrypted-volume": "installation/installing-binary.html#macos-installation", + "#sect-macos-installation-recommended-notes": "installation/installing-binary.html#macos-installation", + "#sect-macos-installation-symlink": "installation/installing-binary.html#macos-installation", + "#sect-multi-user-installation": "installation/installing-binary.html#multi-user-installation", + "#sect-nix-install-binary-tarball": "installation/installing-binary.html#installing-from-a-binary-tarball", + "#sect-nix-install-pinned-version-url": "installation/installing-binary.html#installing-a-pinned-nix-version-from-a-url", + "#sect-single-user-installation": "installation/installing-binary.html#single-user-installation", + "#ch-installing-source": "installation/installing-source.html", + "#ssec-multi-user": "installation/multi-user.html", + "#ch-nix-security": "installation/nix-security.html", + "#sec-obtaining-source": "installation/obtaining-source.html", + "#sec-prerequisites-source": "installation/prerequisites-source.html", + "#sec-single-user": "installation/single-user.html", + "#ch-supported-platforms": "installation/supported-platforms.html", + "#ch-upgrading-nix": "installation/upgrading.html", + "#ch-about-nix": "introduction.html", + "#chap-introduction": "introduction.html", + "#ch-basic-package-mgmt": "package-management/basic-package-mgmt.html", + "#ssec-binary-cache-substituter": "package-management/binary-cache-substituter.html", + "#sec-channels": "package-management/channels.html", + "#ssec-copy-closure": "package-management/copy-closure.html", + "#sec-garbage-collection": "package-management/garbage-collection.html", + "#ssec-gc-roots": "package-management/garbage-collector-roots.html", + "#chap-package-management": "package-management/package-management.html", + "#sec-profiles": "package-management/profiles.html", + "#ssec-s3-substituter": "package-management/s3-substituter.html", + "#ssec-s3-substituter-anonymous-reads": "package-management/s3-substituter.html#anonymous-reads-to-your-s3-compatible-binary-cache", + "#ssec-s3-substituter-authenticated-reads": "package-management/s3-substituter.html#authenticated-reads-to-your-s3-binary-cache", + "#ssec-s3-substituter-authenticated-writes": "package-management/s3-substituter.html#authenticated-writes-to-your-s3-compatible-binary-cache", + "#sec-sharing-packages": "package-management/sharing-packages.html", + "#ssec-ssh-substituter": "package-management/ssh-substituter.html", + "#chap-quick-start": "quick-start.html", + "#sec-relnotes": "release-notes/release-notes.html", + "#ch-relnotes-0.10.1": "release-notes/rl-0.10.1.html", + "#ch-relnotes-0.10": "release-notes/rl-0.10.html", + "#ssec-relnotes-0.11": "release-notes/rl-0.11.html", + "#ssec-relnotes-0.12": "release-notes/rl-0.12.html", + "#ssec-relnotes-0.13": "release-notes/rl-0.13.html", + "#ssec-relnotes-0.14": "release-notes/rl-0.14.html", + "#ssec-relnotes-0.15": "release-notes/rl-0.15.html", + "#ssec-relnotes-0.16": "release-notes/rl-0.16.html", + "#ch-relnotes-0.5": "release-notes/rl-0.5.html", + "#ch-relnotes-0.6": "release-notes/rl-0.6.html", + "#ch-relnotes-0.7": "release-notes/rl-0.7.html", + "#ch-relnotes-0.8.1": "release-notes/rl-0.8.1.html", + "#ch-relnotes-0.8": "release-notes/rl-0.8.html", + "#ch-relnotes-0.9.1": "release-notes/rl-0.9.1.html", + "#ch-relnotes-0.9.2": "release-notes/rl-0.9.2.html", + "#ch-relnotes-0.9": "release-notes/rl-0.9.html", + "#ssec-relnotes-1.0": "release-notes/rl-1.0.html", + "#ssec-relnotes-1.1": "release-notes/rl-1.1.html", + "#ssec-relnotes-1.10": "release-notes/rl-1.10.html", + "#ssec-relnotes-1.11.10": "release-notes/rl-1.11.10.html", + "#ssec-relnotes-1.11": "release-notes/rl-1.11.html", + "#ssec-relnotes-1.2": "release-notes/rl-1.2.html", + "#ssec-relnotes-1.3": "release-notes/rl-1.3.html", + "#ssec-relnotes-1.4": "release-notes/rl-1.4.html", + "#ssec-relnotes-1.5.1": "release-notes/rl-1.5.1.html", + "#ssec-relnotes-1.5.2": "release-notes/rl-1.5.2.html", + "#ssec-relnotes-1.5": "release-notes/rl-1.5.html", + "#ssec-relnotes-1.6.1": "release-notes/rl-1.6.1.html", + "#ssec-relnotes-1.6.0": "release-notes/rl-1.6.html", + "#ssec-relnotes-1.7": "release-notes/rl-1.7.html", + "#ssec-relnotes-1.8": "release-notes/rl-1.8.html", + "#ssec-relnotes-1.9": "release-notes/rl-1.9.html", + "#ssec-relnotes-2.0": "release-notes/rl-2.0.html", + "#ssec-relnotes-2.1": "release-notes/rl-2.1.html", + "#ssec-relnotes-2.2": "release-notes/rl-2.2.html", + "#ssec-relnotes-2.3": "release-notes/rl-2.3.html" +}; + +var isRoot = (document.location.pathname.endsWith('/') || document.location.pathname.endsWith('/index.html')) && path_to_root === ''; +if (isRoot && redirects[document.location.hash]) { + document.location.href = path_to_root + redirects[document.location.hash]; +} From b36d5172cb2cd99f8ae5262b3e3536cceac76b50 Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich Date: Thu, 26 May 2022 18:36:10 +0100 Subject: [PATCH 09/18] src/libutil/json.cc: add missing include for gcc-13 Without the change llvm build fails on this week's gcc-13 snapshot as: src/libutil/json.cc: In function 'void nix::toJSON(std::ostream&, const char*, const char*)': src/libutil/json.cc:33:22: error: 'uint16_t' was not declared in this scope 33 | put(hex[(uint16_t(*i) >> 12) & 0xf]); | ^~~~~~~~ src/libutil/json.cc:5:1: note: 'uint16_t' is defined in header ''; did you forget to '#include '? 4 | #include +++ |+#include 5 | --- src/libutil/json.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libutil/json.cc b/src/libutil/json.cc index 3a981376f..b0a5d7e75 100644 --- a/src/libutil/json.cc +++ b/src/libutil/json.cc @@ -1,6 +1,7 @@ #include "json.hh" #include +#include #include namespace nix { From ec07a70979a86cc436de7e46e03789b4606d25ab Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 27 May 2022 11:25:05 +0200 Subject: [PATCH 10/18] Style fix --- src/libexpr/primops.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index aab6919d4..eea274301 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -3514,7 +3514,7 @@ void prim_match(EvalState & state, const PosIdx pos, Value * * args, Value & v) (v.listElems()[i] = state.allocValue())->mkString(match[i + 1].str()); } - } catch (std::regex_error &e) { + } catch (std::regex_error & e) { if (e.code() == std::regex_constants::error_space) { // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ state.debugThrowLastTrace(EvalError({ @@ -3618,7 +3618,7 @@ void prim_split(EvalState & state, const PosIdx pos, Value * * args, Value & v) assert(idx == 2 * len + 1); - } catch (std::regex_error &e) { + } catch (std::regex_error & e) { if (e.code() == std::regex_constants::error_space) { // limit is _GLIBCXX_REGEX_STATE_LIMIT for libstdc++ state.debugThrowLastTrace(EvalError({ From 8e8e9d8705a68e1be63d6d8059c6c07127826525 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 30 May 2022 11:32:37 +0200 Subject: [PATCH 11/18] Respect the outputSpecified attribute E.g. 'nix build nixpkgs#libxml2.dev' will build the 'dev' output. --- doc/manual/src/release-notes/rl-next.md | 3 -- src/libcmd/installables.cc | 9 +++++- src/libexpr/eval.cc | 1 + src/libexpr/eval.hh | 3 +- src/libexpr/get-drvs.cc | 37 +++++++++++++++++-------- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/doc/manual/src/release-notes/rl-next.md b/doc/manual/src/release-notes/rl-next.md index 878916dc9..7151751dd 100644 --- a/doc/manual/src/release-notes/rl-next.md +++ b/doc/manual/src/release-notes/rl-next.md @@ -22,9 +22,6 @@ `meta.outputsToInstall` attribute if it exists, or all outputs otherwise. - Selecting derivation outputs using the attribute selection syntax - (e.g. `nixpkgs#glibc.dev`) no longer works. - * Running nix with the new `--debugger` flag will cause it to start a repl session if there is an exception thrown during eval, or if `builtins.break` is called. From there one can inspect symbol values and evaluate nix expressions. In debug mode diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc index 635ce19b6..21db2b08b 100644 --- a/src/libcmd/installables.cc +++ b/src/libcmd/installables.cc @@ -623,7 +623,14 @@ std::tuple InstallableF std::set outputsToInstall; std::optional priority; - if (auto aMeta = attr->maybeGetAttr(state->sMeta)) { + if (auto aOutputSpecified = attr->maybeGetAttr(state->sOutputSpecified)) { + if (aOutputSpecified->getBool()) { + if (auto aOutputName = attr->maybeGetAttr("outputName")) + outputsToInstall = { aOutputName->getString() }; + } + } + + else if (auto aMeta = attr->maybeGetAttr(state->sMeta)) { if (auto aOutputsToInstall = aMeta->maybeGetAttr("outputsToInstall")) for (auto & s : aOutputsToInstall->getListOfStrings()) outputsToInstall.insert(s); diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 18baf1cb7..40462afdf 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -459,6 +459,7 @@ EvalState::EvalState( , sKey(symbols.create("key")) , sPath(symbols.create("path")) , sPrefix(symbols.create("prefix")) + , sOutputSpecified(symbols.create("outputSpecified")) , repair(NoRepair) , emptyBindings(0) , store(store) diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 0a32d5885..7b8732169 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -103,7 +103,8 @@ public: sOutputHash, sOutputHashAlgo, sOutputHashMode, sRecurseForDerivations, sDescription, sSelf, sEpsilon, sStartSet, sOperator, sKey, sPath, - sPrefix; + sPrefix, + sOutputSpecified; Symbol sDerivationNix; /* If set, force copying files to the Nix store even if they diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc index d616b3921..346741dd5 100644 --- a/src/libexpr/get-drvs.cc +++ b/src/libexpr/get-drvs.cc @@ -132,23 +132,36 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool withPaths, bool onlyOutputsToInstall } else outputs.emplace("out", withPaths ? std::optional{queryOutPath()} : std::nullopt); } + if (!onlyOutputsToInstall || !attrs) return outputs; - /* Check for `meta.outputsToInstall` and return `outputs` reduced to that. */ - const Value * outTI = queryMeta("outputsToInstall"); - if (!outTI) return outputs; - const auto errMsg = Error("this derivation has bad 'meta.outputsToInstall'"); - /* ^ this shows during `nix-env -i` right under the bad derivation */ - if (!outTI->isList()) throw errMsg; - Outputs result; - for (auto elem : outTI->listItems()) { - if (elem->type() != nString) throw errMsg; - auto out = outputs.find(elem->string.s); - if (out == outputs.end()) throw errMsg; + Bindings::iterator i; + if (attrs && (i = attrs->find(state->sOutputSpecified)) != attrs->end() && state->forceBool(*i->value, i->pos)) { + Outputs result; + auto out = outputs.find(queryOutputName()); + if (out == outputs.end()) + throw Error("derivation does not have output '%s'", queryOutputName()); result.insert(*out); + return result; + } + + else { + /* Check for `meta.outputsToInstall` and return `outputs` reduced to that. */ + const Value * outTI = queryMeta("outputsToInstall"); + if (!outTI) return outputs; + const auto errMsg = Error("this derivation has bad 'meta.outputsToInstall'"); + /* ^ this shows during `nix-env -i` right under the bad derivation */ + if (!outTI->isList()) throw errMsg; + Outputs result; + for (auto elem : outTI->listItems()) { + if (elem->type() != nString) throw errMsg; + auto out = outputs.find(elem->string.s); + if (out == outputs.end()) throw errMsg; + result.insert(*out); + } + return result; } - return result; } From b8faa837429cbcb4f950248571c761c98895e7cd Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 30 May 2022 13:24:04 +0200 Subject: [PATCH 12/18] HttpBinaryCacheStore::getFile(): Don't throw an exception This violates the noexcept specification. Fixes #6445. --- src/libstore/http-binary-cache-store.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libstore/http-binary-cache-store.cc b/src/libstore/http-binary-cache-store.cc index 3cb5efdbf..73bcd6e81 100644 --- a/src/libstore/http-binary-cache-store.cc +++ b/src/libstore/http-binary-cache-store.cc @@ -161,7 +161,12 @@ protected: void getFile(const std::string & path, Callback> callback) noexcept override { - checkEnabled(); + try { + checkEnabled(); + } catch (...) { + callback.rethrow(); + return; + } auto request(makeRequest(path)); From 6378f0bb328437de759f7ed8405fcafbb3bcac54 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 30 May 2022 13:27:13 +0200 Subject: [PATCH 13/18] RemoteStore::queryRealisationUncached(): Fix potential noexcept violation --- src/libstore/remote-store.cc | 56 +++++++++++++++++------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 14aeba75c..bc36aef5d 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -718,36 +718,34 @@ void RemoteStore::registerDrvOutput(const Realisation & info) void RemoteStore::queryRealisationUncached(const DrvOutput & id, Callback> callback) noexcept { - auto conn(getConnection()); - - if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 27) { - warn("the daemon is too old to support content-addressed derivations, please upgrade it to 2.4"); - try { - callback(nullptr); - } catch (...) { return callback.rethrow(); } - } - - conn->to << wopQueryRealisation; - conn->to << id.to_string(); - conn.processStderr(); - - auto real = [&]() -> std::shared_ptr { - if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 31) { - auto outPaths = worker_proto::read( - *this, conn->from, Phantom> {}); - if (outPaths.empty()) - return nullptr; - return std::make_shared(Realisation { .id = id, .outPath = *outPaths.begin() }); - } else { - auto realisations = worker_proto::read( - *this, conn->from, Phantom> {}); - if (realisations.empty()) - return nullptr; - return std::make_shared(*realisations.begin()); - } - }(); - try { + auto conn(getConnection()); + + if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 27) { + warn("the daemon is too old to support content-addressed derivations, please upgrade it to 2.4"); + return callback(nullptr); + } + + conn->to << wopQueryRealisation; + conn->to << id.to_string(); + conn.processStderr(); + + auto real = [&]() -> std::shared_ptr { + if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 31) { + auto outPaths = worker_proto::read( + *this, conn->from, Phantom> {}); + if (outPaths.empty()) + return nullptr; + return std::make_shared(Realisation { .id = id, .outPath = *outPaths.begin() }); + } else { + auto realisations = worker_proto::read( + *this, conn->from, Phantom> {}); + if (realisations.empty()) + return nullptr; + return std::make_shared(*realisations.begin()); + } + }(); + callback(std::shared_ptr(real)); } catch (...) { return callback.rethrow(); } } From 948515efb775c22df5a2585443a0c7f86d2dc64d Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 30 May 2022 13:35:28 +0200 Subject: [PATCH 14/18] Set meta.platforms 'nix-serve' in nixpkgs expects the nix package to set this. --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 77b016ff0..6e0e4d423 100644 --- a/flake.nix +++ b/flake.nix @@ -380,6 +380,7 @@ postUnpack = "sourceRoot=$sourceRoot/perl"; }; + meta.platforms = systems; }; lowdown-nix = with final; currentStdenv.mkDerivation rec { From 452dba510de2f500eae35bbb9dfb5ff825ca0351 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 30 May 2022 14:01:35 +0200 Subject: [PATCH 15/18] Mark nix-perl as a Perl module The call to perl.withPackages in nix-serve expects this. --- flake.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 6e0e4d423..1aa4c4479 100644 --- a/flake.nix +++ b/flake.nix @@ -348,7 +348,7 @@ strictDeps = true; - passthru.perl-bindings = with final; currentStdenv.mkDerivation { + passthru.perl-bindings = with final; perl.pkgs.toPerlModule (currentStdenv.mkDerivation { name = "nix-perl-${version}"; src = self; @@ -378,7 +378,7 @@ enableParallelBuilding = true; postUnpack = "sourceRoot=$sourceRoot/perl"; - }; + }); meta.platforms = systems; }; From de13b445730e94a24690fed6480f86a5f9c102c8 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 30 May 2022 20:39:38 +0200 Subject: [PATCH 16/18] Branch 2.9 release notes --- doc/manual/src/SUMMARY.md.in | 1 + doc/manual/src/release-notes/rl-2.9.md | 47 +++++++++++++++++++++++++ doc/manual/src/release-notes/rl-next.md | 38 -------------------- 3 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 doc/manual/src/release-notes/rl-2.9.md diff --git a/doc/manual/src/SUMMARY.md.in b/doc/manual/src/SUMMARY.md.in index 860222337..825a8b4c0 100644 --- a/doc/manual/src/SUMMARY.md.in +++ b/doc/manual/src/SUMMARY.md.in @@ -72,6 +72,7 @@ - [CLI guideline](contributing/cli-guideline.md) - [Release Notes](release-notes/release-notes.md) - [Release X.Y (202?-??-??)](release-notes/rl-next.md) + - [Release 2.9 (2022-05-30)](release-notes/rl-2.9.md) - [Release 2.8 (2022-04-19)](release-notes/rl-2.8.md) - [Release 2.7 (2022-03-07)](release-notes/rl-2.7.md) - [Release 2.6 (2022-01-24)](release-notes/rl-2.6.md) diff --git a/doc/manual/src/release-notes/rl-2.9.md b/doc/manual/src/release-notes/rl-2.9.md new file mode 100644 index 000000000..ab4b9e42f --- /dev/null +++ b/doc/manual/src/release-notes/rl-2.9.md @@ -0,0 +1,47 @@ +# Release 2.9 (2022-05-30) + +* Running Nix with the new `--debugger` flag will cause it to start a + repl session if if an exception is thrown during evaluation, or if + `builtins.break` is called. From there you can inspect the values + of variables and evaluate Nix expressions. In debug mode, the + following new repl commands are available: + + ``` + :env Show env stack + :bt Show trace stack + :st Show current trace + :st Change to another trace in the stack + :c Go until end of program, exception, or builtins.break(). + :s Go one step + ``` + + Read more about the debugger + [here](https://www.zknotes.com/note/5970). + +* Nix now provides better integration with zsh's `run-help` + feature. It is now included in the Nix installation in the form of + an autoloadable shell function, `run-help-nix`. It picks up Nix + subcommands from the currently typed in command and directs the user + to the associated man pages. + +* `nix repl` has a new build-and-link (`:bl`) command that builds a + derivation while creating GC root symlinks. + +* The path produced by `builtins.toFile` is now allowed to be imported + or read even with restricted evaluation. Note that this will not + work with a read-only store. + +* `nix build` has a new `--print-out-paths` flag to print the + resulting output paths. This matches the default behaviour of + `nix-build`. + +* You can now specify which outputs of a derivation `nix` should + operate on using the syntax `installable^outputs`, + e.g. `nixpkgs#glibc^dev,static` or `nixpkgs#glibc^*`. By default, + `nix` will use the outputs specified by the derivation's + `meta.outputsToInstall` attribute if it exists, or all outputs + otherwise. + +* `builtins.fetchTree` (and flake inputs) can now be used to fetch + plain files over the `http(s)` and `file` protocols in addition to + directory tarballs. diff --git a/doc/manual/src/release-notes/rl-next.md b/doc/manual/src/release-notes/rl-next.md index 7151751dd..c869b5e2f 100644 --- a/doc/manual/src/release-notes/rl-next.md +++ b/doc/manual/src/release-notes/rl-next.md @@ -1,39 +1 @@ # Release X.Y (202?-??-??) - -* Nix now provides better integration with zsh's run-help feature. It is now - included in the Nix installation in the form of an autoloadable shell - function, run-help-nix. It picks up Nix subcommands from the currently typed - in command and directs the user to the associated man pages. - -* `nix repl` has a new build-'n-link (`:bl`) command that builds a derivation - while creating GC root symlinks. - -* The path produced by `builtins.toFile` is now allowed to be imported or read - even with restricted evaluation. Note that this will not work with a - read-only store. - -* `nix build` has a new `--print-out-paths` flag to print the resulting output paths. - This matches the default behaviour of `nix-build`. - -* You can now specify which outputs of a derivation `nix` should - operate on using the syntax `installable^outputs`, - e.g. `nixpkgs#glibc^dev,static` or `nixpkgs#glibc^*`. By default, - `nix` will use the outputs specified by the derivation's - `meta.outputsToInstall` attribute if it exists, or all outputs - otherwise. - -* Running nix with the new `--debugger` flag will cause it to start a repl session if - there is an exception thrown during eval, or if `builtins.break` is called. From - there one can inspect symbol values and evaluate nix expressions. In debug mode - the following new repl commands are available: - ``` - :env Show env stack - :bt Show trace stack - :st Show current trace - :st Change to another trace in the stack - :c Go until end of program, exception, or builtins.break(). - :s Go one step - ``` - -* `builtins.fetchTree` (and flake inputs) can now be used to fetch plain files - over the `http(s)` and `file` protocols in addition to directory tarballs. From 929ab5b195cb063f7f38e7d6aceb262aaabbeee0 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 30 May 2022 21:11:20 +0200 Subject: [PATCH 17/18] Bump version --- .version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.version b/.version index f3ac133c5..f161b5d80 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.9.0 \ No newline at end of file +2.10.0 \ No newline at end of file From 04a699b8a9cebd83ece0011ec3a99e38a2adc3a8 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 31 May 2022 10:37:51 +0200 Subject: [PATCH 18/18] Typo --- doc/manual/src/release-notes/rl-2.9.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/src/release-notes/rl-2.9.md b/doc/manual/src/release-notes/rl-2.9.md index ab4b9e42f..98cc4235d 100644 --- a/doc/manual/src/release-notes/rl-2.9.md +++ b/doc/manual/src/release-notes/rl-2.9.md @@ -1,7 +1,7 @@ # Release 2.9 (2022-05-30) * Running Nix with the new `--debugger` flag will cause it to start a - repl session if if an exception is thrown during evaluation, or if + repl session if an exception is thrown during evaluation, or if `builtins.break` is called. From there you can inspect the values of variables and evaluate Nix expressions. In debug mode, the following new repl commands are available: