Agenda
- Triage (30 min)
- TH: Board situation
- TH: CLI stabilisation
Nix 2.20 stops working with git lfs · Issue #10079 · NixOS/nix · GitHub
`builtins.toJSON` impossible to create single backslash followed by certain characters · Issue #10082 · NixOS/nix · GitHub
File flake input broken in latest git version · Issue #10080 · NixOS/nix · GitHub
Assigned to @edolstra
WIP: literate repl tests by lf- · Pull Request #10075 · NixOS/nix · GitHub
CLI stabilisation
Nix build
-
What should it build? ie what’s the function
Installable -> List DerivablePath- Same as all the other installable commands
-
nix build <stuff>^dev: has to be coerced to a (store) derivation, and build thedevo from it -
nix build <package>: (type = "derivation")- (“Package” is from Redefine outputs in terms of language-level "package", not necessarily store-level derivation (RFC-92, and multi-drv packages, docs) · Issue #6507 · NixOS/nix · GitHub)
- Respect
meta.outputsToInstall - TODO: Define behavior and attribute names required, eg: not drvPath, but outPath, outputs, etc.
- (See Redefine outputs in terms of language-level "package", not necessarily store-level derivation (RFC-92, and multi-drv packages, docs) · Issue #6507 · NixOS/nix · GitHub for “language attrset”)
-
nix build --expr [ path1 path2 ]: (e.g.nixpkgs#bind.all) -
nix build /nix/store/….drv: just realise the.drv. If they’re using drv paths, we assume that they know what they’re doing. (and can use “^*” if needed) -
nix build /nix/store/…: substitute the path. Use case: create a symlink. -
nix build expr.drvPath: like a raw drv path. They put.drvPathfor a reason. -
nix build <language string>: (e.g.nixpkgs#hello.outPath)- Realise the string context
- Restrict to single path? Yes.
- Print the string to stdout? Different command for that?
-
nix build <path-like attrset>: (havingoutPath, nottype = "derivation")- Coerce to path, and behave like
nix build <language string> - Use case:
hello.srcwheresrc = cleanSource ./.;
- Coerce to path, and behave like
-
nix build <path value>- “Realise” by adding to store
-
nix build <language attrset>: (nottype = "derivation")- Currently we fail
-
nix-buildwould build the attrValues, and respectrecurseForDerivations(inserted byrecurseIntoAttrs) - Maybe for
legacyPackagesonly?- tomberek: Footgun, building the world
- doesn’t solve the
testsattribute use case (e.g.passthru.tests)- Add another marker?
- Can’t rely on users to ^C and this runs the risk of failing with an unrelated build failure
- edolstra: A better progress indicator could solve that. It could list the attribute paths as it encounters them.
- Alternatives
- Separate CLI command
- List?
- A more intentional way to build multiple. We don’t have oversized lists in the wild.
- You lose the information to produce a meaningful symlink (except perhaps output names, although those are somewhat subject to change, given a language-based package output definition)
-
--applywill be helpful, but is a lot of typing and thinking for a quite common use case. nix eval <attrset> | nix build --stdinnix-eval-jobs <attrset> | jq | nix build --stdin
- Decision: Keep the conservative statu-quo for now and fail
-
nix build <language list>:-
nix buildeach item - Will be useful particularly with
--apply - Another use case:
pkg.buildInputs - If some elements aren’t valid installables, fail
-
-
nix build <other language value>: fail (e.g. bools, null)
-
User interface
-
--dry-run- Currently using the same interface as the old-style
-
--jsonis broken. Need to be fixed
-
--json. What should it print?
Currently a list of installable serialisation- Proposal: split by installable and preserve structure. Example:
nix build pkg1 path2{ "paths": [ ... ], "installables": [ { "installable": "pkg1", "type": "package", "paths": [ ... ], "outputs": { "out": ... } }, { "installable": "path2", "type": "path", "paths": [ ... ] } ] }
- Proposal: split by installable and preserve structure. Example:
- strive for similar output structure for “dry-run and json”
- If dry-run, each path (
...above) is a JSON DerivablePath. Otherwise it’s just a store path string. - It should be possible to resume the build from
--dry-run(ignoring .drv gc roots perhaps) - tomberek: very similar to profile manifest. We could unify this.
- roberth: Maybe add one or two fields (such as “type”)
- tomberek: Also information that’s known after realisation, such as size, build duration
- roberth: like sql-joining
path-info
-
-
TBD Make symlinks more useful?
- Idea build a more predictable symlink name e.g.
result-<installable index>-<output name> - Proposal:
- base is
result(or the value of--out-link) - If multiple installables on the CLI, append
-{index} - If list, append
-{index} - If
.drvwith multiple outputs, append-{outputName} - If a package with multiple “outputs”, append
-{outputAttrName}
- base is
- Proposal: make the transition to multi outputs transparent
- Example
nix build bind-
result: profile containing the bind package (buildEnv) -
result-out: the out output of thebindpackage -
result-dev: the dev output of thebindpackage
-
- Only apply to packages (and derivations), not to multiple installables or lists
- Example
- TODO: Open an issue about a
--buildenvflag
- Idea build a more predictable symlink name e.g.