aboutsummaryrefslogtreecommitdiff
path: root/doc/manual
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual')
-rw-r--r--doc/manual/generate-manpage.nix191
-rw-r--r--doc/manual/generate-options.nix10
-rw-r--r--doc/manual/local.mk16
-rw-r--r--doc/manual/redirects.js207
-rw-r--r--doc/manual/src/SUMMARY.md.in24
-rw-r--r--doc/manual/src/advanced-topics/distributed-builds.md4
-rw-r--r--doc/manual/src/command-ref/nix-copy-closure.md4
-rw-r--r--doc/manual/src/command-ref/nix-env.md2
-rw-r--r--doc/manual/src/command-ref/nix-instantiate.md4
-rw-r--r--doc/manual/src/command-ref/nix-store.md2
-rw-r--r--doc/manual/src/command-ref/opt-common.md4
-rw-r--r--doc/manual/src/contributing/hacking.md78
-rw-r--r--doc/manual/src/expressions/arguments-variables.md80
-rw-r--r--doc/manual/src/expressions/build-script.md70
-rw-r--r--doc/manual/src/expressions/expression-language.md12
-rw-r--r--doc/manual/src/expressions/expression-syntax.md93
-rw-r--r--doc/manual/src/expressions/generic-builder.md66
-rw-r--r--doc/manual/src/expressions/language-values.md251
-rw-r--r--doc/manual/src/expressions/simple-building-testing.md61
-rw-r--r--doc/manual/src/expressions/simple-expression.md23
-rw-r--r--doc/manual/src/expressions/writing-nix-expressions.md12
-rw-r--r--doc/manual/src/glossary.md54
-rw-r--r--doc/manual/src/installation/installing-binary.md32
-rw-r--r--doc/manual/src/language/advanced-attributes.md (renamed from doc/manual/src/expressions/advanced-attributes.md)0
-rw-r--r--doc/manual/src/language/builtin-constants.md (renamed from doc/manual/src/expressions/builtin-constants.md)0
-rw-r--r--doc/manual/src/language/builtins-prefix.md (renamed from doc/manual/src/expressions/builtins-prefix.md)0
-rw-r--r--doc/manual/src/language/builtins-suffix.md (renamed from doc/manual/src/expressions/builtins-suffix.md)0
-rw-r--r--doc/manual/src/language/constructs.md (renamed from doc/manual/src/expressions/language-constructs.md)0
-rw-r--r--doc/manual/src/language/derivations.md (renamed from doc/manual/src/expressions/derivations.md)0
-rw-r--r--doc/manual/src/language/index.md33
-rw-r--r--doc/manual/src/language/operators.md (renamed from doc/manual/src/expressions/language-operators.md)2
-rw-r--r--doc/manual/src/language/values.md275
-rw-r--r--doc/manual/src/package-management/package-management.md3
-rw-r--r--doc/manual/src/release-notes/rl-2.11.md5
-rw-r--r--doc/manual/src/release-notes/rl-next.md7
-rw-r--r--doc/manual/utils.nix26
36 files changed, 733 insertions, 918 deletions
diff --git a/doc/manual/generate-manpage.nix b/doc/manual/generate-manpage.nix
index 244cfa0c2..057719e34 100644
--- a/doc/manual/generate-manpage.nix
+++ b/doc/manual/generate-manpage.nix
@@ -1,99 +1,114 @@
-{ command, renderLinks ? false }:
+{ toplevel }:
with builtins;
with import ./utils.nix;
let
- showCommand =
- { command, def, filename }:
- ''
- **Warning**: This program is **experimental** and its interface is subject to change.
- ''
- + "# Name\n\n"
- + "`${command}` - ${def.description}\n\n"
- + "# Synopsis\n\n"
- + showSynopsis { inherit command; args = def.args; }
- + (if def.commands or {} != {}
- then
- let
- categories = sort (x: y: x.id < y.id) (unique (map (cmd: cmd.category) (attrValues def.commands)));
- listCommands = cmds:
- concatStrings (map (name:
- "* "
- + (if renderLinks
- then "[`${command} ${name}`](./${appendName filename name}.md)"
- else "`${command} ${name}`")
- + " - ${cmds.${name}.description}\n")
- (attrNames cmds));
- in
- "where *subcommand* is one of the following:\n\n"
- # FIXME: group by category
- + (if length categories > 1
- then
- concatStrings (map
- (cat:
- "**${toString cat.description}:**\n\n"
- + listCommands (filterAttrs (n: v: v.category == cat) def.commands)
- + "\n"
- ) categories)
- + "\n"
- else
- listCommands def.commands
- + "\n")
- else "")
- + (if def ? doc
- then def.doc + "\n\n"
- else "")
- + (let s = showOptions def.flags; in
- if s != ""
- then "# Options\n\n${s}"
- else "")
- ;
+ showCommand = { command, details, filename, toplevel }:
+ let
+ result = ''
+ > **Warning** \
+ > This program is **experimental** and its interface is subject to change.
+
+ # Name
+
+ `${command}` - ${details.description}
+
+ # Synopsis
+
+ ${showSynopsis command details.args}
+
+ ${maybeSubcommands}
+
+ ${maybeDocumentation}
+
+ ${maybeOptions}
+ '';
+ showSynopsis = command: args:
+ let
+ showArgument = arg: "*${arg.label}*" + (if arg ? arity then "" else "...");
+ arguments = concatStringsSep " " (map showArgument args);
+ in ''
+ `${command}` [*option*...] ${arguments}
+ '';
+ maybeSubcommands = if details ? commands && details.commands != {}
+ then ''
+ where *subcommand* is one of the following:
+
+ ${subcommands}
+ ''
+ else "";
+ subcommands = if length categories > 1
+ then listCategories
+ else listSubcommands details.commands;
+ categories = sort (x: y: x.id < y.id) (unique (map (cmd: cmd.category) (attrValues details.commands)));
+ listCategories = concatStrings (map showCategory categories);
+ showCategory = cat: ''
+ **${toString cat.description}:**
+
+ ${listSubcommands (filterAttrs (n: v: v.category == cat) details.commands)}
+ '';
+ listSubcommands = cmds: concatStrings (attrValues (mapAttrs showSubcommand cmds));
+ showSubcommand = name: subcmd: ''
+ * [`${command} ${name}`](./${appendName filename name}.md) - ${subcmd.description}
+ '';
+ maybeDocumentation = if details ? doc then details.doc else "";
+ maybeOptions = if details.flags == {} then "" else ''
+ # Options
+
+ ${showOptions details.flags toplevel.flags}
+ '';
+ showOptions = options: commonOptions:
+ let
+ allOptions = options // commonOptions;
+ showCategory = cat: ''
+ ${if cat != "" then "**${cat}:**" else ""}
+
+ ${listOptions (filterAttrs (n: v: v.category == cat) allOptions)}
+ '';
+ listOptions = opts: concatStringsSep "\n" (attrValues (mapAttrs showOption opts));
+ showOption = name: option:
+ let
+ shortName = if option ? shortName then "/ `-${option.shortName}`" else "";
+ labels = if option ? labels then (concatStringsSep " " (map (s: "*${s}*") option.labels)) else "";
+ in trim ''
+ - `--${name}` ${shortName} ${labels}
+
+ ${option.description}
+ '';
+ categories = sort builtins.lessThan (unique (map (cmd: cmd.category) (attrValues allOptions)));
+ in concatStrings (map showCategory categories);
+ in squash result;
appendName = filename: name: (if filename == "nix" then "nix3" else filename) + "-" + name;
- showOptions = flags:
+ processCommand = { command, details, filename, toplevel }:
let
- categories = sort builtins.lessThan (unique (map (cmd: cmd.category) (attrValues flags)));
- in
- concatStrings (map
- (cat:
- (if cat != ""
- then "**${cat}:**\n\n"
- else "")
- + concatStrings
- (map (longName:
- let
- flag = flags.${longName};
- in
- " - `--${longName}`"
- + (if flag ? shortName then " / `-${flag.shortName}`" else "")
- + (if flag ? labels then " " + (concatStringsSep " " (map (s: "*${s}*") flag.labels)) else "")
- + " \n"
- + " " + flag.description + "\n\n"
- ) (attrNames (filterAttrs (n: v: v.category == cat) flags))))
- categories);
-
- showSynopsis =
- { command, args }:
- "`${command}` [*option*...] ${concatStringsSep " "
- (map (arg: "*${arg.label}*" + (if arg ? arity then "" else "...")) args)}\n\n";
-
- processCommand = { command, def, filename }:
- [ { name = filename + ".md"; value = showCommand { inherit command def filename; }; inherit command; } ]
- ++ concatMap
- (name: processCommand {
- filename = appendName filename name;
- command = command + " " + name;
- def = def.commands.${name};
- })
- (attrNames def.commands or {});
-
-in
+ cmd = {
+ inherit command;
+ name = filename + ".md";
+ value = showCommand { inherit command details filename toplevel; };
+ };
+ subcommand = subCmd: processCommand {
+ command = command + " " + subCmd;
+ details = details.commands.${subCmd};
+ filename = appendName filename subCmd;
+ inherit toplevel;
+ };
+ in [ cmd ] ++ concatMap subcommand (attrNames details.commands or {});
-let
- manpages = processCommand { filename = "nix"; command = "nix"; def = builtins.fromJSON command; };
- summary = concatStrings (map (manpage: " - [${manpage.command}](command-ref/new-cli/${manpage.name})\n") manpages);
-in
-(listToAttrs manpages) // { "SUMMARY.md" = summary; }
+ parsedToplevel = builtins.fromJSON toplevel;
+ manpages = processCommand {
+ command = "nix";
+ details = parsedToplevel;
+ filename = "nix";
+ toplevel = parsedToplevel;
+ };
+
+ tableOfContents = let
+ showEntry = page:
+ " - [${page.command}](command-ref/new-cli/${page.name})";
+ in concatStringsSep "\n" (map showEntry manpages) + "\n";
+
+in (listToAttrs manpages) // { "SUMMARY.md" = tableOfContents; }
diff --git a/doc/manual/generate-options.nix b/doc/manual/generate-options.nix
index 2d586fa1b..680b709c8 100644
--- a/doc/manual/generate-options.nix
+++ b/doc/manual/generate-options.nix
@@ -11,16 +11,16 @@ concatStrings (map
+ concatStrings (map (s: " ${s}\n") (splitLines option.description)) + "\n\n"
+ (if option.documentDefault
then " **Default:** " + (
- if option.value == "" || option.value == []
+ if option.defaultValue == "" || option.defaultValue == []
then "*empty*"
- else if isBool option.value
- then (if option.value then "`true`" else "`false`")
+ else if isBool option.defaultValue
+ then (if option.defaultValue then "`true`" else "`false`")
else
# n.b. a StringMap value type is specified as a string, but
# this shows the value type. The empty stringmap is "null" in
# JSON, but that converts to "{ }" here.
- (if isAttrs option.value then "`\"\"`"
- else "`" + toString option.value + "`")) + "\n\n"
+ (if isAttrs option.defaultValue then "`\"\"`"
+ else "`" + toString option.defaultValue + "`")) + "\n\n"
else " **Default:** *machine-specific*\n")
+ (if option.aliases != []
then " **Deprecated alias:** " + (concatStringsSep ", " (map (s: "`${s}`") option.aliases)) + "\n\n"
diff --git a/doc/manual/local.mk b/doc/manual/local.mk
index 371ed6f21..486dbd7a2 100644
--- a/doc/manual/local.mk
+++ b/doc/manual/local.mk
@@ -1,5 +1,9 @@
ifeq ($(doc_generate),yes)
+MANUAL_SRCS := \
+ $(call rwildcard, $(d)/src, *.md) \
+ $(call rwildcard, $(d)/src, */*.md)
+
# Generate man pages.
man-pages := $(foreach n, \
nix-env.1 nix-build.1 nix-shell.1 nix-store.1 nix-instantiate.1 \
@@ -46,7 +50,7 @@ $(d)/src/SUMMARY.md: $(d)/src/SUMMARY.md.in $(d)/src/command-ref/new-cli
$(d)/src/command-ref/new-cli: $(d)/nix.json $(d)/generate-manpage.nix $(bindir)/nix
@rm -rf $@
- $(trace-gen) $(nix-eval) --write-to $@ --expr 'import doc/manual/generate-manpage.nix { command = builtins.readFile $<; renderLinks = true; }'
+ $(trace-gen) $(nix-eval) --write-to $@ --expr 'import doc/manual/generate-manpage.nix { toplevel = builtins.readFile $<; }'
$(d)/src/command-ref/conf-file.md: $(d)/conf-file.json $(d)/generate-options.nix $(d)/src/command-ref/conf-file-prefix.md $(bindir)/nix
@cat doc/manual/src/command-ref/conf-file-prefix.md > $@.tmp
@@ -61,10 +65,10 @@ $(d)/conf-file.json: $(bindir)/nix
$(trace-gen) $(dummy-env) $(bindir)/nix show-config --json --experimental-features nix-command > $@.tmp
@mv $@.tmp $@
-$(d)/src/expressions/builtins.md: $(d)/builtins.json $(d)/generate-builtins.nix $(d)/src/expressions/builtins-prefix.md $(bindir)/nix
- @cat doc/manual/src/expressions/builtins-prefix.md > $@.tmp
+$(d)/src/language/builtins.md: $(d)/builtins.json $(d)/generate-builtins.nix $(d)/src/language/builtins-prefix.md $(bindir)/nix
+ @cat doc/manual/src/language/builtins-prefix.md > $@.tmp
$(trace-gen) $(nix-eval) --expr 'import doc/manual/generate-builtins.nix (builtins.fromJSON (builtins.readFile $<))' >> $@.tmp
- @cat doc/manual/src/expressions/builtins-suffix.md >> $@.tmp
+ @cat doc/manual/src/language/builtins-suffix.md >> $@.tmp
@mv $@.tmp $@
$(d)/builtins.json: $(bindir)/nix
@@ -92,12 +96,12 @@ doc/manual/generated/man1/nix3-manpages: $(d)/src/command-ref/new-cli
if [[ $$name = SUMMARY ]]; then continue; fi; \
printf "Title: %s\n\n" "$$name" > $$tmpFile; \
cat $$i >> $$tmpFile; \
- lowdown -sT man -M section=1 $$tmpFile -o $(DESTDIR)$$(dirname $@)/$$name.1; \
+ lowdown -sT man --nroff-nolinks -M section=1 $$tmpFile -o $(DESTDIR)$$(dirname $@)/$$name.1; \
rm $$tmpFile; \
done
@touch $@
-$(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)
+$(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/language/builtins.md
$(trace-gen) RUST_LOG=warn mdbook build doc/manual -d $(DESTDIR)$(docdir)/manual
endif
diff --git a/doc/manual/redirects.js b/doc/manual/redirects.js
index 19f928c7e..167e221b8 100644
--- a/doc/manual/redirects.js
+++ b/doc/manual/redirects.js
@@ -132,113 +132,106 @@ var redirects = {
"#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",
+ "#adv-attr-allowSubstitutes": "language/advanced-attributes.html#adv-attr-allowSubstitutes",
+ "#adv-attr-allowedReferences": "language/advanced-attributes.html#adv-attr-allowedReferences",
+ "#adv-attr-allowedRequisites": "language/advanced-attributes.html#adv-attr-allowedRequisites",
+ "#adv-attr-disallowedReferences": "language/advanced-attributes.html#adv-attr-disallowedReferences",
+ "#adv-attr-disallowedRequisites": "language/advanced-attributes.html#adv-attr-disallowedRequisites",
+ "#adv-attr-exportReferencesGraph": "language/advanced-attributes.html#adv-attr-exportReferencesGraph",
+ "#adv-attr-impureEnvVars": "language/advanced-attributes.html#adv-attr-impureEnvVars",
+ "#adv-attr-outputHash": "language/advanced-attributes.html#adv-attr-outputHash",
+ "#adv-attr-outputHashAlgo": "language/advanced-attributes.html#adv-attr-outputHashAlgo",
+ "#adv-attr-outputHashMode": "language/advanced-attributes.html#adv-attr-outputHashMode",
+ "#adv-attr-passAsFile": "language/advanced-attributes.html#adv-attr-passAsFile",
+ "#adv-attr-preferLocalBuild": "language/advanced-attributes.html#adv-attr-preferLocalBuild",
+ "#fixed-output-drvs": "language/advanced-attributes.html#adv-attr-outputHash",
+ "#sec-advanced-attributes": "language/advanced-attributes.html",
+ "#builtin-abort": "language/builtins.html#builtins-abort",
+ "#builtin-add": "language/builtins.html#builtins-add",
+ "#builtin-all": "language/builtins.html#builtins-all",
+ "#builtin-any": "language/builtins.html#builtins-any",
+ "#builtin-attrNames": "language/builtins.html#builtins-attrNames",
+ "#builtin-attrValues": "language/builtins.html#builtins-attrValues",
+ "#builtin-baseNameOf": "language/builtins.html#builtins-baseNameOf",
+ "#builtin-bitAnd": "language/builtins.html#builtins-bitAnd",
+ "#builtin-bitOr": "language/builtins.html#builtins-bitOr",
+ "#builtin-bitXor": "language/builtins.html#builtins-bitXor",
+ "#builtin-builtins": "language/builtins.html#builtins-builtins",
+ "#builtin-compareVersions": "language/builtins.html#builtins-compareVersions",
+ "#builtin-concatLists": "language/builtins.html#builtins-concatLists",
+ "#builtin-concatStringsSep": "language/builtins.html#builtins-concatStringsSep",
+ "#builtin-currentSystem": "language/builtins.html#builtins-currentSystem",
+ "#builtin-deepSeq": "language/builtins.html#builtins-deepSeq",
+ "#builtin-derivation": "language/builtins.html#builtins-derivation",
+ "#builtin-dirOf": "language/builtins.html#builtins-dirOf",
+ "#builtin-div": "language/builtins.html#builtins-div",
+ "#builtin-elem": "language/builtins.html#builtins-elem",
+ "#builtin-elemAt": "language/builtins.html#builtins-elemAt",
+ "#builtin-fetchGit": "language/builtins.html#builtins-fetchGit",
+ "#builtin-fetchTarball": "language/builtins.html#builtins-fetchTarball",
+ "#builtin-fetchurl": "language/builtins.html#builtins-fetchurl",
+ "#builtin-filterSource": "language/builtins.html#builtins-filterSource",
+ "#builtin-foldl-prime": "language/builtins.html#builtins-foldl-prime",
+ "#builtin-fromJSON": "language/builtins.html#builtins-fromJSON",
+ "#builtin-functionArgs": "language/builtins.html#builtins-functionArgs",
+ "#builtin-genList": "language/builtins.html#builtins-genList",
+ "#builtin-getAttr": "language/builtins.html#builtins-getAttr",
+ "#builtin-getEnv": "language/builtins.html#builtins-getEnv",
+ "#builtin-hasAttr": "language/builtins.html#builtins-hasAttr",
+ "#builtin-hashFile": "language/builtins.html#builtins-hashFile",
+ "#builtin-hashString": "language/builtins.html#builtins-hashString",
+ "#builtin-head": "language/builtins.html#builtins-head",
+ "#builtin-import": "language/builtins.html#builtins-import",
+ "#builtin-intersectAttrs": "language/builtins.html#builtins-intersectAttrs",
+ "#builtin-isAttrs": "language/builtins.html#builtins-isAttrs",
+ "#builtin-isBool": "language/builtins.html#builtins-isBool",
+ "#builtin-isFloat": "language/builtins.html#builtins-isFloat",
+ "#builtin-isFunction": "language/builtins.html#builtins-isFunction",
+ "#builtin-isInt": "language/builtins.html#builtins-isInt",
+ "#builtin-isList": "language/builtins.html#builtins-isList",
+ "#builtin-isNull": "language/builtins.html#builtins-isNull",
+ "#builtin-isString": "language/builtins.html#builtins-isString",
+ "#builtin-length": "language/builtins.html#builtins-length",
+ "#builtin-lessThan": "language/builtins.html#builtins-lessThan",
+ "#builtin-listToAttrs": "language/builtins.html#builtins-listToAttrs",
+ "#builtin-map": "language/builtins.html#builtins-map",
+ "#builtin-match": "language/builtins.html#builtins-match",
+ "#builtin-mul": "language/builtins.html#builtins-mul",
+ "#builtin-parseDrvName": "language/builtins.html#builtins-parseDrvName",
+ "#builtin-path": "language/builtins.html#builtins-path",
+ "#builtin-pathExists": "language/builtins.html#builtins-pathExists",
+ "#builtin-placeholder": "language/builtins.html#builtins-placeholder",
+ "#builtin-readDir": "language/builtins.html#builtins-readDir",
+ "#builtin-readFile": "language/builtins.html#builtins-readFile",
+ "#builtin-removeAttrs": "language/builtins.html#builtins-removeAttrs",
+ "#builtin-replaceStrings": "language/builtins.html#builtins-replaceStrings",
+ "#builtin-seq": "language/builtins.html#builtins-seq",
+ "#builtin-sort": "language/builtins.html#builtins-sort",
+ "#builtin-split": "language/builtins.html#builtins-split",
+ "#builtin-splitVersion": "language/builtins.html#builtins-splitVersion",
+ "#builtin-stringLength": "language/builtins.html#builtins-stringLength",
+ "#builtin-sub": "language/builtins.html#builtins-sub",
+ "#builtin-substring": "language/builtins.html#builtins-substring",
+ "#builtin-tail": "language/builtins.html#builtins-tail",
+ "#builtin-throw": "language/builtins.html#builtins-throw",
+ "#builtin-toFile": "language/builtins.html#builtins-toFile",
+ "#builtin-toJSON": "language/builtins.html#builtins-toJSON",
+ "#builtin-toPath": "language/builtins.html#builtins-toPath",
+ "#builtin-toString": "language/builtins.html#builtins-toString",
+ "#builtin-toXML": "language/builtins.html#builtins-toXML",
+ "#builtin-trace": "language/builtins.html#builtins-trace",
+ "#builtin-tryEval": "language/builtins.html#builtins-tryEval",
+ "#builtin-typeOf": "language/builtins.html#builtins-typeOf",
+ "#ssec-builtins": "language/builtins.html",
+ "#attr-system": "language/derivations.html#attr-system",
+ "#ssec-derivation": "language/derivations.html",
+ "#ch-expression-language": "language/index.html",
+ "#sec-constructs": "language/constructs.html",
+ "#sect-let-language": "language/constructs.html#let-language",
+ "#ss-functions": "language/constructs.html#functions",
+ "#sec-language-operators": "language/operators.html",
+ "#table-operators": "language/operators.html",
+ "#ssec-values": "language/values.html",
"#gloss-closure": "glossary.html#gloss-closure",
"#gloss-derivation": "glossary.html#gloss-derivation",
"#gloss-deriver": "glossary.html#gloss-deriver",
diff --git a/doc/manual/src/SUMMARY.md.in b/doc/manual/src/SUMMARY.md.in
index 9728728aa..908e7e3d9 100644
--- a/doc/manual/src/SUMMARY.md.in
+++ b/doc/manual/src/SUMMARY.md.in
@@ -26,21 +26,14 @@
- [Copying Closures via SSH](package-management/copy-closure.md)
- [Serving a Nix store via SSH](package-management/ssh-substituter.md)
- [Serving a Nix store via S3](package-management/s3-substituter.md)
-- [Writing Nix Expressions](expressions/writing-nix-expressions.md)
- - [A Simple Nix Expression](expressions/simple-expression.md)
- - [Expression Syntax](expressions/expression-syntax.md)
- - [Build Script](expressions/build-script.md)
- - [Arguments and Variables](expressions/arguments-variables.md)
- - [Building and Testing](expressions/simple-building-testing.md)
- - [Generic Builder Syntax](expressions/generic-builder.md)
- - [Writing Nix Expressions](expressions/expression-language.md)
- - [Values](expressions/language-values.md)
- - [Language Constructs](expressions/language-constructs.md)
- - [Operators](expressions/language-operators.md)
- - [Derivations](expressions/derivations.md)
- - [Advanced Attributes](expressions/advanced-attributes.md)
- - [Built-in Constants](expressions/builtin-constants.md)
- - [Built-in Functions](expressions/builtins.md)
+- [Nix Language](language/index.md)
+ - [Data Types](language/values.md)
+ - [Language Constructs](language/constructs.md)
+ - [Operators](language/operators.md)
+ - [Derivations](language/derivations.md)
+ - [Advanced Attributes](language/advanced-attributes.md)
+ - [Built-in Constants](language/builtin-constants.md)
+ - [Built-in Functions](language/builtins.md)
- [Advanced Topics](advanced-topics/advanced-topics.md)
- [Remote Builds](advanced-topics/distributed-builds.md)
- [Tuning Cores and Jobs](advanced-topics/cores-vs-jobs.md)
@@ -72,6 +65,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.11 (2022-08-25)](release-notes/rl-2.11.md)
- [Release 2.10 (2022-07-11)](release-notes/rl-2.10.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)
diff --git a/doc/manual/src/advanced-topics/distributed-builds.md b/doc/manual/src/advanced-topics/distributed-builds.md
index b0d7fbf1a..fefd10100 100644
--- a/doc/manual/src/advanced-topics/distributed-builds.md
+++ b/doc/manual/src/advanced-topics/distributed-builds.md
@@ -12,14 +12,14 @@ machine is accessible via SSH and that it has Nix installed. You can
test whether connecting to the remote Nix instance works, e.g.
```console
-$ nix ping-store --store ssh://mac
+$ nix store ping --store ssh://mac
```
will try to connect to the machine named `mac`. It is possible to
specify an SSH identity file as part of the remote store URI, e.g.
```console
-$ nix ping-store --store ssh://mac?ssh-key=/home/alice/my-key
+$ nix store ping --store ssh://mac?ssh-key=/home/alice/my-key
```
Since builds should be non-interactive, the key should not have a
diff --git a/doc/manual/src/command-ref/nix-copy-closure.md b/doc/manual/src/command-ref/nix-copy-closure.md
index 7047d3012..9a29030bd 100644
--- a/doc/manual/src/command-ref/nix-copy-closure.md
+++ b/doc/manual/src/command-ref/nix-copy-closure.md
@@ -30,8 +30,8 @@ Since `nix-copy-closure` calls `ssh`, you may be asked to type in the
appropriate password or passphrase. In fact, you may be asked _twice_
because `nix-copy-closure` currently connects twice to the remote
machine, first to get the set of paths missing on the target machine,
-and second to send the dump of those paths. If this bothers you, use
-`ssh-agent`.
+and second to send the dump of those paths. When using public key
+authentication, you can avoid typing the passphrase with `ssh-agent`.
# Options
diff --git a/doc/manual/src/command-ref/nix-env.md b/doc/manual/src/command-ref/nix-env.md
index a372c5eae..a5df35d77 100644
--- a/doc/manual/src/command-ref/nix-env.md
+++ b/doc/manual/src/command-ref/nix-env.md
@@ -198,7 +198,7 @@ a number of possible ways:
another.
- If `--from-expression` is given, *args* are Nix
- [functions](../expressions/language-constructs.md#functions)
+ [functions](../language/constructs.md#functions)
that are called with the active Nix expression as their single
argument. The derivations returned by those function calls are
installed. This allows derivations to be specified in an
diff --git a/doc/manual/src/command-ref/nix-instantiate.md b/doc/manual/src/command-ref/nix-instantiate.md
index 2e198daed..8f143729e 100644
--- a/doc/manual/src/command-ref/nix-instantiate.md
+++ b/doc/manual/src/command-ref/nix-instantiate.md
@@ -51,7 +51,7 @@ standard input.
- `--strict`\
When used with `--eval`, recursively evaluate list elements and
attributes. Normally, such sub-expressions are left unevaluated
- (since the Nix expression language is lazy).
+ (since the Nix language is lazy).
> **Warning**
>
@@ -66,7 +66,7 @@ standard input.
When used with `--eval`, print the resulting value as an XML
representation of the abstract syntax tree rather than as an ATerm.
The schema is the same as that used by the [`toXML`
- built-in](../expressions/builtins.md).
+ built-in](../language/builtins.md).
- `--read-write-mode`\
When used with `--eval`, perform evaluation in read/write mode so
diff --git a/doc/manual/src/command-ref/nix-store.md b/doc/manual/src/command-ref/nix-store.md
index dc8faba68..ecd838e8d 100644
--- a/doc/manual/src/command-ref/nix-store.md
+++ b/doc/manual/src/command-ref/nix-store.md
@@ -121,7 +121,7 @@ Special exit codes:
- `102`\
Hash mismatch, the build output was rejected because it does not
match the [`outputHash` attribute of the
- derivation](../expressions/advanced-attributes.md).
+ derivation](../language/advanced-attributes.md).
- `104`\
Not deterministic, the build succeeded in check mode but the
diff --git a/doc/manual/src/command-ref/opt-common.md b/doc/manual/src/command-ref/opt-common.md
index 51d7de18a..e612c416f 100644
--- a/doc/manual/src/command-ref/opt-common.md
+++ b/doc/manual/src/command-ref/opt-common.md
@@ -145,7 +145,7 @@ Most Nix commands accept the following command-line options:
expression evaluator will automatically try to call functions that
it encounters. It can automatically call functions for which every
argument has a [default
- value](../expressions/language-constructs.md#functions) (e.g.,
+ value](../language/constructs.md#functions) (e.g.,
`{ argName ? defaultValue }: ...`). With `--arg`, you can also
call functions that have arguments without a default value (or
override a default value). That is, if the evaluator encounters a
@@ -164,7 +164,7 @@ Most Nix commands accept the following command-line options:
So if you call this Nix expression (e.g., when you do `nix-env -iA
pkgname`), the function will be called automatically using the
- value [`builtins.currentSystem`](../expressions/builtins.md) for
+ value [`builtins.currentSystem`](../language/builtins.md) for
the `system` argument. You can override this using `--arg`, e.g.,
`nix-env -iA pkgname --arg system \"i686-freebsd\"`. (Note that
since the argument is a Nix string literal, you have to escape the
diff --git a/doc/manual/src/contributing/hacking.md b/doc/manual/src/contributing/hacking.md
index 59ce5cac7..9f7d5057b 100644
--- a/doc/manual/src/contributing/hacking.md
+++ b/doc/manual/src/contributing/hacking.md
@@ -42,7 +42,7 @@ $ nix develop
```
To get a shell with a different compilation environment (e.g. stdenv,
-gccStdenv, clangStdenv, clang11Stdenv):
+gccStdenv, clangStdenv, clang11Stdenv, ccacheStdenv):
```console
$ nix-shell -A devShells.x86_64-linux.clang11StdenvPackages
@@ -54,6 +54,9 @@ or if you have a flake-enabled nix:
$ nix develop .#clang11StdenvPackages
```
+Note: you can use `ccacheStdenv` to drastically improve rebuild
+time. By default, ccache keeps artifacts in `~/.cache/ccache/`.
+
To build Nix itself in this shell:
```console
@@ -83,9 +86,7 @@ by:
$ nix develop
```
-## Testing
-
-Nix comes with three different flavors of tests: unit, functional and integration.
+## Running tests
### Unit-tests
@@ -108,3 +109,72 @@ These tests include everything that needs to interact with external services or
Because these tests are expensive and require more than what the standard github-actions setup provides, they only run on the master branch (on <https://hydra.nixos.org/jobset/nix/master>).
You can run them manually with `nix build .#hydraJobs.tests.{testName}` or `nix-build -A hydraJobs.tests.{testName}`
+
+### Installer tests
+
+After a one-time setup, the Nix repository's GitHub Actions continuous integration (CI) workflow can test the installer each time you push to a branch.
+
+Creating a Cachix cache for your installer tests and adding its authorization token to GitHub enables [two installer-specific jobs in the CI workflow](https://github.com/NixOS/nix/blob/88a45d6149c0e304f6eb2efcc2d7a4d0d569f8af/.github/workflows/ci.yml#L50-L91):
+
+- The `installer` job generates installers for the platforms below and uploads them to your Cachix cache:
+ - `x86_64-linux`
+ - `armv6l-linux`
+ - `armv7l-linux`
+ - `x86_64-darwin`
+
+- The `installer_test` job (which runs on `ubuntu-latest` and `macos-latest`) will try to install Nix with the cached installer and run a trivial Nix command.
+
+#### One-time setup
+
+1. Have a GitHub account with a fork of the [Nix repository](https://github.com/NixOS/nix).
+2. At cachix.org:
+ - Create or log in to an account.
+ - Create a Cachix cache using the format `<github-username>-nix-install-tests`.
+ - Navigate to the new cache > Settings > Auth Tokens.
+ - Generate a new Cachix auth token and copy the generated value.
+3. At github.com:
+ - Navigate to your Nix fork > Settings > Secrets > Actions > New repository secret.
+ - Name the secret `CACHIX_AUTH_TOKEN`.
+ - Paste the copied value of the Cachix cache auth token.
+
+#### Using the CI-generated installer for manual testing
+
+After the CI run completes, you can check the output to extract the installer URL:
+1. Click into the detailed view of the CI run.
+2. Click into any `installer_test` run (the URL you're here to extract will be the same in all of them).
+3. Click into the `Run cachix/install-nix-action@v...` step and click the detail triangle next to the first log line (it will also be `Run cachix/install-nix-action@v...`)
+4. Copy the value of `install_url`
+5. To generate an install command, plug this `install_url` and your GitHub username into this template:
+
+ ```console
+ sh <(curl -L <install_url>) --tarball-url-prefix https://<github-username>-nix-install-tests.cachix.org/serve
+ ```
+
+<!-- #### Manually generating test installers
+
+There's obviously a manual way to do this, and it's still the only way for
+platforms that lack GA runners.
+
+I did do this back in Fall 2020 (before the GA approach encouraged here). I'll
+sketch what I recall in case it encourages someone to fill in detail, but: I
+didn't know what I was doing at the time and had to fumble/ask around a lot--
+so I don't want to uphold any of it as "right". It may have been dumb or
+the _hard_ way from the getgo. Fundamentals may have changed since.
+
+Here's the build command I used to do this on and for x86_64-darwin:
+nix build --out-link /tmp/foo ".#checks.x86_64-darwin.binaryTarball"
+
+I used the stable out-link to make it easier to script the next steps:
+link=$(readlink /tmp/foo)
+cp $link/*-darwin.tar.xz ~/somewheres
+
+I've lost the last steps and am just going from memory:
+
+From here, I think I had to extract and modify the `install` script to point
+it at this tarball (which I scped to my own site, but it might make more sense
+to just share them locally). I extracted this script once and then just
+search/replaced in it for each new build.
+
+The installer now supports a `--tarball-url-prefix` flag which _may_ have
+solved this need?
+-->
diff --git a/doc/manual/src/expressions/arguments-variables.md b/doc/manual/src/expressions/arguments-variables.md
deleted file mode 100644
index 12198c879..000000000
--- a/doc/manual/src/expressions/arguments-variables.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Arguments and Variables
-
-The [Nix expression for GNU Hello](expression-syntax.md) is a
-function; it is missing some arguments that have to be filled in
-somewhere. In the Nix Packages collection this is done in the file
-`pkgs/top-level/all-packages.nix`, where all Nix expressions for
-packages are imported and called with the appropriate arguments. Here
-are some fragments of `all-packages.nix`, with annotations of what
-they mean:
-
-```nix
-...
-
-rec { â‘ 
-
- hello = import ../applications/misc/hello/ex-1 ② { ③
- inherit fetchurl stdenv perl;
- };
-
- perl = import ../development/interpreters/perl { â‘Ł
- inherit fetchurl stdenv;
- };
-
- fetchurl = import ../build-support/fetchurl {
- inherit stdenv; ...
- };
-
- stdenv = ...;
-
-}
-```
-
-1. This file defines a set of attributes, all of which are concrete
- derivations (i.e., not functions). In fact, we define a *mutually
- recursive* set of attributes. That is, the attributes can refer to
- each other. This is precisely what we want since we want to “plug”
- the various packages into each other.
-
-2. Here we *import* the Nix expression for GNU Hello. The import
- operation just loads and returns the specified Nix expression. In
- fact, we could just have put the contents of the Nix expression
- for GNU Hello in `all-packages.nix` at this point. That would be
- completely equivalent, but it would make `all-packages.nix` rather
- bulky.
-
- Note that we refer to `../applications/misc/hello/ex-1`, not
- `../applications/misc/hello/ex-1/default.nix`. When you try to
- import a directory, Nix automatically appends `/default.nix` to the
- file name.
-
-3. This is where the actual composition takes place. Here we *call* the
- function imported from `../applications/misc/hello/ex-1` with a set
- containing the things that the function expects, namely `fetchurl`,
- `stdenv`, and `perl`. We use inherit again to use the attributes
- defined in the surrounding scope (we could also have written
- `fetchurl = fetchurl;`, etc.).
-
- The result of this function call is an actual derivation that can be
- built by Nix (since when we fill in the arguments of the function,
- what we get is its body, which is the call to `stdenv.mkDerivation`
- in the [Nix expression for GNU Hello](expression-syntax.md)).
-
- > **Note**
- >
- > Nixpkgs has a convenience function `callPackage` that imports and
- > calls a function, filling in any missing arguments by passing the
- > corresponding attribute from the Nixpkgs set, like this:
- >
- > ```nix
- > hello = callPackage ../applications/misc/hello/ex-1 { };
- > ```
- >
- > If necessary, you can set or override arguments:
- >
- > ```nix
- > hello = callPackage ../applications/misc/hello/ex-1 { stdenv = myStdenv; };
- > ```
-
-4. Likewise, we have to instantiate Perl, `fetchurl`, and the standard
- environment.
diff --git a/doc/manual/src/expressions/build-script.md b/doc/manual/src/expressions/build-script.md
deleted file mode 100644
index b1eacae88..000000000
--- a/doc/manual/src/expressions/build-script.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Build Script
-
-Here is the builder referenced from Hello's Nix expression (stored in
-`pkgs/applications/misc/hello/ex-1/builder.sh`):
-
-```bash
-source $stdenv/setup â‘ 
-
-PATH=$perl/bin:$PATH ②
-
-tar xvfz $src ③
-cd hello-*
-./configure --prefix=$out â‘Ł
-make ⑤
-make install
-```
-
-The builder can actually be made a lot shorter by using the *generic
-builder* functions provided by `stdenv`, but here we write out the build
-steps to elucidate what a builder does. It performs the following steps:
-
-1. When Nix runs a builder, it initially completely clears the
- environment (except for the attributes declared in the derivation).
- This is done to prevent undeclared inputs from being used in the
- build process. If for example the `PATH` contained `/usr/bin`, then
- you might accidentally use `/usr/bin/gcc`.
-
- So the first step is to set up the environment. This is done by
- calling the `setup` script of the standard environment. The
- environment variable `stdenv` points to the location of the
- standard environment being used. (It wasn't specified explicitly
- as an attribute in Hello's Nix expression, but `mkDerivation` adds
- it automatically.)
-
-2. Since Hello needs Perl, we have to make sure that Perl is in the
- `PATH`. The `perl` environment variable points to the location of
- the Perl package (since it was passed in as an attribute to the
- derivation), so `$perl/bin` is the directory containing the Perl
- interpreter.
-
-3. Now we have to unpack the sources. The `src` attribute was bound to
- the result of fetching the Hello source tarball from the network, so
- the `src` environment variable points to the location in the Nix
- store to which the tarball was downloaded. After unpacking, we `cd`
- to the resulting source directory.
-
- The whole build is performed in a temporary directory created in
- `/tmp`, by the way. This directory is removed after the builder
- finishes, so there is no need to clean up the sources afterwards.
- Also, the temporary directory is always newly created, so you don't
- have to worry about files from previous builds interfering with the
- current build.
-
-4. GNU Hello is a typical Autoconf-based package, so we first have to
- run its `configure` script. In Nix every package is stored in a
- separate location in the Nix store, for instance
- `/nix/store/9a54ba97fb71b65fda531012d0443ce2-hello-2.1.1`. Nix
- computes this path by cryptographically hashing all attributes of
- the derivation. The path is passed to the builder through the `out`
- environment variable. So here we give `configure` the parameter
- `--prefix=$out` to cause Hello to be installed in the expected
- location.
-
-5. Finally we build Hello (`make`) and install it into the location
- specified by `out` (`make install`).
-
-If you are wondering about the absence of error checking on the result
-of various commands called in the builder: this is because the shell
-script is evaluated with Bash's `-e` option, which causes the script to
-be aborted if any command fails without an error check.
diff --git a/doc/manual/src/expressions/expression-language.md b/doc/manual/src/expressions/expression-language.md
deleted file mode 100644
index 267fcb983..000000000
--- a/doc/manual/src/expressions/expression-language.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Nix Expression Language
-
-The Nix expression language is a pure, lazy, functional language. Purity
-means that operations in the language don't have side-effects (for
-instance, there is no variable assignment). Laziness means that
-arguments to functions are evaluated only when they are needed.
-Functional means that functions are “normal” values that can be passed
-around and manipulated in interesting ways. The language is not a
-full-featured, general purpose language. Its main job is to describe
-packages, compositions of packages, and the variability within packages.
-
-This section presents the various features of the language.
diff --git a/doc/manual/src/expressions/expression-syntax.md b/doc/manual/src/expressions/expression-syntax.md
deleted file mode 100644
index 6b93e692c..000000000
--- a/doc/manual/src/expressions/expression-syntax.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# Expression Syntax
-
-Here is a Nix expression for GNU Hello:
-
-```nix
-{ stdenv, fetchurl, perl }: â‘ 
-
-stdenv.mkDerivation { ②
- name = "hello-2.1.1"; ③
- builder = ./builder.sh; â‘Ł
- src = fetchurl { ⑤
- url = "ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz";
- sha256 = "1md7jsfd8pa45z73bz1kszpp01yw6x5ljkjk2hx7wl800any6465";
- };
- inherit perl; â‘Ą
-}
-```
-
-This file is actually already in the Nix Packages collection in
-`pkgs/applications/misc/hello/ex-1/default.nix`. It is customary to
-place each package in a separate directory and call the single Nix
-expression in that directory `default.nix`. The file has the following
-elements (referenced from the figure by number):
-
-1. This states that the expression is a *function* that expects to be
- called with three arguments: `stdenv`, `fetchurl`, and `perl`. They
- are needed to build Hello, but we don't know how to build them here;
- that's why they are function arguments. `stdenv` is a package that
- is used by almost all Nix Packages; it provides a
- “standard” environment consisting of the things you would expect
- in a basic Unix environment: a C/C++ compiler (GCC, to be precise),
- the Bash shell, fundamental Unix tools such as `cp`, `grep`, `tar`,
- etc. `fetchurl` is a function that downloads files. `perl` is the
- Perl interpreter.
-
- Nix functions generally have the form `{ x, y, ..., z }: e` where
- `x`, `y`, etc. are the names of the expected arguments, and where
- *e* is the body of the function. So here, the entire remainder of
- the file is the body of the function; when given the required
- arguments, the body should describe how to build an instance of
- the Hello package.
-
-2. So we have to build a package. Building something from other stuff
- is called a *derivation* in Nix (as opposed to sources, which are
- built by humans instead of computers). We perform a derivation by
- calling `stdenv.mkDerivation`. `mkDerivation` is a function
- provided by `stdenv` that builds a package from a set of
- *attributes*. A set is just a list of key/value pairs where each
- key is a string and each value is an arbitrary Nix
- expression. They take the general form `{ name1 = expr1; ...
- nameN = exprN; }`.
-
-3. The attribute `name` specifies the symbolic name and version of
- the package. Nix doesn't really care about these things, but they
- are used by for instance `nix-env -q` to show a “human-readable”
- name for packages. This attribute is required by `mkDerivation`.
-
-4. The attribute `builder` specifies the builder. This attribute can
- sometimes be omitted, in which case `mkDerivation` will fill in a
- default builder (which does a `configure; make; make install`, in
- essence). Hello is sufficiently simple that the default builder
- would suffice, but in this case, we will show an actual builder
- for educational purposes. The value `./builder.sh` refers to the
- shell script shown in the [next section](build-script.md),
- discussed below.
-
-5. The builder has to know what the sources of the package are. Here,
- the attribute `src` is bound to the result of a call to the
- `fetchurl` function. Given a URL and a SHA-256 hash of the expected
- contents of the file at that URL, this function builds a derivation
- that downloads the file and checks its hash. So the sources are a
- dependency that like all other dependencies is built before Hello
- itself is built.
-
- Instead of `src` any other name could have been used, and in fact
- there can be any number of sources (bound to different attributes).
- However, `src` is customary, and it's also expected by the default
- builder (which we don't use in this example).
-
-6. Since the derivation requires Perl, we have to pass the value of the
- `perl` function argument to the builder. All attributes in the set
- are actually passed as environment variables to the builder, so
- declaring an attribute
-
- ```nix
- perl = perl;
- ```
-
- will do the trick: it binds an attribute `perl` to the function
- argument which also happens to be called `perl`. However, it looks a
- bit silly, so there is a shorter syntax. The `inherit` keyword
- causes the specified attributes to be bound to whatever variables
- with the same name happen to be in scope.
diff --git a/doc/manual/src/expressions/generic-builder.md b/doc/manual/src/expressions/generic-builder.md
deleted file mode 100644
index cf26b5f82..000000000
--- a/doc/manual/src/expressions/generic-builder.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# Generic Builder Syntax
-
-Recall that the [build script for GNU Hello](build-script.md) looked
-something like this:
-
-```bash
-PATH=$perl/bin:$PATH
-tar xvfz $src
-cd hello-*
-./configure --prefix=$out
-make
-make install
-```
-
-The builders for almost all Unix packages look like this — set up some
-environment variables, unpack the sources, configure, build, and
-install. For this reason the standard environment provides some Bash
-functions that automate the build process. Here is what a builder using
-the generic build facilities looks like:
-
-```bash
-buildInputs="$perl" â‘ 
-
-source $stdenv/setup ②
-
-genericBuild ③
-```
-
-Here is what each line means:
-
-1. The `buildInputs` variable tells `setup` to use the indicated
- packages as “inputs”. This means that if a package provides a `bin`
- subdirectory, it's added to `PATH`; if it has a `include`
- subdirectory, it's added to GCC's header search path; and so on.
- (This is implemented in a modular way: `setup` tries to source the
- file `pkg/nix-support/setup-hook` of all dependencies. These “setup
- hooks” can then set up whatever environment variables they want; for
- instance, the setup hook for Perl sets the `PERL5LIB` environment
- variable to contain the `lib/site_perl` directories of all inputs.)
-
-2. The function `genericBuild` is defined in the file `$stdenv/setup`.
-
-3. The final step calls the shell function `genericBuild`, which
- performs the steps that were done explicitly in the previous build
- script. The generic builder is smart enough to figure out whether
- to unpack the sources using `gzip`, `bzip2`, etc. It can be
- customised in many ways; see the Nixpkgs manual for details.
-
-Discerning readers will note that the `buildInputs` could just as well
-have been set in the Nix expression, like this:
-
-```nix
- buildInputs = [ perl ];
-```
-
-The `perl` attribute can then be removed, and the builder becomes even
-shorter:
-
-```bash
-source $stdenv/setup
-genericBuild
-```
-
-In fact, `mkDerivation` provides a default builder that looks exactly
-like that, so it is actually possible to omit the builder for Hello
-entirely.
diff --git a/doc/manual/src/expressions/language-values.md b/doc/manual/src/expressions/language-values.md
deleted file mode 100644
index 75ae9f2eb..000000000
--- a/doc/manual/src/expressions/language-values.md
+++ /dev/null
@@ -1,251 +0,0 @@
-# Values
-
-## Simple Values
-
-Nix has the following basic data types:
-
- - *Strings* can be written in three ways.
-
- The most common way is to enclose the string between double quotes,
- e.g., `"foo bar"`. Strings can span multiple lines. The special
- characters `"` and `\` and the character sequence `${` must be
- escaped by prefixing them with a backslash (`\`). Newlines, carriage
- returns and tabs can be written as `\n`, `\r` and `\t`,
- respectively.
-
- You can include the result of an expression into a string by
- enclosing it in `${...}`, a feature known as *antiquotation*. The
- enclosed expression must evaluate to something that can be coerced
- into a string (meaning that it must be a string, a path, or a
- derivation). For instance, rather than writing
-
- ```nix
- "--with-freetype2-library=" + freetype + "/lib"
- ```
-
- (where `freetype` is a derivation), you can instead write the more
- natural
-
- ```nix
- "--with-freetype2-library=${freetype}/lib"
- ```
-
- The latter is automatically translated to the former. A more
- complicated example (from the Nix expression for
- [Qt](http://www.trolltech.com/products/qt)):
-
- ```nix
- configureFlags = "
- -system-zlib -system-libpng -system-libjpeg
- ${if openglSupport then "-dlopen-opengl
- -L${mesa}/lib -I${mesa}/include
- -L${libXmu}/lib -I${libXmu}/include" else ""}
- ${if threadSupport then "-thread" else "-no-thread"}
- ";
- ```
-
- Note that Nix expressions and strings can be arbitrarily nested; in
- this case the outer string contains various antiquotations that
- themselves contain strings (e.g., `"-thread"`), some of which in
- turn contain expressions (e.g., `${mesa}`).
-
- The second way to write string literals is as an *indented string*,
- which is enclosed between pairs of *double single-quotes*, like so:
-
- ```nix
- ''
- This is the first line.
- This is the second line.
- This is the third line.
- ''
- ```
-
- This kind of string literal intelligently strips indentation from
- the start of each line. To be precise, it strips from each line a
- number of spaces equal to the minimal indentation of the string as a
- whole (disregarding the indentation of empty lines). For instance,
- the first and second line are indented two spaces, while the third
- line is indented four spaces. Thus, two spaces are stripped from
- each line, so the resulting string is
-
- ```nix
- "This is the first line.\nThis is the second line.\n This is the third line.\n"
- ```
-
- Note that the whitespace and newline following the opening `''` is
- ignored if there is no non-whitespace text on the initial line.
-
- Antiquotation (`${expr}`) is supported in indented strings.
-
- Since `${` and `''` have special meaning in indented strings, you
- need a way to quote them. `$` can be escaped by prefixing it with
- `''` (that is, two single quotes), i.e., `''$`. `''` can be escaped
- by prefixing it with `'`, i.e., `'''`. `$` removes any special
- meaning from the following `$`. Linefeed, carriage-return and tab
- characters can be written as `''\n`, `''\r`, `''\t`, and `''\`
- escapes any other character.
-
- Indented strings are primarily useful in that they allow multi-line
- string literals to follow the indentation of the enclosing Nix
- expression, and that less escaping is typically necessary for
- strings representing languages such as shell scripts and
- configuration files because `''` is much less common than `"`.
- Example:
-
- ```nix
- stdenv.mkDerivation {
- ...
- postInstall =
- ''
- mkdir $out/bin $out/etc
- cp foo $out/bin
- echo "Hello World" > $out/etc/foo.conf
- ${if enableBar then "cp bar $out/bin" else ""}
- '';
- ...
- }
- ```
-
- Finally, as a convenience, *URIs* as defined in appendix B of
- [RFC 2396](http://www.ietf.org/rfc/rfc2396.txt) can be written *as
- is*, without quotes. For instance, the string
- `"http://example.org/foo.tar.bz2"` can also be written as
- `http://example.org/foo.tar.bz2`.
-
- - Numbers, which can be *integers* (like `123`) or *floating point*
- (like `123.43` or `.27e13`).
-
- Numbers are type-compatible: pure integer operations will always
- return integers, whereas any operation involving at least one
- floating point number will have a floating point number as a result.
-
- - *Paths*, e.g., `/bin/sh` or `./builder.sh`. A path must contain at
- least one slash to be recognised as such. For instance, `builder.sh`
- is not a path: it's parsed as an expression that selects the
- attribute `sh` from the variable `builder`. If the file name is
- relative, i.e., if it does not begin with a slash, it is made
- absolute at parse time relative to the directory of the Nix
- expression that contained it. For instance, if a Nix expression in
- `/foo/bar/bla.nix` refers to `../xyzzy/fnord.nix`, the absolute path
- is `/foo/xyzzy/fnord.nix`.
-
- If the first component of a path is a `~`, it is interpreted as if
- the rest of the path were relative to the user's home directory.
- e.g. `~/foo` would be equivalent to `/home/edolstra/foo` for a user
- whose home directory is `/home/edolstra`.
-
- Paths can also be specified between angle brackets, e.g.
- `<nixpkgs>`. This means that the directories listed in the
- environment variable `NIX_PATH` will be searched for the given file
- or directory name.
-
- Antiquotation is supported in any paths except those in angle brackets.
- `./${foo}-${bar}.nix` is a more convenient way of writing
- `./. + "/" + foo + "-" + bar + ".nix"` or `./. + "/${foo}-${bar}.nix"`. At
- least one slash must appear *before* any antiquotations for this to be
- recognized as a path. `a.${foo}/b.${bar}` is a syntactically valid division
- operation. `./a.${foo}/b.${bar}` is a path.
-
- - *Booleans* with values `true` and `false`.
-
- - The null value, denoted as `null`.
-
-## Lists
-
-Lists are formed by enclosing a whitespace-separated list of values
-between square brackets. For example,
-
-```nix
-[ 123 ./foo.nix "abc" (f { x = y; }) ]
-```
-
-defines a list of four elements, the last being the result of a call to
-the function `f`. Note that function calls have to be enclosed in
-parentheses. If they had been omitted, e.g.,
-
-```nix
-[ 123 ./foo.nix "abc" f { x = y; } ]
-```
-
-the result would be a list of five elements, the fourth one being a
-function and the fifth being a set.
-
-Note that lists are only lazy in values, and they are strict in length.
-
-## Sets
-
-Sets are really the core of the language, since ultimately the Nix
-language is all about creating derivations, which are really just sets
-of attributes to be passed to build scripts.
-
-Sets are just a list of name/value pairs (called *attributes*) enclosed
-in curly brackets, where each value is an arbitrary expression
-terminated by a semicolon. For example:
-
-```nix
-{ x = 123;
- text = "Hello";
- y = f { bla = 456; };
-}
-```
-
-This defines a set with attributes named `x`, `text`, `y`. The order of
-the attributes is irrelevant. An attribute name may only occur once.
-
-Attributes can be selected from a set using the `.` operator. For
-instance,
-
-```nix
-{ a = "Foo"; b = "Bar"; }.a
-```
-
-evaluates to `"Foo"`. It is possible to provide a default value in an
-attribute selection using the `or` keyword. For example,
-
-```nix
-{ a = "Foo"; b = "Bar"; }.c or "Xyzzy"
-```
-
-will evaluate to `"Xyzzy"` because there is no `c` attribute in the set.
-
-You can use arbitrary double-quoted strings as attribute names:
-
-```nix
-{ "foo ${bar}" = 123; "nix-1.0" = 456; }."foo ${bar}"
-```
-
-This will evaluate to `123` (Assuming `bar` is antiquotable). In the
-case where an attribute name is just a single antiquotation, the quotes
-can be dropped:
-
-```nix
-{ foo = 123; }.${bar} or 456
-```
-
-This will evaluate to `123` if `bar` evaluates to `"foo"` when coerced
-to a string and `456` otherwise (again assuming `bar` is antiquotable).
-
-In the special case where an attribute name inside of a set declaration
-evaluates to `null` (which is normally an error, as `null` is not
-antiquotable), that attribute is simply not added to the set:
-
-```nix
-{ ${if foo then "bar" else null} = true; }
-```
-
-This will evaluate to `{}` if `foo` evaluates to `false`.
-
-A set that has a `__functor` attribute whose value is callable (i.e. is
-itself a function or a set with a `__functor` attribute whose value is
-callable) can be applied as if it were a function, with the set itself
-passed in first , e.g.,
-
-```nix
-let add = { __functor = self: x: x + self.x; };
- inc = add // { x = 1; };
-in inc 1
-```
-
-evaluates to `2`. This can be used to attach metadata to a function
-without the caller needing to treat it specially, or to implement a form
-of object-oriented programming, for example.
diff --git a/doc/manual/src/expressions/simple-building-testing.md b/doc/manual/src/expressions/simple-building-testing.md
deleted file mode 100644
index 7f0d8f841..000000000
--- a/doc/manual/src/expressions/simple-building-testing.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Building and Testing
-
-You can now try to build Hello. Of course, you could do `nix-env -f . -iA
-hello`, but you may not want to install a possibly broken package just
-yet. The best way to test the package is by using the command
-`nix-build`, which builds a Nix expression and creates a symlink named
-`result` in the current directory:
-
-```console
-$ nix-build -A hello
-building path `/nix/store/632d2b22514d...-hello-2.1.1'
-hello-2.1.1/
-hello-2.1.1/intl/
-hello-2.1.1/intl/ChangeLog
-...
-
-$ ls -l result
-lrwxrwxrwx ... 2006-09-29 10:43 result -> /nix/store/632d2b22514d...-hello-2.1.1
-
-$ ./result/bin/hello
-Hello, world!
-```
-
-The `-A` option selects the `hello` attribute. This is faster than
-using the symbolic package name specified by the `name` attribute
-(which also happens to be `hello`) and is unambiguous (there can be
-multiple packages with the symbolic name `hello`, but there can be
-only one attribute in a set named `hello`).
-
-`nix-build` registers the `./result` symlink as a garbage collection
-root, so unless and until you delete the `./result` symlink, the output
-of the build will be safely kept on your system. You can use
-`nix-build`’s `-o` switch to give the symlink another name.
-
-Nix has transactional semantics. Once a build finishes successfully, Nix
-makes a note of this in its database: it registers that the path denoted
-by `out` is now “valid”. If you try to build the derivation again, Nix
-will see that the path is already valid and finish immediately. If a
-build fails, either because it returns a non-zero exit code, because Nix
-or the builder are killed, or because the machine crashes, then the
-output paths will not be registered as valid. If you try to build the
-derivation again, Nix will remove the output paths if they exist (e.g.,
-because the builder died half-way through `make
-install`) and try again. Note that there is no “negative caching”: Nix
-doesn't remember that a build failed, and so a failed build can always
-be repeated. This is because Nix cannot distinguish between permanent
-failures (e.g., a compiler error due to a syntax error in the source)
-and transient failures (e.g., a disk full condition).
-
-Nix also performs locking. If you run multiple Nix builds
-simultaneously, and they try to build the same derivation, the first Nix
-instance that gets there will perform the build, while the others block
-(or perform other derivations if available) until the build finishes:
-
-```console
-$ nix-build -A hello
-waiting for lock on `/nix/store/0h5b7hp8d4hqfrw8igvx97x1xawrjnac-hello-2.1.1x'
-```
-
-So it is always safe to run multiple instances of Nix in parallel (which
-isn’t the case with, say, `make`).
diff --git a/doc/manual/src/expressions/simple-expression.md b/doc/manual/src/expressions/simple-expression.md
deleted file mode 100644
index 857f71b9b..000000000
--- a/doc/manual/src/expressions/simple-expression.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# A Simple Nix Expression
-
-This section shows how to add and test the [GNU Hello
-package](http://www.gnu.org/software/hello/hello.html) to the Nix
-Packages collection. Hello is a program that prints out the text “Hello,
-world\!”.
-
-To add a package to the Nix Packages collection, you generally need to
-do three things:
-
-1. Write a Nix expression for the package. This is a file that
- describes all the inputs involved in building the package, such as
- dependencies, sources, and so on.
-
-2. Write a *builder*. This is a shell script that builds the package
- from the inputs. (In fact, it can be written in any language, but
- typically it's a `bash` shell script.)
-
-3. Add the package to the file `pkgs/top-level/all-packages.nix`. The
- Nix expression written in the first step is a *function*; it
- requires other packages in order to build it. In this step you put
- it all together, i.e., you call the function with the right
- arguments to build the actual package.
diff --git a/doc/manual/src/expressions/writing-nix-expressions.md b/doc/manual/src/expressions/writing-nix-expressions.md
deleted file mode 100644
index 5664108e7..000000000
--- a/doc/manual/src/expressions/writing-nix-expressions.md
+++ /dev/null
@@ -1,12 +0,0 @@
-This chapter shows you how to write Nix expressions, which instruct Nix
-how to build packages. It starts with a simple example (a Nix expression
-for GNU Hello), and then moves on to a more in-depth look at the Nix
-expression language.
-
-> **Note**
->
-> This chapter is mostly about the Nix expression language. For more
-> extensive information on adding packages to the Nix Packages
-> collection (such as functions in the standard environment and coding
-> conventions), please consult [its
-> manual](http://nixos.org/nixpkgs/manual/).
diff --git a/doc/manual/src/glossary.md b/doc/manual/src/glossary.md
index 3448b971b..70a0eb994 100644
--- a/doc/manual/src/glossary.md
+++ b/doc/manual/src/glossary.md
@@ -3,14 +3,48 @@
- [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
+ using the [`derivation` primitive](language/derivations.md). These are
translated into low-level *store derivations* (implicitly by
`nix-env` and `nix-build`, or explicitly by `nix-instantiate`).
+ - [content-addressed derivation]{#gloss-content-addressed-derivation}\
+ A derivation which has the
+ [`__contentAddressed`](language/advanced-attributes.md#adv-attr-__contentAddressed)
+ attribute set to `true`.
+
+ - [fixed-output derivation]{#gloss-fixed-output-derivation}\
+ A derivation which includes the
+ [`outputHash`](language/advanced-attributes.md#adv-attr-outputHash) attribute.
+
- [store]{#gloss-store}\
The location in the file system where store objects live. Typically
`/nix/store`.
+ From the perspective of the location where Nix is
+ invoked, the Nix store can be referred to
+ as a "_local_" or a "_remote_" one:
+
+ + A *local store* exists on the filesystem of
+ the machine where Nix is invoked. You can use other
+ local stores by passing the `--store` flag to the
+ `nix` command. Local stores can be used for building derivations.
+
+ + A *remote store* exists anywhere other than the
+ local filesystem. One example is the `/nix/store`
+ directory on another machine, accessed via `ssh` or
+ served by the `nix-serve` Perl script.
+
+ - [chroot store]{#gloss-chroot-store}\
+ A local store whose canonical path is anything other than `/nix/store`.
+
+ - [binary cache]{#gloss-binary-cache}\
+ A *binary cache* is a Nix store which uses a different format: its
+ metadata and signatures are kept in `.narinfo` files rather than in a
+ Nix database. This different format simplifies serving store objects
+ over the network, but cannot host builds. Examples of binary caches
+ include S3 buckets and the [NixOS binary
+ cache](https://cache.nixos.org).
+
- [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.
@@ -22,6 +56,19 @@
derivation outputs (objects produced by running a build action), or
derivations (files describing a build action).
+ - [input-addressed store object]{#gloss-input-addressed-store-object}\
+ A store object produced by building a
+ non-[content-addressed](#gloss-content-addressed-derivation),
+ non-[fixed-output](#gloss-fixed-output-derivation)
+ derivation.
+
+ - [output-addressed store object]{#gloss-output-addressed-store-object}\
+ A store object whose store path hashes its content. This
+ includes derivations, the outputs of
+ [content-addressed derivations](#gloss-content-addressed-derivation),
+ and the outputs of
+ [fixed-output derivations](#gloss-fixed-output-derivation).
+
- [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
@@ -29,6 +76,11 @@
store object by downloading a pre-built version of the store object
from some server.
+ - [substituter]{#gloss-substituter}\
+ A *substituter* is an additional store from which Nix will
+ copy store objects it doesn't have. For details, see the
+ [`substituters` option](command-ref/conf-file.html#conf-substituters).
+
- [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
diff --git a/doc/manual/src/installation/installing-binary.md b/doc/manual/src/installation/installing-binary.md
index 9fb9c80c3..2d007ca1b 100644
--- a/doc/manual/src/installation/installing-binary.md
+++ b/doc/manual/src/installation/installing-binary.md
@@ -13,7 +13,7 @@ for your platform:
- multi-user on macOS
> **Notes on read-only filesystem root in macOS 10.15 Catalina +**
- >
+ >
> - It took some time to support this cleanly. You may see posts,
> examples, and tutorials using obsolete workarounds.
> - Supporting it cleanly made macOS installs too complex to qualify
@@ -31,8 +31,8 @@ $ sh <(curl -L https://nixos.org/nix/install) --no-daemon
```
This will perform a single-user installation of Nix, meaning that `/nix`
-is owned by the invoking user. You should run this under your usual user
-account, *not* as root. The script will invoke `sudo` to create `/nix`
+is owned by the invoking user. You can run this under your usual user
+account or root. The script will invoke `sudo` to create `/nix`
if it doesn’t already exist. If you don’t have `sudo`, you should
manually create `/nix` first as root, e.g.:
@@ -71,11 +71,11 @@ $ sh <(curl -L https://nixos.org/nix/install) --daemon
The multi-user installation of Nix will create build users between the
user IDs 30001 and 30032, and a group with the group ID 30000. You
-should run this under your usual user account, *not* as root. The script
+can run this under your usual user account or root. The script
will invoke `sudo` as needed.
> **Note**
->
+>
> If you need Nix to use a different group ID or user ID set, you will
> have to download the tarball manually and [edit the install
> script](#installing-from-a-binary-tarball).
@@ -148,7 +148,8 @@ and `/etc/zshrc` which you may remove.
This will remove all the build users that no longer serve a purpose.
4. Edit fstab using `sudo vifs` to remove the line mounting the Nix Store
- volume on `/nix`, which looks like this,
+ volume on `/nix`, which looks like
+ `UUID=<uuid> /nix apfs rw,noauto,nobrowse,suid,owners` or
`LABEL=Nix\040Store /nix apfs rw,nobrowse`. This will prevent automatic
mounting of the Nix Store volume.
@@ -167,7 +168,7 @@ and `/etc/zshrc` which you may remove.
removed next.
7. Remove the Nix Store volume:
-
+
```console
sudo diskutil apfs deleteVolume /nix
```
@@ -175,8 +176,20 @@ and `/etc/zshrc` which you may remove.
This will remove the Nix Store volume and everything that was added to the
store.
+ If the output indicates that the command couldn't remove the volume, you should
+ make sure you don't have an _unmounted_ Nix Store volume. Look for a
+ "Nix Store" volume in the output of the following command:
+
+ ```console
+ diskutil list
+ ```
+
+ If you _do_ see a "Nix Store" volume, delete it by re-running the diskutil
+ deleteVolume command, but replace `/nix` with the store volume's `diskXsY`
+ identifier.
+
> **Note**
->
+>
> After you complete the steps here, you will still have an empty `/nix`
> directory. This is an expected sign of a successful uninstall. The empty
> `/nix` directory will disappear the next time you reboot.
@@ -191,8 +204,7 @@ and `/etc/zshrc` which you may remove.
<!-- Note: anchors above to catch permalinks to old explanations -->
We believe we have ironed out how to cleanly support the read-only root
-on modern macOS. New installs will do this automatically, and you can
-also re-run a new installer to convert your existing setup.
+on modern macOS. New installs will do this automatically.
This section previously detailed the situation, options, and trade-offs,
but it now only outlines what the installer does. You don't need to know
diff --git a/doc/manual/src/expressions/advanced-attributes.md b/doc/manual/src/language/advanced-attributes.md
index 2e7e80ed0..2e7e80ed0 100644
--- a/doc/manual/src/expressions/advanced-attributes.md
+++ b/doc/manual/src/language/advanced-attributes.md
diff --git a/doc/manual/src/expressions/builtin-constants.md b/doc/manual/src/language/builtin-constants.md
index 78d066a82..78d066a82 100644
--- a/doc/manual/src/expressions/builtin-constants.md
+++ b/doc/manual/src/language/builtin-constants.md
diff --git a/doc/manual/src/expressions/builtins-prefix.md b/doc/manual/src/language/builtins-prefix.md
index c631a8453..c631a8453 100644
--- a/doc/manual/src/expressions/builtins-prefix.md
+++ b/doc/manual/src/language/builtins-prefix.md
diff --git a/doc/manual/src/expressions/builtins-suffix.md b/doc/manual/src/language/builtins-suffix.md
index a74db2857..a74db2857 100644
--- a/doc/manual/src/expressions/builtins-suffix.md
+++ b/doc/manual/src/language/builtins-suffix.md
diff --git a/doc/manual/src/expressions/language-constructs.md b/doc/manual/src/language/constructs.md
index 1c01f2cc7..1c01f2cc7 100644
--- a/doc/manual/src/expressions/language-constructs.md
+++ b/doc/manual/src/language/constructs.md
diff --git a/doc/manual/src/expressions/derivations.md b/doc/manual/src/language/derivations.md
index 3391ec0d8..3391ec0d8 100644
--- a/doc/manual/src/expressions/derivations.md
+++ b/doc/manual/src/language/derivations.md
diff --git a/doc/manual/src/language/index.md b/doc/manual/src/language/index.md
new file mode 100644
index 000000000..a4b402f8b
--- /dev/null
+++ b/doc/manual/src/language/index.md
@@ -0,0 +1,33 @@
+# Nix Language
+
+The Nix language is
+
+- *domain-specific*
+
+ It only exists for the Nix package manager:
+ to describe packages and configurations as well as their variants and compositions.
+ It is not intended for general purpose use.
+
+- *declarative*
+
+ There is no notion of executing sequential steps.
+ Dependencies between operations are established only through data.
+
+- *pure*
+
+ Values cannot change during computation.
+ Functions always produce the same output if their input does not change.
+
+- *functional*
+
+ Functions are like any other value.
+ Functions can be assigned to names, taken as arguments, or returned by functions.
+
+- *lazy*
+
+ Expressions are only evaluated when their value is needed.
+
+- *dynamically typed*
+
+ Type errors are only detected when expressions are evaluated.
+
diff --git a/doc/manual/src/expressions/language-operators.md b/doc/manual/src/language/operators.md
index 268b44f4c..32398189d 100644
--- a/doc/manual/src/expressions/language-operators.md
+++ b/doc/manual/src/language/operators.md
@@ -1,6 +1,6 @@
# Operators
-The table below lists the operators in the Nix expression language, in
+The table below lists the operators in the Nix language, in
order of precedence (from strongest to weakest binding).
| Name | Syntax | Associativity | Description | Precedence |
diff --git a/doc/manual/src/language/values.md b/doc/manual/src/language/values.md
new file mode 100644
index 000000000..6fc8c0369
--- /dev/null
+++ b/doc/manual/src/language/values.md
@@ -0,0 +1,275 @@
+# Data Types
+
+## Primitives
+
+- <a id="type-string" href="#type-string">String</a>
+
+ *Strings* can be written in three ways.
+
+ The most common way is to enclose the string between double quotes,
+ e.g., `"foo bar"`. Strings can span multiple lines. The special
+ characters `"` and `\` and the character sequence `${` must be
+ escaped by prefixing them with a backslash (`\`). Newlines, carriage
+ returns and tabs can be written as `\n`, `\r` and `\t`,
+ respectively.
+
+ You can include the result of an expression into a string by
+ enclosing it in `${...}`, a feature known as *antiquotation*. The
+ enclosed expression must evaluate to something that can be coerced
+ into a string (meaning that it must be a string, a path, or a
+ derivation). For instance, rather than writing
+
+ ```nix
+ "--with-freetype2-library=" + freetype + "/lib"
+ ```
+
+ (where `freetype` is a derivation), you can instead write the more
+ natural
+
+ ```nix
+ "--with-freetype2-library=${freetype}/lib"
+ ```
+
+ The latter is automatically translated to the former. A more
+ complicated example (from the Nix expression for
+ [Qt](http://www.trolltech.com/products/qt)):
+
+ ```nix
+ configureFlags = "
+ -system-zlib -system-libpng -system-libjpeg
+ ${if openglSupport then "-dlopen-opengl
+ -L${mesa}/lib -I${mesa}/include
+ -L${libXmu}/lib -I${libXmu}/include" else ""}
+ ${if threadSupport then "-thread" else "-no-thread"}
+ ";
+ ```
+
+ Note that Nix expressions and strings can be arbitrarily nested; in
+ this case the outer string contains various antiquotations that
+ themselves contain strings (e.g., `"-thread"`), some of which in
+ turn contain expressions (e.g., `${mesa}`).
+
+ The second way to write string literals is as an *indented string*,
+ which is enclosed between pairs of *double single-quotes*, like so:
+
+ ```nix
+ ''
+ This is the first line.
+ This is the second line.
+ This is the third line.
+ ''
+ ```
+
+ This kind of string literal intelligently strips indentation from
+ the start of each line. To be precise, it strips from each line a
+ number of spaces equal to the minimal indentation of the string as a
+ whole (disregarding the indentation of empty lines). For instance,
+ the first and second line are indented two spaces, while the third
+ line is indented four spaces. Thus, two spaces are stripped from
+ each line, so the resulting string is
+
+ ```nix
+ "This is the first line.\nThis is the second line.\n This is the third line.\n"
+ ```
+
+ Note that the whitespace and newline following the opening `''` is
+ ignored if there is no non-whitespace text on the initial line.
+
+ Antiquotation (`${expr}`) is supported in indented strings.
+
+ Since `${` and `''` have special meaning in indented strings, you
+ need a way to quote them. `$` can be escaped by prefixing it with
+ `''` (that is, two single quotes), i.e., `''$`. `''` can be escaped
+ by prefixing it with `'`, i.e., `'''`. `$` removes any special
+ meaning from the following `$`. Linefeed, carriage-return and tab
+ characters can be written as `''\n`, `''\r`, `''\t`, and `''\`
+ escapes any other character.
+
+ Indented strings are primarily useful in that they allow multi-line
+ string literals to follow the indentation of the enclosing Nix
+ expression, and that less escaping is typically necessary for
+ strings representing languages such as shell scripts and
+ configuration files because `''` is much less common than `"`.
+ Example:
+
+ ```nix
+ stdenv.mkDerivation {
+ ...
+ postInstall =
+ ''
+ mkdir $out/bin $out/etc
+ cp foo $out/bin
+ echo "Hello World" > $out/etc/foo.conf
+ ${if enableBar then "cp bar $out/bin" else ""}
+ '';
+ ...
+ }
+ ```
+
+ Finally, as a convenience, *URIs* as defined in appendix B of
+ [RFC 2396](http://www.ietf.org/rfc/rfc2396.txt) can be written *as
+ is*, without quotes. For instance, the string
+ `"http://example.org/foo.tar.bz2"` can also be written as
+ `http://example.org/foo.tar.bz2`.
+
+- <a id="type-number" href="#type-number">Number</a>
+
+ Numbers, which can be *integers* (like `123`) or *floating point*
+ (like `123.43` or `.27e13`).
+
+ Numbers are type-compatible: pure integer operations will always
+ return integers, whereas any operation involving at least one
+ floating point number will have a floating point number as a result.
+
+- <a id="type-path" href="#type-path">Path</a>
+
+ *Paths*, e.g., `/bin/sh` or `./builder.sh`. A path must contain at
+ least one slash to be recognised as such. For instance, `builder.sh`
+ is not a path: it's parsed as an expression that selects the
+ attribute `sh` from the variable `builder`. If the file name is
+ relative, i.e., if it does not begin with a slash, it is made
+ absolute at parse time relative to the directory of the Nix
+ expression that contained it. For instance, if a Nix expression in
+ `/foo/bar/bla.nix` refers to `../xyzzy/fnord.nix`, the absolute path
+ is `/foo/xyzzy/fnord.nix`.
+
+ If the first component of a path is a `~`, it is interpreted as if
+ the rest of the path were relative to the user's home directory.
+ e.g. `~/foo` would be equivalent to `/home/edolstra/foo` for a user
+ whose home directory is `/home/edolstra`.
+
+ Paths can also be specified between angle brackets, e.g.
+ `<nixpkgs>`. This means that the directories listed in the
+ environment variable `NIX_PATH` will be searched for the given file
+ or directory name.
+
+ Antiquotation is supported in any paths except those in angle brackets.
+ `./${foo}-${bar}.nix` is a more convenient way of writing
+ `./. + "/" + foo + "-" + bar + ".nix"` or `./. + "/${foo}-${bar}.nix"`. At
+ least one slash must appear *before* any antiquotations for this to be
+ recognized as a path. `a.${foo}/b.${bar}` is a syntactically valid division
+ operation. `./a.${foo}/b.${bar}` is a path.
+
+ When a path appears in an antiquotation, and is thus coerced into a string,
+ the path is first copied into the Nix store and the resulting string is
+ the Nix store path. For instance `"${./foo.txt}" will cause `foo.txt` in
+ the current directory to be copied into the Nix store and result in the
+ string `"/nix/store/<HASH>-foo.txt"`.
+
+ Note that the Nix language assumes that all input files will remain
+ _unchanged_ during the course of the Nix expression evaluation.
+ If you for example antiquote a file path during a `nix repl` session, and
+ then later in the same session, after having changed the file contents,
+ evaluate the antiquotation with the file path again, then Nix will still
+ return the first store path. It will _not_ reread the file contents to
+ produce a different Nix store path.
+
+- <a id="type-boolean" href="#type-boolean">Boolean</a>
+
+ *Booleans* with values `true` and `false`.
+
+- <a id="type-null" href="#type-null">Null</a>
+
+ The null value, denoted as `null`.
+
+## List
+
+Lists are formed by enclosing a whitespace-separated list of values
+between square brackets. For example,
+
+```nix
+[ 123 ./foo.nix "abc" (f { x = y; }) ]
+```
+
+defines a list of four elements, the last being the result of a call to
+the function `f`. Note that function calls have to be enclosed in
+parentheses. If they had been omitted, e.g.,
+
+```nix
+[ 123 ./foo.nix "abc" f { x = y; } ]
+```
+
+the result would be a list of five elements, the fourth one being a
+function and the fifth being a set.
+
+Note that lists are only lazy in values, and they are strict in length.
+
+## Attribute Set
+
+An attribute set is a collection of name-value-pairs (called *attributes*) enclosed in curly brackets (`{ }`).
+
+Names and values are separated by an equal sign (`=`).
+Each value is an arbitrary expression terminated by a semicolon (`;`).
+
+Attributes can appear in any order.
+An attribute name may only occur once.
+
+Example:
+
+```nix
+{
+ x = 123;
+ text = "Hello";
+ y = f { bla = 456; };
+}
+```
+
+This defines a set with attributes named `x`, `text`, `y`.
+
+Attributes can be selected from a set using the `.` operator. For
+instance,
+
+```nix
+{ a = "Foo"; b = "Bar"; }.a
+```
+
+evaluates to `"Foo"`. It is possible to provide a default value in an
+attribute selection using the `or` keyword. For example,
+
+```nix
+{ a = "Foo"; b = "Bar"; }.c or "Xyzzy"
+```
+
+will evaluate to `"Xyzzy"` because there is no `c` attribute in the set.
+
+You can use arbitrary double-quoted strings as attribute names:
+
+```nix
+{ "foo ${bar}" = 123; "nix-1.0" = 456; }."foo ${bar}"
+```
+
+This will evaluate to `123` (Assuming `bar` is antiquotable). In the
+case where an attribute name is just a single antiquotation, the quotes
+can be dropped:
+
+```nix
+{ foo = 123; }.${bar} or 456
+```
+
+This will evaluate to `123` if `bar` evaluates to `"foo"` when coerced
+to a string and `456` otherwise (again assuming `bar` is antiquotable).
+
+In the special case where an attribute name inside of a set declaration
+evaluates to `null` (which is normally an error, as `null` is not
+antiquotable), that attribute is simply not added to the set:
+
+```nix
+{ ${if foo then "bar" else null} = true; }
+```
+
+This will evaluate to `{}` if `foo` evaluates to `false`.
+
+A set that has a `__functor` attribute whose value is callable (i.e. is
+itself a function or a set with a `__functor` attribute whose value is
+callable) can be applied as if it were a function, with the set itself
+passed in first , e.g.,
+
+```nix
+let add = { __functor = self: x: x + self.x; };
+ inc = add // { x = 1; };
+in inc 1
+```
+
+evaluates to `2`. This can be used to attach metadata to a function
+without the caller needing to treat it specially, or to implement a form
+of object-oriented programming, for example.
diff --git a/doc/manual/src/package-management/package-management.md b/doc/manual/src/package-management/package-management.md
index bd26a09ab..d528112e2 100644
--- a/doc/manual/src/package-management/package-management.md
+++ b/doc/manual/src/package-management/package-management.md
@@ -1,5 +1,4 @@
This chapter discusses how to do package management with Nix, i.e.,
how to obtain, install, upgrade, and erase packages. This is the
“user’s” perspective of the Nix system — people who want to *create*
-packages should consult the [chapter on writing Nix
-expressions](../expressions/writing-nix-expressions.md).
+packages should consult the chapter on the [Nix language](../language/index.md).
diff --git a/doc/manual/src/release-notes/rl-2.11.md b/doc/manual/src/release-notes/rl-2.11.md
new file mode 100644
index 000000000..b322a4e5e
--- /dev/null
+++ b/doc/manual/src/release-notes/rl-2.11.md
@@ -0,0 +1,5 @@
+# Release 2.11 (2022-08-24)
+
+* `nix copy` now copies the store paths in parallel as much as possible (again).
+ This doesn't apply for the `daemon` and `ssh-ng` stores which copy everything
+ in one batch to avoid latencies issues.
diff --git a/doc/manual/src/release-notes/rl-next.md b/doc/manual/src/release-notes/rl-next.md
index 36b759a10..e84b2eff6 100644
--- a/doc/manual/src/release-notes/rl-next.md
+++ b/doc/manual/src/release-notes/rl-next.md
@@ -1,3 +1,8 @@
# Release X.Y (202?-??-??)
-* Allow explicitly selecting outputs with *store derivations* installable syntax too.
+* `<nix/fetchurl.nix>` now accepts an additional argument `impure` which
+ defaults to `false`. If it is set to `true`, the `hash` and `sha256`
+ arguments will be ignored and the resulting derivation will have
+ `__impure` set to `true`, making it an impure derivation.
+
+* Allow explicitly selecting outputs with *store derivations* installable syntax too. \ No newline at end of file
diff --git a/doc/manual/utils.nix b/doc/manual/utils.nix
index d4b18472f..d0643ef46 100644
--- a/doc/manual/utils.nix
+++ b/doc/manual/utils.nix
@@ -5,6 +5,32 @@ rec {
concatStrings = concatStringsSep "";
+ replaceStringsRec = from: to: string:
+ # recursively replace occurrences of `from` with `to` within `string`
+ # example:
+ # replaceStringRec "--" "-" "hello-----world"
+ # => "hello-world"
+ let
+ replaced = replaceStrings [ from ] [ to ] string;
+ in
+ if replaced == string then string else replaceStringsRec from to replaced;
+
+ squash = replaceStringsRec "\n\n\n" "\n\n";
+
+ trim = string:
+ # trim trailing spaces and squash non-leading spaces
+ let
+ trimLine = line:
+ let
+ # separate leading spaces from the rest
+ parts = split "(^ *)" line;
+ spaces = head (elemAt parts 1);
+ rest = elemAt parts 2;
+ # drop trailing spaces
+ body = head (split " *$" rest);
+ in spaces + replaceStringsRec " " " " body;
+ in concatStringsSep "\n" (map trimLine (splitLines string));
+
# FIXME: O(n^2)
unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) [];