Compare commits

...

3 commits

Author SHA1 Message Date
Rebecca Turner
cf89bfc499 Format Nix code with nixfmt
Change-Id: I61efeb666ff7481c05fcb247168290e86a250151
2024-03-29 17:23:08 -07:00
Rebecca Turner
e7316a8e99 Add treefmt pre-commit hook
This lets us use different formatters for different filetypes.

Change-Id: Ib52383dd5097c8919a65e299aca2b5a55412223c
2024-03-29 17:23:06 -07:00
Rebecca Turner
7b3ef56094 Add pre-commit checks
The big ones here are `trim-trailing-whitespace` and `end-of-file-fixer`
(which makes sure that every file ends with exactly one newline
character).

Change-Id: Idca73b640883188f068f9903e013cf0d82aa1123
2024-03-29 17:22:56 -07:00
131 changed files with 1725 additions and 1254 deletions

View file

@ -48,4 +48,3 @@ PointerAlignment: Middle
SortIncludes: Never SortIncludes: Never
SpaceAfterCStyleCast: true SpaceAfterCStyleCast: true
SpaceAfterTemplateKeyword: false SpaceAfterTemplateKeyword: false

View file

@ -17,4 +17,3 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- run: bash scripts/check-hydra-status.sh - run: bash scripts/check-hydra-status.sh

2
.gitignore vendored
View file

@ -159,3 +159,5 @@ result-*
buildtime.bin buildtime.bin
.envrc.local .envrc.local
# We generate this with a Nix shell hook
/.pre-commit-config.yaml

22
COPYING
View file

@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be author's reputation will not be affected by problems that might be
introduced by others. introduced by others.
Finally, software patents pose a constant threat to the existence of Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a effectively restrict the users of a free program by obtaining a
@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The "work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must former contains code derived from the library, whereas the latter must
be combined with the library in order to run. be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does. and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's 1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an you conspicuously and appropriately publish on each copy an
@ -158,7 +158,7 @@ Library.
You may charge a fee for the physical act of transferring a copy, You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a and you may at your option offer warranty protection in exchange for a
fee. fee.
2. You may modify your copy or copies of the Library or any portion 2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1 distribute such modifications or work under the terms of Section 1
@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in that version instead if you wish.) Do not make any other change in
these notices. these notices.
Once this change is made in a given copy, it is irreversible for Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy. subsequent copies and derivative works made from that copy.
@ -267,7 +267,7 @@ Library will still fall under Section 6.)
distribute the object code for the work under the terms of Section 6. distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6, Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself. whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or 6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work work containing portions of the Library, and distribute that work
@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you use both them and the Library together in an executable that you
distribute. distribute.
7. You may place library facilities that are a work based on the 7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined facilities not covered by this License, and distribute such a combined
@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein. restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with You are not responsible for enforcing compliance by third parties with
this License. this License.
11. If, as a consequence of a court judgment or allegation of patent 11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues), infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or conditions are imposed on you (whether by court order, agreement or
@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by license version number, you may choose any version ever published by
the Free Software Foundation. the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free 14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these, programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is write to the author to ask for permission. For software which is
@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES. DAMAGES.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest If you develop a new library, and you want it to be of the greatest
@ -500,5 +500,3 @@ necessary. Here is a sample; alter the names:
Ty Coon, President of Vice Ty Coon, President of Vice
That's all there is to it! That's all there is to it!

View file

@ -9,7 +9,7 @@ index 0468aaec..b348d869 100644
+ size_t stack_limit; + size_t stack_limit;
if (!EXPECT(GC_thr_initialized, TRUE)) if (!EXPECT(GC_thr_initialized, TRUE))
GC_thr_init(); GC_thr_init();
@@ -411,6 +412,19 @@ GC_INNER void GC_push_all_stacks(void) @@ -411,6 +412,19 @@ GC_INNER void GC_push_all_stacks(void)
GC_push_all_stack_sections(lo, hi, p->traced_stack_sect); GC_push_all_stack_sections(lo, hi, p->traced_stack_sect);
} }
@ -37,7 +37,7 @@ index edab6c22..f2c61282 100644
@@ -2172,6 +2172,11 @@ GC_API void GC_CALL GC_win32_free_heap(void); @@ -2172,6 +2172,11 @@ GC_API void GC_CALL GC_win32_free_heap(void);
(*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_ignore_off_page) (*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_ignore_off_page)
#endif /* _AMIGA && !GC_AMIGA_MAKINGLIB */ #endif /* _AMIGA && !GC_AMIGA_MAKINGLIB */
+#if !__APPLE__ +#if !__APPLE__
+/* Patch doesn't work on apple */ +/* Patch doesn't work on apple */
+#define NIX_BOEHM_PATCH_VERSION 1 +#define NIX_BOEHM_PATCH_VERSION 1

View file

@ -3,7 +3,7 @@ index 597c7f13..587286be 100644
--- a/include/gc_allocator.h --- a/include/gc_allocator.h
+++ b/include/gc_allocator.h +++ b/include/gc_allocator.h
@@ -312,6 +312,7 @@ public: @@ -312,6 +312,7 @@ public:
template<> template<>
class traceable_allocator<void> { class traceable_allocator<void> {
+public: +public:

View file

@ -1,10 +1,9 @@
(import (import (
( let
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in lock = builtins.fromJSON (builtins.readFile ./flake.lock);
fetchTarball { in
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; fetchTarball {
sha256 = lock.nodes.flake-compat.locked.narHash; url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
} sha256 = lock.nodes.flake-compat.locked.narHash;
) }
{ src = ./.; } ) { src = ./.; }).defaultNix
).defaultNix

0
doc/manual/anchors.jq Executable file → Normal file
View file

View file

@ -2,10 +2,15 @@ let
inherit (builtins) concatStringsSep attrValues mapAttrs; inherit (builtins) concatStringsSep attrValues mapAttrs;
inherit (import ./utils.nix) optionalString squash; inherit (import ./utils.nix) optionalString squash;
in in
builtinsInfo: builtinsInfo:
let let
showBuiltin = name: { doc, type, impure-only }: showBuiltin =
name:
{
doc,
type,
impure-only,
}:
let let
type' = optionalString (type != null) " (${type})"; type' = optionalString (type != null) " (${type})";

View file

@ -2,10 +2,16 @@ let
inherit (builtins) concatStringsSep attrValues mapAttrs; inherit (builtins) concatStringsSep attrValues mapAttrs;
inherit (import ./utils.nix) optionalString squash; inherit (import ./utils.nix) optionalString squash;
in in
builtinsInfo: builtinsInfo:
let let
showBuiltin = name: { doc, args, arity, experimental-feature }: showBuiltin =
name:
{
doc,
args,
arity,
experimental-feature,
}:
let let
experimentalNotice = optionalString (experimental-feature != null) '' experimentalNotice = optionalString (experimental-feature != null) ''
This function is only available if the [${experimental-feature}](@docroot@/contributing/experimental-features.md#xp-feature-${experimental-feature}) experimental feature is enabled. This function is only available if the [${experimental-feature}](@docroot@/contributing/experimental-features.md#xp-feature-${experimental-feature}) experimental feature is enabled.

View file

@ -1,19 +1,39 @@
let let
inherit (builtins) inherit (builtins)
attrNames attrValues fromJSON listToAttrs mapAttrs attrNames
concatStringsSep concatMap length lessThan replaceStrings sort; attrValues
inherit (import ./utils.nix) concatStrings optionalString filterAttrs trim squash unique showSettings; fromJSON
listToAttrs
mapAttrs
concatStringsSep
concatMap
length
lessThan
replaceStrings
sort
;
inherit (import ./utils.nix)
concatStrings
optionalString
filterAttrs
trim
squash
unique
showSettings
;
in in
inlineHTML: commandDump: inlineHTML: commandDump:
let let
commandInfo = fromJSON commandDump; commandInfo = fromJSON commandDump;
showCommand = { command, details, filename, toplevel }: showCommand =
{
command,
details,
filename,
toplevel,
}:
let let
result = '' result = ''
> **Warning** \ > **Warning** \
> This program is > This program is
@ -35,26 +55,27 @@ let
${maybeOptions} ${maybeOptions}
''; '';
showSynopsis = command: args: showSynopsis =
command: args:
let let
showArgument = arg: "*${arg.label}*" + optionalString (! arg ? arity) "..."; showArgument = arg: "*${arg.label}*" + optionalString (!arg ? arity) "...";
arguments = concatStringsSep " " (map showArgument args); arguments = concatStringsSep " " (map showArgument args);
in '' in
`${command}` [*option*...] ${arguments} ''
`${command}` [*option*...] ${arguments}
''; '';
maybeSubcommands = optionalString (details ? commands && details.commands != {}) maybeSubcommands = optionalString (details ? commands && details.commands != { }) ''
'' where *subcommand* is one of the following:
where *subcommand* is one of the following:
${subcommands} ${subcommands}
''; '';
subcommands = if length categories > 1 subcommands = if length categories > 1 then listCategories else listSubcommands details.commands;
then listCategories
else listSubcommands details.commands;
categories = sort (x: y: x.id < y.id) (unique (map (cmd: cmd.category) (attrValues details.commands))); categories = sort (x: y: x.id < y.id) (
unique (map (cmd: cmd.category) (attrValues details.commands))
);
listCategories = concatStrings (map showCategory categories); listCategories = concatStrings (map showCategory categories);
@ -71,11 +92,11 @@ let
''; '';
# TODO: move this confusing special case out of here when implementing #8496 # TODO: move this confusing special case out of here when implementing #8496
maybeStoreDocs = optionalString maybeStoreDocs = optionalString (details ? doc) (
(details ? doc) replaceStrings [ "@stores@" ] [ storeDocs ] details.doc
(replaceStrings ["@stores@"] [storeDocs] details.doc); );
maybeOptions = optionalString (details.flags != {}) '' maybeOptions = optionalString (details.flags != { }) ''
# Options # Options
${showOptions details.flags toplevel.flags} ${showOptions details.flags toplevel.flags}
@ -85,51 +106,70 @@ let
> See [`man nix.conf`](@docroot@/command-ref/conf-file.md#command-line-flags) for overriding configuration settings with command line flags. > See [`man nix.conf`](@docroot@/command-ref/conf-file.md#command-line-flags) for overriding configuration settings with command line flags.
''; '';
showOptions = options: commonOptions: showOptions =
options: commonOptions:
let let
allOptions = options // commonOptions; allOptions = options // commonOptions;
showCategory = cat: '' showCategory = cat: ''
${optionalString (cat != "") "**${cat}:**"} ${optionalString (cat != "") "**${cat}:**"}
${listOptions (filterAttrs (n: v: v.category == cat) allOptions)} ${listOptions (filterAttrs (n: v: v.category == cat) allOptions)}
''; '';
listOptions = opts: concatStringsSep "\n" (attrValues (mapAttrs showOption opts)); listOptions = opts: concatStringsSep "\n" (attrValues (mapAttrs showOption opts));
showOption = name: option: showOption =
name: option:
let let
result = trim '' result = trim ''
- ${item} - ${item}
${option.description} ${option.description}
''; '';
item = if inlineHTML item =
then ''<span id="opt-${name}">[`--${name}`](#opt-${name})</span> ${shortName} ${labels}'' if inlineHTML then
else "`--${name}` ${shortName} ${labels}"; ''<span id="opt-${name}">[`--${name}`](#opt-${name})</span> ${shortName} ${labels}''
shortName = optionalString else
(option ? shortName) "`--${name}` ${shortName} ${labels}";
("/ `-${option.shortName}`"); shortName = optionalString (option ? shortName) "/ `-${option.shortName}`";
labels = optionalString labels = optionalString (option ? labels) (concatStringsSep " " (map (s: "*${s}*") option.labels));
(option ? labels) in
(concatStringsSep " " (map (s: "*${s}*") option.labels)); result;
in result;
categories = sort lessThan (unique (map (cmd: cmd.category) (attrValues allOptions))); categories = sort lessThan (unique (map (cmd: cmd.category) (attrValues allOptions)));
in concatStrings (map showCategory categories); in
in squash result; concatStrings (map showCategory categories);
in
squash result;
appendName = filename: name: (if filename == "nix" then "nix3" else filename) + "-" + name; appendName = filename: name: (if filename == "nix" then "nix3" else filename) + "-" + name;
processCommand = { command, details, filename, toplevel }: processCommand =
{
command,
details,
filename,
toplevel,
}:
let let
cmd = { cmd = {
inherit command; inherit command;
name = filename + ".md"; name = filename + ".md";
value = showCommand { inherit command details filename toplevel; }; value = showCommand {
inherit
command
details
filename
toplevel
;
};
}; };
subcommand = subCmd: processCommand { subcommand =
command = command + " " + subCmd; subCmd:
details = details.commands.${subCmd}; processCommand {
filename = appendName filename subCmd; command = command + " " + subCmd;
inherit toplevel; details = details.commands.${subCmd};
}; filename = appendName filename subCmd;
in [ cmd ] ++ concatMap subcommand (attrNames details.commands or {}); inherit toplevel;
};
in
[ cmd ] ++ concatMap subcommand (attrNames details.commands or { });
manpages = processCommand { manpages = processCommand {
command = "nix"; command = "nix";
@ -138,14 +178,21 @@ let
toplevel = commandInfo.args; toplevel = commandInfo.args;
}; };
tableOfContents = let tableOfContents =
showEntry = page: let
" - [${page.command}](command-ref/new-cli/${page.name})"; showEntry = page: " - [${page.command}](command-ref/new-cli/${page.name})";
in concatStringsSep "\n" (map showEntry manpages) + "\n"; in
concatStringsSep "\n" (map showEntry manpages) + "\n";
storeDocs = storeDocs =
let let
showStore = name: { settings, doc, experimentalFeature }: showStore =
name:
{
settings,
doc,
experimentalFeature,
}:
let let
experimentalFeatureNote = optionalString (experimentalFeature != null) '' experimentalFeatureNote = optionalString (experimentalFeature != null) ''
> **Warning** > **Warning**
@ -161,7 +208,8 @@ let
extra-experimental-features = ${experimentalFeature} extra-experimental-features = ${experimentalFeature}
``` ```
''; '';
in '' in
''
## ${name} ## ${name}
${doc} ${doc}
@ -172,6 +220,7 @@ let
${showSettings { inherit inlineHTML; } settings} ${showSettings { inherit inlineHTML; } settings}
''; '';
in concatStrings (attrValues (mapAttrs showStore commandInfo.stores)); in
concatStrings (attrValues (mapAttrs showStore commandInfo.stores));
in (listToAttrs manpages) // { "SUMMARY.md" = tableOfContents; } in
(listToAttrs manpages) // { "SUMMARY.md" = tableOfContents; }

View file

@ -1,9 +1,8 @@
with builtins; with builtins;
with import ./utils.nix; with import ./utils.nix;
let let
showExperimentalFeature = name: doc: showExperimentalFeature = name: doc: ''
'' - [`${name}`](@docroot@/contributing/experimental-features.md#xp-feature-${name})
- [`${name}`](@docroot@/contributing/experimental-features.md#xp-feature-${name}) '';
''; in
in xps: indent " " (concatStrings (attrValues (mapAttrs showExperimentalFeature xps))) xps: indent " " (concatStrings (attrValues (mapAttrs showExperimentalFeature xps)))

View file

@ -1,11 +1,12 @@
with builtins; with builtins;
with import ./utils.nix; with import ./utils.nix;
let let
showExperimentalFeature = name: doc: showExperimentalFeature =
name: doc:
squash '' squash ''
## [`${name}`]{#xp-feature-${name}} ## [`${name}`]{#xp-feature-${name}}
${doc} ${doc}
''; '';
in xps: (concatStringsSep "\n" (attrValues (mapAttrs showExperimentalFeature xps))) in
xps: (concatStringsSep "\n" (attrValues (mapAttrs showExperimentalFeature xps)))

View file

@ -37,4 +37,3 @@ error:
error: uh oh! error: uh oh!
``` ```

View file

@ -27,4 +27,3 @@
/package-management/channels* /command-ref/nix-channel 301! /package-management/channels* /command-ref/nix-channel 301!
/package-management/s3-substituter* /command-ref/new-cli/nix3-help-stores#s3-binary-cache-store 301! /package-management/s3-substituter* /command-ref/new-cli/nix3-help-stores#s3-binary-cache-store 301!

View file

@ -102,13 +102,13 @@ In particular, notice the
has copied the build results to that directory where you can examine it. has copied the build results to that directory where you can examine it.
> []{#check-dirs-are-unregistered} **Note** > []{#check-dirs-are-unregistered} **Note**
> >
> Check paths are not protected against garbage collection, and this > Check paths are not protected against garbage collection, and this
> path will be deleted on the next garbage collection. > path will be deleted on the next garbage collection.
> >
> The path is guaranteed to be alive for the duration of > The path is guaranteed to be alive for the duration of
> the `diff-hook`'s execution, but may be deleted any time after. > the `diff-hook`'s execution, but may be deleted any time after.
> >
> If the comparison is performed as part of automated tooling, please > If the comparison is performed as part of automated tooling, please
> use the diff-hook or author your tooling to handle the case where the > use the diff-hook or author your tooling to handle the case where the
> build was not deterministic and also a check path does not exist. > build was not deterministic and also a check path does not exist.
@ -117,7 +117,7 @@ has copied the build results to that directory where you can examine it.
already. If the derivation has not been built Nix will fail with the already. If the derivation has not been built Nix will fail with the
error: error:
error: some outputs of '/nix/store/hzi1h60z2qf0nb85iwnpvrai3j2w7rr6-unstable.drv' error: some outputs of '/nix/store/hzi1h60z2qf0nb85iwnpvrai3j2w7rr6-unstable.drv'
are not valid, so checking is not possible are not valid, so checking is not possible
Run the build without `--check`, and then try with `--check` again. Run the build without `--check`, and then try with `--check` again.

View file

@ -112,4 +112,3 @@ Build inputs used as instructions to a build task are marked accordingly:
| | | |
+--------------------------------------------------------------------+ +--------------------------------------------------------------------+
``` ```

View file

@ -67,4 +67,3 @@ Configuration options can be set on the command line, overriding the values set
The `extra-` prefix is supported for settings that take a list of items (e.g. `--extra-trusted users alice` or `--option extra-trusted-users alice`). The `extra-` prefix is supported for settings that take a list of items (e.g. `--extra-trusted users alice` or `--option extra-trusted-users alice`).
# Available settings # Available settings

View file

@ -184,4 +184,3 @@ channel:
```console ```console
$ nix-env --file https://github.com/NixOS/nixpkgs/archive/nixos-14.12.tar.gz --install --attr firefox $ nix-env --file https://github.com/NixOS/nixpkgs/archive/nixos-14.12.tar.gz --install --attr firefox
``` ```

View file

@ -30,4 +30,3 @@ $ nix-env --list-generations
97 2004-02-06 16:22:45 97 2004-02-06 16:22:45
98 2004-02-06 16:24:33 (current) 98 2004-02-06 16:24:33 (current)
``` ```

View file

@ -212,4 +212,3 @@ To show all packages in the latest revision of the Nixpkgs repository:
```console ```console
$ nix-env --file https://github.com/NixOS/nixpkgs/archive/master.tar.gz --query --available $ nix-env --file https://github.com/NixOS/nixpkgs/archive/master.tar.gz --query --available
``` ```

View file

@ -79,4 +79,3 @@ To make files from `binutils` take precedence over files from `gcc`:
$ nix-env --set-flag priority 5 binutils $ nix-env --set-flag priority 5 binutils
$ nix-env --set-flag priority 10 gcc $ nix-env --set-flag priority 10 gcc
``` ```

View file

@ -27,4 +27,3 @@ contain just Firefox:
```console ```console
$ nix-env --profile /nix/var/nix/profiles/browser --set firefox $ nix-env --profile /nix/var/nix/profiles/browser --set firefox
``` ```

View file

@ -30,4 +30,3 @@ Switching will fail if the specified generation does not exist.
$ nix-env --switch-generation 42 $ nix-env --switch-generation 42
switching from generation 50 to 42 switching from generation 50 to 42
``` ```

View file

@ -138,4 +138,3 @@ This is illustrated by the following examples:
2.3a < 2.3c 2.3a < 2.3c
2.3pre1 < 2.3c 2.3pre1 < 2.3c
2.3pre1 < 2.3q 2.3pre1 < 2.3q

View file

@ -32,4 +32,3 @@ This operation has the following options:
$ nix-store --add-fixed sha256 ./hello-2.10.tar.gz $ nix-store --add-fixed sha256 ./hello-2.10.tar.gz
/nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz /nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz
``` ```

View file

@ -69,4 +69,3 @@ To delete at least 100 MiBs of unreachable paths:
```console ```console
$ nix-store --gc --max-freed $((100 * 1024 * 1024)) $ nix-store --gc --max-freed $((100 * 1024 * 1024))
``` ```

View file

@ -33,4 +33,3 @@ The following options are allowed for all `nix-store` operations, but may not al
If there are multiple results, then multiple symlinks will be If there are multiple results, then multiple symlinks will be
created by sequentially numbering symlinks beyond the first one created by sequentially numbering symlinks beyond the first one
(e.g., `foo`, `foo-2`, `foo-3`, and so on). (e.g., `foo`, `foo-2`, `foo-3`, and so on).

View file

@ -37,4 +37,3 @@ hashing files in `/nix/store/qhqx7l2f1kmwihc9bnxs7rc159hsxnf3-gcc-4.1.1'
541838819 bytes (516.74 MiB) freed by hard-linking 54143 files; 541838819 bytes (516.74 MiB) freed by hard-linking 54143 files;
there are 114486 files with equal contents out of 215894 files in total there are 114486 files with equal contents out of 215894 files in total
``` ```

View file

@ -28,4 +28,3 @@ export stdenv; stdenv='/nix/store/7c8asx3yfrg5dg1gzhzyq2236zfgibnn-stdenv'
export system; system='x86_64-linux' export system; system='x86_64-linux'
export _args; _args='-e /nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25c-default-builder.sh' export _args; _args='-e /nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25c-default-builder.sh'
``` ```

View file

@ -225,4 +225,3 @@ $ nix-store --query --roots $(which svn)
/nix/var/nix/profiles/default-82-link /nix/var/nix/profiles/default-82-link
/home/eelco/.local/state/nix/profiles/profile-97-link /home/eelco/.local/state/nix/profiles/profile-97-link
``` ```

View file

@ -35,4 +35,3 @@ ktorrent-2.2.1/
ktorrent-2.2.1/NEWS ktorrent-2.2.1/NEWS
... ...
``` ```

View file

@ -32,4 +32,3 @@ $ nix-store --repair-path /nix/store/dj7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13
fetching path `/nix/store/d7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13'... fetching path `/nix/store/d7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13'...
``` ```

View file

@ -35,4 +35,3 @@ $ cat <<EOF >>/root/.ssh/authorized_keys
command="nice -n20 nix-store --serve --write" ssh-rsa AAAAB3NzaC1yc2EAAAA... command="nice -n20 nix-store --serve --write" ssh-rsa AAAAB3NzaC1yc2EAAAA...
EOF EOF
``` ```

View file

@ -26,4 +26,3 @@ To verify the integrity of the `svn` command and all its dependencies:
```console ```console
$ nix-store --verify-path $(nix-store --query --requisites $(which svn)) $ nix-store --verify-path $(nix-store --query --requisites $(which svn))
``` ```

View file

@ -37,7 +37,7 @@ Most Nix commands accept the following command-line options:
Print even more informational messages. Print even more informational messages.
- `4` “Debug” - `4` “Debug”
Print debug information. Print debug information.
- `5` “Vomit” - `5` “Vomit”

View file

@ -289,4 +289,3 @@ search/replaced in it for each new build.
The installer now supports a `--tarball-url-prefix` flag which _may_ have The installer now supports a `--tarball-url-prefix` flag which _may_ have
solved this need? solved this need?
--> -->

View file

@ -21,7 +21,7 @@ Nix keeps its *store* (the place where packages are stored) in
`--with-store-dir=path`. `--with-store-dir=path`.
> **Warning** > **Warning**
> >
> It is best *not* to change the Nix store from its default, since doing > It is best *not* to change the Nix store from its default, since doing
> so makes it impossible to use pre-built binaries from the standard > so makes it impossible to use pre-built binaries from the standard
> Nixpkgs channels — that is, all packages will need to be built from > Nixpkgs channels — that is, all packages will need to be built from

View file

@ -14,7 +14,7 @@ builds) are forwarded to a *Nix daemon* running under the owner of the
Nix store/database that performs the operation. Nix store/database that performs the operation.
> **Note** > **Note**
> >
> Multi-user mode has one important limitation: only root and a set of > Multi-user mode has one important limitation: only root and a set of
> trusted users specified in `nix.conf` can specify arbitrary binary > trusted users specified in `nix.conf` can specify arbitrary binary
> caches. So while unprivileged users may install packages from > caches. So while unprivileged users may install packages from

View file

@ -145,4 +145,3 @@ which you may remove.
> complete. macOS (Catalina+) directly controls root directories and its > complete. macOS (Catalina+) directly controls root directories and its
> read-only root will prevent you from manually deleting the empty `/nix` > read-only root will prevent you from manually deleting the empty `/nix`
> mountpoint. > mountpoint.

View file

@ -146,65 +146,65 @@ three kinds of patterns:
- If a pattern is a single identifier, then the function matches any - If a pattern is a single identifier, then the function matches any
argument. Example: argument. Example:
```nix ```nix
let negate = x: !x; let negate = x: !x;
concat = x: y: x + y; concat = x: y: x + y;
in if negate true then concat "foo" "bar" else "" in if negate true then concat "foo" "bar" else ""
``` ```
Note that `concat` is a function that takes one argument and returns Note that `concat` is a function that takes one argument and returns
a function that takes another argument. This allows partial a function that takes another argument. This allows partial
parameterisation (i.e., only filling some of the arguments of a parameterisation (i.e., only filling some of the arguments of a
function); e.g., function); e.g.,
```nix ```nix
map (concat "foo") [ "bar" "bla" "abc" ] map (concat "foo") [ "bar" "bla" "abc" ]
``` ```
evaluates to `[ "foobar" "foobla" "fooabc" ]`. evaluates to `[ "foobar" "foobla" "fooabc" ]`.
- A *set pattern* of the form `{ name1, name2, …, nameN }` matches a - A *set pattern* of the form `{ name1, name2, …, nameN }` matches a
set containing the listed attributes, and binds the values of those set containing the listed attributes, and binds the values of those
attributes to variables in the function body. For example, the attributes to variables in the function body. For example, the
function function
```nix ```nix
{ x, y, z }: z + y + x { x, y, z }: z + y + x
``` ```
can only be called with a set containing exactly the attributes `x`, can only be called with a set containing exactly the attributes `x`,
`y` and `z`. No other attributes are allowed. If you want to allow `y` and `z`. No other attributes are allowed. If you want to allow
additional arguments, you can use an ellipsis (`...`): additional arguments, you can use an ellipsis (`...`):
```nix ```nix
{ x, y, z, ... }: z + y + x { x, y, z, ... }: z + y + x
``` ```
This works on any set that contains at least the three named This works on any set that contains at least the three named
attributes. attributes.
It is possible to provide *default values* for attributes, in It is possible to provide *default values* for attributes, in
which case they are allowed to be missing. A default value is which case they are allowed to be missing. A default value is
specified by writing `name ? e`, where *e* is an arbitrary specified by writing `name ? e`, where *e* is an arbitrary
expression. For example, expression. For example,
```nix ```nix
{ x, y ? "foo", z ? "bar" }: z + y + x { x, y ? "foo", z ? "bar" }: z + y + x
``` ```
specifies a function that only requires an attribute named `x`, but specifies a function that only requires an attribute named `x`, but
optionally accepts `y` and `z`. optionally accepts `y` and `z`.
- An `@`-pattern provides a means of referring to the whole value - An `@`-pattern provides a means of referring to the whole value
being matched: being matched:
```nix ```nix
args@{ x, y, z, ... }: z + y + x + args.a args@{ x, y, z, ... }: z + y + x + args.a
``` ```
but can also be written as: but can also be written as:
```nix ```nix
{ x, y, z, ... } @ args: z + y + x + args.a { x, y, z, ... } @ args: z + y + x + args.a
``` ```

View file

@ -24,22 +24,22 @@ the attributes of which specify the inputs of the build.
- Every attribute is passed as an environment variable to the builder. - Every attribute is passed as an environment variable to the builder.
Attribute values are translated to environment variables as follows: Attribute values are translated to environment variables as follows:
- Strings and numbers are just passed verbatim. - Strings and numbers are just passed verbatim.
- A *path* (e.g., `../foo/sources.tar`) causes the referenced file - A *path* (e.g., `../foo/sources.tar`) causes the referenced file
to be copied to the store; its location in the store is put in to be copied to the store; its location in the store is put in
the environment variable. The idea is that all sources should the environment variable. The idea is that all sources should
reside in the Nix store, since all inputs to a derivation should reside in the Nix store, since all inputs to a derivation should
reside in the Nix store. reside in the Nix store.
- A *derivation* causes that derivation to be built prior to the - A *derivation* causes that derivation to be built prior to the
present derivation; its default output path is put in the present derivation; its default output path is put in the
environment variable. environment variable.
- Lists of the previous types are also allowed. They are simply - Lists of the previous types are also allowed. They are simply
concatenated, separated by spaces. concatenated, separated by spaces.
- `true` is passed as the string `1`, `false` and `null` are - `true` is passed as the string `1`, `false` and `null` are
passed as an empty string. passed as an empty string.
@ -56,36 +56,36 @@ the attributes of which specify the inputs of the build.
library doesnt need the header files and documentation at runtime, library doesnt need the header files and documentation at runtime,
and it doesnt need the documentation at build time. Thus, the and it doesnt need the documentation at build time. Thus, the
library package could specify: library package could specify:
```nix ```nix
outputs = [ "lib" "headers" "doc" ]; outputs = [ "lib" "headers" "doc" ];
``` ```
This will cause Nix to pass environment variables `lib`, `headers` This will cause Nix to pass environment variables `lib`, `headers`
and `doc` to the builder containing the intended store paths of each and `doc` to the builder containing the intended store paths of each
output. The builder would typically do something like output. The builder would typically do something like
```bash ```bash
./configure \ ./configure \
--libdir=$lib/lib \ --libdir=$lib/lib \
--includedir=$headers/include \ --includedir=$headers/include \
--docdir=$doc/share/doc --docdir=$doc/share/doc
``` ```
for an Autoconf-style package. You can refer to each output of a for an Autoconf-style package. You can refer to each output of a
derivation by selecting it as an attribute, e.g. derivation by selecting it as an attribute, e.g.
```nix ```nix
buildInputs = [ pkg.lib pkg.headers ]; buildInputs = [ pkg.lib pkg.headers ];
``` ```
The first element of `outputs` determines the *default output*. The first element of `outputs` determines the *default output*.
Thus, you could also write Thus, you could also write
```nix ```nix
buildInputs = [ pkg pkg.headers ]; buildInputs = [ pkg pkg.headers ];
``` ```
since `pkg` is equivalent to `pkg.lib`. since `pkg` is equivalent to `pkg.lib`.
The function `mkDerivation` in the Nixpkgs standard environment is a The function `mkDerivation` in the Nixpkgs standard environment is a
@ -103,24 +103,24 @@ The builder is executed as follows:
specified above. specified above.
- In addition, the following variables are set: - In addition, the following variables are set:
- `NIX_BUILD_TOP` contains the path of the temporary directory for - `NIX_BUILD_TOP` contains the path of the temporary directory for
this build. this build.
- Also, `TMPDIR`, `TEMPDIR`, `TMP`, `TEMP` are set to point to the - Also, `TMPDIR`, `TEMPDIR`, `TMP`, `TEMP` are set to point to the
temporary directory. This is to prevent the builder from temporary directory. This is to prevent the builder from
accidentally writing temporary files anywhere else. Doing so accidentally writing temporary files anywhere else. Doing so
might cause interference by other processes. might cause interference by other processes.
- `PATH` is set to `/path-not-set` to prevent shells from - `PATH` is set to `/path-not-set` to prevent shells from
initialising it to their built-in default value. initialising it to their built-in default value.
- `HOME` is set to `/homeless-shelter` to prevent programs from - `HOME` is set to `/homeless-shelter` to prevent programs from
using `/etc/passwd` or the like to find the user's home using `/etc/passwd` or the like to find the user's home
directory, which could cause impurity. Usually, when `HOME` is directory, which could cause impurity. Usually, when `HOME` is
set, it is used as the location of the home directory, even if set, it is used as the location of the home directory, even if
it points to a non-existent path. it points to a non-existent path.
- `NIX_STORE` is set to the path of the top-level Nix store - `NIX_STORE` is set to the path of the top-level Nix store
directory (typically, `/nix/store`). directory (typically, `/nix/store`).
@ -128,7 +128,7 @@ The builder is executed as follows:
is set to `true` for the dervation. A detailed explanation of this is set to `true` for the dervation. A detailed explanation of this
behavior can be found in the behavior can be found in the
[section about structured attrs](./advanced-attributes.md#adv-attr-structuredAttrs). [section about structured attrs](./advanced-attributes.md#adv-attr-structuredAttrs).
- For each output declared in `outputs`, the corresponding - For each output declared in `outputs`, the corresponding
environment variable is set to point to the intended path in the environment variable is set to point to the intended path in the
Nix store for that output. Each output path is a concatenation Nix store for that output. Each output path is a concatenation

View file

@ -161,4 +161,3 @@ All comparison operators are implemented in terms of `<`, and the following equi
Equivalent to `!`*b1* `||` *b2*. Equivalent to `!`*b1* `||` *b2*.
[Logical implication]: #logical-implication [Logical implication]: #logical-implication

View file

@ -37,7 +37,7 @@ $ nix-channel --update
``` ```
> **Note** > **Note**
> >
> On NixOS, youre automatically subscribed to a NixOS channel > On NixOS, youre automatically subscribed to a NixOS channel
> corresponding to your NixOS major release (e.g. > corresponding to your NixOS major release (e.g.
> <http://nixos.org/channels/nixos-21.11>). A NixOS channel is identical > <http://nixos.org/channels/nixos-21.11>). A NixOS channel is identical
@ -120,7 +120,7 @@ will install the package called `subversion` from `nixpkgs` channel (which is, o
[Subversion version management system](http://subversion.tigris.org/)). [Subversion version management system](http://subversion.tigris.org/)).
> **Note** > **Note**
> >
> When you ask Nix to install a package, it will first try to get it in > When you ask Nix to install a package, it will first try to get it in
> pre-compiled form from a *binary cache*. By default, Nix will use the > pre-compiled form from a *binary cache*. By default, Nix will use the
> binary cache <https://cache.nixos.org>; it contains binaries for most > binary cache <https://cache.nixos.org>; it contains binaries for most

View file

@ -16,7 +16,7 @@ it will fall back to using the binary cache substituter, and then to
building from source. building from source.
> **Note** > **Note**
> >
> The SSH substituter currently does not allow you to enter an SSH > The SSH substituter currently does not allow you to enter an SSH
> passphrase interactively. Therefore, you should use `ssh-add` to load > passphrase interactively. Therefore, you should use `ssh-add` to load
> the decrypted private key into `ssh-agent`. > the decrypted private key into `ssh-agent`.

View file

@ -1,67 +1,67 @@
# Release 0.10 (2006-10-06) # Release 0.10 (2006-10-06)
> **Note** > **Note**
> >
> This version of Nix uses Berkeley DB 4.4 instead of 4.3. The database > This version of Nix uses Berkeley DB 4.4 instead of 4.3. The database
> is upgraded automatically, but you should be careful not to use old > is upgraded automatically, but you should be careful not to use old
> versions of Nix that still use Berkeley DB 4.3. In particular, if you > versions of Nix that still use Berkeley DB 4.3. In particular, if you
> use a Nix installed through Nix, you should run > use a Nix installed through Nix, you should run
> >
> $ nix-store --clear-substitutes > $ nix-store --clear-substitutes
> >
> first. > first.
> **Warning** > **Warning**
> >
> Also, the database schema has changed slighted to fix a performance > Also, the database schema has changed slighted to fix a performance
> issue (see below). When you run any Nix 0.10 command for the first > issue (see below). When you run any Nix 0.10 command for the first
> time, the database will be upgraded automatically. This is > time, the database will be upgraded automatically. This is
> irreversible. > irreversible.
- `nix-env` usability improvements: - `nix-env` usability improvements:
- An option `--compare-versions` (or `-c`) has been added to - An option `--compare-versions` (or `-c`) has been added to
`nix-env `nix-env
--query` to allow you to compare installed versions of packages --query` to allow you to compare installed versions of packages
to available versions, or vice versa. An easy way to see if you to available versions, or vice versa. An easy way to see if you
are up to date with whats in your subscribed channels is are up to date with whats in your subscribed channels is
`nix-env -qc \*`. `nix-env -qc \*`.
- `nix-env --query` now takes as arguments a list of package names - `nix-env --query` now takes as arguments a list of package names
about which to show information, just like `--install`, etc.: about which to show information, just like `--install`, etc.:
for example, `nix-env -q gcc`. Note that to show all for example, `nix-env -q gcc`. Note that to show all
derivations, you need to specify `\*`. derivations, you need to specify `\*`.
- `nix-env -i - `nix-env -i
pkgname` will now install the highest available version of pkgname` will now install the highest available version of
*pkgname*, rather than installing all available versions (which *pkgname*, rather than installing all available versions (which
would probably give collisions) (`NIX-31`). would probably give collisions) (`NIX-31`).
- `nix-env (-i|-u) --dry-run` now shows exactly which missing - `nix-env (-i|-u) --dry-run` now shows exactly which missing
paths will be built or substituted. paths will be built or substituted.
- `nix-env -qa --description` shows human-readable descriptions of - `nix-env -qa --description` shows human-readable descriptions of
packages, provided that they have a `meta.description` attribute packages, provided that they have a `meta.description` attribute
(which most packages in Nixpkgs dont have yet). (which most packages in Nixpkgs dont have yet).
- New language features: - New language features:
- Reference scanning (which happens after each build) is much - Reference scanning (which happens after each build) is much
faster and takes a constant amount of memory. faster and takes a constant amount of memory.
- String interpolation. Expressions like - String interpolation. Expressions like
"--with-freetype2-library=" + freetype + "/lib" "--with-freetype2-library=" + freetype + "/lib"
can now be written as can now be written as
"--with-freetype2-library=${freetype}/lib" "--with-freetype2-library=${freetype}/lib"
You can write arbitrary expressions within `${...}`, not just You can write arbitrary expressions within `${...}`, not just
identifiers. identifiers.
- Multi-line string literals. - Multi-line string literals.
- String concatenations can now involve derivations, as in the - String concatenations can now involve derivations, as in the
example `"--with-freetype2-library=" example `"--with-freetype2-library="
+ freetype + "/lib"`. This was not previously possible because + freetype + "/lib"`. This was not previously possible because
@ -69,17 +69,17 @@
dependent on `freetype`. The evaluator now properly propagates dependent on `freetype`. The evaluator now properly propagates
this information. Consequently, the subpath operator (`~`) has this information. Consequently, the subpath operator (`~`) has
been deprecated. been deprecated.
- Default values of function arguments can now refer to other - Default values of function arguments can now refer to other
function arguments; that is, all arguments are in scope in the function arguments; that is, all arguments are in scope in the
default values (`NIX-45`). default values (`NIX-45`).
- Lots of new built-in primitives, such as functions for list - Lots of new built-in primitives, such as functions for list
manipulation and integer arithmetic. See the manual for a manipulation and integer arithmetic. See the manual for a
complete list. All primops are now available in the set complete list. All primops are now available in the set
`builtins`, allowing one to test for the availability of primop `builtins`, allowing one to test for the availability of primop
in a backwards-compatible way. in a backwards-compatible way.
- Real let-expressions: `let x = ...; - Real let-expressions: `let x = ...;
... z = ...; in ...`. ... z = ...; in ...`.
@ -89,15 +89,15 @@
your machine and you want to copy it somewhere else. your machine and you want to copy it somewhere else.
- XML support: - XML support:
- `nix-env -q --xml` prints the installed or available packages in - `nix-env -q --xml` prints the installed or available packages in
an XML representation for easy processing by other tools. an XML representation for easy processing by other tools.
- `nix-instantiate --eval-only - `nix-instantiate --eval-only
--xml` prints an XML representation of the resulting term. (The --xml` prints an XML representation of the resulting term. (The
new flag `--strict` forces deep evaluation of the result, new flag `--strict` forces deep evaluation of the result,
i.e., list elements and attributes are evaluated recursively.) i.e., list elements and attributes are evaluated recursively.)
- In Nix expressions, the primop `builtins.toXML` converts a term - In Nix expressions, the primop `builtins.toXML` converts a term
to an XML representation. This is primarily useful for passing to an XML representation. This is primarily useful for passing
structured information to builders. structured information to builders.
@ -133,21 +133,21 @@
something other than `result`. something other than `result`.
- Platform support: - Platform support:
- Support for 64-bit platforms, provided a [suitably patched ATerm - Support for 64-bit platforms, provided a [suitably patched ATerm
library](http://bugzilla.sen.cwi.nl:8080/show_bug.cgi?id=606) is library](http://bugzilla.sen.cwi.nl:8080/show_bug.cgi?id=606) is
used. Also, files larger than 2 GiB are now supported. used. Also, files larger than 2 GiB are now supported.
- Added support for Cygwin (Windows, `i686-cygwin`), Mac OS X on - Added support for Cygwin (Windows, `i686-cygwin`), Mac OS X on
Intel (`i686-darwin`) and Linux on PowerPC (`powerpc-linux`). Intel (`i686-darwin`) and Linux on PowerPC (`powerpc-linux`).
- Users of SMP and multicore machines will appreciate that the - Users of SMP and multicore machines will appreciate that the
number of builds to be performed in parallel can now be number of builds to be performed in parallel can now be
specified in the configuration file in the `build-max-jobs` specified in the configuration file in the `build-max-jobs`
setting. setting.
- Garbage collector improvements: - Garbage collector improvements:
- Open files (such as running programs) are now used as roots of - Open files (such as running programs) are now used as roots of
the garbage collector. This prevents programs that have been the garbage collector. This prevents programs that have been
uninstalled from being garbage collected while they are still uninstalled from being garbage collected while they are still
@ -155,17 +155,17 @@
(`find-runtime-roots.pl`) is inherently system-specific, but it (`find-runtime-roots.pl`) is inherently system-specific, but it
should work on Linux and on all platforms that have the `lsof` should work on Linux and on all platforms that have the `lsof`
utility. utility.
- `nix-store --gc` (a.k.a. `nix-collect-garbage`) prints out the - `nix-store --gc` (a.k.a. `nix-collect-garbage`) prints out the
number of bytes freed on standard output. `nix-store number of bytes freed on standard output. `nix-store
--gc --print-dead` shows how many bytes would be freed by an --gc --print-dead` shows how many bytes would be freed by an
actual garbage collection. actual garbage collection.
- `nix-collect-garbage -d` removes all old generations of *all* - `nix-collect-garbage -d` removes all old generations of *all*
profiles before calling the actual garbage collector (`nix-store profiles before calling the actual garbage collector (`nix-store
--gc`). This is an easy way to get rid of all old packages in --gc`). This is an easy way to get rid of all old packages in
the Nix store. the Nix store.
- `nix-store` now has an operation `--delete` to delete specific - `nix-store` now has an operation `--delete` to delete specific
paths from the Nix store. It wont delete reachable paths from the Nix store. It wont delete reachable
(non-garbage) paths unless `--ignore-liveness` is specified. (non-garbage) paths unless `--ignore-liveness` is specified.
@ -192,13 +192,13 @@
memoisation of path hashing. memoisation of path hashing.
- Lots of bug fixes, notably: - Lots of bug fixes, notably:
- Make sure that the garbage collector can run successfully when - Make sure that the garbage collector can run successfully when
the disk is full (`NIX-18`). the disk is full (`NIX-18`).
- `nix-env` now locks the profile to prevent races between - `nix-env` now locks the profile to prevent races between
concurrent `nix-env` operations on the same profile (`NIX-7`). concurrent `nix-env` operations on the same profile (`NIX-7`).
- Removed misleading messages from `nix-env -i` (e.g., - Removed misleading messages from `nix-env -i` (e.g.,
``installing ``installing
`foo'`` followed by ``uninstalling `foo'`` followed by ``uninstalling

View file

@ -50,7 +50,7 @@ on Nix. Here is an (incomplete) list:
multiple packages with the same name, then pick the package with the multiple packages with the same name, then pick the package with the
highest priority, and only use the version if there are multiple highest priority, and only use the version if there are multiple
packages with the same priority. packages with the same priority.
This makes it possible to mark specific versions/variant in Nixpkgs This makes it possible to mark specific versions/variant in Nixpkgs
more or less desirable than others. A typical example would be a more or less desirable than others. A typical example would be a
beta version of some package (e.g., `gcc-4.2.0rc1`) which should not beta version of some package (e.g., `gcc-4.2.0rc1`) which should not
@ -62,14 +62,14 @@ on Nix. Here is an (incomplete) list:
be modified. There are several attributes that can be usefully be modified. There are several attributes that can be usefully
modified, because they affect the behaviour of `nix-env` or the user modified, because they affect the behaviour of `nix-env` or the user
environment build script: environment build script:
- `meta.priority` can be changed to resolve filename clashes (see - `meta.priority` can be changed to resolve filename clashes (see
above). above).
- `meta.keep` can be set to `true` to prevent the package from - `meta.keep` can be set to `true` to prevent the package from
being upgraded or replaced. Useful if you want to hang on to an being upgraded or replaced. Useful if you want to hang on to an
older version of a package. older version of a package.
- `meta.active` can be set to `false` to “disable” the package. - `meta.active` can be set to `false` to “disable” the package.
That is, no symlinks will be generated to the files of the That is, no symlinks will be generated to the files of the
package, but it remains part of the profile (so it wont be package, but it remains part of the profile (so it wont be

View file

@ -7,23 +7,23 @@
Nix process crashes; no write access is needed for read-only Nix process crashes; no write access is needed for read-only
operations; no more running out of Berkeley DB locks on certain operations; no more running out of Berkeley DB locks on certain
operations. operations.
You still need to compile Nix with Berkeley DB support if you want You still need to compile Nix with Berkeley DB support if you want
Nix to automatically convert your old Nix store to the new schema. Nix to automatically convert your old Nix store to the new schema.
If you dont need this, you can build Nix with the `configure` If you dont need this, you can build Nix with the `configure`
option `--disable-old-db-compat`. option `--disable-old-db-compat`.
After the automatic conversion to the new schema, you can delete the After the automatic conversion to the new schema, you can delete the
old Berkeley DB files: old Berkeley DB files:
$ cd /nix/var/nix/db $ cd /nix/var/nix/db
$ rm __db* log.* derivers references referrers reserved validpaths DB_CONFIG $ rm __db* log.* derivers references referrers reserved validpaths DB_CONFIG
The new metadata is stored in the directories `/nix/var/nix/db/info` The new metadata is stored in the directories `/nix/var/nix/db/info`
and `/nix/var/nix/db/referrer`. Though the metadata is stored in and `/nix/var/nix/db/referrer`. Though the metadata is stored in
human-readable plain-text files, they are not intended to be human-readable plain-text files, they are not intended to be
human-editable, as Nix is rather strict about the format. human-editable, as Nix is rather strict about the format.
The new storage schema may or may not require less disk space than The new storage schema may or may not require less disk space than
the Berkeley DB environment, mostly depending on the cluster size of the Berkeley DB environment, mostly depending on the cluster size of
your file system. With 1 KiB clusters (which seems to be the `ext3` your file system. With 1 KiB clusters (which seems to be the `ext3`
@ -50,11 +50,11 @@
last access time. This allows non-recently used stuff to be deleted. last access time. This allows non-recently used stuff to be deleted.
The option `--max-atime time` specifies an upper limit to the last The option `--max-atime time` specifies an upper limit to the last
accessed time of paths that may be deleted. For instance, accessed time of paths that may be deleted. For instance,
``` ```
$ nix-store --gc -v --max-atime $(date +%s -d "2 months ago") $ nix-store --gc -v --max-atime $(date +%s -d "2 months ago")
``` ```
deletes everything that hasnt been accessed in two months. deletes everything that hasnt been accessed in two months.
- `nix-env` now uses optimistic profile locking when performing an - `nix-env` now uses optimistic profile locking when performing an
@ -73,7 +73,7 @@
now always shown by `nix-env`, `nix-store -r` and `nix-build`. The now always shown by `nix-env`, `nix-store -r` and `nix-build`. The
total download size of substitutable paths is now also shown. For total download size of substitutable paths is now also shown. For
instance, a build will show something like instance, a build will show something like
the following derivations will be built: the following derivations will be built:
/nix/store/129sbxnk5n466zg6r1qmq1xjv9zymyy7-activate-configuration.sh.drv /nix/store/129sbxnk5n466zg6r1qmq1xjv9zymyy7-activate-configuration.sh.drv
/nix/store/7mzy971rdm8l566ch8hgxaf89x7lr7ik-upstart-jobs.drv /nix/store/7mzy971rdm8l566ch8hgxaf89x7lr7ik-upstart-jobs.drv
@ -84,24 +84,24 @@
... ...
- Language features: - Language features:
- @-patterns as in Haskell. For instance, in a function definition - @-patterns as in Haskell. For instance, in a function definition
f = args @ {x, y, z}: ...; f = args @ {x, y, z}: ...;
`args` refers to the argument as a whole, which is further `args` refers to the argument as a whole, which is further
pattern-matched against the attribute set pattern `{x, y, z}`. pattern-matched against the attribute set pattern `{x, y, z}`.
- “`...`” (ellipsis) patterns. An attribute set pattern can now - “`...`” (ellipsis) patterns. An attribute set pattern can now
say `...` at the end of the attribute name list to specify that say `...` at the end of the attribute name list to specify that
the function takes *at least* the listed attributes, while the function takes *at least* the listed attributes, while
ignoring additional attributes. For instance, ignoring additional attributes. For instance,
{stdenv, fetchurl, fuse, ...}: ... {stdenv, fetchurl, fuse, ...}: ...
defines a function that accepts any attribute set that includes defines a function that accepts any attribute set that includes
at least the three listed attributes. at least the three listed attributes.
- New primops: `builtins.parseDrvName` (split a package name - New primops: `builtins.parseDrvName` (split a package name
string like `"nix-0.12pre12876"` into its name and version string like `"nix-0.12pre12876"` into its name and version
components, e.g. `"nix"` and `"0.12pre12876"`), components, e.g. `"nix"` and `"0.12pre12876"`),

View file

@ -3,7 +3,7 @@
This is primarily a bug fix release. It has some new features: This is primarily a bug fix release. It has some new features:
- Syntactic sugar for writing nested attribute sets. Instead of - Syntactic sugar for writing nested attribute sets. Instead of
{ {
foo = { foo = {
bar = 123; bar = 123;
@ -11,15 +11,15 @@ This is primarily a bug fix release. It has some new features:
}; };
a = { b = { c = "d"; }; }; a = { b = { c = "d"; }; };
} }
you can write you can write
{ {
foo.bar = 123; foo.bar = 123;
foo.xyzzy = true; foo.xyzzy = true;
a.b.c = "d"; a.b.c = "d";
} }
This is useful, for instance, in NixOS configuration files. This is useful, for instance, in NixOS configuration files.
- Support for Nix channels generated by Hydra, the Nix-based - Support for Nix channels generated by Hydra, the Nix-based

View file

@ -1,15 +1,15 @@
# Release 0.6 (2004-11-14) # Release 0.6 (2004-11-14)
- Rewrite of the normalisation engine. - Rewrite of the normalisation engine.
- Multiple builds can now be performed in parallel (option `-j`). - Multiple builds can now be performed in parallel (option `-j`).
- Distributed builds. Nix can now call a shell script to forward - Distributed builds. Nix can now call a shell script to forward
builds to Nix installations on remote machines, which may or may builds to Nix installations on remote machines, which may or may
not be of the same platform type. not be of the same platform type.
- Option `--fallback` allows recovery from broken substitutes. - Option `--fallback` allows recovery from broken substitutes.
- Option `--keep-going` causes building of other (unaffected) - Option `--keep-going` causes building of other (unaffected)
derivations to continue if one failed. derivations to continue if one failed.
@ -28,32 +28,32 @@
- Manual updates. - Manual updates.
- `nix-env` changes: - `nix-env` changes:
- Derivations for other platforms are filtered out (which can be - Derivations for other platforms are filtered out (which can be
overridden using `--system-filter`). overridden using `--system-filter`).
- `--install` by default now uninstall previous derivations with - `--install` by default now uninstall previous derivations with
the same name. the same name.
- `--upgrade` allows upgrading to a specific version. - `--upgrade` allows upgrading to a specific version.
- New operation `--delete-generations` to remove profile - New operation `--delete-generations` to remove profile
generations (necessary for effective garbage collection). generations (necessary for effective garbage collection).
- Nicer output (sorted, columnised). - Nicer output (sorted, columnised).
- More sensible verbosity levels all around (builder output is now - More sensible verbosity levels all around (builder output is now
shown always, unless `-Q` is given). shown always, unless `-Q` is given).
- Nix expression language changes: - Nix expression language changes:
- New language construct: `with - New language construct: `with
E1; E1;
E2` brings all attributes defined in the attribute set *E1* in E2` brings all attributes defined in the attribute set *E1* in
scope in *E2*. scope in *E2*.
- Added a `map` function. - Added a `map` function.
- Various new operators (e.g., string concatenation). - Various new operators (e.g., string concatenation).
- Expression evaluation is much faster. - Expression evaluation is much faster.

View file

@ -39,29 +39,29 @@ Nix 0.8 has the following improvements:
notion of “closure store expressions” is gone (and so is the notion notion of “closure store expressions” is gone (and so is the notion
of “successors”); the file system references of a store path are now of “successors”); the file system references of a store path are now
just stored in the database. just stored in the database.
For instance, given any store path, you can query its closure: For instance, given any store path, you can query its closure:
$ nix-store -qR $(which firefox) $ nix-store -qR $(which firefox)
... lots of paths ... ... lots of paths ...
Also, Nix now remembers for each store path the derivation that Also, Nix now remembers for each store path the derivation that
built it (the “deriver”): built it (the “deriver”):
$ nix-store -qR $(which firefox) $ nix-store -qR $(which firefox)
/nix/store/4b0jx7vq80l9aqcnkszxhymsf1ffa5jd-firefox-1.0.1.drv /nix/store/4b0jx7vq80l9aqcnkszxhymsf1ffa5jd-firefox-1.0.1.drv
So to see the build-time dependencies, you can do So to see the build-time dependencies, you can do
$ nix-store -qR $(nix-store -qd $(which firefox)) $ nix-store -qR $(nix-store -qd $(which firefox))
or, in a nicer format: or, in a nicer format:
$ nix-store -q --tree $(nix-store -qd $(which firefox)) $ nix-store -q --tree $(nix-store -qd $(which firefox))
File system references are also stored in reverse. For instance, you File system references are also stored in reverse. For instance, you
can query all paths that directly or indirectly use a certain Glibc: can query all paths that directly or indirectly use a certain Glibc:
$ nix-store -q --referrers-closure \ $ nix-store -q --referrers-closure \
/nix/store/8lz9yc6zgmc0vlqmn2ipcpkjlmbi51vv-glibc-2.3.4 /nix/store/8lz9yc6zgmc0vlqmn2ipcpkjlmbi51vv-glibc-2.3.4
@ -92,28 +92,28 @@ Nix 0.8 has the following improvements:
- `nix-channel` has new operations `--list` and `--remove`. - `nix-channel` has new operations `--list` and `--remove`.
- New ways of installing components into user environments: - New ways of installing components into user environments:
- Copy from another user environment: - Copy from another user environment:
$ nix-env -i --from-profile .../other-profile firefox $ nix-env -i --from-profile .../other-profile firefox
- Install a store derivation directly (bypassing the Nix - Install a store derivation directly (bypassing the Nix
expression language entirely): expression language entirely):
$ nix-env -i /nix/store/z58v41v21xd3...-aterm-2.3.1.drv $ nix-env -i /nix/store/z58v41v21xd3...-aterm-2.3.1.drv
(This is used to implement `nix-install-package`, which is (This is used to implement `nix-install-package`, which is
therefore immune to evolution in the Nix expression language.) therefore immune to evolution in the Nix expression language.)
- Install an already built store path directly: - Install an already built store path directly:
$ nix-env -i /nix/store/hsyj5pbn0d9i...-aterm-2.3.1 $ nix-env -i /nix/store/hsyj5pbn0d9i...-aterm-2.3.1
- Install the result of a Nix expression specified as a - Install the result of a Nix expression specified as a
command-line argument: command-line argument:
$ nix-env -f .../i686-linux.nix -i -E 'x: x.firefoxWrapper' $ nix-env -f .../i686-linux.nix -i -E 'x: x.firefoxWrapper'
The difference with the normal installation mode is that `-E` The difference with the normal installation mode is that `-E`
does not use the `name` attributes of derivations. Therefore, does not use the `name` attributes of derivations. Therefore,
this can be used to disambiguate multiple derivations with the this can be used to disambiguate multiple derivations with the
@ -127,7 +127,7 @@ Nix 0.8 has the following improvements:
- Implemented a concurrent garbage collector. It is now always safe to - Implemented a concurrent garbage collector. It is now always safe to
run the garbage collector, even if other Nix operations are run the garbage collector, even if other Nix operations are
happening simultaneously. happening simultaneously.
However, there can still be GC races if you use `nix-instantiate` However, there can still be GC races if you use `nix-instantiate`
and `nix-store and `nix-store
--realise` directly to build things. To prevent races, use the --realise` directly to build things. To prevent races, use the
@ -147,13 +147,13 @@ Nix 0.8 has the following improvements:
- The behaviour of the garbage collector can be changed globally by - The behaviour of the garbage collector can be changed globally by
setting options in `/nix/etc/nix/nix.conf`. setting options in `/nix/etc/nix/nix.conf`.
- `gc-keep-derivations` specifies whether deriver links should be - `gc-keep-derivations` specifies whether deriver links should be
followed when searching for live paths. followed when searching for live paths.
- `gc-keep-outputs` specifies whether outputs of derivations - `gc-keep-outputs` specifies whether outputs of derivations
should be followed when searching for live paths. should be followed when searching for live paths.
- `env-keep-derivations` specifies whether user environments - `env-keep-derivations` specifies whether user environments
should store the paths of derivations when they are added (thus should store the paths of derivations when they are added (thus
keeping the derivations alive). keeping the derivations alive).

View file

@ -18,36 +18,36 @@ first.
derivations can mutually refer to each other (as long as there are derivations can mutually refer to each other (as long as there are
no data dependencies on the `outPath` and `drvPath` attributes no data dependencies on the `outPath` and `drvPath` attributes
computed by `derivation`). computed by `derivation`).
For example, the expression `derivation For example, the expression `derivation
attrs` now evaluates to (essentially) attrs` now evaluates to (essentially)
attrs // { attrs // {
type = "derivation"; type = "derivation";
outPath = derivation! attrs; outPath = derivation! attrs;
drvPath = derivation! attrs; drvPath = derivation! attrs;
} }
where `derivation!` is a primop that does the actual derivation where `derivation!` is a primop that does the actual derivation
instantiation (i.e., it does what `derivation` used to do). The instantiation (i.e., it does what `derivation` used to do). The
advantage is that it allows commands such as `nix-env -qa` and advantage is that it allows commands such as `nix-env -qa` and
`nix-env -i` to be much faster since they no longer need to `nix-env -i` to be much faster since they no longer need to
instantiate all derivations, just the `name` attribute. instantiate all derivations, just the `name` attribute.
Also, it allows derivations to cyclically reference each other, for Also, it allows derivations to cyclically reference each other, for
example, example,
webServer = derivation { webServer = derivation {
... ...
hostName = "svn.cs.uu.nl"; hostName = "svn.cs.uu.nl";
services = [svnService]; services = [svnService];
}; };
svnService = derivation { svnService = derivation {
... ...
hostName = webServer.hostName; hostName = webServer.hostName;
}; };
Previously, this would yield a black hole (infinite recursion). Previously, this would yield a black hole (infinite recursion).
- `nix-build` now defaults to using `./default.nix` if no Nix - `nix-build` now defaults to using `./default.nix` if no Nix

View file

@ -5,26 +5,26 @@ This release has the following improvements:
- On Linux, when doing a chroot build, Nix now uses various namespace - On Linux, when doing a chroot build, Nix now uses various namespace
features provided by the Linux kernel to improve build isolation. features provided by the Linux kernel to improve build isolation.
Namely: Namely:
- The private network namespace ensures that builders cannot talk - The private network namespace ensures that builders cannot talk
to the outside world (or vice versa): each build only sees a to the outside world (or vice versa): each build only sees a
private loopback interface. This also means that two concurrent private loopback interface. This also means that two concurrent
builds can listen on the same port (e.g. as part of a test) builds can listen on the same port (e.g. as part of a test)
without conflicting with each other. without conflicting with each other.
- The PID namespace causes each build to start as PID 1. Processes - The PID namespace causes each build to start as PID 1. Processes
outside of the chroot are not visible to those on the inside. On outside of the chroot are not visible to those on the inside. On
the other hand, processes inside the chroot *are* visible from the other hand, processes inside the chroot *are* visible from
the outside (though with different PIDs). the outside (though with different PIDs).
- The IPC namespace prevents the builder from communicating with - The IPC namespace prevents the builder from communicating with
outside processes using SysV IPC mechanisms (shared memory, outside processes using SysV IPC mechanisms (shared memory,
message queues, semaphores). It also ensures that all IPC message queues, semaphores). It also ensures that all IPC
objects are destroyed when the builder exits. objects are destroyed when the builder exits.
- The UTS namespace ensures that builders see a hostname of - The UTS namespace ensures that builders see a hostname of
`localhost` rather than the actual hostname. `localhost` rather than the actual hostname.
- The private mount namespace was already used by Nix to ensure - The private mount namespace was already used by Nix to ensure
that the bind-mounts used to set up the chroot are cleaned up that the bind-mounts used to set up the chroot are cleaned up
automatically. automatically.

View file

@ -5,23 +5,23 @@ features:
- `nix-prefetch-url` can now download URLs specified in a Nix - `nix-prefetch-url` can now download URLs specified in a Nix
expression. For example, expression. For example,
$ nix-prefetch-url -A hello.src $ nix-prefetch-url -A hello.src
will prefetch the file specified by the `fetchurl` call in the will prefetch the file specified by the `fetchurl` call in the
attribute `hello.src` from the Nix expression in the current attribute `hello.src` from the Nix expression in the current
directory, and print the cryptographic hash of the resulting file on directory, and print the cryptographic hash of the resulting file on
stdout. This differs from `nix-build -A stdout. This differs from `nix-build -A
hello.src` in that it doesn't verify the hash, and is thus useful hello.src` in that it doesn't verify the hash, and is thus useful
when youre updating a Nix expression. when youre updating a Nix expression.
You can also prefetch the result of functions that unpack a tarball, You can also prefetch the result of functions that unpack a tarball,
such as `fetchFromGitHub`. For example: such as `fetchFromGitHub`. For example:
$ nix-prefetch-url --unpack https://github.com/NixOS/patchelf/archive/0.8.tar.gz $ nix-prefetch-url --unpack https://github.com/NixOS/patchelf/archive/0.8.tar.gz
or from a Nix expression: or from a Nix expression:
$ nix-prefetch-url -A nix-repl.src $ nix-prefetch-url -A nix-repl.src
- The builtin function `<nix/fetchurl.nix>` now supports downloading - The builtin function `<nix/fetchurl.nix>` now supports downloading
@ -49,12 +49,12 @@ features:
same derivation and `-K` is given, will make the output of the other same derivation and `-K` is given, will make the output of the other
run available under `store-path-check`. This makes it easier to run available under `store-path-check`. This makes it easier to
investigate the non-determinism using tools like `diffoscope`, e.g., investigate the non-determinism using tools like `diffoscope`, e.g.,
$ nix-build pkgs/stdenv/linux -A stage1.pkgs.zlib --check -K $ nix-build pkgs/stdenv/linux -A stage1.pkgs.zlib --check -K
error: derivation /nix/store/l54i8wlw2265…-zlib-1.2.8.drv may not error: derivation /nix/store/l54i8wlw2265…-zlib-1.2.8.drv may not
be deterministic: output /nix/store/11a27shh6n2i…-zlib-1.2.8 be deterministic: output /nix/store/11a27shh6n2i…-zlib-1.2.8
differs from /nix/store/11a27shh6n2i…-zlib-1.2.8-check differs from /nix/store/11a27shh6n2i…-zlib-1.2.8-check
$ diffoscope /nix/store/11a27shh6n2i…-zlib-1.2.8 /nix/store/11a27shh6n2i…-zlib-1.2.8-check $ diffoscope /nix/store/11a27shh6n2i…-zlib-1.2.8 /nix/store/11a27shh6n2i…-zlib-1.2.8-check
├── lib/libz.a ├── lib/libz.a

View file

@ -8,9 +8,9 @@ This release has the following improvements and changes:
binary caches to see if any of them has a pre-built binary of that binary caches to see if any of them has a pre-built binary of that
path. The configuration setting `binary-caches` contains a list of path. The configuration setting `binary-caches` contains a list of
URLs of binary caches. For instance, doing URLs of binary caches. For instance, doing
$ nix-env -i thunderbird --option binary-caches http://cache.nixos.org $ nix-env -i thunderbird --option binary-caches http://cache.nixos.org
will install Thunderbird and its dependencies, using the available will install Thunderbird and its dependencies, using the available
pre-built binaries in <http://cache.nixos.org>. The main advantage pre-built binaries in <http://cache.nixos.org>. The main advantage
over the old “manifest”-based method of getting pre-built binaries over the old “manifest”-based method of getting pre-built binaries
@ -19,12 +19,12 @@ This release has the following improvements and changes:
need to run `nix-pull` to update your manifest. Its also more need to run `nix-pull` to update your manifest. Its also more
scalable because you dont need to redownload a giant manifest file scalable because you dont need to redownload a giant manifest file
every time. every time.
A Nix channel can provide a binary cache URL that will be used A Nix channel can provide a binary cache URL that will be used
automatically if you subscribe to that channel. If you use the automatically if you subscribe to that channel. If you use the
Nixpkgs or NixOS channels (<http://nixos.org/channels>) you Nixpkgs or NixOS channels (<http://nixos.org/channels>) you
automatically get the cache <http://cache.nixos.org>. automatically get the cache <http://cache.nixos.org>.
Binary caches are created using `nix-push`. For details on the Binary caches are created using `nix-push`. For details on the
operation and format of binary caches, see the `nix-push` manpage. operation and format of binary caches, see the `nix-push` manpage.
More details are provided in [this nix-dev More details are provided in [this nix-dev
@ -33,16 +33,16 @@ This release has the following improvements and changes:
- Multiple output support should now be usable. A derivation can - Multiple output support should now be usable. A derivation can
declare that it wants to produce multiple store paths by saying declare that it wants to produce multiple store paths by saying
something like something like
outputs = [ "lib" "headers" "doc" ]; outputs = [ "lib" "headers" "doc" ];
This will cause Nix to pass the intended store path of each output This will cause Nix to pass the intended store path of each output
to the builder through the environment variables `lib`, `headers` to the builder through the environment variables `lib`, `headers`
and `doc`. Other packages can refer to a specific output by and `doc`. Other packages can refer to a specific output by
referring to `pkg.output`, e.g. referring to `pkg.output`, e.g.
buildInputs = [ pkg.lib pkg.headers ]; buildInputs = [ pkg.lib pkg.headers ];
If you install a package with multiple outputs using `nix-env`, each If you install a package with multiple outputs using `nix-env`, each
output path will be symlinked into the user environment. output path will be symlinked into the user environment.
@ -60,10 +60,10 @@ This release has the following improvements and changes:
Instead, the recommended way to guard the Nix store against Instead, the recommended way to guard the Nix store against
accidental modification on Linux is to make it a read-only bind accidental modification on Linux is to make it a read-only bind
mount, like this: mount, like this:
$ mount --bind /nix/store /nix/store $ mount --bind /nix/store /nix/store
$ mount -o remount,ro,bind /nix/store $ mount -o remount,ro,bind /nix/store
Nix will automatically make `/nix/store` writable as needed (using a Nix will automatically make `/nix/store` writable as needed (using a
private mount namespace) to allow modifications. private mount namespace) to allow modifications.

View file

@ -25,28 +25,28 @@ features:
declarative package management similar to NixOSs declarative package management similar to NixOSs
`environment.systemPackages`. For instance, if you have a `environment.systemPackages`. For instance, if you have a
specification `my-packages.nix` like this: specification `my-packages.nix` like this:
with import <nixpkgs> {}; with import <nixpkgs> {};
[ thunderbird [ thunderbird
geeqie geeqie
... ...
] ]
then after any change to this file, you can run: then after any change to this file, you can run:
$ nix-env -f my-packages.nix -ir $ nix-env -f my-packages.nix -ir
to update your profile to match the specification. to update your profile to match the specification.
- The `with` language construct is now more lazy. It only evaluates - The `with` language construct is now more lazy. It only evaluates
its argument if a variable might actually refer to an attribute in its argument if a variable might actually refer to an attribute in
the argument. For instance, this now works: the argument. For instance, this now works:
let let
pkgs = with pkgs; { foo = "old"; bar = foo; } // overrides; pkgs = with pkgs; { foo = "old"; bar = foo; } // overrides;
overrides = { foo = "new"; }; overrides = { foo = "new"; };
in pkgs.bar in pkgs.bar
This evaluates to `"new"`, while previously it gave an “infinite This evaluates to `"new"`, while previously it gave an “infinite
recursion” error. recursion” error.

View file

@ -25,7 +25,7 @@ features:
builds a previously built derivation again, and prints an error builds a previously built derivation again, and prints an error
message if the output is not exactly the same. This helps to verify message if the output is not exactly the same. This helps to verify
whether a derivation is truly deterministic. For example: whether a derivation is truly deterministic. For example:
$ nix-build '<nixpkgs>' -A patchelf $ nix-build '<nixpkgs>' -A patchelf
$ nix-build '<nixpkgs>' -A patchelf --check $ nix-build '<nixpkgs>' -A patchelf --check
@ -43,31 +43,31 @@ features:
'1 + 2'` will print `3`. '1 + 2'` will print `3`.
- `nix-shell` improvements: - `nix-shell` improvements:
- It has a new flag, `--packages` (or `-p`), that sets up a build - It has a new flag, `--packages` (or `-p`), that sets up a build
environment containing the specified packages from Nixpkgs. For environment containing the specified packages from Nixpkgs. For
example, the command example, the command
$ nix-shell -p sqlite xorg.libX11 hello $ nix-shell -p sqlite xorg.libX11 hello
will start a shell in which the given packages are present. will start a shell in which the given packages are present.
- It now uses `shell.nix` as the default expression, falling back - It now uses `shell.nix` as the default expression, falling back
to `default.nix` if the former doesnt exist. This makes it to `default.nix` if the former doesnt exist. This makes it
convenient to have a `shell.nix` in your project to set up a convenient to have a `shell.nix` in your project to set up a
nice development environment. nice development environment.
- It evaluates the derivation attribute `shellHook`, if set. Since - It evaluates the derivation attribute `shellHook`, if set. Since
`stdenv` does not normally execute this hook, it allows you to `stdenv` does not normally execute this hook, it allows you to
do `nix-shell`-specific setup. do `nix-shell`-specific setup.
- It preserves the users timezone setting. - It preserves the users timezone setting.
- In chroots, Nix now sets up a `/dev` containing only a minimal set - In chroots, Nix now sets up a `/dev` containing only a minimal set
of devices (such as `/dev/null`). Note that it only does this if you of devices (such as `/dev/null`). Note that it only does this if you
*dont* have `/dev` listed in your `build-chroot-dirs` setting; *dont* have `/dev` listed in your `build-chroot-dirs` setting;
otherwise, it will bind-mount the `/dev` from outside the chroot. otherwise, it will bind-mount the `/dev` from outside the chroot.
Similarly, if you dont have `/dev/pts` listed in Similarly, if you dont have `/dev/pts` listed in
`build-chroot-dirs`, Nix will mount a private `devpts` filesystem on `build-chroot-dirs`, Nix will mount a private `devpts` filesystem on
the chroots `/dev/pts`. the chroots `/dev/pts`.
@ -82,7 +82,7 @@ features:
such as attribute sets. such as attribute sets.
- The `-A` flag now allows attribute names with dots in them, e.g. - The `-A` flag now allows attribute names with dots in them, e.g.
$ nix-instantiate --eval '<nixos>' -A 'config.systemd.units."nscd.service".text' $ nix-instantiate --eval '<nixos>' -A 'config.systemd.units."nscd.service".text'
- The `--max-freed` option to `nix-store --gc` now accepts a unit - The `--max-freed` option to `nix-store --gc` now accepts a unit
@ -106,7 +106,7 @@ features:
`unsafeGetAttrPos`, that returns the position of an attribute. This `unsafeGetAttrPos`, that returns the position of an attribute. This
is used by Nixpkgs to provide location information in error is used by Nixpkgs to provide location information in error
messages, e.g. messages, e.g.
$ nix-build '<nixpkgs>' -A libreoffice --argstr system x86_64-darwin $ nix-build '<nixpkgs>' -A libreoffice --argstr system x86_64-darwin
error: the package libreoffice-4.0.5.2 in .../applications/office/libreoffice/default.nix:263 error: the package libreoffice-4.0.5.2 in .../applications/office/libreoffice/default.nix:263
is not supported on x86_64-darwin is not supported on x86_64-darwin
@ -116,12 +116,12 @@ features:
- The binary tarball installer has been improved. You can now install - The binary tarball installer has been improved. You can now install
Nix by running: Nix by running:
$ bash <(curl -L https://nixos.org/nix/install) $ bash <(curl -L https://nixos.org/nix/install)
- More evaluation errors include position information. For instance, - More evaluation errors include position information. For instance,
selecting a missing attribute will print something like selecting a missing attribute will print something like
error: attribute `nixUnstabl' missing, at /etc/nixos/configurations/misc/eelco/mandark.nix:216:15 error: attribute `nixUnstabl' missing, at /etc/nixos/configurations/misc/eelco/mandark.nix:216:15
- The command `nix-setuid-helper` is gone. - The command `nix-setuid-helper` is gone.

View file

@ -10,24 +10,24 @@
- `nix-env` selectors are now regular expressions. For instance, you - `nix-env` selectors are now regular expressions. For instance, you
can do can do
$ nix-env -qa '.*zip.*' $ nix-env -qa '.*zip.*'
to query all packages with a name containing `zip`. to query all packages with a name containing `zip`.
- `nix-store --read-log` can now fetch remote build logs. If a build - `nix-store --read-log` can now fetch remote build logs. If a build
log is not available locally, then nix-store -l will now try to log is not available locally, then nix-store -l will now try to
download it from the servers listed in the log-servers option in download it from the servers listed in the log-servers option in
nix.conf. For instance, if you have the configuration option nix.conf. For instance, if you have the configuration option
log-servers = http://hydra.nixos.org/log log-servers = http://hydra.nixos.org/log
then it will try to get logs from `http://hydra.nixos.org/log/base then it will try to get logs from `http://hydra.nixos.org/log/base
name of the name of the
store path`. This allows you to do things like: store path`. This allows you to do things like:
$ nix-store -l $(which xterm) $ nix-store -l $(which xterm)
and get a log even if `xterm` wasn't built locally. and get a log even if `xterm` wasn't built locally.
- New builtin functions: `attrValues`, `deepSeq`, `fromJSON`, - New builtin functions: `attrValues`, `deepSeq`, `fromJSON`,

View file

@ -5,17 +5,17 @@ features:
- Signed binary cache support. You can enable signature checking by - Signed binary cache support. You can enable signature checking by
adding the following to `nix.conf`: adding the following to `nix.conf`:
signed-binary-caches = * signed-binary-caches = *
binary-cache-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= binary-cache-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
This will prevent Nix from downloading any binary from the cache This will prevent Nix from downloading any binary from the cache
that is not signed by one of the keys listed in that is not signed by one of the keys listed in
`binary-cache-public-keys`. `binary-cache-public-keys`.
Signature checking is only supported if you built Nix with the Signature checking is only supported if you built Nix with the
`libsodium` package. `libsodium` package.
Note that while Nix has had experimental support for signed binary Note that while Nix has had experimental support for signed binary
caches since version 1.7, this release changes the signature format caches since version 1.7, this release changes the signature format
in a backwards-incompatible way. in a backwards-incompatible way.
@ -24,79 +24,79 @@ features:
you can now specify the URL of a tarball containing Nix expressions you can now specify the URL of a tarball containing Nix expressions
(such as Nixpkgs), which will be downloaded and unpacked (such as Nixpkgs), which will be downloaded and unpacked
automatically. For example: automatically. For example:
- In `nix-env`: - In `nix-env`:
$ nix-env -f https://github.com/NixOS/nixpkgs-channels/archive/nixos-14.12.tar.gz -iA firefox $ nix-env -f https://github.com/NixOS/nixpkgs-channels/archive/nixos-14.12.tar.gz -iA firefox
This installs Firefox from the latest tested and built revision This installs Firefox from the latest tested and built revision
of the NixOS 14.12 channel. of the NixOS 14.12 channel.
- In `nix-build` and `nix-shell`: - In `nix-build` and `nix-shell`:
$ nix-build https://github.com/NixOS/nixpkgs/archive/master.tar.gz -A hello $ nix-build https://github.com/NixOS/nixpkgs/archive/master.tar.gz -A hello
This builds GNU Hello from the latest revision of the Nixpkgs This builds GNU Hello from the latest revision of the Nixpkgs
master branch. master branch.
- In the Nix search path (as specified via `NIX_PATH` or `-I`). - In the Nix search path (as specified via `NIX_PATH` or `-I`).
For example, to start a shell containing the Pan package from a For example, to start a shell containing the Pan package from a
specific version of Nixpkgs: specific version of Nixpkgs:
$ nix-shell -p pan -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/8a3eea054838b55aca962c3fbde9c83c102b8bf2.tar.gz $ nix-shell -p pan -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/8a3eea054838b55aca962c3fbde9c83c102b8bf2.tar.gz
- In `nixos-rebuild` (on NixOS): - In `nixos-rebuild` (on NixOS):
$ nixos-rebuild test -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz $ nixos-rebuild test -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz
- In Nix expressions, via the new builtin function `fetchTarball`: - In Nix expressions, via the new builtin function `fetchTarball`:
with import (fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-14.12.tar.gz) {}; … with import (fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-14.12.tar.gz) {}; …
(This is not allowed in restricted mode.) (This is not allowed in restricted mode.)
- `nix-shell` improvements: - `nix-shell` improvements:
- `nix-shell` now has a flag `--run` to execute a command in the - `nix-shell` now has a flag `--run` to execute a command in the
`nix-shell` environment, e.g. `nix-shell --run make`. This is `nix-shell` environment, e.g. `nix-shell --run make`. This is
like the existing `--command` flag, except that it uses a like the existing `--command` flag, except that it uses a
non-interactive shell (ensuring that hitting Ctrl-C wont drop non-interactive shell (ensuring that hitting Ctrl-C wont drop
you into the child shell). you into the child shell).
- `nix-shell` can now be used as a `#!`-interpreter. This allows - `nix-shell` can now be used as a `#!`-interpreter. This allows
you to write scripts that dynamically fetch their own you to write scripts that dynamically fetch their own
dependencies. For example, here is a Haskell script that, when dependencies. For example, here is a Haskell script that, when
invoked, first downloads GHC and the Haskell packages on which invoked, first downloads GHC and the Haskell packages on which
it depends: it depends:
#! /usr/bin/env nix-shell #! /usr/bin/env nix-shell
#! nix-shell -i runghc -p haskellPackages.ghc haskellPackages.HTTP #! nix-shell -i runghc -p haskellPackages.ghc haskellPackages.HTTP
import Network.HTTP import Network.HTTP
main = do main = do
resp <- Network.HTTP.simpleHTTP (getRequest "http://nixos.org/") resp <- Network.HTTP.simpleHTTP (getRequest "http://nixos.org/")
body <- getResponseBody resp body <- getResponseBody resp
print (take 100 body) print (take 100 body)
Of course, the dependencies are cached in the Nix store, so the Of course, the dependencies are cached in the Nix store, so the
second invocation of this script will be much faster. second invocation of this script will be much faster.
- Chroot improvements: - Chroot improvements:
- Chroot builds are now supported on Mac OS X (using its sandbox - Chroot builds are now supported on Mac OS X (using its sandbox
mechanism). mechanism).
- If chroots are enabled, they are now used for all derivations, - If chroots are enabled, they are now used for all derivations,
including fixed-output derivations (such as `fetchurl`). The including fixed-output derivations (such as `fetchurl`). The
latter do have network access, but can no longer access the host latter do have network access, but can no longer access the host
filesystem. If you need the old behaviour, you can set the filesystem. If you need the old behaviour, you can set the
option `build-use-chroot` to `relaxed`. option `build-use-chroot` to `relaxed`.
- On Linux, if chroots are enabled, builds are performed in a - On Linux, if chroots are enabled, builds are performed in a
private PID namespace once again. (This functionality was lost private PID namespace once again. (This functionality was lost
in Nix 1.8.) in Nix 1.8.)
- Store paths listed in `build-chroot-dirs` are now automatically - Store paths listed in `build-chroot-dirs` are now automatically
expanded to their closure. For instance, if you want expanded to their closure. For instance, if you want
`/nix/store/…-bash/bin/sh` mounted in your chroot as `/bin/sh`, `/nix/store/…-bash/bin/sh` mounted in your chroot as `/bin/sh`,

View file

@ -8,13 +8,13 @@ The following incompatible changes have been made:
It has been superseded by the binary cache substituter mechanism It has been superseded by the binary cache substituter mechanism
since several years. As a result, the following programs have been since several years. As a result, the following programs have been
removed: removed:
- `nix-pull` - `nix-pull`
- `nix-generate-patches` - `nix-generate-patches`
- `bsdiff` - `bsdiff`
- `bspatch` - `bspatch`
- The “copy from other stores” substituter mechanism - The “copy from other stores” substituter mechanism
@ -58,26 +58,26 @@ This release has the following new features:
`nix-build`, `nix-shell -p`, `nix-env -qa`, `nix-instantiate `nix-build`, `nix-shell -p`, `nix-env -qa`, `nix-instantiate
--eval`, `nix-push` and `nix-copy-closure`. It has the following --eval`, `nix-push` and `nix-copy-closure`. It has the following
major features: major features:
- Unlike the legacy commands, it has a consistent way to refer to - Unlike the legacy commands, it has a consistent way to refer to
packages and package-like arguments (like store paths). For packages and package-like arguments (like store paths). For
example, the following commands all copy the GNU Hello package example, the following commands all copy the GNU Hello package
to a remote machine: to a remote machine:
nix copy --to ssh://machine nixpkgs.hello nix copy --to ssh://machine nixpkgs.hello
nix copy --to ssh://machine /nix/store/0i2jd68mp5g6h2sa5k9c85rb80sn8hi9-hello-2.10 nix copy --to ssh://machine /nix/store/0i2jd68mp5g6h2sa5k9c85rb80sn8hi9-hello-2.10
nix copy --to ssh://machine '(with import <nixpkgs> {}; hello)' nix copy --to ssh://machine '(with import <nixpkgs> {}; hello)'
By contrast, `nix-copy-closure` only accepted store paths as By contrast, `nix-copy-closure` only accepted store paths as
arguments. arguments.
- It is self-documenting: `--help` shows all available - It is self-documenting: `--help` shows all available
command-line arguments. If `--help` is given after a subcommand, command-line arguments. If `--help` is given after a subcommand,
it shows examples for that subcommand. `nix it shows examples for that subcommand. `nix
--help-config` shows all configuration options. --help-config` shows all configuration options.
- It is much less verbose. By default, it displays a single-line - It is much less verbose. By default, it displays a single-line
progress indicator that shows how many packages are left to be progress indicator that shows how many packages are left to be
built or downloaded, and (if there are running builds) the most built or downloaded, and (if there are running builds) the most
@ -85,7 +85,7 @@ This release has the following new features:
last few lines of builder output. The full build log can be last few lines of builder output. The full build log can be
retrieved using `nix retrieved using `nix
log`. log`.
- It - It
[provides](https://github.com/NixOS/nix/commit/b8283773bd64d7da6859ed520ee19867742a03ba) [provides](https://github.com/NixOS/nix/commit/b8283773bd64d7da6859ed520ee19867742a03ba)
all `nix.conf` configuration options as command line flags. For all `nix.conf` configuration options as command line flags. For
@ -93,122 +93,122 @@ This release has the following new features:
http-connections 100` you can write `--http-connections 100`. http-connections 100` you can write `--http-connections 100`.
Boolean options can be written as `--foo` or `--no-foo` (e.g. Boolean options can be written as `--foo` or `--no-foo` (e.g.
`--no-auto-optimise-store`). `--no-auto-optimise-store`).
- Many subcommands have a `--json` flag to write results to stdout - Many subcommands have a `--json` flag to write results to stdout
in JSON format. in JSON format.
> **Warning** > **Warning**
> >
> Please note that the `nix` command is a work in progress and the > Please note that the `nix` command is a work in progress and the
> interface is subject to change. > interface is subject to change.
It provides the following high-level (“porcelain”) subcommands: It provides the following high-level (“porcelain”) subcommands:
- `nix build` is a replacement for `nix-build`. - `nix build` is a replacement for `nix-build`.
- `nix run` executes a command in an environment in which the - `nix run` executes a command in an environment in which the
specified packages are available. It is (roughly) a replacement specified packages are available. It is (roughly) a replacement
for `nix-shell for `nix-shell
-p`. Unlike that command, it does not execute the command in a -p`. Unlike that command, it does not execute the command in a
shell, and has a flag (`-c`) that specifies the unquoted command shell, and has a flag (`-c`) that specifies the unquoted command
line to be executed. line to be executed.
It is particularly useful in conjunction with chroot stores, It is particularly useful in conjunction with chroot stores,
allowing Linux users who do not have permission to install Nix allowing Linux users who do not have permission to install Nix
in `/nix/store` to still use binary substitutes that assume in `/nix/store` to still use binary substitutes that assume
`/nix/store`. For example, `/nix/store`. For example,
nix run --store ~/my-nix nixpkgs.hello -c hello --greeting 'Hi everybody!' nix run --store ~/my-nix nixpkgs.hello -c hello --greeting 'Hi everybody!'
downloads (or if not substitutes are available, builds) the GNU downloads (or if not substitutes are available, builds) the GNU
Hello package into `~/my-nix/nix/store`, then runs `hello` in a Hello package into `~/my-nix/nix/store`, then runs `hello` in a
mount namespace where `~/my-nix/nix/store` is mounted onto mount namespace where `~/my-nix/nix/store` is mounted onto
`/nix/store`. `/nix/store`.
- `nix search` replaces `nix-env - `nix search` replaces `nix-env
-qa`. It searches the available packages for occurrences of a -qa`. It searches the available packages for occurrences of a
search string in the attribute name, package name or search string in the attribute name, package name or
description. Unlike `nix-env -qa`, it has a cache to speed up description. Unlike `nix-env -qa`, it has a cache to speed up
subsequent searches. subsequent searches.
- `nix copy` copies paths between arbitrary Nix stores, - `nix copy` copies paths between arbitrary Nix stores,
generalising `nix-copy-closure` and `nix-push`. generalising `nix-copy-closure` and `nix-push`.
- `nix repl` replaces the external program `nix-repl`. It provides - `nix repl` replaces the external program `nix-repl`. It provides
an interactive environment for evaluating and building Nix an interactive environment for evaluating and building Nix
expressions. Note that it uses `linenoise-ng` instead of GNU expressions. Note that it uses `linenoise-ng` instead of GNU
Readline. Readline.
- `nix upgrade-nix` upgrades Nix to the latest stable version. - `nix upgrade-nix` upgrades Nix to the latest stable version.
This requires that Nix is installed in a profile. (Thus it wont This requires that Nix is installed in a profile. (Thus it wont
work on NixOS, or if its installed outside of the Nix store.) work on NixOS, or if its installed outside of the Nix store.)
- `nix verify` checks whether store paths are unmodified and/or - `nix verify` checks whether store paths are unmodified and/or
“trusted” (see below). It replaces `nix-store --verify` and “trusted” (see below). It replaces `nix-store --verify` and
`nix-store `nix-store
--verify-path`. --verify-path`.
- `nix log` shows the build log of a package or path. If the - `nix log` shows the build log of a package or path. If the
build log is not available locally, it will try to obtain it build log is not available locally, it will try to obtain it
from the configured substituters (such as from the configured substituters (such as
[cache.nixos.org](https://cache.nixos.org/), which now [cache.nixos.org](https://cache.nixos.org/), which now
provides build logs). provides build logs).
- `nix edit` opens the source code of a package in your editor. - `nix edit` opens the source code of a package in your editor.
- `nix eval` replaces `nix-instantiate --eval`. - `nix eval` replaces `nix-instantiate --eval`.
- `nix - `nix
why-depends` shows why one store path has another in its why-depends` shows why one store path has another in its
closure. This is primarily useful to finding the causes of closure. This is primarily useful to finding the causes of
closure bloat. For example, closure bloat. For example,
nix why-depends nixpkgs.vlc nixpkgs.libdrm.dev nix why-depends nixpkgs.vlc nixpkgs.libdrm.dev
shows a chain of files and fragments of file contents that cause shows a chain of files and fragments of file contents that cause
the VLC package to have the “dev” output of `libdrm` in its the VLC package to have the “dev” output of `libdrm` in its
closure — an undesirable situation. closure — an undesirable situation.
- `nix path-info` shows information about store paths, replacing - `nix path-info` shows information about store paths, replacing
`nix-store -q`. A useful feature is the option `--closure-size` `nix-store -q`. A useful feature is the option `--closure-size`
(`-S`). For example, the following command show the closure (`-S`). For example, the following command show the closure
sizes of every path in the current NixOS system closure, sorted sizes of every path in the current NixOS system closure, sorted
by size: by size:
nix path-info -rS /run/current-system | sort -nk2 nix path-info -rS /run/current-system | sort -nk2
- `nix optimise-store` replaces `nix-store --optimise`. The main - `nix optimise-store` replaces `nix-store --optimise`. The main
difference is that it has a progress indicator. difference is that it has a progress indicator.
A number of low-level (“plumbing”) commands are also available: A number of low-level (“plumbing”) commands are also available:
- `nix ls-store` and `nix - `nix ls-store` and `nix
ls-nar` list the contents of a store path or NAR file. The ls-nar` list the contents of a store path or NAR file. The
former is primarily useful in conjunction with remote stores, former is primarily useful in conjunction with remote stores,
e.g. e.g.
nix ls-store --store https://cache.nixos.org/ -lR /nix/store/0i2jd68mp5g6h2sa5k9c85rb80sn8hi9-hello-2.10 nix ls-store --store https://cache.nixos.org/ -lR /nix/store/0i2jd68mp5g6h2sa5k9c85rb80sn8hi9-hello-2.10
lists the contents of path in a binary cache. lists the contents of path in a binary cache.
- `nix cat-store` and `nix - `nix cat-store` and `nix
cat-nar` allow extracting a file from a store path or NAR file. cat-nar` allow extracting a file from a store path or NAR file.
- `nix dump-path` writes the contents of a store path to stdout in - `nix dump-path` writes the contents of a store path to stdout in
NAR format. This replaces `nix-store --dump`. NAR format. This replaces `nix-store --dump`.
- `nix - `nix
show-derivation` displays a store derivation in JSON format. show-derivation` displays a store derivation in JSON format.
This is an alternative to `pp-aterm`. This is an alternative to `pp-aterm`.
- `nix - `nix
add-to-store` replaces `nix-store add-to-store` replaces `nix-store
--add`. --add`.
- `nix sign-paths` signs store paths. - `nix sign-paths` signs store paths.
- `nix copy-sigs` copies signatures from one store to another. - `nix copy-sigs` copies signatures from one store to another.
- `nix show-config` shows all configuration options and their - `nix show-config` shows all configuration options and their
current values. current values.
@ -224,11 +224,11 @@ This release has the following new features:
`nix-copy-closure`, `nix-push` and substitution are all instances `nix-copy-closure`, `nix-push` and substitution are all instances
of the general notion of copying paths between different kinds of of the general notion of copying paths between different kinds of
Nix stores. Nix stores.
Stores are specified using an URI-like syntax, e.g. Stores are specified using an URI-like syntax, e.g.
<https://cache.nixos.org/> or <ssh://machine>. The following store <https://cache.nixos.org/> or <ssh://machine>. The following store
types are supported: types are supported:
- `LocalStore` (stori URI `local` or an absolute path) and the - `LocalStore` (stori URI `local` or an absolute path) and the
misnamed `RemoteStore` (`daemon`) provide access to a local Nix misnamed `RemoteStore` (`daemon`) provide access to a local Nix
store, the latter via the Nix daemon. You can use `auto` or the store, the latter via the Nix daemon. You can use `auto` or the
@ -236,63 +236,63 @@ This release has the following new features:
whether you have write permission to the Nix store. It is no whether you have write permission to the Nix store. It is no
longer necessary to set the `NIX_REMOTE` environment variable to longer necessary to set the `NIX_REMOTE` environment variable to
use the Nix daemon. use the Nix daemon.
As noted above, `LocalStore` now supports chroot builds, As noted above, `LocalStore` now supports chroot builds,
allowing the “physical” location of the Nix store (e.g. allowing the “physical” location of the Nix store (e.g.
`/home/alice/nix/store`) to differ from its “logical” location `/home/alice/nix/store`) to differ from its “logical” location
(typically `/nix/store`). This allows non-root users to use Nix (typically `/nix/store`). This allows non-root users to use Nix
while still getting the benefits from prebuilt binaries from while still getting the benefits from prebuilt binaries from
[cache.nixos.org](https://cache.nixos.org/). [cache.nixos.org](https://cache.nixos.org/).
- `BinaryCacheStore` is the abstract superclass of all binary - `BinaryCacheStore` is the abstract superclass of all binary
cache stores. It supports writing build logs and NAR content cache stores. It supports writing build logs and NAR content
listings in JSON format. listings in JSON format.
- `HttpBinaryCacheStore` (`http://`, `https://`) supports binary - `HttpBinaryCacheStore` (`http://`, `https://`) supports binary
caches via HTTP or HTTPS. If the server supports `PUT` requests, caches via HTTP or HTTPS. If the server supports `PUT` requests,
it supports uploading store paths via commands such as `nix it supports uploading store paths via commands such as `nix
copy`. copy`.
- `LocalBinaryCacheStore` (`file://`) supports binary caches in - `LocalBinaryCacheStore` (`file://`) supports binary caches in
the local filesystem. the local filesystem.
- `S3BinaryCacheStore` (`s3://`) supports binary caches stored in - `S3BinaryCacheStore` (`s3://`) supports binary caches stored in
Amazon S3, if enabled at compile time. Amazon S3, if enabled at compile time.
- `LegacySSHStore` (`ssh://`) is used to implement remote builds - `LegacySSHStore` (`ssh://`) is used to implement remote builds
and `nix-copy-closure`. and `nix-copy-closure`.
- `SSHStore` (`ssh-ng://`) supports arbitrary Nix operations on a - `SSHStore` (`ssh-ng://`) supports arbitrary Nix operations on a
remote machine via the same protocol used by `nix-daemon`. remote machine via the same protocol used by `nix-daemon`.
- Security has been improved in various ways: - Security has been improved in various ways:
- Nix now stores signatures for local store paths. When paths are - Nix now stores signatures for local store paths. When paths are
copied between stores (e.g., copied from a binary cache to a copied between stores (e.g., copied from a binary cache to a
local store), signatures are propagated. local store), signatures are propagated.
Locally-built paths are signed automatically using the secret Locally-built paths are signed automatically using the secret
keys specified by the `secret-key-files` store option. keys specified by the `secret-key-files` store option.
Secret/public key pairs can be generated using `nix-store Secret/public key pairs can be generated using `nix-store
--generate-binary-cache-key`. --generate-binary-cache-key`.
In addition, locally-built store paths are marked as “ultimately In addition, locally-built store paths are marked as “ultimately
trusted”, but this bit is not propagated when paths are copied trusted”, but this bit is not propagated when paths are copied
between stores. between stores.
- Content-addressable store paths no longer require signatures — - Content-addressable store paths no longer require signatures —
they can be imported into a store by unprivileged users even if they can be imported into a store by unprivileged users even if
they lack signatures. they lack signatures.
- The command `nix verify` checks whether the specified paths are - The command `nix verify` checks whether the specified paths are
trusted, i.e., have a certain number of trusted signatures, are trusted, i.e., have a certain number of trusted signatures, are
ultimately trusted, or are content-addressed. ultimately trusted, or are content-addressed.
- Substitutions from binary caches - Substitutions from binary caches
[now](https://github.com/NixOS/nix/commit/ecbc3fedd3d5bdc5a0e1a0a51b29062f2874ac8b) [now](https://github.com/NixOS/nix/commit/ecbc3fedd3d5bdc5a0e1a0a51b29062f2874ac8b)
require signatures by default. This was already the case on require signatures by default. This was already the case on
NixOS. NixOS.
- In Linux sandbox builds, we - In Linux sandbox builds, we
[now](https://github.com/NixOS/nix/commit/eba840c8a13b465ace90172ff76a0db2899ab11b) [now](https://github.com/NixOS/nix/commit/eba840c8a13b465ace90172ff76a0db2899ab11b)
use `/build` instead of `/tmp` as the temporary build directory. use `/build` instead of `/tmp` as the temporary build directory.
@ -309,7 +309,7 @@ This release has the following new features:
hash or commit hash is specified. For example, calls to hash or commit hash is specified. For example, calls to
`builtins.fetchGit` are only allowed if a `rev` attribute is `builtins.fetchGit` are only allowed if a `rev` attribute is
specified. specified.
The goal of this feature is to enable true reproducibility and The goal of this feature is to enable true reproducibility and
traceability of builds (including NixOS system configurations) at traceability of builds (including NixOS system configurations) at
the evaluation level. For example, in the future, `nixos-rebuild` the evaluation level. For example, in the future, `nixos-rebuild`
@ -367,21 +367,21 @@ This release has the following new features:
log will be shown if a build fails. log will be shown if a build fails.
- Networking has been improved: - Networking has been improved:
- HTTP/2 is now supported. This makes binary cache lookups [much - HTTP/2 is now supported. This makes binary cache lookups [much
more more
efficient](https://github.com/NixOS/nix/commit/90ad02bf626b885a5dd8967894e2eafc953bdf92). efficient](https://github.com/NixOS/nix/commit/90ad02bf626b885a5dd8967894e2eafc953bdf92).
- We now retry downloads on many HTTP errors, making binary caches - We now retry downloads on many HTTP errors, making binary caches
substituters more resilient to temporary failures. substituters more resilient to temporary failures.
- HTTP credentials can now be configured via the standard `netrc` - HTTP credentials can now be configured via the standard `netrc`
mechanism. mechanism.
- If S3 support is enabled at compile time, <s3://> URIs are - If S3 support is enabled at compile time, <s3://> URIs are
[supported](https://github.com/NixOS/nix/commit/9ff9c3f2f80ba4108e9c945bbfda2c64735f987b) [supported](https://github.com/NixOS/nix/commit/9ff9c3f2f80ba4108e9c945bbfda2c64735f987b)
in all places where Nix allows URIs. in all places where Nix allows URIs.
- Brotli compression is now supported. In particular, - Brotli compression is now supported. In particular,
[cache.nixos.org](https://cache.nixos.org/) build logs are now compressed [cache.nixos.org](https://cache.nixos.org/) build logs are now compressed
using Brotli. using Brotli.
@ -431,9 +431,9 @@ The Nix language has the following new features:
- Derivation attributes can now reference the outputs of the - Derivation attributes can now reference the outputs of the
derivation using the `placeholder` builtin function. For example, derivation using the `placeholder` builtin function. For example,
the attribute the attribute
configureFlags = "--prefix=${placeholder "out"} --includedir=${placeholder "dev"}"; configureFlags = "--prefix=${placeholder "out"} --includedir=${placeholder "dev"}";
will cause the `configureFlags` environment variable to contain the will cause the `configureFlags` environment variable to contain the
actual store paths corresponding to the `out` and `dev` outputs. actual store paths corresponding to the `out` and `dev` outputs.
@ -444,7 +444,7 @@ The following builtin functions are new or extended:
Nixpkgs, which fetches at build time and cannot be used to fetch Nix Nixpkgs, which fetches at build time and cannot be used to fetch Nix
expressions during evaluation. A typical use case is to import expressions during evaluation. A typical use case is to import
external NixOS modules from your configuration, e.g. external NixOS modules from your configuration, e.g.
imports = [ (builtins.fetchGit https://github.com/edolstra/dwarffs + "/module.nix") ]; imports = [ (builtins.fetchGit https://github.com/edolstra/dwarffs + "/module.nix") ];
- Similarly, `builtins.fetchMercurial` allows you to fetch Mercurial - Similarly, `builtins.fetchMercurial` allows you to fetch Mercurial
@ -485,7 +485,7 @@ The Nix build environment has the following changes:
builder via the file `.attrs.json` in the builders temporary builder via the file `.attrs.json` in the builders temporary
directory. This obviates the need for `passAsFile` since JSON files directory. This obviates the need for `passAsFile` since JSON files
have no size restrictions, unlike process environments. have no size restrictions, unlike process environments.
[As a convenience to Bash [As a convenience to Bash
builders](https://github.com/NixOS/nix/commit/2d5b1b24bf70a498e4c0b378704cfdb6471cc699), builders](https://github.com/NixOS/nix/commit/2d5b1b24bf70a498e4c0b378704cfdb6471cc699),
Nix writes a script named `.attrs.sh` to the builders directory Nix writes a script named `.attrs.sh` to the builders directory

View file

@ -6,15 +6,15 @@ This is primarily a bug fix release. It also has the following changes:
the `__structuredAttrs` attribute to `true` to cause all attributes the `__structuredAttrs` attribute to `true` to cause all attributes
to be passed to the builder in JSON format), you can now specify to be passed to the builder in JSON format), you can now specify
closure checks per output, e.g.: closure checks per output, e.g.:
outputChecks."out" = { outputChecks."out" = {
# The closure of 'out' must not be larger than 256 MiB. # The closure of 'out' must not be larger than 256 MiB.
maxClosureSize = 256 * 1024 * 1024; maxClosureSize = 256 * 1024 * 1024;
# It must not refer to C compiler or to the 'dev' output. # It must not refer to C compiler or to the 'dev' output.
disallowedRequisites = [ stdenv.cc "dev" ]; disallowedRequisites = [ stdenv.cc "dev" ];
}; };
outputChecks."dev" = { outputChecks."dev" = {
# The 'dev' output must not be larger than 128 KiB. # The 'dev' output must not be larger than 128 KiB.
maxSize = 128 * 1024; maxSize = 128 * 1024;
@ -24,7 +24,7 @@ This is primarily a bug fix release. It also has the following changes:
for local builds, and not just to route builds to remote builders. for local builds, and not just to route builds to remote builders.
The supported features of a machine can be specified through the The supported features of a machine can be specified through the
configuration setting `system-features`. configuration setting `system-features`.
By default, `system-features` includes `kvm` if `/dev/kvm` exists. By default, `system-features` includes `kvm` if `/dev/kvm` exists.
For compatibility, it also includes the pseudo-features For compatibility, it also includes the pseudo-features
`nixos-test`, `benchmark` and `big-parallel` which are used by `nixos-test`, `benchmark` and `big-parallel` which are used by
@ -45,22 +45,22 @@ This is primarily a bug fix release. It also has the following changes:
- Nix now supports [SRI hashes](https://www.w3.org/TR/SRI/), allowing - Nix now supports [SRI hashes](https://www.w3.org/TR/SRI/), allowing
the hash algorithm and hash to be specified in a single string. For the hash algorithm and hash to be specified in a single string. For
example, you can write: example, you can write:
import <nix/fetchurl.nix> { import <nix/fetchurl.nix> {
url = https://nixos.org/releases/nix/nix-2.1.3/nix-2.1.3.tar.xz; url = https://nixos.org/releases/nix/nix-2.1.3/nix-2.1.3.tar.xz;
hash = "sha256-XSLa0FjVyADWWhFfkZ2iKTjFDda6mMXjoYMXLRSYQKQ="; hash = "sha256-XSLa0FjVyADWWhFfkZ2iKTjFDda6mMXjoYMXLRSYQKQ=";
}; };
instead of instead of
import <nix/fetchurl.nix> { import <nix/fetchurl.nix> {
url = https://nixos.org/releases/nix/nix-2.1.3/nix-2.1.3.tar.xz; url = https://nixos.org/releases/nix/nix-2.1.3/nix-2.1.3.tar.xz;
sha256 = "5d22dad058d5c800d65a115f919da22938c50dd6ba98c5e3a183172d149840a4"; sha256 = "5d22dad058d5c800d65a115f919da22938c50dd6ba98c5e3a183172d149840a4";
}; };
In fixed-output derivations, the `outputHashAlgo` attribute is no In fixed-output derivations, the `outputHashAlgo` attribute is no
longer mandatory if `outputHash` specifies the hash. longer mandatory if `outputHash` specifies the hash.
`nix hash-file` and `nix `nix hash-file` and `nix
hash-path` now print hashes in SRI format by default. They also use hash-path` now print hashes in SRI format by default. They also use
SHA-256 by default instead of SHA-512 because that's what we use SHA-256 by default instead of SHA-512 because that's what we use

File diff suppressed because one or more lines are too long

View file

@ -1,14 +1,18 @@
with builtins; with builtins;
rec { rec {
splitLines = s: filter (x: !isList x) (split "\n" s); splitLines = s: filter (x: !isList x) (split "\n" s);
concatStrings = concatStringsSep ""; concatStrings = concatStringsSep "";
attrsToList = a: attrsToList =
map (name: { inherit name; value = a.${name}; }) (builtins.attrNames a); a:
map (name: {
inherit name;
value = a.${name};
}) (builtins.attrNames a);
replaceStringsRec = from: to: string: replaceStringsRec =
from: to: string:
# recursively replace occurrences of `from` with `to` within `string` # recursively replace occurrences of `from` with `to` within `string`
# example: # example:
# replaceStringRec "--" "-" "hello-----world" # replaceStringRec "--" "-" "hello-----world"
@ -16,14 +20,16 @@ rec {
let let
replaced = replaceStrings [ from ] [ to ] string; replaced = replaceStrings [ from ] [ to ] string;
in in
if replaced == string then string else replaceStringsRec from to replaced; if replaced == string then string else replaceStringsRec from to replaced;
squash = replaceStringsRec "\n\n\n" "\n\n"; squash = replaceStringsRec "\n\n\n" "\n\n";
trim = string: trim =
string:
# trim trailing spaces and squash non-leading spaces # trim trailing spaces and squash non-leading spaces
let let
trimLine = line: trimLine =
line:
let let
# separate leading spaces from the rest # separate leading spaces from the rest
parts = split "(^ *)" line; parts = split "(^ *)" line;
@ -31,76 +37,102 @@ rec {
rest = elemAt parts 2; rest = elemAt parts 2;
# drop trailing spaces # drop trailing spaces
body = head (split " *$" rest); body = head (split " *$" rest);
in spaces + replaceStringsRec " " " " body; in
in concatStringsSep "\n" (map trimLine (splitLines string)); spaces + replaceStringsRec " " " " body;
in
concatStringsSep "\n" (map trimLine (splitLines string));
# FIXME: O(n^2) # FIXME: O(n^2)
unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) []; unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) [ ];
nameValuePair = name: value: { inherit name value; }; nameValuePair = name: value: { inherit name value; };
filterAttrs = pred: set: filterAttrs =
listToAttrs (concatMap (name: let v = set.${name}; in if pred name v then [(nameValuePair name v)] else []) (attrNames set)); pred: set:
listToAttrs (
concatMap (
name:
let
v = set.${name};
in
if pred name v then [ (nameValuePair name v) ] else [ ]
) (attrNames set)
);
optionalString = cond: string: if cond then string else ""; optionalString = cond: string: if cond then string else "";
showSetting = { inlineHTML }: name: { description, documentDefault, defaultValue, aliases, value, experimentalFeature }: showSetting =
{ inlineHTML }:
name:
{
description,
documentDefault,
defaultValue,
aliases,
value,
experimentalFeature,
}:
let let
result = squash '' result = squash ''
- ${if inlineHTML - ${
then ''<span id="conf-${name}">[`${name}`](#conf-${name})</span>'' if inlineHTML then ''<span id="conf-${name}">[`${name}`](#conf-${name})</span>'' else ''`${name}`''
else ''`${name}`''} }
${indent " " body} ${indent " " body}
''; '';
experimentalFeatureNote = optionalString (experimentalFeature != null) '' experimentalFeatureNote = optionalString (experimentalFeature != null) ''
> **Warning** > **Warning**
> This setting is part of an > This setting is part of an
> [experimental feature](@docroot@/contributing/experimental-features.md). > [experimental feature](@docroot@/contributing/experimental-features.md).
To change this setting, you need to make sure the corresponding experimental feature, To change this setting, you need to make sure the corresponding experimental feature,
[`${experimentalFeature}`](@docroot@/contributing/experimental-features.md#xp-feature-${experimentalFeature}), [`${experimentalFeature}`](@docroot@/contributing/experimental-features.md#xp-feature-${experimentalFeature}),
is enabled. is enabled.
For example, include the following in [`nix.conf`](#): For example, include the following in [`nix.conf`](#):
``` ```
extra-experimental-features = ${experimentalFeature} extra-experimental-features = ${experimentalFeature}
${name} = ... ${name} = ...
``` ```
''; '';
# separate body to cleanly handle indentation # separate body to cleanly handle indentation
body = '' body = ''
${description} ${description}
${experimentalFeatureNote} ${experimentalFeatureNote}
**Default:** ${showDefault documentDefault defaultValue} **Default:** ${showDefault documentDefault defaultValue}
${showAliases aliases} ${showAliases aliases}
''; '';
showDefault = documentDefault: defaultValue: showDefault =
documentDefault: defaultValue:
if documentDefault then if documentDefault then
# a StringMap value type is specified as a string, but # a StringMap value type is specified as a string, but
# this shows the value type. The empty stringmap is `null` in # this shows the value type. The empty stringmap is `null` in
# JSON, but that converts to `{ }` here. # JSON, but that converts to `{ }` here.
if defaultValue == "" || defaultValue == [] || isAttrs defaultValue if defaultValue == "" || defaultValue == [ ] || isAttrs defaultValue then
then "*empty*" "*empty*"
else if isBool defaultValue then else if isBool defaultValue then
if defaultValue then "`true`" else "`false`" if defaultValue then "`true`" else "`false`"
else "`${toString defaultValue}`" else
else "*machine-specific*"; "`${toString defaultValue}`"
else
"*machine-specific*";
showAliases = aliases: showAliases =
optionalString (aliases != []) aliases:
"**Deprecated alias:** ${(concatStringsSep ", " (map (s: "`${s}`") aliases))}"; optionalString (aliases != [ ])
"**Deprecated alias:** ${(concatStringsSep ", " (map (s: "`${s}`") aliases))}";
in
result;
in result; indent =
prefix: s: concatStringsSep "\n" (map (x: if x == "" then x else "${prefix}${x}") (splitLines s));
indent = prefix: s: showSettings =
concatStringsSep "\n" (map (x: if x == "" then x else "${prefix}${x}") (splitLines s)); args: settingsInfo: concatStrings (attrValues (mapAttrs (showSetting args) settingsInfo));
showSettings = args: settingsInfo: concatStrings (attrValues (mapAttrs (showSetting args) settingsInfo));
} }

View file

@ -1,70 +1,70 @@
{ pkgs ? import <nixpkgs> { } {
, lib ? pkgs.lib pkgs ? import <nixpkgs> { },
, name ? "nix" lib ? pkgs.lib,
, tag ? "latest" name ? "nix",
, bundleNixpkgs ? true tag ? "latest",
, channelName ? "nixpkgs" bundleNixpkgs ? true,
, channelURL ? "https://nixos.org/channels/nixpkgs-unstable" channelName ? "nixpkgs",
, extraPkgs ? [] channelURL ? "https://nixos.org/channels/nixpkgs-unstable",
, maxLayers ? 100 extraPkgs ? [ ],
, nixConf ? {} maxLayers ? 100,
, flake-registry ? null nixConf ? { },
flake-registry ? null,
}: }:
let let
defaultPkgs = with pkgs; [ defaultPkgs =
nix with pkgs;
bashInteractive [
coreutils-full nix
gnutar bashInteractive
gzip coreutils-full
gnugrep gnutar
which gzip
curl gnugrep
less which
wget curl
man less
cacert.out wget
findutils man
iana-etc cacert.out
git findutils
openssh iana-etc
] ++ extraPkgs; git
openssh
]
++ extraPkgs;
users = { users =
{
root = {
uid = 0;
shell = "${pkgs.bashInteractive}/bin/bash";
home = "/root";
gid = 0;
groups = [ "root" ];
description = "System administrator";
};
root = { nobody = {
uid = 0; uid = 65534;
shell = "${pkgs.bashInteractive}/bin/bash"; shell = "${pkgs.shadow}/bin/nologin";
home = "/root"; home = "/var/empty";
gid = 0; gid = 65534;
groups = [ "root" ]; groups = [ "nobody" ];
description = "System administrator"; description = "Unprivileged account (don't use!)";
}; };
}
nobody = { // lib.listToAttrs (
uid = 65534; map (n: {
shell = "${pkgs.shadow}/bin/nologin"; name = "nixbld${toString n}";
home = "/var/empty"; value = {
gid = 65534; uid = 30000 + n;
groups = [ "nobody" ]; gid = 30000;
description = "Unprivileged account (don't use!)"; groups = [ "nixbld" ];
}; description = "Nix build user ${toString n}";
};
} // lib.listToAttrs ( }) (lib.lists.range 1 32)
map );
(
n: {
name = "nixbld${toString n}";
value = {
uid = 30000 + n;
gid = 30000;
groups = [ "nixbld" ];
description = "Nix build user ${toString n}";
};
}
)
(lib.lists.range 1 32)
);
groups = { groups = {
root.gid = 0; root.gid = 0;
@ -74,24 +74,20 @@ let
userToPasswd = ( userToPasswd = (
k: k:
{ uid {
, gid ? 65534 uid,
, home ? "/var/empty" gid ? 65534,
, description ? "" home ? "/var/empty",
, shell ? "/bin/false" description ? "",
, groups ? [ ] shell ? "/bin/false",
}: "${k}:x:${toString uid}:${toString gid}:${description}:${home}:${shell}" groups ? [ ],
); }:
passwdContents = ( "${k}:x:${toString uid}:${toString gid}:${description}:${home}:${shell}"
lib.concatStringsSep "\n"
(lib.attrValues (lib.mapAttrs userToPasswd users))
); );
passwdContents = (lib.concatStringsSep "\n" (lib.attrValues (lib.mapAttrs userToPasswd users)));
userToShadow = k: { ... }: "${k}:!:1::::::"; userToShadow = k: { ... }: "${k}:!:1::::::";
shadowContents = ( shadowContents = (lib.concatStringsSep "\n" (lib.attrValues (lib.mapAttrs userToShadow users)));
lib.concatStringsSep "\n"
(lib.attrValues (lib.mapAttrs userToShadow users))
);
# Map groups to members # Map groups to members
# { # {
@ -101,42 +97,28 @@ let
let let
# Create a flat list of user/group mappings # Create a flat list of user/group mappings
mappings = ( mappings = (
builtins.foldl' builtins.foldl' (
( acc: user:
acc: user: let
let groups = users.${user}.groups or [ ];
groups = users.${user}.groups or [ ]; in
in acc ++ map (group: { inherit user group; }) groups
acc ++ map ) [ ] (lib.attrNames users)
(group: {
inherit user group;
})
groups
)
[ ]
(lib.attrNames users)
); );
in in
( (builtins.foldl' (
builtins.foldl' acc: v: acc // { ${v.group} = acc.${v.group} or [ ] ++ [ v.user ]; }
( ) { } mappings)
acc: v: acc // {
${v.group} = acc.${v.group} or [ ] ++ [ v.user ];
}
)
{ }
mappings)
); );
groupToGroup = k: { gid }: groupToGroup =
k:
{ gid }:
let let
members = groupMemberMap.${k} or [ ]; members = groupMemberMap.${k} or [ ];
in in
"${k}:x:${toString gid}:${lib.concatStringsSep "," members}"; "${k}:x:${toString gid}:${lib.concatStringsSep "," members}";
groupContents = ( groupContents = (lib.concatStringsSep "\n" (lib.attrValues (lib.mapAttrs groupToGroup groups)));
lib.concatStringsSep "\n"
(lib.attrValues (lib.mapAttrs groupToGroup groups))
);
defaultNixConf = { defaultNixConf = {
sandbox = "false"; sandbox = "false";
@ -144,11 +126,17 @@ let
trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ]; trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
}; };
nixConfContents = (lib.concatStringsSep "\n" (lib.mapAttrsFlatten (n: v: nixConfContents =
let (lib.concatStringsSep "\n" (
vStr = if builtins.isList v then lib.concatStringsSep " " v else v; lib.mapAttrsFlatten (
in n: v:
"${n} = ${vStr}") (defaultNixConf // nixConf))) + "\n"; let
vStr = if builtins.isList v then lib.concatStringsSep " " v else v;
in
"${n} = ${vStr}"
) (defaultNixConf // nixConf)
))
+ "\n";
baseSystem = baseSystem =
let let
@ -167,21 +155,31 @@ let
manifest = pkgs.buildPackages.runCommand "manifest.nix" { } '' manifest = pkgs.buildPackages.runCommand "manifest.nix" { } ''
cat > $out <<EOF cat > $out <<EOF
[ [
${lib.concatStringsSep "\n" (builtins.map (drv: let ${lib.concatStringsSep "\n" (
outputs = drv.outputsToInstall or [ "out" ]; builtins.map (
in '' drv:
{ let
${lib.concatStringsSep "\n" (builtins.map (output: '' outputs = drv.outputsToInstall or [ "out" ];
${output} = { outPath = "${lib.getOutput output drv}"; }; in
'') outputs)} ''
outputs = [ ${lib.concatStringsSep " " (builtins.map (x: "\"${x}\"") outputs)} ]; {
name = "${drv.name}"; ${
outPath = "${drv}"; lib.concatStringsSep "\n" (
system = "${drv.system}"; builtins.map (output: ''
type = "derivation"; ${output} = { outPath = "${lib.getOutput output drv}"; };
meta = { }; '') outputs
} )
'') defaultPkgs)} }
outputs = [ ${lib.concatStringsSep " " (builtins.map (x: "\"${x}\"") outputs)} ];
name = "${drv.name}";
outPath = "${drv}";
system = "${drv.system}";
type = "derivation";
meta = { };
}
''
) defaultPkgs
)}
] ]
EOF EOF
''; '';
@ -190,16 +188,22 @@ let
cp -a ${rootEnv}/* $out/ cp -a ${rootEnv}/* $out/
ln -s ${manifest} $out/manifest.nix ln -s ${manifest} $out/manifest.nix
''; '';
flake-registry-path = if (flake-registry == null) then flake-registry-path =
null if (flake-registry == null) then
else if (builtins.readFileType (toString flake-registry)) == "directory" then null
"${flake-registry}/flake-registry.json" else if (builtins.readFileType (toString flake-registry)) == "directory" then
else "${flake-registry}/flake-registry.json"
flake-registry; else
flake-registry;
in in
pkgs.runCommand "base-system" pkgs.runCommand "base-system"
{ {
inherit passwdContents groupContents shadowContents nixConfContents; inherit
passwdContents
groupContents
shadowContents
nixConfContents
;
passAsFile = [ passAsFile = [
"passwdContents" "passwdContents"
"groupContents" "groupContents"
@ -208,66 +212,68 @@ let
]; ];
allowSubstitutes = false; allowSubstitutes = false;
preferLocalBuild = true; preferLocalBuild = true;
} ('' }
env (
set -x ''
mkdir -p $out/etc env
set -x
mkdir -p $out/etc
mkdir -p $out/etc/ssl/certs mkdir -p $out/etc/ssl/certs
ln -s /nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/certs ln -s /nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt $out/etc/ssl/certs
cat $passwdContentsPath > $out/etc/passwd cat $passwdContentsPath > $out/etc/passwd
echo "" >> $out/etc/passwd echo "" >> $out/etc/passwd
cat $groupContentsPath > $out/etc/group cat $groupContentsPath > $out/etc/group
echo "" >> $out/etc/group echo "" >> $out/etc/group
cat $shadowContentsPath > $out/etc/shadow cat $shadowContentsPath > $out/etc/shadow
echo "" >> $out/etc/shadow echo "" >> $out/etc/shadow
mkdir -p $out/usr mkdir -p $out/usr
ln -s /nix/var/nix/profiles/share $out/usr/ ln -s /nix/var/nix/profiles/share $out/usr/
mkdir -p $out/nix/var/nix/gcroots mkdir -p $out/nix/var/nix/gcroots
mkdir $out/tmp mkdir $out/tmp
mkdir -p $out/var/tmp mkdir -p $out/var/tmp
mkdir -p $out/etc/nix mkdir -p $out/etc/nix
cat $nixConfContentsPath > $out/etc/nix/nix.conf cat $nixConfContentsPath > $out/etc/nix/nix.conf
mkdir -p $out/root mkdir -p $out/root
mkdir -p $out/nix/var/nix/profiles/per-user/root mkdir -p $out/nix/var/nix/profiles/per-user/root
ln -s ${profile} $out/nix/var/nix/profiles/default-1-link ln -s ${profile} $out/nix/var/nix/profiles/default-1-link
ln -s $out/nix/var/nix/profiles/default-1-link $out/nix/var/nix/profiles/default ln -s $out/nix/var/nix/profiles/default-1-link $out/nix/var/nix/profiles/default
ln -s /nix/var/nix/profiles/default $out/root/.nix-profile ln -s /nix/var/nix/profiles/default $out/root/.nix-profile
ln -s ${channel} $out/nix/var/nix/profiles/per-user/root/channels-1-link ln -s ${channel} $out/nix/var/nix/profiles/per-user/root/channels-1-link
ln -s $out/nix/var/nix/profiles/per-user/root/channels-1-link $out/nix/var/nix/profiles/per-user/root/channels ln -s $out/nix/var/nix/profiles/per-user/root/channels-1-link $out/nix/var/nix/profiles/per-user/root/channels
mkdir -p $out/root/.nix-defexpr mkdir -p $out/root/.nix-defexpr
ln -s $out/nix/var/nix/profiles/per-user/root/channels $out/root/.nix-defexpr/channels ln -s $out/nix/var/nix/profiles/per-user/root/channels $out/root/.nix-defexpr/channels
echo "${channelURL} ${channelName}" > $out/root/.nix-channels echo "${channelURL} ${channelName}" > $out/root/.nix-channels
mkdir -p $out/bin $out/usr/bin mkdir -p $out/bin $out/usr/bin
ln -s ${pkgs.coreutils}/bin/env $out/usr/bin/env ln -s ${pkgs.coreutils}/bin/env $out/usr/bin/env
ln -s ${pkgs.bashInteractive}/bin/bash $out/bin/sh ln -s ${pkgs.bashInteractive}/bin/bash $out/bin/sh
'' + (lib.optionalString (flake-registry-path != null) ''
nixCacheDir="/root/.cache/nix"
mkdir -p $out$nixCacheDir
globalFlakeRegistryPath="$nixCacheDir/flake-registry.json"
ln -s ${flake-registry-path} $out$globalFlakeRegistryPath
mkdir -p $out/nix/var/nix/gcroots/auto
rootName=$(${pkgs.nix}/bin/nix --extra-experimental-features nix-command hash file --type sha1 --base32 <(echo -n $globalFlakeRegistryPath))
ln -s $globalFlakeRegistryPath $out/nix/var/nix/gcroots/auto/$rootName
''));
''
+ (lib.optionalString (flake-registry-path != null) ''
nixCacheDir="/root/.cache/nix"
mkdir -p $out$nixCacheDir
globalFlakeRegistryPath="$nixCacheDir/flake-registry.json"
ln -s ${flake-registry-path} $out$globalFlakeRegistryPath
mkdir -p $out/nix/var/nix/gcroots/auto
rootName=$(${pkgs.nix}/bin/nix --extra-experimental-features nix-command hash file --type sha1 --base32 <(echo -n $globalFlakeRegistryPath))
ln -s $globalFlakeRegistryPath $out/nix/var/nix/gcroots/auto/$rootName
'')
);
in in
pkgs.dockerTools.buildLayeredImageWithNixDb { pkgs.dockerTools.buildLayeredImageWithNixDb {
inherit name tag maxLayers; inherit name tag maxLayers;
contents = [ baseSystem ]; contents = [ baseSystem ];
@ -285,20 +291,23 @@ pkgs.dockerTools.buildLayeredImageWithNixDb {
Cmd = [ "/root/.nix-profile/bin/bash" ]; Cmd = [ "/root/.nix-profile/bin/bash" ];
Env = [ Env = [
"USER=root" "USER=root"
"PATH=${lib.concatStringsSep ":" [ "PATH=${
"/root/.nix-profile/bin" lib.concatStringsSep ":" [
"/nix/var/nix/profiles/default/bin" "/root/.nix-profile/bin"
"/nix/var/nix/profiles/default/sbin" "/nix/var/nix/profiles/default/bin"
]}" "/nix/var/nix/profiles/default/sbin"
"MANPATH=${lib.concatStringsSep ":" [ ]
"/root/.nix-profile/share/man" }"
"/nix/var/nix/profiles/default/share/man" "MANPATH=${
]}" lib.concatStringsSep ":" [
"/root/.nix-profile/share/man"
"/nix/var/nix/profiles/default/share/man"
]
}"
"SSL_CERT_FILE=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt" "SSL_CERT_FILE=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt"
"GIT_SSL_CAINFO=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt" "GIT_SSL_CAINFO=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt"
"NIX_SSL_CERT_FILE=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt" "NIX_SSL_CERT_FILE=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt"
"NIX_PATH=/nix/var/nix/profiles/per-user/root/channels:/root/.nix-defexpr/channels" "NIX_PATH=/nix/var/nix/profiles/per-user/root/channels:/root/.nix-defexpr/channels"
]; ];
}; };
} }

View file

@ -3,11 +3,11 @@
"flake-compat": { "flake-compat": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1673956053, "lastModified": 1696426674,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra", "owner": "edolstra",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -16,13 +16,52 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"pre-commit-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1709884566, "lastModified": 1711481231,
"narHash": "sha256-NSYJg2sfdO/XS3L8XN/59Zhzn0dqWm7XtVnKI2mHq3w=", "narHash": "sha256-J/fW3Xhm3WsJPNd8ksZmfMnol5aOG2qEMDPbOnNNdTQ=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "2be119add7b37dc535da2dd4cba68e2cf8d1517e", "rev": "9d6ddb13cee3cc1192e4430277708c732685f38a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -48,11 +87,56 @@
"type": "github" "type": "github"
} }
}, },
"pre-commit-hooks": {
"inputs": {
"flake-compat": [
"flake-compat"
],
"flake-utils": "flake-utils",
"gitignore": "gitignore",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-stable": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1711562502,
"narHash": "sha256-SLo1yf/lfozph818VME9Y56uhaZWY0juZcj/qJZPPrs=",
"owner": "9999years",
"repo": "git-hooks.nix",
"rev": "d2f6f9376c38fb0c48526720793a17f10cd3ac10",
"type": "github"
},
"original": {
"owner": "9999years",
"ref": "add-default-pre-commit-hooks",
"repo": "git-hooks.nix",
"type": "github"
}
},
"root": { "root": {
"inputs": { "inputs": {
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nixpkgs-regression": "nixpkgs-regression" "nixpkgs-regression": "nixpkgs-regression",
"pre-commit-hooks": "pre-commit-hooks"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
} }
} }
}, },

616
flake.nix
View file

@ -1,12 +1,33 @@
{ {
description = "The purely functional package manager"; description = "The purely functional package manager";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11-small"; inputs = {
inputs.nixpkgs-regression.url = "github:NixOS/nixpkgs/215d4d0fd80ca5163643b03a33fde804a29cc1e2"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11-small";
inputs.flake-compat = { url = "github:edolstra/flake-compat"; flake = false; }; nixpkgs-regression.url = "github:NixOS/nixpkgs/215d4d0fd80ca5163643b03a33fde804a29cc1e2";
pre-commit-hooks = {
outputs = { self, nixpkgs, nixpkgs-regression, flake-compat }: # Can go back to `cachix/git-hooks.nix` when this is merged:
# https://github.com/cachix/git-hooks.nix/pull/401
url = "github:9999years/git-hooks.nix/add-default-pre-commit-hooks";
inputs = {
flake-compat.follows = "flake-compat";
nixpkgs.follows = "nixpkgs";
nixpkgs-stable.follows = "nixpkgs";
};
};
flake-compat = {
url = "github:edolstra/flake-compat";
flake = false;
};
};
outputs =
{
self,
nixpkgs,
nixpkgs-regression,
pre-commit-hooks,
flake-compat,
}:
let let
inherit (nixpkgs) lib; inherit (nixpkgs) lib;
inherit (lib) fileset; inherit (lib) fileset;
@ -18,105 +39,137 @@
version = lib.fileContents ./.version + versionSuffix; version = lib.fileContents ./.version + versionSuffix;
versionSuffix = versionSuffix =
if officialRelease if officialRelease then
then "" ""
else "pre${builtins.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}_${self.shortRev or "dirty"}"; else
"pre${
builtins.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")
}_${self.shortRev or "dirty"}";
linux32BitSystems = [ "i686-linux" ]; linux32BitSystems = [ "i686-linux" ];
linux64BitSystems = [ "x86_64-linux" "aarch64-linux" ]; linux64BitSystems = [
"x86_64-linux"
"aarch64-linux"
];
linuxSystems = linux32BitSystems ++ linux64BitSystems; linuxSystems = linux32BitSystems ++ linux64BitSystems;
darwinSystems = [ "x86_64-darwin" "aarch64-darwin" ]; darwinSystems = [
"x86_64-darwin"
"aarch64-darwin"
];
systems = linuxSystems ++ darwinSystems; systems = linuxSystems ++ darwinSystems;
crossSystems = [ crossSystems = [
"armv6l-linux" "armv7l-linux" "armv6l-linux"
"x86_64-freebsd13" "x86_64-netbsd" "armv7l-linux"
"x86_64-freebsd13"
"x86_64-netbsd"
]; ];
stdenvs = [ "gccStdenv" "clangStdenv" "stdenv" "libcxxStdenv" "ccacheStdenv" ]; stdenvs = [
"gccStdenv"
"clangStdenv"
"stdenv"
"libcxxStdenv"
"ccacheStdenv"
];
forAllSystems = lib.genAttrs systems; forAllSystems = lib.genAttrs systems;
forAllCrossSystems = lib.genAttrs crossSystems; forAllCrossSystems = lib.genAttrs crossSystems;
forAllStdenvs = f: forAllStdenvs =
lib.listToAttrs f:
(map lib.listToAttrs (
(stdenvName: { map (stdenvName: {
name = "${stdenvName}Packages"; name = "${stdenvName}Packages";
value = f stdenvName; value = f stdenvName;
}) }) stdenvs
stdenvs); );
# Memoize nixpkgs for different platforms for efficiency. # Memoize nixpkgs for different platforms for efficiency.
nixpkgsFor = forAllSystems nixpkgsFor = forAllSystems (
(system: let system:
make-pkgs = crossSystem: stdenv: import nixpkgs { let
localSystem = { make-pkgs =
inherit system; crossSystem: stdenv:
}; import nixpkgs {
crossSystem = if crossSystem == null then null else { localSystem = {
system = crossSystem; inherit system;
} // lib.optionalAttrs (crossSystem == "x86_64-freebsd13") { };
useLLVM = true; crossSystem =
}; if crossSystem == null then
overlays = [ null
(overlayFor (p: p.${stdenv})) else
]; {
system = crossSystem;
}
// lib.optionalAttrs (crossSystem == "x86_64-freebsd13") { useLLVM = true; };
overlays = [
(overlayFor (p: p.${stdenv}))
(final: prev: { nixfmt = final.callPackage ./nix-support/nixfmt.nix { }; })
];
config.permittedInsecurePackages = [ "nix-2.13.6" ]; config.permittedInsecurePackages = [ "nix-2.13.6" ];
}; };
stdenvs = forAllStdenvs (make-pkgs null); stdenvs = forAllStdenvs (make-pkgs null);
native = stdenvs.stdenvPackages; native = stdenvs.stdenvPackages;
in { in
{
inherit stdenvs native; inherit stdenvs native;
static = native.pkgsStatic; static = native.pkgsStatic;
cross = forAllCrossSystems (crossSystem: make-pkgs crossSystem "stdenv"); cross = forAllCrossSystems (crossSystem: make-pkgs crossSystem "stdenv");
}); }
);
testNixVersions = pkgs: client: daemon: let testNixVersions =
nix = pkgs.callPackage ./package.nix { pkgs: client: daemon:
pname = let
"nix-tests" nix = pkgs.callPackage ./package.nix {
+ lib.optionalString pname =
(lib.versionAtLeast daemon.version "2.4pre20211005" && "nix-tests"
lib.versionAtLeast client.version "2.4pre20211005") + lib.optionalString (
"-${client.version}-against-${daemon.version}"; lib.versionAtLeast daemon.version "2.4pre20211005"
&& lib.versionAtLeast client.version "2.4pre20211005"
) "-${client.version}-against-${daemon.version}";
inherit fileset; inherit fileset;
}; };
in nix.overrideAttrs (prevAttrs: { in
NIX_DAEMON_PACKAGE = daemon; nix.overrideAttrs (prevAttrs: {
NIX_CLIENT_PACKAGE = client; NIX_DAEMON_PACKAGE = daemon;
NIX_CLIENT_PACKAGE = client;
dontBuild = true; dontBuild = true;
doInstallCheck = true; doInstallCheck = true;
configureFlags = prevAttrs.configureFlags ++ [ configureFlags = prevAttrs.configureFlags ++ [
# We don't need the actual build here. # We don't need the actual build here.
"--disable-build" "--disable-build"
]; ];
installPhase = '' installPhase = ''
mkdir -p $out mkdir -p $out
''; '';
installCheckPhase = lib.optionalString pkgs.stdenv.hostPlatform.isDarwin '' installCheckPhase =
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES lib.optionalString pkgs.stdenv.hostPlatform.isDarwin ''
'' + '' export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
mkdir -p src/nix-channel ''
make installcheck -j$NIX_BUILD_CORES -l$NIX_BUILD_CORES + ''
''; mkdir -p src/nix-channel
}); make installcheck -j$NIX_BUILD_CORES -l$NIX_BUILD_CORES
'';
});
binaryTarball = nix: pkgs: binaryTarball =
nix: pkgs:
let let
inherit (pkgs) buildPackages; inherit (pkgs) buildPackages;
installerClosureInfo = buildPackages.closureInfo { rootPaths = [ nix ]; }; installerClosureInfo = buildPackages.closureInfo { rootPaths = [ nix ]; };
in in
buildPackages.runCommand "nix-binary-tarball-${version}" buildPackages.runCommand "nix-binary-tarball-${version}"
{ #nativeBuildInputs = lib.optional (system != "aarch64-linux") shellcheck; {
#nativeBuildInputs = lib.optional (system != "aarch64-linux") shellcheck;
meta.description = "Distribution-independent Nix bootstrap binaries for ${pkgs.system}"; meta.description = "Distribution-independent Nix bootstrap binaries for ${pkgs.system}";
} }
'' ''
@ -137,25 +190,26 @@
$(cat ${installerClosureInfo}/store-paths) $(cat ${installerClosureInfo}/store-paths)
''; '';
overlayFor = getStdenv: final: prev: overlayFor =
getStdenv: final: prev:
let let
currentStdenv = getStdenv final; currentStdenv = getStdenv final;
comDeps = with final; commonDeps { comDeps =
inherit pkgs; with final;
inherit (currentStdenv.hostPlatform) isStatic; commonDeps {
}; inherit pkgs;
in { inherit (currentStdenv.hostPlatform) isStatic;
};
in
{
nixStable = prev.nix; nixStable = prev.nix;
# Forward from the previous stage as we dont want it to pick the lowdown override # Forward from the previous stage as we dont want it to pick the lowdown override
nixUnstable = prev.nixUnstable; nixUnstable = prev.nixUnstable;
build-release-notes = build-release-notes = final.buildPackages.callPackage ./maintainers/build-release-notes.nix { };
final.buildPackages.callPackage ./maintainers/build-release-notes.nix { };
clangbuildanalyzer = final.buildPackages.callPackage ./misc/clangbuildanalyzer.nix { }; clangbuildanalyzer = final.buildPackages.callPackage ./misc/clangbuildanalyzer.nix { };
boehmgc-nix = (final.boehmgc.override { boehmgc-nix = (final.boehmgc.override { enableLargeConfig = true; }).overrideAttrs (o: {
enableLargeConfig = true;
}).overrideAttrs (o: {
patches = (o.patches or [ ]) ++ [ patches = (o.patches or [ ]) ++ [
./boehmgc-coroutine-sp-fallback.diff ./boehmgc-coroutine-sp-fallback.diff
@ -195,57 +249,65 @@
busybox-sandbox-shell = final.busybox-sandbox-shell or final.default-busybox-sandbox-shell; busybox-sandbox-shell = final.busybox-sandbox-shell or final.default-busybox-sandbox-shell;
}; };
}; };
in
in { {
# A Nixpkgs overlay that overrides the 'nix' and # A Nixpkgs overlay that overrides the 'nix' and
# 'nix.perl-bindings' packages. # 'nix.perl-bindings' packages.
overlays.default = overlayFor (p: p.stdenv); overlays.default = overlayFor (p: p.stdenv);
hydraJobs = { hydraJobs = {
# Binary package for various platforms. # Binary package for various platforms.
build = forAllSystems (system: self.packages.${system}.nix); build = forAllSystems (system: self.packages.${system}.nix);
# FIXME(Qyriad): remove this when the migration to Meson has been completed. # FIXME(Qyriad): remove this when the migration to Meson has been completed.
# NOTE: mesonBuildClang depends on mesonBuild depends on build to avoid OOMs # NOTE: mesonBuildClang depends on mesonBuild depends on build to avoid OOMs
# on aarch64 builders caused by too many parallel compiler/linker processes. # on aarch64 builders caused by too many parallel compiler/linker processes.
mesonBuild = forAllSystems (system: mesonBuild = forAllSystems (
(self.packages.${system}.nix.override { system:
buildWithMeson = true; (self.packages.${system}.nix.override { buildWithMeson = true; }).overrideAttrs (prev: {
}).overrideAttrs (prev: {
buildInputs = prev.buildInputs ++ [ self.packages.${system}.nix ]; buildInputs = prev.buildInputs ++ [ self.packages.${system}.nix ];
}));
mesonBuildClang = forAllSystems (system:
(nixpkgsFor.${system}.stdenvs.clangStdenvPackages.nix.override {
buildWithMeson = true;
}).overrideAttrs (prev: {
buildInputs = prev.buildInputs ++ [ self.hydraJobs.mesonBuild.${system} ];
}) })
); );
mesonBuildClang = forAllSystems (
system:
(nixpkgsFor.${system}.stdenvs.clangStdenvPackages.nix.override { buildWithMeson = true; })
.overrideAttrs
(prev: {
buildInputs = prev.buildInputs ++ [ self.hydraJobs.mesonBuild.${system} ];
})
);
# Perl bindings for various platforms. # Perl bindings for various platforms.
perlBindings = forAllSystems (system: nixpkgsFor.${system}.native.nix.perl-bindings); perlBindings = forAllSystems (system: nixpkgsFor.${system}.native.nix.perl-bindings);
# Binary tarball for various platforms, containing a Nix store # Binary tarball for various platforms, containing a Nix store
# with the closure of 'nix' package. # with the closure of 'nix' package.
binaryTarball = forAllSystems (system: binaryTarball nixpkgsFor.${system}.native.nix nixpkgsFor.${system}.native); binaryTarball = forAllSystems (
system: binaryTarball nixpkgsFor.${system}.native.nix nixpkgsFor.${system}.native
);
# docker image with Nix inside # docker image with Nix inside
dockerImage = lib.genAttrs linux64BitSystems (system: self.packages.${system}.dockerImage); dockerImage = lib.genAttrs linux64BitSystems (system: self.packages.${system}.dockerImage);
# API docs for Nix's unstable internal C++ interfaces. # API docs for Nix's unstable internal C++ interfaces.
internal-api-docs = let internal-api-docs =
nixpkgs = nixpkgsFor.x86_64-linux.native; let
inherit (nixpkgs) pkgs; nixpkgs = nixpkgsFor.x86_64-linux.native;
inherit (nixpkgs) pkgs;
nix = pkgs.callPackage ./package.nix { nix = pkgs.callPackage ./package.nix {
inherit versionSuffix fileset officialRelease buildUnreleasedNotes; inherit
inherit (pkgs) build-release-notes; versionSuffix
internalApiDocs = true; fileset
boehmgc = pkgs.boehmgc-nix; officialRelease
busybox-sandbox-shell = pkgs.busybox-sandbox-shell; buildUnreleasedNotes
}; ;
in inherit (pkgs) build-release-notes;
internalApiDocs = true;
boehmgc = pkgs.boehmgc-nix;
busybox-sandbox-shell = pkgs.busybox-sandbox-shell;
};
in
nix.overrideAttrs (prev: { nix.overrideAttrs (prev: {
# This Hydra job is just for the internal API docs. # This Hydra job is just for the internal API docs.
# We don't need the build artifacts here. # We don't need the build artifacts here.
@ -256,146 +318,248 @@
# System tests. # System tests.
tests = import ./tests/nixos { inherit lib nixpkgs nixpkgsFor; } // { tests = import ./tests/nixos { inherit lib nixpkgs nixpkgsFor; } // {
# Make sure that nix-env still produces the exact same result # Make sure that nix-env still produces the exact same result
# on a particular version of Nixpkgs. # on a particular version of Nixpkgs.
evalNixpkgs = evalNixpkgs =
with nixpkgsFor.x86_64-linux.native; with nixpkgsFor.x86_64-linux.native;
runCommand "eval-nixos" { buildInputs = [ nix ]; } runCommand "eval-nixos" { buildInputs = [ nix ]; } ''
'' type -p nix-env
type -p nix-env # Note: we're filtering out nixos-install-tools because https://github.com/NixOS/nixpkgs/pull/153594#issuecomment-1020530593.
# Note: we're filtering out nixos-install-tools because https://github.com/NixOS/nixpkgs/pull/153594#issuecomment-1020530593. time nix-env --store dummy:// -f ${nixpkgs-regression} -qaP --drv-path | sort | grep -v nixos-install-tools > packages
time nix-env --store dummy:// -f ${nixpkgs-regression} -qaP --drv-path | sort | grep -v nixos-install-tools > packages [[ $(sha1sum < packages | cut -c1-40) = 402242fca90874112b34718b8199d844e8b03d12 ]]
[[ $(sha1sum < packages | cut -c1-40) = 402242fca90874112b34718b8199d844e8b03d12 ]] mkdir $out
mkdir $out '';
'';
nixpkgsLibTests = nixpkgsLibTests = forAllSystems (
forAllSystems (system: system:
import (nixpkgs + "/lib/tests/release.nix") import (nixpkgs + "/lib/tests/release.nix") {
{ pkgs = nixpkgsFor.${system}.native; pkgs = nixpkgsFor.${system}.native;
nixVersions = [ self.packages.${system}.nix ]; nixVersions = [ self.packages.${system}.nix ];
} }
); );
}; };
pre-commit = builtins.mapAttrs (
system: pre-commit-lib:
pre-commit-lib.run {
src = self;
hooks = {
no-commit-to-branch = {
enable = true;
settings.branch = [ "main" ];
};
check-case-conflicts.enable = true;
check-executables-have-shebangs = {
enable = true;
stages = [ "commit" ];
};
check-shebang-scripts-are-executable = {
enable = true;
stages = [ "commit" ];
};
check-symlinks = {
enable = true;
excludes = [ "^tests/functional/lang/symlink-resolution/broken$" ];
};
check-merge-conflicts.enable = true;
end-of-file-fixer = {
enable = true;
excludes = [
"\\.drv$"
"^tests/functional/lang/"
];
};
mixed-line-endings = {
enable = true;
excludes = [ "^tests/functional/lang/" ];
};
# TODO: Once the test suite is nicer, clean up and start
# enforcing trailing whitespace on tests that don't explicitly
# check for it.
trim-trailing-whitespace = {
enable = true;
stages = [ "commit" ];
excludes = [ "^tests/functional/lang/" ];
};
treefmt = {
enable = true;
settings.formatters =
let
pkgs = nixpkgsFor.${system}.native;
in
[ pkgs.nixfmt ];
};
};
}
) pre-commit-hooks.lib;
}; };
checks = forAllSystems (system: let checks = forAllSystems (
rl-next-check = name: dir: system:
let pkgs = nixpkgsFor.${system}.native; let
in pkgs.buildPackages.runCommand "test-${name}-release-notes" { } '' rl-next-check =
LANG=C.UTF-8 ${lib.getExe pkgs.build-release-notes} ${dir} >$out name: dir:
''; let
in { pkgs = nixpkgsFor.${system}.native;
# FIXME(Qyriad): remove this when the migration to Meson has been completed. in
mesonBuild = self.hydraJobs.mesonBuild.${system}; pkgs.buildPackages.runCommand "test-${name}-release-notes" { } ''
mesonBuildClang = self.hydraJobs.mesonBuildClang.${system}; LANG=C.UTF-8 ${lib.getExe pkgs.build-release-notes} ${dir} >$out
binaryTarball = self.hydraJobs.binaryTarball.${system};
perlBindings = self.hydraJobs.perlBindings.${system};
nixpkgsLibTests = self.hydraJobs.tests.nixpkgsLibTests.${system};
rl-next = rl-next-check "rl-next" ./doc/manual/rl-next;
rl-next-dev = rl-next-check "rl-next-dev" ./doc/manual/rl-next-dev;
} // (lib.optionalAttrs (builtins.elem system linux64BitSystems)) {
dockerImage = self.hydraJobs.dockerImage.${system};
});
packages = forAllSystems (system: rec {
inherit (nixpkgsFor.${system}.native) nix;
default = nix;
} // (lib.optionalAttrs (builtins.elem system linux64BitSystems) {
nix-static = nixpkgsFor.${system}.static.nix;
dockerImage =
let
pkgs = nixpkgsFor.${system}.native;
image = import ./docker.nix { inherit pkgs; tag = version; };
in
pkgs.runCommand
"docker-image-tarball-${version}"
{ meta.description = "Docker image with Nix for ${system}"; }
''
mkdir -p $out/nix-support
image=$out/image.tar.gz
ln -s ${image} $image
echo "file binary-dist $image" >> $out/nix-support/hydra-build-products
''; '';
} // builtins.listToAttrs (map in
(crossSystem: { {
name = "nix-${crossSystem}"; # FIXME(Qyriad): remove this when the migration to Meson has been completed.
value = nixpkgsFor.${system}.cross.${crossSystem}.nix; mesonBuild = self.hydraJobs.mesonBuild.${system};
}) mesonBuildClang = self.hydraJobs.mesonBuildClang.${system};
crossSystems) binaryTarball = self.hydraJobs.binaryTarball.${system};
// builtins.listToAttrs (map perlBindings = self.hydraJobs.perlBindings.${system};
(stdenvName: { nixpkgsLibTests = self.hydraJobs.tests.nixpkgsLibTests.${system};
name = "nix-${stdenvName}"; rl-next = rl-next-check "rl-next" ./doc/manual/rl-next;
value = nixpkgsFor.${system}.stdenvs."${stdenvName}Packages".nix; rl-next-dev = rl-next-check "rl-next-dev" ./doc/manual/rl-next-dev;
}) pre-commit = self.hydraJobs.pre-commit.${system};
stdenvs))); }
// (lib.optionalAttrs (builtins.elem system linux64BitSystems)) {
dockerImage = self.hydraJobs.dockerImage.${system};
}
);
devShells = let packages = forAllSystems (
makeShell = pkgs: stdenv: system:
let rec {
nix = pkgs.callPackage ./package.nix { inherit (nixpkgsFor.${system}.native) nix;
inherit stdenv versionSuffix fileset; default = nix;
boehmgc = pkgs.boehmgc-nix; }
busybox-sandbox-shell = pkgs.busybox-sandbox-shell or pkgs.default-busybox-sandbox; // (
forDevShell = true; lib.optionalAttrs (builtins.elem system linux64BitSystems) {
}; nix-static = nixpkgsFor.${system}.static.nix;
in dockerImage =
let
pkgs = nixpkgsFor.${system}.native;
image = import ./docker.nix {
inherit pkgs;
tag = version;
};
in
pkgs.runCommand "docker-image-tarball-${version}"
{ meta.description = "Docker image with Nix for ${system}"; }
''
mkdir -p $out/nix-support
image=$out/image.tar.gz
ln -s ${image} $image
echo "file binary-dist $image" >> $out/nix-support/hydra-build-products
'';
}
// builtins.listToAttrs (
map (crossSystem: {
name = "nix-${crossSystem}";
value = nixpkgsFor.${system}.cross.${crossSystem}.nix;
}) crossSystems
)
// builtins.listToAttrs (
map (stdenvName: {
name = "nix-${stdenvName}";
value = nixpkgsFor.${system}.stdenvs."${stdenvName}Packages".nix;
}) stdenvs
)
)
);
devShells =
let
makeShell =
pkgs: stdenv:
let
nix = pkgs.callPackage ./package.nix {
inherit stdenv versionSuffix fileset;
boehmgc = pkgs.boehmgc-nix;
busybox-sandbox-shell = pkgs.busybox-sandbox-shell or pkgs.default-busybox-sandbox;
forDevShell = true;
};
pre-commit = self.hydraJobs.pre-commit.${pkgs.system} or { };
in
(nix.override { (nix.override {
buildUnreleasedNotes = true; buildUnreleasedNotes = true;
officialRelease = false; officialRelease = false;
}).overrideAttrs (prev: { }).overrideAttrs
# Required for clang-tidy checks (
buildInputs = prev.buildInputs ++ lib.optionals (stdenv.cc.isClang) [ pkgs.llvmPackages.llvm pkgs.llvmPackages.clang-unwrapped.dev ]; prev:
nativeBuildInputs = prev.nativeBuildInputs {
++ lib.optional (stdenv.cc.isClang && !stdenv.buildPlatform.isDarwin) pkgs.buildPackages.bear # Required for clang-tidy checks
# Required for clang-tidy checks buildInputs =
++ lib.optionals (stdenv.cc.isClang) [ pkgs.buildPackages.cmake pkgs.buildPackages.ninja pkgs.buildPackages.llvmPackages.llvm.dev ] prev.buildInputs
++ lib.optional ++ lib.optional (pre-commit ? enabledPackages) pre-commit.enabledPackages
(stdenv.cc.isClang && stdenv.hostPlatform == stdenv.buildPlatform) # Unfortunately `git-hooks.nix` can't propagate `treefmt`
# for some reason that seems accidental and was changed in # formatters into `enabledPackages` correctly.
# NixOS 24.05-pre, clang-tools is pinned to LLVM 14 when ++ [ pkgs.nixfmt ]
# default LLVM is newer. ++ lib.optionals (stdenv.cc.isClang) [
(pkgs.buildPackages.clang-tools.override { inherit (pkgs.buildPackages) llvmPackages; }) pkgs.llvmPackages.llvm
++ [ pkgs.llvmPackages.clang-unwrapped.dev
# FIXME(Qyriad): remove once the migration to Meson is complete. ];
pkgs.buildPackages.meson nativeBuildInputs =
pkgs.buildPackages.ninja prev.nativeBuildInputs
++ lib.optional (stdenv.cc.isClang && !stdenv.buildPlatform.isDarwin) pkgs.buildPackages.bear
# Required for clang-tidy checks
++ lib.optionals (stdenv.cc.isClang) [
pkgs.buildPackages.cmake
pkgs.buildPackages.ninja
pkgs.buildPackages.llvmPackages.llvm.dev
]
++
lib.optional (stdenv.cc.isClang && stdenv.hostPlatform == stdenv.buildPlatform)
# for some reason that seems accidental and was changed in
# NixOS 24.05-pre, clang-tools is pinned to LLVM 14 when
# default LLVM is newer.
(pkgs.buildPackages.clang-tools.override { inherit (pkgs.buildPackages) llvmPackages; })
++ [
# FIXME(Qyriad): remove once the migration to Meson is complete.
pkgs.buildPackages.meson
pkgs.buildPackages.ninja
pkgs.buildPackages.clangbuildanalyzer pkgs.buildPackages.clangbuildanalyzer
]; ];
src = null; src = null;
installFlags = "sysconfdir=$(out)/etc"; installFlags = "sysconfdir=$(out)/etc";
strictDeps = false; strictDeps = false;
shellHook = '' shellHook = ''
PATH=$prefix/bin:$PATH PATH=$prefix/bin:$PATH
unset PYTHONPATH unset PYTHONPATH
export MANPATH=$out/share/man:$MANPATH export MANPATH=$out/share/man:$MANPATH
# Make bash completion work. # Make bash completion work.
XDG_DATA_DIRS+=:$out/share XDG_DATA_DIRS+=:$out/share
'';
} // lib.optionalAttrs (stdenv.buildPlatform.isLinux && pkgs.glibcLocales != null) { ${lib.optionalString (pre-commit ? shellHook) pre-commit.shellHook}
# Required to make non-NixOS Linux not complain about missing locale files during configure in a dev shell '';
LOCALE_ARCHIVE = "${lib.getLib pkgs.glibcLocales}/lib/locale/locale-archive"; }
}); // lib.optionalAttrs (stdenv.buildPlatform.isLinux && pkgs.glibcLocales != null) {
# Required to make non-NixOS Linux not complain about missing locale files during configure in a dev shell
LOCALE_ARCHIVE = "${lib.getLib pkgs.glibcLocales}/lib/locale/locale-archive";
}
);
in in
forAllSystems (system: forAllSystems (
system:
let let
makeShells = prefix: pkgs: makeShells =
lib.mapAttrs' prefix: pkgs:
(k: v: lib.nameValuePair "${prefix}-${k}" v) lib.mapAttrs' (k: v: lib.nameValuePair "${prefix}-${k}" v) (
(forAllStdenvs (stdenvName: makeShell pkgs pkgs.${stdenvName})); forAllStdenvs (stdenvName: makeShell pkgs pkgs.${stdenvName})
);
in in
(makeShells "native" nixpkgsFor.${system}.native) // (makeShells "native" nixpkgsFor.${system}.native)
(makeShells "static" nixpkgsFor.${system}.static) // // (makeShells "static" nixpkgsFor.${system}.static)
(forAllCrossSystems (crossSystem: let pkgs = nixpkgsFor.${system}.cross.${crossSystem}; in makeShell pkgs pkgs.stdenv)) // // (forAllCrossSystems (
{ crossSystem:
default = self.devShells.${system}.native-stdenvPackages; let
} pkgs = nixpkgsFor.${system}.cross.${crossSystem};
in
makeShell pkgs pkgs.stdenv
))
// {
default = self.devShells.${system}.native-stdenvPackages;
}
); );
}; };
} }

View file

@ -1,5 +1,8 @@
{ lib, python3, writeShellScriptBin }: {
lib,
python3,
writeShellScriptBin,
}:
writeShellScriptBin "build-release-notes" '' writeShellScriptBin "build-release-notes" ''
exec ${lib.getExe (python3.withPackages (p: [ p.python-frontmatter ]))} \ exec ${lib.getExe (python3.withPackages (p: [ p.python-frontmatter ]))} \
${./build-release-notes.py} "$@" ${./build-release-notes.py} "$@"

0
maintainers/build-release-notes.py Executable file → Normal file
View file

View file

@ -189,8 +189,7 @@ release:
* Bump the version number of the release branch as above (e.g. to * Bump the version number of the release branch as above (e.g. to
`2.12.2`). `2.12.2`).
## Recovering from mistakes ## Recovering from mistakes
`upload-release.pl` should be idempotent. For instance a wrong `IS_LATEST` value can be fixed that way, by running the script on the actual latest release. `upload-release.pl` should be idempotent. For instance a wrong `IS_LATEST` value can be fixed that way, by running the script on the actual latest release.

View file

@ -84,4 +84,3 @@ except Exception as e:
print(f'{name}: INTERNAL ERROR running test ({sys.argv}): {e}', file=sys.stderr) print(f'{name}: INTERNAL ERROR running test ({sys.argv}): {e}', file=sys.stderr)
print(f'this is a bug in {name}') print(f'this is a bug in {name}')
sys.exit(99) sys.exit(99)

View file

@ -1,6 +1,11 @@
# Upstreaming here, can be deleted once it's upstreamed: # Upstreaming here, can be deleted once it's upstreamed:
# https://github.com/NixOS/nixpkgs/pull/297102 # https://github.com/NixOS/nixpkgs/pull/297102
{ stdenv, lib, cmake, fetchFromGitHub }: {
stdenv,
lib,
cmake,
fetchFromGitHub,
}:
stdenv.mkDerivation (finalAttrs: { stdenv.mkDerivation (finalAttrs: {
pname = "clangbuildanalyzer"; pname = "clangbuildanalyzer";
version = "1.5.0"; version = "1.5.0";
@ -12,9 +17,7 @@ stdenv.mkDerivation (finalAttrs: {
sha256 = "sha256-kmgdk634zM0W0OoRoP/RzepArSipa5bNqdVgdZO9gxo="; sha256 = "sha256-kmgdk634zM0W0OoRoP/RzepArSipa5bNqdVgdZO9gxo=";
}; };
nativeBuildInputs = [ nativeBuildInputs = [ cmake ];
cmake
];
meta = { meta = {
description = "Tool for analyzing Clang's -ftrace-time files"; description = "Tool for analyzing Clang's -ftrace-time files";

View file

@ -3,20 +3,20 @@
# nix-daemon: Starts the nix package manager daemon # nix-daemon: Starts the nix package manager daemon
# #
# chkconfig: 345 24 02 # chkconfig: 345 24 02
# description: This is a daemon which enable the multi-user mode # description: This is a daemon which enable the multi-user mode
# of the nix package manager. # of the nix package manager.
# processname: nix-daemon # processname: nix-daemon
# pidfile: /var/run/nix/nix-daemon.pid # pidfile: /var/run/nix/nix-daemon.pid
### BEGIN INIT INFO ### BEGIN INIT INFO
# Required-Start: # Required-Start:
# Required-Stop: # Required-Stop:
# Should-Start: # Should-Start:
# Should-Stop: # Should-Stop:
# Default-Start: 3 4 5 # Default-Start: 3 4 5
# Default-Stop: 0 1 2 6 # Default-Stop: 0 1 2 6
# Short-Description: Starts the nix daemon # Short-Description: Starts the nix daemon
# Description: This is a daemon which enable the multi-user mode # Description: This is a daemon which enable the multi-user mode
# of the nix package manager. # of the nix package manager.
### END INIT INFO ### END INIT INFO

79
nix-support/nixfmt.nix Normal file
View file

@ -0,0 +1,79 @@
# Copy of `nixfmt-rfc-style` vendored from `nixpkgs` master:
# https://github.com/NixOS/nixpkgs/blob/ab6071eb54cc9b66dda436111d4f569e4e56cbf4/pkgs/by-name/ni/nixfmt-rfc-style/package.nix
{
haskell,
haskellPackages,
lib,
fetchpatch,
}:
let
inherit (haskell.lib.compose) overrideCabal justStaticExecutables;
overrides = {
version = "unstable-2024-03-01";
patches = [
(fetchpatch {
url = "https://github.com/serokell/nixfmt/commit/ca9c8975ed671112fdfce94f2e9e2ad3de480c9a.patch";
hash = "sha256-UOSAYahSKBsqPMVcQJ3H26Eg2xpPAsNOjYMI6g+WTYU=";
})
];
};
raw-pkg = haskellPackages.callPackage (
{
mkDerivation,
base,
cmdargs,
directory,
fetchzip,
filepath,
lib,
megaparsec,
mtl,
parser-combinators,
safe-exceptions,
scientific,
text,
transformers,
unix,
}:
mkDerivation {
pname = "nixfmt";
version = "0.5.0";
src = fetchzip {
url = "https://github.com/piegamesde/nixfmt/archive/2b5ee820690bae64cb4003e46917ae43541e3e0b.tar.gz";
sha256 = "1i1jbc1q4gd7fpilwy6s3a583yl5l8d8rlmipygj61mpclg9ihqg";
};
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
base
megaparsec
mtl
parser-combinators
scientific
text
transformers
];
executableHaskellDepends = [
base
cmdargs
directory
filepath
safe-exceptions
text
unix
];
jailbreak = true;
homepage = "https://github.com/serokell/nixfmt";
description = "An opinionated formatter for Nix";
license = lib.licenses.mpl20;
mainProgram = "nixfmt";
}
) { };
in
lib.pipe raw-pkg [
(overrideCabal overrides)
justStaticExecutables
]

View file

@ -40,9 +40,11 @@
util-linuxMinimal ? utillinuxMinimal, util-linuxMinimal ? utillinuxMinimal,
utillinuxMinimal ? null, utillinuxMinimal ? null,
xz, xz,
busybox-sandbox-shell, busybox-sandbox-shell,
# Customization options
# =====================
pname ? "nix", pname ? "nix",
versionSuffix ? "", versionSuffix ? "",
officialRelease ? true, officialRelease ? true,
@ -61,19 +63,21 @@
__forDefaults ? { __forDefaults ? {
canRunInstalled = stdenv.buildPlatform.canExecute stdenv.hostPlatform; canRunInstalled = stdenv.buildPlatform.canExecute stdenv.hostPlatform;
}, },
}: let }:
let
inherit (__forDefaults) canRunInstalled; inherit (__forDefaults) canRunInstalled;
version = lib.fileContents ./.version + versionSuffix; version = lib.fileContents ./.version + versionSuffix;
aws-sdk-cpp-nix = aws-sdk-cpp.override { aws-sdk-cpp-nix = aws-sdk-cpp.override {
apis = [ "s3" "transfer" ]; apis = [
"s3"
"transfer"
];
customMemoryManagement = false; customMemoryManagement = false;
}; };
testConfigureFlags = [ testConfigureFlags = [ "RAPIDCHECK_HEADERS=${lib.getDev rapidcheck}/extras/gtest/include" ];
"RAPIDCHECK_HEADERS=${lib.getDev rapidcheck}/extras/gtest/include"
];
# The internal API docs need these for the build, but if we're not building # The internal API docs need these for the build, but if we're not building
# Nix itself, then these don't need to be propagated. # Nix itself, then these don't need to be propagated.
@ -95,48 +99,60 @@
./README.md ./README.md
]; ];
topLevelBuildFiles = fileset.unions ([ topLevelBuildFiles = fileset.unions (
./local.mk [
./Makefile ./local.mk
./Makefile.config.in ./Makefile
./mk ./Makefile.config.in
] ++ lib.optionals buildWithMeson [ ./mk
./meson.build ]
./meson.options ++ lib.optionals buildWithMeson [
./meson ./meson.build
./scripts/meson.build ./meson.options
]); ./meson
./scripts/meson.build
]
);
functionalTestFiles = fileset.unions [ functionalTestFiles = fileset.unions [
./tests/functional ./tests/functional
./tests/unit ./tests/unit
(fileset.fileFilter (f: lib.strings.hasPrefix "nix-profile" f.name) ./scripts) (fileset.fileFilter (f: lib.strings.hasPrefix "nix-profile" f.name) ./scripts)
]; ];
in
in stdenv.mkDerivation (finalAttrs: { stdenv.mkDerivation (finalAttrs: {
inherit pname version; inherit pname version;
src = fileset.toSource { src = fileset.toSource {
root = ./.; root = ./.;
fileset = fileset.intersection baseFiles (fileset.unions ([ fileset = fileset.intersection baseFiles (
configureFiles fileset.unions (
topLevelBuildFiles [
functionalTestFiles configureFiles
] ++ lib.optionals (!finalAttrs.dontBuild || internalApiDocs) [ topLevelBuildFiles
./boehmgc-coroutine-sp-fallback.diff functionalTestFiles
./doc ]
./misc ++ lib.optionals (!finalAttrs.dontBuild || internalApiDocs) [
./precompiled-headers.h ./boehmgc-coroutine-sp-fallback.diff
./src ./doc
./COPYING ./misc
./scripts/local.mk ./precompiled-headers.h
])); ./src
./COPYING
./scripts/local.mk
]
)
);
}; };
VERSION_SUFFIX = versionSuffix; VERSION_SUFFIX = versionSuffix;
outputs = [ "out" ] outputs =
++ lib.optionals (!finalAttrs.dontBuild) [ "dev" "doc" ]; [ "out" ]
++ lib.optionals (!finalAttrs.dontBuild) [
"dev"
"doc"
];
dontBuild = false; dontBuild = false;
@ -148,51 +164,59 @@ in stdenv.mkDerivation (finalAttrs: {
# We only include CMake so that Meson can locate toml11, which only ships CMake dependency metadata. # We only include CMake so that Meson can locate toml11, which only ships CMake dependency metadata.
dontUseCmakeConfigure = true; dontUseCmakeConfigure = true;
nativeBuildInputs = [ nativeBuildInputs =
bison [
flex bison
] ++ [ flex
(lib.getBin lowdown) ]
mdbook ++ [
mdbook-linkcheck (lib.getBin lowdown)
autoconf-archive mdbook
] ++ lib.optional (!buildWithMeson) autoreconfHook ++ [ mdbook-linkcheck
pkg-config autoconf-archive
]
++ lib.optional (!buildWithMeson) autoreconfHook
++ [
pkg-config
# Tests # Tests
git git
mercurial mercurial
jq jq
lsof lsof
] ++ lib.optional stdenv.hostPlatform.isLinux util-linuxMinimal ]
++ lib.optional stdenv.hostPlatform.isLinux util-linuxMinimal
++ lib.optional (!officialRelease && buildUnreleasedNotes) build-release-notes ++ lib.optional (!officialRelease && buildUnreleasedNotes) build-release-notes
++ lib.optional internalApiDocs doxygen ++ lib.optional internalApiDocs doxygen
++ lib.optionals buildWithMeson [ ++ lib.optionals buildWithMeson [
meson meson
ninja ninja
cmake cmake
]; ];
buildInputs = [ buildInputs =
curl [
bzip2 curl
xz bzip2
brotli xz
editline brotli
openssl editline
sqlite openssl
libarchive sqlite
boost libarchive
lowdown boost
libsodium lowdown
toml11 libsodium
] toml11
++ lib.optionals stdenv.hostPlatform.isLinux [ libseccomp busybox-sandbox-shell ] ]
++ lib.optionals stdenv.hostPlatform.isLinux [
libseccomp
busybox-sandbox-shell
]
++ lib.optional stdenv.hostPlatform.isx86_64 libcpuid ++ lib.optional stdenv.hostPlatform.isx86_64 libcpuid
# There have been issues building these dependencies # There have been issues building these dependencies
++ lib.optional (stdenv.hostPlatform == stdenv.buildPlatform) aws-sdk-cpp-nix ++ lib.optional (stdenv.hostPlatform == stdenv.buildPlatform) aws-sdk-cpp-nix
++ lib.optionals (finalAttrs.dontBuild) maybePropagatedInputs ++ lib.optionals (finalAttrs.dontBuild) maybePropagatedInputs;
;
checkInputs = [ checkInputs = [
gtest gtest
@ -201,9 +225,7 @@ in stdenv.mkDerivation (finalAttrs: {
propagatedBuildInputs = lib.optionals (!finalAttrs.dontBuild) maybePropagatedInputs; propagatedBuildInputs = lib.optionals (!finalAttrs.dontBuild) maybePropagatedInputs;
disallowedReferences = [ disallowedReferences = [ boost ];
boost
];
# Needed for Meson to find Boost. # Needed for Meson to find Boost.
# https://github.com/NixOS/nixpkgs/issues/86131. # https://github.com/NixOS/nixpkgs/issues/86131.
@ -212,45 +234,49 @@ in stdenv.mkDerivation (finalAttrs: {
BOOST_LIBRARYDIR = "${lib.getLib boost}/lib"; BOOST_LIBRARYDIR = "${lib.getLib boost}/lib";
}; };
preConfigure = lib.optionalString (!finalAttrs.dontBuild && !stdenv.hostPlatform.isStatic) '' preConfigure =
# Copy libboost_context so we don't get all of Boost in our closure. lib.optionalString (!finalAttrs.dontBuild && !stdenv.hostPlatform.isStatic) ''
# https://github.com/NixOS/nixpkgs/issues/45462 # Copy libboost_context so we don't get all of Boost in our closure.
mkdir -p $out/lib # https://github.com/NixOS/nixpkgs/issues/45462
cp -pd ${boost}/lib/{libboost_context*,libboost_thread*,libboost_system*} $out/lib mkdir -p $out/lib
rm -f $out/lib/*.a cp -pd ${boost}/lib/{libboost_context*,libboost_thread*,libboost_system*} $out/lib
'' + lib.optionalString (!finalAttrs.dontBuild && stdenv.hostPlatform.isLinux) '' rm -f $out/lib/*.a
chmod u+w $out/lib/*.so.* ''
patchelf --set-rpath $out/lib:${stdenv.cc.cc.lib}/lib $out/lib/libboost_thread.so.* + lib.optionalString (!finalAttrs.dontBuild && stdenv.hostPlatform.isLinux) ''
'' + lib.optionalString (!finalAttrs.dontBuild && stdenv.hostPlatform.isDarwin) '' chmod u+w $out/lib/*.so.*
for LIB in $out/lib/*.dylib; do patchelf --set-rpath $out/lib:${stdenv.cc.cc.lib}/lib $out/lib/libboost_thread.so.*
chmod u+w $LIB ''
install_name_tool -id $LIB $LIB + lib.optionalString (!finalAttrs.dontBuild && stdenv.hostPlatform.isDarwin) ''
install_name_tool -delete_rpath ${boost}/lib/ $LIB || true for LIB in $out/lib/*.dylib; do
done chmod u+w $LIB
install_name_tool -change ${boost}/lib/libboost_system.dylib $out/lib/libboost_system.dylib $out/lib/libboost_thread.dylib install_name_tool -id $LIB $LIB
'' + '' install_name_tool -delete_rpath ${boost}/lib/ $LIB || true
# Workaround https://github.com/NixOS/nixpkgs/issues/294890. done
if [[ -n "''${doCheck:-}" ]]; then install_name_tool -change ${boost}/lib/libboost_system.dylib $out/lib/libboost_system.dylib $out/lib/libboost_thread.dylib
appendToVar configureFlags "--enable-tests" ''
else + ''
appendToVar configureFlags "--disable-tests" # Workaround https://github.com/NixOS/nixpkgs/issues/294890.
fi if [[ -n "''${doCheck:-}" ]]; then
''; appendToVar configureFlags "--enable-tests"
else
appendToVar configureFlags "--disable-tests"
fi
'';
configureFlags = lib.optionals stdenv.isLinux [ configureFlags =
"--with-boost=${boost}/lib" lib.optionals stdenv.isLinux [
"--with-sandbox-shell=${busybox-sandbox-shell}/bin/busybox" "--with-boost=${boost}/lib"
] ++ lib.optionals (stdenv.isLinux && !(stdenv.hostPlatform.isStatic && stdenv.system == "aarch64-linux")) [ "--with-sandbox-shell=${busybox-sandbox-shell}/bin/busybox"
"LDFLAGS=-fuse-ld=gold" ]
] ++ lib.optionals (
stdenv.isLinux && !(stdenv.hostPlatform.isStatic && stdenv.system == "aarch64-linux")
) [ "LDFLAGS=-fuse-ld=gold" ]
++ lib.optional stdenv.hostPlatform.isStatic "--enable-embedded-sandbox-shell" ++ lib.optional stdenv.hostPlatform.isStatic "--enable-embedded-sandbox-shell"
++ lib.optionals (finalAttrs.doCheck || internalApiDocs) testConfigureFlags ++ lib.optionals (finalAttrs.doCheck || internalApiDocs) testConfigureFlags
++ lib.optional (!canRunInstalled) "--disable-doc-gen" ++ lib.optional (!canRunInstalled) "--disable-doc-gen"
++ [ (lib.enableFeature internalApiDocs "internal-api-docs") ] ++ [ (lib.enableFeature internalApiDocs "internal-api-docs") ]
++ lib.optional (!forDevShell) "--sysconfdir=/etc" ++ lib.optional (!forDevShell) "--sysconfdir=/etc"
++ [ ++ [ "TOML11_HEADERS=${lib.getDev toml11}/include" ];
"TOML11_HEADERS=${lib.getDev toml11}/include"
];
mesonBuildType = lib.optional (buildWithMeson || forDevShell) "debugoptimized"; mesonBuildType = lib.optional (buildWithMeson || forDevShell) "debugoptimized";
@ -262,37 +288,37 @@ in stdenv.mkDerivation (finalAttrs: {
doCheck = true; doCheck = true;
mesonCheckFlags = lib.optionals (buildWithMeson || forDevShell) [ mesonCheckFlags = lib.optionals (buildWithMeson || forDevShell) [ "--suite=check" ];
"--suite=check"
];
installFlags = "sysconfdir=$(out)/etc"; installFlags = "sysconfdir=$(out)/etc";
postInstall = lib.optionalString (!finalAttrs.dontBuild) '' postInstall =
mkdir -p $doc/nix-support lib.optionalString (!finalAttrs.dontBuild) ''
echo "doc manual $doc/share/doc/nix/manual" >> $doc/nix-support/hydra-build-products mkdir -p $doc/nix-support
'' + lib.optionalString stdenv.hostPlatform.isStatic '' echo "doc manual $doc/share/doc/nix/manual" >> $doc/nix-support/hydra-build-products
mkdir -p $out/nix-support ''
echo "file binary-dist $out/bin/nix" >> $out/nix-support/hydra-build-products + lib.optionalString stdenv.hostPlatform.isStatic ''
'' + lib.optionalString stdenv.isDarwin '' mkdir -p $out/nix-support
for lib in libnixutil.dylib libnixexpr.dylib; do echo "file binary-dist $out/bin/nix" >> $out/nix-support/hydra-build-products
install_name_tool \ ''
-change "${lib.getLib boost}/lib/libboost_context.dylib" \ + lib.optionalString stdenv.isDarwin ''
"$out/lib/libboost_context.dylib" \ for lib in libnixutil.dylib libnixexpr.dylib; do
"$out/lib/$lib" install_name_tool \
done -change "${lib.getLib boost}/lib/libboost_context.dylib" \
'' + lib.optionalString internalApiDocs '' "$out/lib/libboost_context.dylib" \
mkdir -p $out/nix-support "$out/lib/$lib"
echo "doc internal-api-docs $out/share/doc/nix/internal-api/html" >> "$out/nix-support/hydra-build-products" done
''; ''
+ lib.optionalString internalApiDocs ''
mkdir -p $out/nix-support
echo "doc internal-api-docs $out/share/doc/nix/internal-api/html" >> "$out/nix-support/hydra-build-products"
'';
doInstallCheck = finalAttrs.doCheck; doInstallCheck = finalAttrs.doCheck;
installCheckFlags = "sysconfdir=$(out)/etc"; installCheckFlags = "sysconfdir=$(out)/etc";
installCheckTarget = "installcheck"; # work around buggy detection in stdenv installCheckTarget = "installcheck"; # work around buggy detection in stdenv
mesonInstallCheckFlags = [ mesonInstallCheckFlags = [ "--suite=installcheck" ];
"--suite=installcheck"
];
preInstallCheck = lib.optionalString stdenv.hostPlatform.isDarwin '' preInstallCheck = lib.optionalString stdenv.hostPlatform.isDarwin ''
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
@ -310,12 +336,9 @@ in stdenv.mkDerivation (finalAttrs: {
strictDeps = true; strictDeps = true;
# strictoverflow is disabled because we trap on signed overflow instead # strictoverflow is disabled because we trap on signed overflow instead
hardeningDisable = [ "strictoverflow" ] hardeningDisable = [ "strictoverflow" ] ++ lib.optional stdenv.hostPlatform.isStatic "pie";
++ lib.optional stdenv.hostPlatform.isStatic "pie";
meta.platforms = lib.platforms.unix; meta.platforms = lib.platforms.unix;
passthru.perl-bindings = pkgs.callPackage ./perl { passthru.perl-bindings = pkgs.callPackage ./perl { inherit fileset stdenv; };
inherit fileset stdenv;
};
}) })

View file

@ -1,51 +1,64 @@
{ lib, fileset {
, stdenv lib,
, perl, perlPackages fileset,
, autoconf-archive, autoreconfHook, pkg-config stdenv,
, nix, curl, bzip2, xz, boost, libsodium, darwin perl,
perlPackages,
autoconf-archive,
autoreconfHook,
pkg-config,
nix,
curl,
bzip2,
xz,
boost,
libsodium,
darwin,
}: }:
perl.pkgs.toPerlModule (
stdenv.mkDerivation {
name = "nix-perl-${nix.version}";
perl.pkgs.toPerlModule (stdenv.mkDerivation { src = fileset.toSource {
name = "nix-perl-${nix.version}"; root = ../.;
fileset = fileset.unions [
../.version
../m4
../mk
./MANIFEST
./Makefile
./Makefile.config.in
./configure.ac
./lib
./local.mk
];
};
src = fileset.toSource { nativeBuildInputs = [
root = ../.; autoconf-archive
fileset = fileset.unions [
../.version
../m4
../mk
./MANIFEST
./Makefile
./Makefile.config.in
./configure.ac
./lib
./local.mk
];
};
nativeBuildInputs =
[ autoconf-archive
autoreconfHook autoreconfHook
pkg-config pkg-config
]; ];
buildInputs = buildInputs =
[ nix [
curl nix
bzip2 curl
xz bzip2
perl xz
boost perl
] boost
++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium ]
++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Security; ++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium
++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Security;
configureFlags = [ configureFlags = [
"--with-dbi=${perlPackages.DBI}/${perl.libPrefix}" "--with-dbi=${perlPackages.DBI}/${perl.libPrefix}"
"--with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix}" "--with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix}"
]; ];
enableParallelBuilding = true; enableParallelBuilding = true;
postUnpack = "sourceRoot=$sourceRoot/perl"; postUnpack = "sourceRoot=$sourceRoot/perl";
}) }
)

View file

@ -1,43 +1,72 @@
{ system ? "" # obsolete {
, url system ? "", # obsolete
, hash ? "" # an SRI hash url,
hash ? "", # an SRI hash
# Legacy hash specification # Legacy hash specification
, md5 ? "", sha1 ? "", sha256 ? "", sha512 ? "" md5 ? "",
, outputHash ? sha1 ? "",
if hash != "" then hash else if sha512 != "" then sha512 else if sha1 != "" then sha1 else if md5 != "" then md5 else sha256 sha256 ? "",
, outputHashAlgo ? sha512 ? "",
if hash != "" then "" else if sha512 != "" then "sha512" else if sha1 != "" then "sha1" else if md5 != "" then "md5" else "sha256" outputHash ?
if hash != "" then
, executable ? false hash
, unpack ? false else if sha512 != "" then
, name ? baseNameOf (toString url) sha512
, impure ? false else if sha1 != "" then
sha1
else if md5 != "" then
md5
else
sha256,
outputHashAlgo ?
if hash != "" then
""
else if sha512 != "" then
"sha512"
else if sha1 != "" then
"sha1"
else if md5 != "" then
"md5"
else
"sha256",
executable ? false,
unpack ? false,
name ? baseNameOf (toString url),
impure ? false,
}: }:
derivation (
{
builder = "builtin:fetchurl";
derivation ({ # New-style output content requirements.
builder = "builtin:fetchurl"; outputHashMode = if unpack || executable then "recursive" else "flat";
# New-style output content requirements. inherit
outputHashMode = if unpack || executable then "recursive" else "flat"; name
url
executable
unpack
;
inherit name url executable unpack; system = "builtin";
system = "builtin"; # No need to double the amount of network traffic
preferLocalBuild = true;
# No need to double the amount of network traffic impureEnvVars = [
preferLocalBuild = true; # We borrow these environment variables from the caller to allow
# easy proxy configuration. This is impure, but a fixed-output
# derivation like fetchurl is allowed to do so since its result is
# by definition pure.
"http_proxy"
"https_proxy"
"ftp_proxy"
"all_proxy"
"no_proxy"
];
impureEnvVars = [ # To make "nix-prefetch-url" work.
# We borrow these environment variables from the caller to allow urls = [ url ];
# easy proxy configuration. This is impure, but a fixed-output }
# derivation like fetchurl is allowed to do so since its result is // (if impure then { __impure = true; } else { inherit outputHashAlgo outputHash; })
# by definition pure. )
"http_proxy" "https_proxy" "ftp_proxy" "all_proxy" "no_proxy"
];
# To make "nix-prefetch-url" work.
urls = [ url ];
} // (if impure
then { __impure = true; }
else { inherit outputHashAlgo outputHash; }))

View file

@ -1,72 +1,69 @@
lockFileStr: rootSrc: rootSubdir: lockFileStr: rootSrc: rootSubdir:
let let
lockFile = builtins.fromJSON lockFileStr; lockFile = builtins.fromJSON lockFileStr;
allNodes = allNodes = builtins.mapAttrs (
builtins.mapAttrs key: node:
(key: node: let
let sourceInfo =
if key == lockFile.root then
rootSrc
else
fetchTree (node.info or { } // removeAttrs node.locked [ "dir" ]);
sourceInfo = subdir = if key == lockFile.root then rootSubdir else node.locked.dir or "";
if key == lockFile.root
then rootSrc
else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]);
subdir = if key == lockFile.root then rootSubdir else node.locked.dir or ""; outPath = sourceInfo + ((if subdir == "" then "" else "/") + subdir);
outPath = sourceInfo + ((if subdir == "" then "" else "/") + subdir); flake = import (outPath + "/flake.nix");
flake = import (outPath + "/flake.nix"); inputs = builtins.mapAttrs (inputName: inputSpec: allNodes.${resolveInput inputSpec}) (
node.inputs or { }
);
inputs = builtins.mapAttrs # Resolve a input spec into a node name. An input spec is
(inputName: inputSpec: allNodes.${resolveInput inputSpec}) # either a node name, or a 'follows' path from the root
(node.inputs or {}); # node.
resolveInput =
inputSpec: if builtins.isList inputSpec then getInputByPath lockFile.root inputSpec else inputSpec;
# Resolve a input spec into a node name. An input spec is # Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the
# either a node name, or a 'follows' path from the root # root node, returning the final node.
# node. getInputByPath =
resolveInput = inputSpec: nodeName: path:
if builtins.isList inputSpec if path == [ ] then
then getInputByPath lockFile.root inputSpec nodeName
else inputSpec; else
getInputByPath
# Since this could be a 'follows' input, call resolveInput.
(resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path})
(builtins.tail path);
# Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the outputs = flake.outputs (inputs // { self = result; });
# root node, returning the final node.
getInputByPath = nodeName: path:
if path == []
then nodeName
else
getInputByPath
# Since this could be a 'follows' input, call resolveInput.
(resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path})
(builtins.tail path);
outputs = flake.outputs (inputs // { self = result; }); result =
outputs
# We add the sourceInfo attribute for its metadata, as they are
# relevant metadata for the flake. However, the outPath of the
# sourceInfo does not necessarily match the outPath of the flake,
# as the flake may be in a subdirectory of a source.
# This is shadowed in the next //
// sourceInfo
// {
# This shadows the sourceInfo.outPath
inherit outPath;
result = inherit inputs;
outputs inherit outputs;
# We add the sourceInfo attribute for its metadata, as they are inherit sourceInfo;
# relevant metadata for the flake. However, the outPath of the _type = "flake";
# sourceInfo does not necessarily match the outPath of the flake, };
# as the flake may be in a subdirectory of a source. in
# This is shadowed in the next // if node.flake or true then
// sourceInfo assert builtins.isFunction flake.outputs;
// { result
# This shadows the sourceInfo.outPath else
inherit outPath; sourceInfo
) lockFile.nodes;
inherit inputs; inherit outputs; inherit sourceInfo; _type = "flake"; in
}; allNodes.${lockFile.root}
in
if node.flake or true then
assert builtins.isFunction flake.outputs;
result
else
sourceInfo
)
lockFile.nodes;
in allNodes.${lockFile.root}

View file

@ -1,21 +1,24 @@
attrs @ { drvPath, outputs, name, ... }: attrs@{
drvPath,
outputs,
name,
...
}:
let let
commonAttrs = (builtins.listToAttrs outputsList) // {
all = map (x: x.value) outputsList;
inherit drvPath name;
type = "derivation";
};
commonAttrs = (builtins.listToAttrs outputsList) // outputToAttrListElement = outputName: {
{ all = map (x: x.value) outputsList; name = outputName;
inherit drvPath name; value = commonAttrs // {
type = "derivation"; outPath = builtins.getAttr outputName attrs;
inherit outputName;
}; };
};
outputToAttrListElement = outputName:
{ name = outputName;
value = commonAttrs // {
outPath = builtins.getAttr outputName attrs;
inherit outputName;
};
};
outputsList = map outputToAttrListElement outputs; outputsList = map outputToAttrListElement outputs;
in
in (builtins.head outputsList).value (builtins.head outputsList).value

View file

@ -1,27 +1,32 @@
/* This is the implementation of the derivation builtin function. /*
It's actually a wrapper around the derivationStrict primop. */ This is the implementation of the derivation builtin function.
It's actually a wrapper around the derivationStrict primop.
drvAttrs @ { outputs ? [ "out" ], ... }: */
drvAttrs@{
outputs ? [ "out" ],
...
}:
let let
strict = derivationStrict drvAttrs; strict = derivationStrict drvAttrs;
commonAttrs = drvAttrs // (builtins.listToAttrs outputsList) // commonAttrs =
{ all = map (x: x.value) outputsList; drvAttrs
// (builtins.listToAttrs outputsList)
// {
all = map (x: x.value) outputsList;
inherit drvAttrs; inherit drvAttrs;
}; };
outputToAttrListElement = outputName: outputToAttrListElement = outputName: {
{ name = outputName; name = outputName;
value = commonAttrs // { value = commonAttrs // {
outPath = builtins.getAttr outputName strict; outPath = builtins.getAttr outputName strict;
drvPath = strict.drvPath; drvPath = strict.drvPath;
type = "derivation"; type = "derivation";
inherit outputName; inherit outputName;
};
}; };
};
outputsList = map outputToAttrListElement outputs; outputsList = map outputToAttrListElement outputs;
in
in (builtins.head outputsList).value (builtins.head outputsList).value

View file

@ -8,5 +8,3 @@ namespace nix {
void setPersonality(std::string_view system); void setPersonality(std::string_view system);
} }

View file

@ -144,7 +144,7 @@ struct SourcePath
* Resolve any symlinks in this `SourcePath` according to the * Resolve any symlinks in this `SourcePath` according to the
* given resolution mode. * given resolution mode.
* *
* @param mode might only be a temporary solution for this. * @param mode might only be a temporary solution for this.
* See the discussion in https://github.com/NixOS/nix/pull/9985. * See the discussion in https://github.com/NixOS/nix/pull/9985.
*/ */
SourcePath resolveSymlinks( SourcePath resolveSymlinks(

View file

@ -152,5 +152,3 @@ void ThreadPool::doWork(bool mainThread)
} }
} }

View file

@ -1,5 +1,8 @@
{ name, channelName, src }: {
name,
channelName,
src,
}:
derivation { derivation {
builder = "builtin:unpack-channel"; builder = "builtin:unpack-channel";

View file

@ -1,5 +1,4 @@
{ derivations, manifest }: { derivations, manifest }:
derivation { derivation {
name = "user-environment"; name = "user-environment";
system = "builtin"; system = "builtin";
@ -8,13 +7,15 @@ derivation {
inherit manifest; inherit manifest;
# !!! grmbl, need structured data for passing this in a clean way. # !!! grmbl, need structured data for passing this in a clean way.
derivations = derivations = map (
map (d: d:
[ (d.meta.active or "true") [
(d.meta.priority or 5) (d.meta.active or "true")
(builtins.length d.outputs) (d.meta.priority or 5)
] ++ map (output: builtins.getAttr output d) d.outputs) (builtins.length d.outputs)
derivations; ]
++ map (output: builtins.getAttr output d) d.outputs
) derivations;
# Building user environments remotely just causes huge amounts of # Building user environments remotely just causes huge amounts of
# network traffic, so don't do that. # network traffic, so don't do that.

2
tests/functional/ca/build-cache.sh Normal file → Executable file
View file

@ -48,4 +48,4 @@ testRemoteCache () {
} }
clearStore clearStore
testRemoteCache testRemoteCache

View file

@ -3,4 +3,3 @@ source common.sh
export NIX_TESTS_CA_BY_DEFAULT=1 export NIX_TESTS_CA_BY_DEFAULT=1
cd .. && source build-dry.sh cd .. && source build-dry.sh

0
tests/functional/ca/build.sh Normal file → Executable file
View file

0
tests/functional/ca/eval-store.sh Normal file → Executable file
View file

View file

@ -3,4 +3,3 @@ source common.sh
export NIX_TESTS_CA_BY_DEFAULT=1 export NIX_TESTS_CA_BY_DEFAULT=1
cd .. && source import-derivation.sh cd .. && source import-derivation.sh

View file

@ -5,4 +5,3 @@ source common.sh
CONTENT_ADDRESSED=true CONTENT_ADDRESSED=true
cd .. cd ..
source ./nix-shell.sh source ./nix-shell.sh

View file

@ -32,4 +32,3 @@ rec {
''; '';
}; };
} }

View file

@ -7,5 +7,3 @@ requireDaemonNewerThan "2.4pre20210626"
export NIX_TESTS_CA_BY_DEFAULT=1 export NIX_TESTS_CA_BY_DEFAULT=1
cd .. cd ..
source ./post-hook.sh source ./post-hook.sh

0
tests/functional/ca/substitute.sh Normal file → Executable file
View file

0
tests/functional/dyn-drv/build-built-drv.sh Normal file → Executable file
View file

0
tests/functional/dyn-drv/dep-built-drv.sh Normal file → Executable file
View file

0
tests/functional/dyn-drv/eval-outputOf.sh Normal file → Executable file
View file

0
tests/functional/dyn-drv/text-hashed-output.sh Normal file → Executable file
View file

View file

@ -147,4 +147,3 @@ expectStderr 1 nix eval -v --raw --expr "
inputAddressed = true; inputAddressed = true;
} }
" | grepQuiet 'error.*The store object referred to by.*fromPath.* at .* is not input-addressed, but .*inputAddressed.* is set to .*true.*' " | grepQuiet 'error.*The store object referred to by.*fromPath.* at .* is not input-addressed, but .*inputAddressed.* is set to .*true.*'

View file

@ -47,4 +47,3 @@ nix flake update b --flake $flakeA
# Test list-inputs with circular dependencies # Test list-inputs with circular dependencies
nix flake metadata $flakeA nix flake metadata $flakeA

View file

@ -167,7 +167,7 @@ nix flake lock "$flakeFollowsA" 2>&1 | grep "warning: input 'B' has an override
# #
# The message was # The message was
# error: input 'B/D' follows a non-existent input 'B/C/D' # error: input 'B/D' follows a non-existent input 'B/C/D'
# #
# Note that for `B` to resolve its follow for `D`, it needs `C/D`, for which it needs to resolve the follow on `C` first. # Note that for `B` to resolve its follow for `D`, it needs `C/D`, for which it needs to resolve the follow on `C` first.
flakeFollowsOverloadA="$TEST_ROOT/follows/overload/flakeA" flakeFollowsOverloadA="$TEST_ROOT/follows/overload/flakeA"
flakeFollowsOverloadB="$TEST_ROOT/follows/overload/flakeA/flakeB" flakeFollowsOverloadB="$TEST_ROOT/follows/overload/flakeA/flakeB"

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