Compare commits
5
Commits
main
..
release-2.90
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4bbdb2f556 | ||
|
|
5bf891b15a | ||
|
|
f72153a510 | ||
|
|
8da08ab551 | ||
|
|
98d0249d5c |
@@ -1,14 +0,0 @@
|
|||||||
[target.'cfg(true)']
|
|
||||||
rustflags = [
|
|
||||||
# rustc will pass `-nodefaultlibs` without this, but we need the C++ standard library.
|
|
||||||
'-Cdefault-linker-libraries=yes',
|
|
||||||
]
|
|
||||||
|
|
||||||
[target.'cfg(target_env = "musl")']
|
|
||||||
rustflags = [
|
|
||||||
'-Cdefault-linker-libraries=yes',
|
|
||||||
# musl, at least in Nixpkgs, is not compiled with -fPIE.
|
|
||||||
# XXX: nevermind? as of Nixpkgs 26.05??
|
|
||||||
# Oh gods do we need to gate this??
|
|
||||||
#'-Crelocation-model=static',
|
|
||||||
]
|
|
||||||
+3
-4
@@ -4,10 +4,9 @@ AccessModifierOffset: -4
|
|||||||
AlignAfterOpenBracket: BlockIndent
|
AlignAfterOpenBracket: BlockIndent
|
||||||
AlignEscapedNewlines: Left
|
AlignEscapedNewlines: Left
|
||||||
AlignOperands: DontAlign
|
AlignOperands: DontAlign
|
||||||
AlignTrailingComments: false
|
AllowShortBlocksOnASingleLine: Always
|
||||||
AllowShortBlocksOnASingleLine: Empty
|
|
||||||
AllowShortFunctionsOnASingleLine: Empty
|
AllowShortFunctionsOnASingleLine: Empty
|
||||||
AllowShortIfStatementsOnASingleLine: Never
|
AllowShortIfStatementsOnASingleLine: WithoutElse
|
||||||
AlwaysBreakBeforeMultilineStrings: true
|
AlwaysBreakBeforeMultilineStrings: true
|
||||||
AlwaysBreakTemplateDeclarations: Yes
|
AlwaysBreakTemplateDeclarations: Yes
|
||||||
BinPackArguments: false
|
BinPackArguments: false
|
||||||
@@ -36,7 +35,7 @@ BreakAfterAttributes: Always
|
|||||||
BreakBeforeBinaryOperators: NonAssignment
|
BreakBeforeBinaryOperators: NonAssignment
|
||||||
BreakBeforeBraces: Custom
|
BreakBeforeBraces: Custom
|
||||||
BreakConstructorInitializers: BeforeComma
|
BreakConstructorInitializers: BeforeComma
|
||||||
ColumnLimit: 110
|
ColumnLimit: 100
|
||||||
EmptyLineAfterAccessModifier: Leave
|
EmptyLineAfterAccessModifier: Leave
|
||||||
EmptyLineBeforeAccessModifier: Leave
|
EmptyLineBeforeAccessModifier: Leave
|
||||||
FixNamespaceComments: false
|
FixNamespaceComments: false
|
||||||
|
|||||||
+2
-21
@@ -8,30 +8,11 @@ Checks:
|
|||||||
- -bugprone-narrowing-conversions
|
- -bugprone-narrowing-conversions
|
||||||
# kind of nonsense
|
# kind of nonsense
|
||||||
- -bugprone-easily-swappable-parameters
|
- -bugprone-easily-swappable-parameters
|
||||||
|
# too many warnings for now
|
||||||
|
- -bugprone-implicit-widening-of-multiplication-result
|
||||||
# Lix's exception handling is Questionable
|
# Lix's exception handling is Questionable
|
||||||
- -bugprone-empty-catch
|
- -bugprone-empty-catch
|
||||||
# many warnings
|
# many warnings
|
||||||
- -bugprone-unchecked-optional-access
|
- -bugprone-unchecked-optional-access
|
||||||
# many warnings, seems like a questionable lint
|
# many warnings, seems like a questionable lint
|
||||||
- -bugprone-branch-clone
|
- -bugprone-branch-clone
|
||||||
# we don't compile out our asserts
|
|
||||||
- -bugprone-assert-side-effect
|
|
||||||
# FIXME(jade): figure out if this warning is any good
|
|
||||||
- -bugprone-exception-escape
|
|
||||||
# all thrown exceptions must derive from std::exception
|
|
||||||
- hicpp-exception-baseclass
|
|
||||||
# capturing async lambdas are dangerous
|
|
||||||
- cppcoreguidelines-avoid-capturing-lambda-coroutines
|
|
||||||
# crimes must be appropriately declared as crimes
|
|
||||||
- cppcoreguidelines-pro-type-cstyle-cast
|
|
||||||
- lix-*
|
|
||||||
# This lint is included as an example, but the lib function it replaces is
|
|
||||||
# already gone.
|
|
||||||
- -lix-hasprefixsuffix
|
|
||||||
|
|
||||||
|
|
||||||
CheckOptions:
|
|
||||||
bugprone-reserved-identifier.AllowedIdentifiers: '__asan_default_options'
|
|
||||||
bugprone-unused-return-value.AllowCastToVoid: true
|
|
||||||
|
|
||||||
ExtraArgs: ["-Werror=unnecessary-virtual-specifier"]
|
|
||||||
|
|||||||
@@ -29,11 +29,3 @@ trim_trailing_whitespace = false
|
|||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
max_line_length = 0
|
max_line_length = 0
|
||||||
|
|
||||||
[meson.build]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
|
|
||||||
[*.json]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 4
|
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
# shellcheck shell=bash
|
# shellcheck shell=bash
|
||||||
source_env_if_exists .envrc.local
|
source_env_if_exists .envrc.local
|
||||||
# Use native-clangStdenvPackages to get clangd by default.
|
# TODO: `use flake .#native-clangStdenvPackages` on macOS?
|
||||||
use flake ".#${LIX_SHELL_VARIANT:-native-clangStdenvPackages}" "${LIX_SHELL_EXTRA_ARGS[@]}"
|
use flake ".#${LIX_SHELL_VARIANT:-default}" "${LIX_SHELL_EXTRA_ARGS[@]}"
|
||||||
|
export MAKEFLAGS="$MAKEFLAGS -e"
|
||||||
|
if [[ -n "$NIX_BUILD_CORES" ]]; then
|
||||||
|
export MAKEFLAGS="$MAKEFLAGS -j $NIX_BUILD_CORES"
|
||||||
|
fi
|
||||||
export GTEST_BRIEF=1
|
export GTEST_BRIEF=1
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: Missing or incorrect documentation
|
name: Missing or incorrect documentation
|
||||||
about: Help us improve the reference manual
|
about: Help us improve the reference manual
|
||||||
title: ''
|
title: ''
|
||||||
labels: docs
|
labels: documentation
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -19,10 +19,10 @@ assignees: ''
|
|||||||
|
|
||||||
<!-- make sure this issue is not redundant or obsolete -->
|
<!-- make sure this issue is not redundant or obsolete -->
|
||||||
|
|
||||||
- [ ] checked [latest Lix manual] or its [source code]
|
- [ ] checked [latest Lix manual] \([source]\)
|
||||||
- [ ] checked [documentation issues] and [recent documentation changes] for possible duplicates
|
- [ ] checked [documentation issues] and [recent documentation changes] for possible duplicates
|
||||||
|
|
||||||
[latest Lix manual]: https://docs.lix.systems/manual/lix/nightly
|
[latest Nix manual]: https://docs.lix.systems/manual/lix/nightly
|
||||||
[source code]: https://git.lix.systems/lix-project/lix/src/main/doc/manual/src
|
[source]: https://git.lix.systems/lix-project/lix/src/main/doc/manual/src
|
||||||
[documentation issues]: https://git.lix.systems/lix-project/lix/issues?labels=151&state=all
|
[documentation issues]: https://git.lix.systems/lix-project/lix/issues?labels=151&state=all
|
||||||
[recent documentation changes]: https://gerrit.lix.systems/q/p:lix+path:%22%5Edoc/manual/.*%22
|
[recent documentation changes]: https://gerrit.lix.systems/q/p:lix+path:%22%5Edoc/manual/.*%22
|
||||||
|
|||||||
+1
-17
@@ -1,5 +1,4 @@
|
|||||||
/build
|
outputs/
|
||||||
/outputs
|
|
||||||
|
|
||||||
# GNU Global
|
# GNU Global
|
||||||
GPATH
|
GPATH
|
||||||
@@ -10,10 +9,6 @@ GTAGS
|
|||||||
# ccls
|
# ccls
|
||||||
/.ccls-cache
|
/.ccls-cache
|
||||||
|
|
||||||
# auto-generated compilation database
|
|
||||||
compile_commands.json
|
|
||||||
rust-project.json
|
|
||||||
|
|
||||||
result
|
result
|
||||||
result-*
|
result-*
|
||||||
|
|
||||||
@@ -34,14 +29,3 @@ buildtime.bin
|
|||||||
/.pre-commit-config.yaml
|
/.pre-commit-config.yaml
|
||||||
/.nocontribmsg
|
/.nocontribmsg
|
||||||
/release
|
/release
|
||||||
|
|
||||||
# Rust build files when using Cargo (not actually supported for building but it spews the files anyway)
|
|
||||||
/target/
|
|
||||||
|
|
||||||
# Python compiled files from the code generators and test suite
|
|
||||||
*.pyc
|
|
||||||
|
|
||||||
**/.idea
|
|
||||||
|
|
||||||
# Yeah, I've got no clue.
|
|
||||||
/subprojects/.wraplock
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
Fiona Behrens <me@kloenk.dev>
|
|
||||||
Fiona Behrens <me@kloenk.dev> <me@kloenk.de>
|
|
||||||
rootile <lix@rootile.de>
|
|
||||||
rootile <lix@rootile.de> <commentator2.0@crystal-cavern.systems>
|
|
||||||
rootile <lix@rootile.de> <lix@crystal-cavern.systems>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
This is a file used by the dev shell shellHook in package.nix to check that this is actually a Lix repo before installing git hooks. Its contents have no meaning.
|
|
||||||
Generated
-957
@@ -1,957 +0,0 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
version = 4
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "aho-corasick"
|
|
||||||
version = "1.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
|
|
||||||
dependencies = [
|
|
||||||
"memchr",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "allocator-api2"
|
|
||||||
version = "0.2.21"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstream"
|
|
||||||
version = "1.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
|
|
||||||
dependencies = [
|
|
||||||
"anstyle",
|
|
||||||
"anstyle-parse",
|
|
||||||
"anstyle-query",
|
|
||||||
"anstyle-wincon",
|
|
||||||
"colorchoice",
|
|
||||||
"is_terminal_polyfill",
|
|
||||||
"utf8parse",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle"
|
|
||||||
version = "1.0.14"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-parse"
|
|
||||||
version = "1.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
|
|
||||||
dependencies = [
|
|
||||||
"utf8parse",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-query"
|
|
||||||
version = "1.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
|
|
||||||
dependencies = [
|
|
||||||
"windows-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-wincon"
|
|
||||||
version = "3.0.11"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
|
|
||||||
dependencies = [
|
|
||||||
"anstyle",
|
|
||||||
"once_cell_polyfill",
|
|
||||||
"windows-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ar_archive_writer"
|
|
||||||
version = "0.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4087686b4b0a3427190bae57a1d9a478dbb2d40c5dc1bd6e2b6d797913bdd348"
|
|
||||||
dependencies = [
|
|
||||||
"object",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ariadne"
|
|
||||||
version = "0.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "72fe02fc62033df9ba41cba57ee19acf5e742511a140c7dbc3a873e19a19a1bd"
|
|
||||||
dependencies = [
|
|
||||||
"unicode-width 0.1.14",
|
|
||||||
"yansi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama"
|
|
||||||
version = "0.12.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28"
|
|
||||||
dependencies = [
|
|
||||||
"askama_derive",
|
|
||||||
"askama_escape",
|
|
||||||
"humansize",
|
|
||||||
"num-traits",
|
|
||||||
"percent-encoding",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama_derive"
|
|
||||||
version = "0.12.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83"
|
|
||||||
dependencies = [
|
|
||||||
"askama_parser",
|
|
||||||
"basic-toml",
|
|
||||||
"mime",
|
|
||||||
"mime_guess",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"serde",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama_escape"
|
|
||||||
version = "0.10.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "askama_parser"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0"
|
|
||||||
dependencies = [
|
|
||||||
"nom",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "autocfg"
|
|
||||||
version = "1.5.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "basic-toml"
|
|
||||||
version = "0.1.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a"
|
|
||||||
dependencies = [
|
|
||||||
"serde",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bitflags"
|
|
||||||
version = "2.13.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "block-buffer"
|
|
||||||
version = "0.10.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
|
|
||||||
dependencies = [
|
|
||||||
"generic-array",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cc"
|
|
||||||
version = "1.2.65"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"
|
|
||||||
dependencies = [
|
|
||||||
"find-msvc-tools",
|
|
||||||
"shlex",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cfg-if"
|
|
||||||
version = "1.0.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cfg_aliases"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "chumsky"
|
|
||||||
version = "1.0.0-alpha.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0e82d74e6c83060ec269fe9e0d408d6de4a1645d525f9a0bbbb841ba4efd91ac"
|
|
||||||
dependencies = [
|
|
||||||
"hashbrown 0.15.5",
|
|
||||||
"regex-automata 0.3.9",
|
|
||||||
"serde",
|
|
||||||
"stacker",
|
|
||||||
"unicode-ident",
|
|
||||||
"unicode-segmentation",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clap"
|
|
||||||
version = "4.6.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
|
|
||||||
dependencies = [
|
|
||||||
"clap_builder",
|
|
||||||
"clap_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clap_builder"
|
|
||||||
version = "4.6.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
|
|
||||||
dependencies = [
|
|
||||||
"anstream",
|
|
||||||
"anstyle",
|
|
||||||
"clap_lex",
|
|
||||||
"strsim",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clap_derive"
|
|
||||||
version = "4.6.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
|
|
||||||
dependencies = [
|
|
||||||
"heck",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clap_lex"
|
|
||||||
version = "1.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clipboard-win"
|
|
||||||
version = "5.4.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4"
|
|
||||||
dependencies = [
|
|
||||||
"error-code",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "colorchoice"
|
|
||||||
version = "1.0.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "countme"
|
|
||||||
version = "3.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cpufeatures"
|
|
||||||
version = "0.2.17"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crypto-common"
|
|
||||||
version = "0.1.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
|
|
||||||
dependencies = [
|
|
||||||
"generic-array",
|
|
||||||
"typenum",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "digest"
|
|
||||||
version = "0.10.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
|
||||||
dependencies = [
|
|
||||||
"block-buffer",
|
|
||||||
"crypto-common",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "dissimilar"
|
|
||||||
version = "1.0.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "59f8e79d1fbf76bdfbde321e902714bf6c49df88a7dda6fc682fc2979226962d"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "either"
|
|
||||||
version = "1.16.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "endian-type"
|
|
||||||
version = "0.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "869b0adbda23651a9c5c0c3d270aac9fcb52e8622a8f2b17e57802d7791962f2"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "equivalent"
|
|
||||||
version = "1.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "error-code"
|
|
||||||
version = "3.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "expect-test"
|
|
||||||
version = "1.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9e0be0a561335815e06dab7c62e50353134c796e7a6155402a64bcff66b6a5e0"
|
|
||||||
dependencies = [
|
|
||||||
"dissimilar",
|
|
||||||
"once_cell",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "find-msvc-tools"
|
|
||||||
version = "0.1.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "foldhash"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "generic-array"
|
|
||||||
version = "0.14.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
|
|
||||||
dependencies = [
|
|
||||||
"typenum",
|
|
||||||
"version_check",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hashbrown"
|
|
||||||
version = "0.14.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hashbrown"
|
|
||||||
version = "0.15.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
|
||||||
dependencies = [
|
|
||||||
"allocator-api2",
|
|
||||||
"equivalent",
|
|
||||||
"foldhash",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hashbrown"
|
|
||||||
version = "0.17.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "heck"
|
|
||||||
version = "0.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hex"
|
|
||||||
version = "0.4.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "home"
|
|
||||||
version = "0.5.12"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d"
|
|
||||||
dependencies = [
|
|
||||||
"windows-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "humansize"
|
|
||||||
version = "2.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
|
|
||||||
dependencies = [
|
|
||||||
"libm",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "indexmap"
|
|
||||||
version = "2.14.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
|
||||||
dependencies = [
|
|
||||||
"equivalent",
|
|
||||||
"hashbrown 0.17.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "is_terminal_polyfill"
|
|
||||||
version = "1.70.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "itertools"
|
|
||||||
version = "0.11.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
|
|
||||||
dependencies = [
|
|
||||||
"either",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libc"
|
|
||||||
version = "0.2.186"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libm"
|
|
||||||
version = "0.2.16"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "licxxbridge"
|
|
||||||
version = "0.0.0"
|
|
||||||
dependencies = [
|
|
||||||
"clap",
|
|
||||||
"zngur",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "lix"
|
|
||||||
version = "0.0.0"
|
|
||||||
dependencies = [
|
|
||||||
"lix-doc",
|
|
||||||
"pkg-config",
|
|
||||||
"regex",
|
|
||||||
"rootcause",
|
|
||||||
"rustyline",
|
|
||||||
"rustyline-derive",
|
|
||||||
"zngur",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "lix-doc"
|
|
||||||
version = "0.0.1"
|
|
||||||
dependencies = [
|
|
||||||
"expect-test",
|
|
||||||
"rnix",
|
|
||||||
"rowan",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "log"
|
|
||||||
version = "0.4.33"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memchr"
|
|
||||||
version = "2.8.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "mime"
|
|
||||||
version = "0.3.17"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "mime_guess"
|
|
||||||
version = "2.0.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
|
||||||
dependencies = [
|
|
||||||
"mime",
|
|
||||||
"unicase",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "minimal-lexical"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nibble_vec"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43"
|
|
||||||
dependencies = [
|
|
||||||
"smallvec",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nix"
|
|
||||||
version = "0.31.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
"cfg-if",
|
|
||||||
"cfg_aliases",
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nom"
|
|
||||||
version = "7.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
|
||||||
dependencies = [
|
|
||||||
"memchr",
|
|
||||||
"minimal-lexical",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-traits"
|
|
||||||
version = "0.2.19"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "object"
|
|
||||||
version = "0.37.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe"
|
|
||||||
dependencies = [
|
|
||||||
"memchr",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "once_cell"
|
|
||||||
version = "1.19.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "once_cell_polyfill"
|
|
||||||
version = "1.70.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "percent-encoding"
|
|
||||||
version = "2.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pkg-config"
|
|
||||||
version = "0.3.33"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "proc-macro2"
|
|
||||||
version = "1.0.106"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
|
||||||
dependencies = [
|
|
||||||
"unicode-ident",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "psm"
|
|
||||||
version = "0.1.31"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "645dbe486e346d9b5de3ef16ede18c26e6c70ad97418f4874b8b1889d6e761ea"
|
|
||||||
dependencies = [
|
|
||||||
"ar_archive_writer",
|
|
||||||
"cc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "quote"
|
|
||||||
version = "1.0.45"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "radix_trie"
|
|
||||||
version = "0.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3b4431027dcd37fc2a73ef740b5f233aa805897935b8bce0195e41bbf9a3289a"
|
|
||||||
dependencies = [
|
|
||||||
"endian-type",
|
|
||||||
"nibble_vec",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex"
|
|
||||||
version = "1.12.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
|
|
||||||
dependencies = [
|
|
||||||
"aho-corasick",
|
|
||||||
"memchr",
|
|
||||||
"regex-automata 0.4.14",
|
|
||||||
"regex-syntax 0.8.11",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex-automata"
|
|
||||||
version = "0.3.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9"
|
|
||||||
dependencies = [
|
|
||||||
"aho-corasick",
|
|
||||||
"memchr",
|
|
||||||
"regex-syntax 0.7.5",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex-automata"
|
|
||||||
version = "0.4.14"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
|
||||||
dependencies = [
|
|
||||||
"aho-corasick",
|
|
||||||
"memchr",
|
|
||||||
"regex-syntax 0.8.11",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex-syntax"
|
|
||||||
version = "0.7.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex-syntax"
|
|
||||||
version = "0.8.11"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rnix"
|
|
||||||
version = "0.12.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6f15e00b0ab43abd70d50b6f8cd021290028f9b7fdd7cdfa6c35997173bc1ba9"
|
|
||||||
dependencies = [
|
|
||||||
"rowan",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rootcause"
|
|
||||||
version = "0.13.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b660d9968fae12f4e691f2b2be5d9a3a6de875300c682e8d2cb89a618dd60875"
|
|
||||||
dependencies = [
|
|
||||||
"hashbrown 0.17.1",
|
|
||||||
"indexmap",
|
|
||||||
"rootcause-internals",
|
|
||||||
"rustc-hash 2.1.3",
|
|
||||||
"triomphe",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rootcause-internals"
|
|
||||||
version = "0.13.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0184f6fcff3b58b7c963aee6e3cc915c04331aa6eef974f79d7d44d21e246c24"
|
|
||||||
dependencies = [
|
|
||||||
"triomphe",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rowan"
|
|
||||||
version = "0.15.16"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0a542b0253fa46e632d27a1dc5cf7b930de4df8659dc6e720b647fc72147ae3d"
|
|
||||||
dependencies = [
|
|
||||||
"countme",
|
|
||||||
"hashbrown 0.14.5",
|
|
||||||
"rustc-hash 1.1.0",
|
|
||||||
"text-size",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc-hash"
|
|
||||||
version = "1.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc-hash"
|
|
||||||
version = "2.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustyline"
|
|
||||||
version = "18.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "53f6a737db68eb1a8ccff86b584b2fc13eca6a7bb6f78ebc7c529547e3ab9684"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
"cfg-if",
|
|
||||||
"clipboard-win",
|
|
||||||
"home",
|
|
||||||
"libc",
|
|
||||||
"log",
|
|
||||||
"memchr",
|
|
||||||
"nix",
|
|
||||||
"radix_trie",
|
|
||||||
"unicode-segmentation",
|
|
||||||
"unicode-width 0.2.2",
|
|
||||||
"utf8parse",
|
|
||||||
"windows-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustyline-derive"
|
|
||||||
version = "0.12.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "64e5587417a3c4e16a4415e8d7d07f80998ed835ade621d19dfbe9fbe3205b0f"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde"
|
|
||||||
version = "1.0.228"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
|
|
||||||
dependencies = [
|
|
||||||
"serde_core",
|
|
||||||
"serde_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde_core"
|
|
||||||
version = "1.0.228"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
|
|
||||||
dependencies = [
|
|
||||||
"serde_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde_derive"
|
|
||||||
version = "1.0.228"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sha2"
|
|
||||||
version = "0.10.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"cpufeatures",
|
|
||||||
"digest",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "shlex"
|
|
||||||
version = "2.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "smallvec"
|
|
||||||
version = "1.15.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "stacker"
|
|
||||||
version = "0.1.24"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "640c8cdd92b6b12f5bcb1803ca3bbf5ab96e5e6b6b96b9ab77dabe9e880b3190"
|
|
||||||
dependencies = [
|
|
||||||
"cc",
|
|
||||||
"cfg-if",
|
|
||||||
"libc",
|
|
||||||
"psm",
|
|
||||||
"windows-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "strsim"
|
|
||||||
version = "0.11.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "syn"
|
|
||||||
version = "2.0.118"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"unicode-ident",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "text-size"
|
|
||||||
version = "1.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "triomphe"
|
|
||||||
version = "0.1.16"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "typenum"
|
|
||||||
version = "1.20.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicase"
|
|
||||||
version = "2.9.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-ident"
|
|
||||||
version = "1.0.24"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-segmentation"
|
|
||||||
version = "1.13.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-width"
|
|
||||||
version = "0.1.14"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-width"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "utf8parse"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "version_check"
|
|
||||||
version = "0.9.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-link"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-sys"
|
|
||||||
version = "0.61.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
|
|
||||||
dependencies = [
|
|
||||||
"windows-link",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "yansi"
|
|
||||||
version = "0.5.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "zngur"
|
|
||||||
version = "0.10.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7fc912d12934b4d04aabc52c14db6fc88ae8aa5a47902f27e8759c2de254723f"
|
|
||||||
dependencies = [
|
|
||||||
"zngur-generator",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "zngur-def"
|
|
||||||
version = "0.10.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8f27e49a62db537cea43a6c122ded7eda99c4ac0ca1d7cfd74f2bf6a6c88712d"
|
|
||||||
dependencies = [
|
|
||||||
"indexmap",
|
|
||||||
"itertools",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "zngur-generator"
|
|
||||||
version = "0.10.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5ffad8c6994c477023aba7613bdf17c470003bbd191846d3096e84ffecf86d4c"
|
|
||||||
dependencies = [
|
|
||||||
"askama",
|
|
||||||
"hex",
|
|
||||||
"indexmap",
|
|
||||||
"itertools",
|
|
||||||
"sha2",
|
|
||||||
"zngur-def",
|
|
||||||
"zngur-parser",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "zngur-parser"
|
|
||||||
version = "0.10.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8d66c1b85ca6eab9576df5de31758cb1f9046b4ce47b25f45dabcb0fc7ef8789"
|
|
||||||
dependencies = [
|
|
||||||
"ariadne",
|
|
||||||
"chumsky",
|
|
||||||
"itertools",
|
|
||||||
"zngur-def",
|
|
||||||
]
|
|
||||||
-28
@@ -1,28 +0,0 @@
|
|||||||
[workspace]
|
|
||||||
resolver = "2"
|
|
||||||
members = [
|
|
||||||
"lix/lix-doc",
|
|
||||||
"lix/lix-rs",
|
|
||||||
"tools/licxxbridge",
|
|
||||||
]
|
|
||||||
|
|
||||||
[workspace.package]
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
[workspace.dependencies]
|
|
||||||
clap = "4"
|
|
||||||
regex = "1.12.4"
|
|
||||||
rootcause = "0.13.0"
|
|
||||||
rustyline = "18"
|
|
||||||
rustyline-derive = "0.12"
|
|
||||||
syn = "2.0"
|
|
||||||
zngur = "0.10"
|
|
||||||
pkg-config = "0.3.33"
|
|
||||||
|
|
||||||
[profile.dev]
|
|
||||||
opt-level = 1
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
debug = "full"
|
|
||||||
debug-assertions = true
|
|
||||||
overflow-checks = true
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Docs
|
|
||||||
per-file README.md=*
|
|
||||||
per-file CONTRIBUTING.md=*
|
|
||||||
|
|
||||||
# DevX
|
|
||||||
per-file justfile=*
|
|
||||||
per-file .envrc=*
|
|
||||||
per-file .gitignore=*
|
|
||||||
per-file .github=*
|
|
||||||
per-file .mailmap=*
|
|
||||||
|
|
||||||
# Build
|
|
||||||
per-file meson.build=*
|
|
||||||
per-file meson.options=*
|
|
||||||
per-file flake.nix=*
|
|
||||||
per-file flake.lock=*
|
|
||||||
per-file *.nix=*
|
|
||||||
per-file Cargo.lock=*
|
|
||||||
per-file Cargo.toml=*
|
|
||||||
per-file version.json=*
|
|
||||||
|
|
||||||
# Code style
|
|
||||||
per-file .clang-tidy=*
|
|
||||||
per-file .clang-format=*
|
|
||||||
per-file .editorconfig=*
|
|
||||||
per-file treefmt.toml=*
|
|
||||||
@@ -17,16 +17,13 @@ For systems that **already have a Nix implementation installed**, such as NixOS
|
|||||||
|
|
||||||
## Building And Developing
|
## Building And Developing
|
||||||
|
|
||||||
See our [Hacking guide](https://git.lix.systems/lix-project/lix/src/branch/main/doc/manual/src/contributing/hacking.md) in our manual for instruction on how to set up a development environment and build Lix from source.
|
See our [Hacking guide](https://git.lix.systems/lix-project/lix/src/branch/main/doc/manual/src/contributing/hacking.md) in our manual for instruction on how to to set up a development environment and build Lix from source.
|
||||||
|
|
||||||
## Additional Resources
|
## Additional Resources
|
||||||
|
|
||||||
- The Lix reference manual:
|
|
||||||
- [Stable](https://docs.lix.systems/manual/lix/stable/)
|
|
||||||
- [Nightly](https://docs.lix.systems/manual/lix/nightly/) (NOTE: [not automatically updated, yet](https://git.lix.systems/lix-project/lix/issues/742))
|
|
||||||
- [Our wiki](https://wiki.lix.systems)
|
- [Our wiki](https://wiki.lix.systems)
|
||||||
- [Matrix - #space:lix.systems](https://matrix.to/#/#space:lix.systems)
|
- [Matrix - #space:lix.systems](https://matrix.to/#/#space:lix.systems)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Lix is released under [LGPL-2.1-or-later](./COPYING).
|
Lix is released under the [LGPL v2.1](./COPYING).
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
bench-*.json
|
bench-*.json
|
||||||
bench-*.md
|
bench-*.md
|
||||||
perf-*.json
|
|
||||||
nixpkgs
|
nixpkgs
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
*
|
|
||||||
-238
@@ -1,238 +0,0 @@
|
|||||||
#!/usr/bin/env nix-shell
|
|
||||||
#!nix-shell -i python3 -p python3 -p hyperfine -p "if stdenv.isLinux then linuxPackages.perf else null"
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import subprocess
|
|
||||||
import os
|
|
||||||
import json
|
|
||||||
import tempfile
|
|
||||||
import platform
|
|
||||||
import shlex
|
|
||||||
import textwrap
|
|
||||||
import dataclasses
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
flake_args = ["--extra-experimental-features", "nix-command flakes"]
|
|
||||||
cases = {
|
|
||||||
"search": lambda build: [
|
|
||||||
f"{build}/bin/nix",
|
|
||||||
*flake_args,
|
|
||||||
"search",
|
|
||||||
"--no-eval-cache",
|
|
||||||
f"path:{Path('./bench/nixpkgs/').readlink()}",
|
|
||||||
"hello",
|
|
||||||
],
|
|
||||||
"rebuild": lambda build: [
|
|
||||||
f"{build}/bin/nix",
|
|
||||||
*flake_args,
|
|
||||||
"eval",
|
|
||||||
"--raw",
|
|
||||||
"--impure",
|
|
||||||
"--expr",
|
|
||||||
textwrap.dedent("""
|
|
||||||
(import <nixpkgs/nixos> {
|
|
||||||
configuration = ./bench/nixpkgs/nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma6.nix;
|
|
||||||
}).config.system.build.toplevel
|
|
||||||
""").replace("\n", " "),
|
|
||||||
],
|
|
||||||
"rebuild_lh": lambda build: [
|
|
||||||
"GC_INITIAL_HEAP_SIZE=10g",
|
|
||||||
*cases['rebuild'](build),
|
|
||||||
],
|
|
||||||
"parse": lambda build: [
|
|
||||||
f"{build}/bin/nix",
|
|
||||||
*flake_args,
|
|
||||||
"eval",
|
|
||||||
"-f",
|
|
||||||
"bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
arg_parser = argparse.ArgumentParser()
|
|
||||||
# FIXME(jade, gilice): it is a reasonable use case to want to run a benchmark run
|
|
||||||
# on just one build. However, since we are using hyperfine in comparison
|
|
||||||
# mode, we would have to combine the JSON ourselves to support that, which
|
|
||||||
# would probably be better done by writing a benchmarking script in
|
|
||||||
# not-bash.
|
|
||||||
arg_parser.add_argument(
|
|
||||||
'builds',
|
|
||||||
nargs='+',
|
|
||||||
help="At least two build directories to compare, containing bin/nix",
|
|
||||||
)
|
|
||||||
arg_parser.add_argument(
|
|
||||||
'--cases',
|
|
||||||
type=str,
|
|
||||||
help="A comma-separated list of cases you want to run. Defaults to running all",
|
|
||||||
)
|
|
||||||
arg_parser.add_argument(
|
|
||||||
'--mode',
|
|
||||||
nargs='+',
|
|
||||||
choices=[ "walltime", "memory" ] + [ "icount" ] if platform.system() == 'Linux' else [], # perf doesn't run on Darwin
|
|
||||||
default=[ "walltime" ],
|
|
||||||
)
|
|
||||||
arg_parser.add_argument(
|
|
||||||
'--daemon',
|
|
||||||
action='store_true',
|
|
||||||
help='Run a temporary daemon for the benchmark instead of using a local store directly',
|
|
||||||
)
|
|
||||||
args = arg_parser.parse_args()
|
|
||||||
if len(args.builds) < 1:
|
|
||||||
raise ValueError("need at least one build directory to benchmark")
|
|
||||||
|
|
||||||
benchmarks: list[str] = []
|
|
||||||
if args.cases is None:
|
|
||||||
benchmarks = list(cases.keys())
|
|
||||||
else:
|
|
||||||
for case in args.cases.split(","):
|
|
||||||
if case not in cases:
|
|
||||||
raise ValueError(f"no such case: {case}")
|
|
||||||
benchmarks.append(case)
|
|
||||||
|
|
||||||
def make_full_command(build, case):
|
|
||||||
cmd = " ".join(map(shlex.quote, cases[case](build)))
|
|
||||||
if args.daemon:
|
|
||||||
return " ".join([
|
|
||||||
f"{build}/bin/nix --extra-experimental-features nix-command daemon &",
|
|
||||||
"trap 'kill %1' EXIT;",
|
|
||||||
f"NIX_REMOTE=daemon {cmd}",
|
|
||||||
])
|
|
||||||
else:
|
|
||||||
return cmd
|
|
||||||
|
|
||||||
def bench_walltime(env):
|
|
||||||
for case in benchmarks:
|
|
||||||
for build in args.builds:
|
|
||||||
subprocess.run([
|
|
||||||
"taskset", "-c", "2,3",
|
|
||||||
"chrt", "-f","50",
|
|
||||||
*[
|
|
||||||
"hyperfine", "--warmup", "2", "--runs", "10",
|
|
||||||
"--export-json", f"bench/bench-{case}-{build}.json",
|
|
||||||
"--export-markdown", f"bench/bench-{case}-{build}.md",
|
|
||||||
"--", make_full_command(build, case),
|
|
||||||
],
|
|
||||||
], env=env, check=True)
|
|
||||||
|
|
||||||
print("Benchmarks summary\n---\n")
|
|
||||||
for case in benchmarks:
|
|
||||||
results = []
|
|
||||||
for build in args.builds:
|
|
||||||
with open(f"bench/bench-{case}-{build}.json") as fd:
|
|
||||||
results.append(json.load(fd)["results"][0])
|
|
||||||
for result in results:
|
|
||||||
print(result["command"])
|
|
||||||
print("-" * min(80,len(result["command"])))
|
|
||||||
def attr_rounded(attr):
|
|
||||||
return f"{result[attr]:.3f}"
|
|
||||||
print(" mean: ", attr_rounded("mean"), "±", attr_rounded("stddev"))
|
|
||||||
print(" user:", attr_rounded("user"), "| system", attr_rounded("system"))
|
|
||||||
print(" median: ", attr_rounded("median"))
|
|
||||||
print(" range: ", attr_rounded("min") + "s.." + attr_rounded("max")+"s")
|
|
||||||
print(" relative:", f"{result["mean"]/results[0]["mean"]:.3f}")
|
|
||||||
print("\n")
|
|
||||||
|
|
||||||
|
|
||||||
def bench_icount(env):
|
|
||||||
perf_results_for: dict[str, list[tuple[str, float]]] = {}
|
|
||||||
for case in benchmarks:
|
|
||||||
for build in args.builds:
|
|
||||||
# the perf stat -j output (incorrectly) localizes numbers, which will trip up the json parser.
|
|
||||||
env["LC_ALL"]="C"
|
|
||||||
case_command = make_full_command(build, case)
|
|
||||||
commandline = [
|
|
||||||
"perf", "stat", "-o", f"bench/perf-{case}.json", "-j",
|
|
||||||
"sh", "-c", case_command,
|
|
||||||
]
|
|
||||||
print("running", case_command)
|
|
||||||
subprocess.run(commandline, env=env, check=True, stdout=subprocess.DEVNULL) # warmup run
|
|
||||||
subprocess.run(commandline, env=env, check=True, stdout=subprocess.DEVNULL)
|
|
||||||
perf_fd = open(f"bench/perf-{case}.json")
|
|
||||||
perf_data = [json.loads(x) for x in perf_fd.readlines()]
|
|
||||||
perf_fd.close()
|
|
||||||
|
|
||||||
instr = next(x for x in perf_data if x["event"] in ["instructions", "instructions:u"]) # an implementation of a find_first iterator
|
|
||||||
if case not in perf_results_for:
|
|
||||||
perf_results_for[case] = []
|
|
||||||
perf_results_for[case].append((case_command, float(instr["counter-value"])))
|
|
||||||
|
|
||||||
print("Benchmarks summary\n---\n")
|
|
||||||
for (case, entries) in perf_results_for.items():
|
|
||||||
for entry in entries:
|
|
||||||
cmd,instr = entry
|
|
||||||
print(cmd)
|
|
||||||
print("-" * min(80,len(cmd)))
|
|
||||||
print(" instructions: ", int(instr))
|
|
||||||
print(" relative instructions:", int(instr)/perf_results_for[case][0][1])
|
|
||||||
print("\n")
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
|
||||||
class MemoryStatistics:
|
|
||||||
envBytes: int
|
|
||||||
listBytes: int
|
|
||||||
setBytes: int
|
|
||||||
valueBytes: int
|
|
||||||
heapBytes: int
|
|
||||||
heapSize: int
|
|
||||||
|
|
||||||
def bench_memory(env):
|
|
||||||
path = "bench/bench-memory.json"
|
|
||||||
env = env | {
|
|
||||||
'NIX_SHOW_STATS': '1',
|
|
||||||
'NIX_SHOW_STATS_PATH': path,
|
|
||||||
}
|
|
||||||
results: dict[str, list[tuple[str, MemoryStatistics]]] = {}
|
|
||||||
for case in benchmarks:
|
|
||||||
for build in args.builds:
|
|
||||||
case_command = make_full_command(build, case)
|
|
||||||
commandline = [ "sh", "-c", case_command ]
|
|
||||||
print("running", case_command)
|
|
||||||
subprocess.run(commandline, env=env, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
||||||
with open(path) as fd:
|
|
||||||
stats = json.load(fd)
|
|
||||||
results.setdefault(case, []).append((case_command, MemoryStatistics(
|
|
||||||
envBytes=stats['envs']['bytes'],
|
|
||||||
listBytes=stats['list']['bytes'],
|
|
||||||
setBytes=stats['sets']['bytes'],
|
|
||||||
valueBytes=stats['values']['bytes'],
|
|
||||||
heapSize=stats['gc']['heapSize'],
|
|
||||||
heapBytes=stats['gc']['totalBytes'],
|
|
||||||
)))
|
|
||||||
|
|
||||||
print("Benchmarks summary\n---\n")
|
|
||||||
for (case, entries) in results.items():
|
|
||||||
for cmd, stats in entries:
|
|
||||||
print(cmd)
|
|
||||||
print("-" * min(80, len(cmd)))
|
|
||||||
print(f" env bytes: {stats.envBytes :15d} | {(stats.envBytes / entries[0][1].envBytes) :.3f}x")
|
|
||||||
print(f" list bytes: {stats.listBytes :15d} | {(stats.listBytes / entries[0][1].listBytes) :.3f}x")
|
|
||||||
print(f" set bytes: {stats.setBytes :15d} | {(stats.setBytes / entries[0][1].setBytes) :.3f}x")
|
|
||||||
if not entries[0][1].valueBytes:
|
|
||||||
print(f" value bytes: {0:15d}")
|
|
||||||
else:
|
|
||||||
print(f" value bytes: {stats.valueBytes:15d} | {(stats.valueBytes / entries[0][1].valueBytes):.3f}x")
|
|
||||||
print(f" heap alloc'd: {stats.heapBytes :15d} | {(stats.heapBytes / entries[0][1].heapBytes) :.3f}x")
|
|
||||||
print(f" heap size: {stats.heapSize :15d} | {(stats.heapSize / entries[0][1].heapSize) :.3f}x")
|
|
||||||
print("\n")
|
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
||||||
subprocess.run([
|
|
||||||
"nix", "build",
|
|
||||||
"--extra-experimental-features", "nix-command flakes",
|
|
||||||
"--impure", "--expr",'(builtins.getFlake "git+file:.").inputs.nixpkgs.outPath',
|
|
||||||
"-o","bench/nixpkgs"
|
|
||||||
], check=True)
|
|
||||||
subenv = os.environ.copy()
|
|
||||||
subenv["NIX_CONF_DIR"] = "/var/empty"
|
|
||||||
subenv["NIX_REMOTE"] = tmp_dir
|
|
||||||
subenv["NIX_PATH"] = ":".join([
|
|
||||||
"nixpkgs=bench/nixpkgs",
|
|
||||||
])
|
|
||||||
subenv["NIX_DAEMON_SOCKET_PATH"] = f"{tmp_dir}/daemon"
|
|
||||||
|
|
||||||
for mode in args.mode:
|
|
||||||
if mode == "walltime":
|
|
||||||
bench_walltime(subenv)
|
|
||||||
elif mode == "memory":
|
|
||||||
bench_memory(subenv)
|
|
||||||
else:
|
|
||||||
bench_icount(subenv)
|
|
||||||
Executable
+62
@@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
shopt -s inherit_errexit
|
||||||
|
|
||||||
|
scriptdir=$(cd "$(dirname -- "$0")" ; pwd -P)
|
||||||
|
cd "$scriptdir/.."
|
||||||
|
|
||||||
|
if [[ $# -lt 2 ]]; then
|
||||||
|
# FIXME(jade): it is a reasonable use case to want to run a benchmark run
|
||||||
|
# on just one build. However, since we are using hyperfine in comparison
|
||||||
|
# mode, we would have to combine the JSON ourselves to support that, which
|
||||||
|
# would probably be better done by writing a benchmarking script in
|
||||||
|
# not-bash.
|
||||||
|
echo "Fewer than two result dirs given, nothing to compare!" >&2
|
||||||
|
echo "Pass some directories (with names indicating which alternative they are) with bin/nix in them" >&2
|
||||||
|
echo "Usage: ./bench/bench.sh result-1 result-2 [result-3...]" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
_exit=""
|
||||||
|
trap "$_exit" EXIT
|
||||||
|
|
||||||
|
# XXX: yes this is very silly. flakes~!!
|
||||||
|
nix build --impure --expr '(builtins.getFlake "git+file:.").inputs.nixpkgs.outPath' -o bench/nixpkgs
|
||||||
|
|
||||||
|
export NIX_REMOTE="$(mktemp -d)"
|
||||||
|
_exit='rm -rfv "$NIX_REMOTE"; $_exit'
|
||||||
|
export NIX_PATH="nixpkgs=bench/nixpkgs:nixos-config=bench/configuration.nix"
|
||||||
|
|
||||||
|
builds=("$@")
|
||||||
|
|
||||||
|
flake_args="--extra-experimental-features 'nix-command flakes'"
|
||||||
|
|
||||||
|
hyperfineArgs=(
|
||||||
|
--parameter-list BUILD "$(IFS=,; echo "${builds[*]}")"
|
||||||
|
--warmup 2 --runs 10
|
||||||
|
)
|
||||||
|
|
||||||
|
declare -A cases
|
||||||
|
cases=(
|
||||||
|
[search]="{BUILD}/bin/nix $flake_args search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870 hello"
|
||||||
|
[rebuild]="{BUILD}/bin/nix $flake_args eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'"
|
||||||
|
[rebuild-lh]="GC_INITIAL_HEAP_SIZE=10g {BUILD}/bin/nix eval $flake_args --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'"
|
||||||
|
[parse]="{BUILD}/bin/nix $flake_args eval -f bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix"
|
||||||
|
)
|
||||||
|
|
||||||
|
benches=(
|
||||||
|
rebuild
|
||||||
|
rebuild-lh
|
||||||
|
search
|
||||||
|
parse
|
||||||
|
)
|
||||||
|
|
||||||
|
for k in "${benches[@]}"; do
|
||||||
|
taskset -c 2,3 \
|
||||||
|
chrt -f 50 \
|
||||||
|
hyperfine "${hyperfineArgs[@]}" --export-json="bench/bench-${k}.json" --export-markdown="bench/bench-${k}.md" "${cases[$k]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Benchmarks summary (from ./bench/summarize.jq bench/bench-*.json)"
|
||||||
|
bench/summarize.jq bench/*.json
|
||||||
@@ -0,0 +1,325 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
boot = {
|
||||||
|
initrd = {
|
||||||
|
availableKernelModules = [
|
||||||
|
"xhci_pci"
|
||||||
|
"ahci"
|
||||||
|
];
|
||||||
|
kernelModules = [ "dm-snapshot" ];
|
||||||
|
luks.devices = {
|
||||||
|
croot = {
|
||||||
|
device = "/dev/sdb";
|
||||||
|
allowDiscards = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kernelModules = [ "kvm-intel" ];
|
||||||
|
kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
|
||||||
|
loader = {
|
||||||
|
systemd-boot.enable = true;
|
||||||
|
efi.canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
enableRedistributableFirmware = true;
|
||||||
|
cpu.intel.updateMicrocode = true;
|
||||||
|
opengl.driSupport32Bit = true;
|
||||||
|
opengl.extraPackages = with pkgs; [
|
||||||
|
vaapiIntel
|
||||||
|
intel-media-driver
|
||||||
|
intel-compute-runtime
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/sda2";
|
||||||
|
fsType = "xfs";
|
||||||
|
options = [ "noatime" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"/boot" = {
|
||||||
|
device = "/dev/sda1";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
"/nas" = {
|
||||||
|
device = "nas:/";
|
||||||
|
fsType = "nfs4";
|
||||||
|
options = [
|
||||||
|
"ro"
|
||||||
|
"x-systemd.automount"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
swapDevices = [ { device = "/dev/swap"; } ];
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
useDHCP = false;
|
||||||
|
hostName = "host";
|
||||||
|
wireless = {
|
||||||
|
enable = true;
|
||||||
|
interfaces = [ "eth1" ];
|
||||||
|
};
|
||||||
|
interfaces = {
|
||||||
|
eth0.useDHCP = true;
|
||||||
|
eth1.useDHCP = true;
|
||||||
|
};
|
||||||
|
wg-quick.interfaces = {
|
||||||
|
wg0 = {
|
||||||
|
address = [ "2001:db8::1" ];
|
||||||
|
privateKeyFile = "/etc/secrets/wg0.key";
|
||||||
|
peers = [
|
||||||
|
{
|
||||||
|
publicKey = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
|
||||||
|
endpoint = "[2001:db8::2]:61021";
|
||||||
|
allowedIPs = [ "2001::db8:1::/64" ];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
firewall.allowedUDPPorts = [ 4567 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
i18n = {
|
||||||
|
defaultLocale = "en_US.UTF-8";
|
||||||
|
inputMethod.enabled = "ibus";
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
xserver = {
|
||||||
|
enable = true;
|
||||||
|
layout = "us";
|
||||||
|
xkbVariant = "altgr-intl";
|
||||||
|
xkbOptions = "ctrl:nocaps";
|
||||||
|
libinput.enable = true;
|
||||||
|
wacom.enable = true;
|
||||||
|
videoDrivers = [ "modesetting" ];
|
||||||
|
modules = [ pkgs.xf86_input_wacom ];
|
||||||
|
|
||||||
|
displayManager.sx.enable = true;
|
||||||
|
windowManager.i3.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
udev.extraHwdb = ''
|
||||||
|
# not like this mattered at all
|
||||||
|
# we're not running udev from here
|
||||||
|
'';
|
||||||
|
|
||||||
|
udev.extraRules = ''
|
||||||
|
# ACTION=="add", SUBSYSTEM=="input", ...
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
sound.enable = true;
|
||||||
|
hardware.pulseaudio = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.pulseaudioFull;
|
||||||
|
daemon.config = {
|
||||||
|
lock-memory = "yes";
|
||||||
|
realtime-scheduling = "yes";
|
||||||
|
rlimit-rtprio = "-1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
light.enable = true;
|
||||||
|
wireshark = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.wireshark-qt;
|
||||||
|
};
|
||||||
|
gnupg.agent = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
font-awesome
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-cjk
|
||||||
|
noto-fonts-emoji
|
||||||
|
noto-fonts-extra
|
||||||
|
dejavu_fonts
|
||||||
|
powerline-fonts
|
||||||
|
source-code-pro
|
||||||
|
cantarell-fonts
|
||||||
|
];
|
||||||
|
|
||||||
|
users = {
|
||||||
|
mutableUsers = false;
|
||||||
|
|
||||||
|
users = {
|
||||||
|
user = {
|
||||||
|
isNormalUser = true;
|
||||||
|
group = "user";
|
||||||
|
extraGroups = [
|
||||||
|
"wheel"
|
||||||
|
"video"
|
||||||
|
"audio"
|
||||||
|
"dialout"
|
||||||
|
"users"
|
||||||
|
"kvm"
|
||||||
|
"wireshark"
|
||||||
|
];
|
||||||
|
password = "unimportant";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
groups = {
|
||||||
|
user = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
security = {
|
||||||
|
pam.loginLimits = [
|
||||||
|
{
|
||||||
|
domain = "@audio";
|
||||||
|
item = "memlock";
|
||||||
|
type = "-";
|
||||||
|
value = "unlimited";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
domain = "@audio";
|
||||||
|
item = "rtprio";
|
||||||
|
type = "-";
|
||||||
|
value = "99";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
domain = "@audio";
|
||||||
|
item = "nofile";
|
||||||
|
type = "soft";
|
||||||
|
value = "99999";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
domain = "@audio";
|
||||||
|
item = "nofile";
|
||||||
|
type = "hard";
|
||||||
|
value = "99999";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
sudo.extraRules = [
|
||||||
|
{
|
||||||
|
users = [ "user" ];
|
||||||
|
commands = [
|
||||||
|
{
|
||||||
|
command = "${pkgs.linuxPackages.cpupower}/bin/cpupower";
|
||||||
|
options = [ "NOPASSWD" ];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
a2jmidid
|
||||||
|
age
|
||||||
|
ardour
|
||||||
|
bemenu
|
||||||
|
blender
|
||||||
|
breeze-icons
|
||||||
|
breeze-qt5
|
||||||
|
bubblewrap
|
||||||
|
calf
|
||||||
|
claws-mail
|
||||||
|
darktable
|
||||||
|
duperemove
|
||||||
|
emacs
|
||||||
|
feh
|
||||||
|
file
|
||||||
|
firefox
|
||||||
|
fluidsynth
|
||||||
|
gnome3.adwaita-icon-theme
|
||||||
|
gnuplot
|
||||||
|
graphviz
|
||||||
|
helm
|
||||||
|
i3status-rust
|
||||||
|
inkscape
|
||||||
|
jack2
|
||||||
|
jq
|
||||||
|
krita
|
||||||
|
ldns
|
||||||
|
libqalculate
|
||||||
|
libreoffice
|
||||||
|
man-pages
|
||||||
|
nheko
|
||||||
|
nix-diff
|
||||||
|
nix-index
|
||||||
|
nix-output-monitor
|
||||||
|
open-music-kontrollers.patchmatrix
|
||||||
|
pamixer
|
||||||
|
pavucontrol
|
||||||
|
pciutils
|
||||||
|
picom
|
||||||
|
pwgen
|
||||||
|
redshift
|
||||||
|
ripgrep
|
||||||
|
rlwrap
|
||||||
|
silver-searcher
|
||||||
|
soundfont-fluid
|
||||||
|
whois
|
||||||
|
wol
|
||||||
|
xclip
|
||||||
|
xdot
|
||||||
|
xdotool
|
||||||
|
xorg.xkbcomp
|
||||||
|
yt-dlp
|
||||||
|
zathura
|
||||||
|
borgbackup
|
||||||
|
linuxPackages.cpupower
|
||||||
|
mtr
|
||||||
|
kitty
|
||||||
|
xf86_input_wacom
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.pathsToLink = [ "/share/soundfonts" ];
|
||||||
|
|
||||||
|
systemd.user.services.run-python = {
|
||||||
|
after = [ "network-online.target" ];
|
||||||
|
script = ''
|
||||||
|
exec ${pkgs.python3}/bin/python
|
||||||
|
'';
|
||||||
|
serviceConfig = {
|
||||||
|
CapabilityBoundingSet = [ "" ];
|
||||||
|
KeyringMode = "private";
|
||||||
|
LockPersonality = true;
|
||||||
|
MemoryDenyWriteExecute = true;
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
PrivateDevices = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
PrivateUsers = true;
|
||||||
|
ProcSubset = "pid";
|
||||||
|
ProtectClock = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
ProtectHome = true;
|
||||||
|
ProtectHostname = true;
|
||||||
|
ProtectKernelLogs = true;
|
||||||
|
ProtectKernelModules = true;
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectProc = "invisible";
|
||||||
|
ProtectSystem = "strict";
|
||||||
|
RestrictAddressFamilies = "AF_INET AF_INET6";
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
RestrictSUIDSGID = true;
|
||||||
|
SystemCallArchitectures = "native";
|
||||||
|
SystemCallFilter = [
|
||||||
|
"@system-service"
|
||||||
|
"~ @resources @privileged"
|
||||||
|
];
|
||||||
|
UMask = "077";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "23.11";
|
||||||
|
}
|
||||||
Executable
+22
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env -S jq -Mrf
|
||||||
|
|
||||||
|
def round3:
|
||||||
|
. * 1000 | round | . / 1000
|
||||||
|
;
|
||||||
|
|
||||||
|
def stats($first):
|
||||||
|
[
|
||||||
|
" mean: \(.mean | round3)s ± \(.stddev | round3)s",
|
||||||
|
" user: \(.user | round3)s | system: \(.system | round3)s",
|
||||||
|
" median: \(.median | round3)s",
|
||||||
|
" range: \(.min | round3)s ... \(.max | round3)s",
|
||||||
|
" relative: \(.mean / $first.mean | round3)"
|
||||||
|
]
|
||||||
|
| join("\n")
|
||||||
|
;
|
||||||
|
|
||||||
|
def fmt($first):
|
||||||
|
"\(.command)\n" + (. | stats($first))
|
||||||
|
;
|
||||||
|
|
||||||
|
[.results | .[0] as $first | .[] | fmt($first)] | join("\n\n") | (. + "\n\n---\n")
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
diff --git a/pthread_stop_world.c b/pthread_stop_world.c
|
||||||
|
index 2b45489..0e6d8ef 100644
|
||||||
|
--- a/pthread_stop_world.c
|
||||||
|
+++ b/pthread_stop_world.c
|
||||||
|
@@ -776,6 +776,8 @@ STATIC void GC_restart_handler(int sig)
|
||||||
|
/* world is stopped. Should not fail if it isn't. */
|
||||||
|
GC_INNER void GC_push_all_stacks(void)
|
||||||
|
{
|
||||||
|
+ size_t stack_limit;
|
||||||
|
+ pthread_attr_t pattr;
|
||||||
|
GC_bool found_me = FALSE;
|
||||||
|
size_t nthreads = 0;
|
||||||
|
int i;
|
||||||
|
@@ -868,6 +870,40 @@ GC_INNER void GC_push_all_stacks(void)
|
||||||
|
hi = p->altstack + p->altstack_size;
|
||||||
|
# endif
|
||||||
|
/* FIXME: Need to scan the normal stack too, but how ? */
|
||||||
|
+ } else {
|
||||||
|
+ #ifdef HAVE_PTHREAD_ATTR_GET_NP
|
||||||
|
+ if (pthread_attr_init(&pattr) != 0) {
|
||||||
|
+ ABORT("GC_push_all_stacks: pthread_attr_init failed!");
|
||||||
|
+ }
|
||||||
|
+ if (pthread_attr_get_np(p->id, &pattr) != 0) {
|
||||||
|
+ ABORT("GC_push_all_stacks: pthread_attr_get_np failed!");
|
||||||
|
+ }
|
||||||
|
+ #else
|
||||||
|
+ if (pthread_getattr_np(p->id, &pattr)) {
|
||||||
|
+ ABORT("GC_push_all_stacks: pthread_getattr_np failed!");
|
||||||
|
+ }
|
||||||
|
+ #endif
|
||||||
|
+ if (pthread_attr_getstacksize(&pattr, &stack_limit)) {
|
||||||
|
+ ABORT("GC_push_all_stacks: pthread_attr_getstacksize failed!");
|
||||||
|
+ }
|
||||||
|
+ if (pthread_attr_destroy(&pattr)) {
|
||||||
|
+ ABORT("GC_push_all_stacks: pthread_attr_destroy failed!");
|
||||||
|
+ }
|
||||||
|
+ // When a thread goes into a coroutine, we lose its original sp until
|
||||||
|
+ // control flow returns to the thread.
|
||||||
|
+ // While in the coroutine, the sp points outside the thread stack,
|
||||||
|
+ // so we can detect this and push the entire thread stack instead,
|
||||||
|
+ // as an approximation.
|
||||||
|
+ // We assume that the coroutine has similarly added its entire stack.
|
||||||
|
+ // This could be made accurate by cooperating with the application
|
||||||
|
+ // via new functions and/or callbacks.
|
||||||
|
+ #ifndef STACK_GROWS_UP
|
||||||
|
+ if (lo >= hi || lo < hi - stack_limit) { // sp outside stack
|
||||||
|
+ lo = hi - stack_limit;
|
||||||
|
+ }
|
||||||
|
+ #else
|
||||||
|
+ #error "STACK_GROWS_UP not supported in boost_coroutine2 (as of june 2021), so we don't support it in Nix."
|
||||||
|
+ #endif
|
||||||
|
}
|
||||||
|
# ifdef STACKPTR_CORRECTOR_AVAILABLE
|
||||||
|
if (GC_sp_corrector != 0)
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
#include "FixIncludes.hh"
|
||||||
|
#include <clang-tidy/ClangTidyCheck.h>
|
||||||
|
#include <clang/Basic/Diagnostic.h>
|
||||||
|
#include <clang/Basic/SourceManager.h>
|
||||||
|
#include <clang/Lex/PPCallbacks.h>
|
||||||
|
#include <clang/Lex/Preprocessor.h>
|
||||||
|
#include <llvm/ADT/StringRef.h>
|
||||||
|
#include <llvm/Support/Debug.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace nix::clang_tidy {
|
||||||
|
|
||||||
|
using namespace clang;
|
||||||
|
using namespace clang::tidy;
|
||||||
|
|
||||||
|
class FixIncludesCallbacks : public PPCallbacks {
|
||||||
|
public:
|
||||||
|
ClangTidyCheck &Check;
|
||||||
|
Preprocessor &PP;
|
||||||
|
FixIncludesCallbacks(ClangTidyCheck &Check, Preprocessor &PP)
|
||||||
|
: Check(Check), PP(PP) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool Ignore = false;
|
||||||
|
virtual void LexedFileChanged(FileID FID, LexedFileChangeReason Reason,
|
||||||
|
SrcMgr::CharacteristicKind FileType,
|
||||||
|
FileID PrevFID, SourceLocation Loc) override;
|
||||||
|
|
||||||
|
virtual void InclusionDirective(SourceLocation HashLoc,
|
||||||
|
const Token &IncludeTok, StringRef FileName,
|
||||||
|
bool IsAngled, CharSourceRange FilenameRange,
|
||||||
|
OptionalFileEntryRef File,
|
||||||
|
StringRef SearchPath, StringRef RelativePath,
|
||||||
|
const Module *Imported,
|
||||||
|
SrcMgr::CharacteristicKind FileType) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
void FixIncludesCallbacks::LexedFileChanged(FileID, LexedFileChangeReason,
|
||||||
|
SrcMgr::CharacteristicKind FileType,
|
||||||
|
FileID, SourceLocation) {
|
||||||
|
Ignore = FileType != SrcMgr::C_User;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixIncludesCallbacks::InclusionDirective(
|
||||||
|
SourceLocation, const Token &, StringRef FileName, bool IsAngled,
|
||||||
|
CharSourceRange FilenameRange, OptionalFileEntryRef File, StringRef,
|
||||||
|
StringRef, const Module *, SrcMgr::CharacteristicKind) {
|
||||||
|
if (Ignore)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// FIXME: this is kinda evil, but this is a one-time fixup
|
||||||
|
const std::vector<std::string> SourceDirs = {"src/", "include/lix/"};
|
||||||
|
|
||||||
|
const auto Bracketize = [IsAngled](StringRef s) {
|
||||||
|
return IsAngled ? ("<" + s + ">").str() : ("\"" + s + "\"").str();
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const auto &SourceDir : SourceDirs) {
|
||||||
|
const bool IsAlreadyFixed = FileName.starts_with("lix/lib");
|
||||||
|
if (File && File->getNameAsRequested().contains(SourceDir) &&
|
||||||
|
!IsAlreadyFixed) {
|
||||||
|
StringRef Name = File->getNameAsRequested();
|
||||||
|
auto Idx = Name.find(SourceDir);
|
||||||
|
assert(Idx != std::string::npos);
|
||||||
|
std::string Suffix = Name.drop_front(Idx + SourceDir.length()).str();
|
||||||
|
|
||||||
|
if (!Suffix.starts_with("lib")) {
|
||||||
|
llvm::dbgs() << "ignored: " << Suffix << "\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Suffix = "lix/" + Suffix;
|
||||||
|
|
||||||
|
auto Diag = Check.diag(FilenameRange.getBegin(),
|
||||||
|
"include needs to specify the source subdir");
|
||||||
|
|
||||||
|
Diag << FilenameRange
|
||||||
|
<< FixItHint::CreateReplacement(FilenameRange, Bracketize(Suffix));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixIncludesCheck::registerPPCallbacks(const SourceManager &,
|
||||||
|
Preprocessor *PP, Preprocessor *) {
|
||||||
|
PP->addPPCallbacks(std::make_unique<FixIncludesCallbacks>(*this, *PP));
|
||||||
|
}
|
||||||
|
|
||||||
|
}; // namespace nix::clang_tidy
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
#include <clang-tidy/ClangTidyCheck.h>
|
||||||
|
#include <clang/ASTMatchers/ASTMatchFinder.h>
|
||||||
|
#include <llvm/ADT/StringRef.h>
|
||||||
|
|
||||||
|
namespace nix::clang_tidy {
|
||||||
|
|
||||||
|
using namespace clang;
|
||||||
|
using namespace clang::tidy;
|
||||||
|
|
||||||
|
class FixIncludesCheck : public ClangTidyCheck {
|
||||||
|
public:
|
||||||
|
FixIncludesCheck(StringRef Name, ClangTidyContext *Context)
|
||||||
|
: ClangTidyCheck(Name, Context) {}
|
||||||
|
|
||||||
|
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#include <clang-tidy/ClangTidyModule.h>
|
||||||
|
#include <clang-tidy/ClangTidyModuleRegistry.h>
|
||||||
|
#include "FixIncludes.hh"
|
||||||
|
#include "HasPrefixSuffix.hh"
|
||||||
|
|
||||||
|
namespace nix::clang_tidy {
|
||||||
|
using namespace clang;
|
||||||
|
using namespace clang::tidy;
|
||||||
|
|
||||||
|
class NixClangTidyChecks : public ClangTidyModule {
|
||||||
|
public:
|
||||||
|
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
|
||||||
|
CheckFactories.registerCheck<HasPrefixSuffixCheck>("lix-hasprefixsuffix");
|
||||||
|
CheckFactories.registerCheck<FixIncludesCheck>("lix-fixincludes");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static ClangTidyModuleRegistry::Add<NixClangTidyChecks> X("lix-module", "Adds lix specific checks");
|
||||||
|
};
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
# Clang tidy lints for Lix
|
||||||
|
|
||||||
|
This is a skeleton of a clang-tidy lints library for Lix.
|
||||||
|
|
||||||
|
Currently there is one check (which is already obsolete as it has served its
|
||||||
|
goal and is there as an example), `HasPrefixSuffixCheck`.
|
||||||
|
|
||||||
|
## Running fixes/checks
|
||||||
|
|
||||||
|
One file:
|
||||||
|
|
||||||
|
```
|
||||||
|
ninja -C build && clang-tidy --checks='-*,lix-*' --load=build/liblix-clang-tidy.so -p ../compile_commands.json -header-filter '\.\./src/.*\.h' --fix ../src/libcmd/installables.cc
|
||||||
|
```
|
||||||
|
|
||||||
|
Several files, in parallel:
|
||||||
|
|
||||||
|
```
|
||||||
|
ninja -C build && run-clang-tidy -checks='-*,lix-*' -load=build/liblix-clang-tidy.so -p .. -header-filter '\.\./src/.*\.h' -fix ../src | tee -a clang-tidy-result
|
||||||
|
```
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
* https://firefox-source-docs.mozilla.org/code-quality/static-analysis/writing-new/clang-query.html
|
||||||
|
* https://clang.llvm.org/docs/LibASTMatchersReference.html
|
||||||
|
* https://devblogs.microsoft.com/cppblog/exploring-clang-tooling-part-3-rewriting-code-with-clang-tidy/
|
||||||
|
|
||||||
|
## Developing new checks
|
||||||
|
|
||||||
|
Put something like so in `myquery.txt`:
|
||||||
|
|
||||||
|
```
|
||||||
|
set traversal IgnoreUnlessSpelledInSource
|
||||||
|
# ^ Ignore implicit AST nodes. May need to use AsIs depending on how you are
|
||||||
|
# working.
|
||||||
|
set bind-root true
|
||||||
|
# ^ true unless you use any .bind("foo") commands
|
||||||
|
set print-matcher true
|
||||||
|
enable output dump
|
||||||
|
match callExpr(callee(functionDecl(hasName("hasPrefix"))), optionally(hasArgument( 0, cxxConstructExpr(hasDeclaration(functionDecl(hasParameter(0, parmVarDecl(hasType(asString("const char *"))).bind("meow2"))))))))
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run, e.g. `clang-query --preload hasprefix.query -p compile_commands.json src/libcmd/installables.cc`.
|
||||||
|
|
||||||
|
With this you can iterate a query before writing it in C++ and suffering from
|
||||||
|
C++.
|
||||||
|
|
||||||
|
### Tips and tricks for the C++
|
||||||
|
|
||||||
|
There is a function `dump()` on many things that will dump to stderr. Also
|
||||||
|
`llvm::errs()` lets you print to stderr.
|
||||||
|
|
||||||
|
When I wrote `HasPrefixSuffixCheck`, I was not really able to figure out how
|
||||||
|
the structured replacement system was supposed to work. In principle you can
|
||||||
|
describe the replacement with a nice DSL. Look up the Stencil system in Clang
|
||||||
|
for details.
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
project('lix-clang-tidy', ['cpp', 'c'],
|
||||||
|
version : '0.1',
|
||||||
|
default_options : ['warning_level=3', 'cpp_std=c++20'])
|
||||||
|
|
||||||
|
llvm = dependency('Clang', version: '>= 14', modules: ['libclang'])
|
||||||
|
sources = files(
|
||||||
|
'HasPrefixSuffix.cc',
|
||||||
|
'LixClangTidyChecks.cc',
|
||||||
|
'FixIncludes.cc',
|
||||||
|
)
|
||||||
|
|
||||||
|
shared_module('lix-clang-tidy', sources,
|
||||||
|
dependencies: llvm)
|
||||||
@@ -1 +0,0 @@
|
|||||||
*
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
plugin_mtls_store = shared_module(
|
|
||||||
'plugin_mtls_store',
|
|
||||||
'plugin_mtls_store.cc',
|
|
||||||
# don't link liblix* into plugins (host process provides them at runtime).
|
|
||||||
# Explicitly link curl so it binds to Nix-store libcurl, not /usr/lib/libcurl.
|
|
||||||
dependencies : [
|
|
||||||
liblix.partial_dependency(includes : true, compile_args : true),
|
|
||||||
curl,
|
|
||||||
],
|
|
||||||
install : false,
|
|
||||||
build_by_default : true,
|
|
||||||
link_args : plugin_link_args,
|
|
||||||
)
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
R"(
|
|
||||||
|
|
||||||
**Store URL format**: `https+mtls://...`
|
|
||||||
|
|
||||||
This store allows a binary cache to be accessed via HTTPS with mutual TLS (client certificate authentication).
|
|
||||||
|
|
||||||
Both parameters are required:
|
|
||||||
|
|
||||||
- `tls-certificate`, a path to the TLS client certificate
|
|
||||||
- `tls-private-key`, a path to the TLS private key backing the client certificate
|
|
||||||
|
|
||||||
If you don't need mTLS, use `https://` instead.
|
|
||||||
|
|
||||||
)"
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
#include "lix/libstore/store-api.hh"
|
|
||||||
#include "lix/libutil/config.hh"
|
|
||||||
#include "lix/libstore/http-binary-cache-store.hh"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <curl/curl.h>
|
|
||||||
|
|
||||||
namespace nix {
|
|
||||||
struct mTLSBinaryCacheStoreConfig : HttpBinaryCacheStoreConfig
|
|
||||||
{
|
|
||||||
using HttpBinaryCacheStoreConfig::HttpBinaryCacheStoreConfig;
|
|
||||||
|
|
||||||
const std::string name() override
|
|
||||||
{
|
|
||||||
return "mTLS HTTP Binary Cache Store";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string doc() override
|
|
||||||
{
|
|
||||||
return
|
|
||||||
#include "mtls-http-binary-cache-store.md"
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
PathsSetting<nix::Path> tlsCertificate{
|
|
||||||
this,
|
|
||||||
"",
|
|
||||||
"tls-certificate",
|
|
||||||
"Path of the TLS client certificate in PEM format as expected by CURLOPT_SSLCERT"
|
|
||||||
};
|
|
||||||
|
|
||||||
PathsSetting<nix::Path> tlsKey{
|
|
||||||
this,
|
|
||||||
"",
|
|
||||||
"tls-private-key",
|
|
||||||
"Path of the TLS client certificate private key in PEM format as expected by CURLOPT_SSLKEY"
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mTLSBinaryCacheStoreImpl : public HttpBinaryCacheStore
|
|
||||||
{
|
|
||||||
struct Keyring
|
|
||||||
{
|
|
||||||
nix::Path tlsCertificate;
|
|
||||||
nix::Path tlsKey;
|
|
||||||
};
|
|
||||||
|
|
||||||
mTLSBinaryCacheStoreConfig config_;
|
|
||||||
std::shared_ptr<Keyring> keyring;
|
|
||||||
|
|
||||||
mTLSBinaryCacheStoreConfig & config() override
|
|
||||||
{
|
|
||||||
return config_;
|
|
||||||
}
|
|
||||||
const mTLSBinaryCacheStoreConfig & config() const override
|
|
||||||
{
|
|
||||||
return config_;
|
|
||||||
}
|
|
||||||
|
|
||||||
mTLSBinaryCacheStoreImpl(
|
|
||||||
const std::string & uriScheme, const Path & _cacheUri, mTLSBinaryCacheStoreConfig config
|
|
||||||
)
|
|
||||||
: Store(config)
|
|
||||||
, HttpBinaryCacheStore("https", _cacheUri, config)
|
|
||||||
, config_(std::move(config))
|
|
||||||
, keyring(std::make_shared<Keyring>(config_.tlsCertificate.get(), config_.tlsKey.get()))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
FileTransferOptions makeOptions(Headers && headers = {}) override
|
|
||||||
{
|
|
||||||
auto options = HttpBinaryCacheStore::makeOptions(std::move(headers));
|
|
||||||
auto baseExtraSetup = std::move(options.extraSetup);
|
|
||||||
auto keyring = this->keyring;
|
|
||||||
|
|
||||||
options.extraSetup = [keyring, baseExtraSetup{std::move(baseExtraSetup)}](CURL * req) {
|
|
||||||
if (baseExtraSetup) {
|
|
||||||
baseExtraSetup(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
const bool haveCert = !keyring->tlsCertificate.empty();
|
|
||||||
const bool haveKey = !keyring->tlsKey.empty();
|
|
||||||
if (!(haveCert && haveKey)) {
|
|
||||||
throw Error("https+mtls requires both tls-certificate and tls-private-key");
|
|
||||||
}
|
|
||||||
curl_easy_setopt(req, CURLOPT_SSLCERT, keyring->tlsCertificate.c_str());
|
|
||||||
curl_easy_setopt(req, CURLOPT_SSLKEY, keyring->tlsKey.c_str());
|
|
||||||
};
|
|
||||||
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::set<std::string> uriSchemes()
|
|
||||||
{
|
|
||||||
return {"https+mtls"};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void nix_plugin_entry()
|
|
||||||
{
|
|
||||||
nix::StoreImplementations::add<nix::mTLSBinaryCacheStoreImpl, nix::mTLSBinaryCacheStoreConfig>();
|
|
||||||
}
|
|
||||||
+9
-15
@@ -1,15 +1,9 @@
|
|||||||
let
|
(import (
|
||||||
lockFile = builtins.fromJSON (builtins.readFile ./flake.lock);
|
let
|
||||||
flake-compat-node = lockFile.nodes.${lockFile.nodes.root.inputs.flake-compat};
|
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
|
||||||
flake-compat = builtins.fetchTarball {
|
in
|
||||||
inherit (flake-compat-node.locked) url;
|
fetchTarball {
|
||||||
sha256 = flake-compat-node.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;
|
||||||
|
}
|
||||||
flake = (
|
) { src = ./.; }).defaultNix
|
||||||
import flake-compat {
|
|
||||||
src = ./.;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
in
|
|
||||||
flake.defaultNix
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
*
|
|
||||||
@@ -20,7 +20,7 @@ OUTPUT_DIRECTORY = @docdir@
|
|||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
# quick idea about the purpose of the project. Keep the description short.
|
# quick idea about the purpose of the project. Keep the description short.
|
||||||
|
|
||||||
PROJECT_BRIEF = "Lix: A modern, delicious implementation of the Nix package manager; unstable internal interfaces"
|
PROJECT_BRIEF = "Nix, the purely functional package manager; unstable internal interfaces"
|
||||||
|
|
||||||
# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
|
# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
|
||||||
# The default value is: YES.
|
# The default value is: YES.
|
||||||
@@ -33,7 +33,32 @@ GENERATE_LATEX = NO
|
|||||||
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
||||||
# Note: If this tag is empty the current directory is searched.
|
# Note: If this tag is empty the current directory is searched.
|
||||||
|
|
||||||
INPUT = @INPUT_PATHS@
|
# FIXME Make this list more maintainable somehow. We could maybe generate this
|
||||||
|
# in the Makefile, but we would need to change how `.in` files are preprocessed
|
||||||
|
# so they can expand variables despite configure variables.
|
||||||
|
|
||||||
|
INPUT = \
|
||||||
|
src/libcmd \
|
||||||
|
src/libexpr \
|
||||||
|
src/libexpr/flake \
|
||||||
|
tests/unit/libexpr \
|
||||||
|
tests/unit/libexpr/value \
|
||||||
|
tests/unit/libexpr/test \
|
||||||
|
tests/unit/libexpr/test/value \
|
||||||
|
src/libexpr/value \
|
||||||
|
src/libfetchers \
|
||||||
|
src/libmain \
|
||||||
|
src/libstore \
|
||||||
|
src/libstore/build \
|
||||||
|
src/libstore/builtins \
|
||||||
|
tests/unit/libstore \
|
||||||
|
tests/unit/libstore/test \
|
||||||
|
src/libutil \
|
||||||
|
tests/unit/libutil \
|
||||||
|
tests/unit/libutil/test \
|
||||||
|
src/nix \
|
||||||
|
src/nix-env \
|
||||||
|
src/nix-store
|
||||||
|
|
||||||
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
|
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
|
||||||
# in the source code. If set to NO, only conditional compilation will be
|
# in the source code. If set to NO, only conditional compilation will be
|
||||||
@@ -72,15 +97,3 @@ EXPAND_AS_DEFINED = \
|
|||||||
DECLARE_WORKER_SERIALISER \
|
DECLARE_WORKER_SERIALISER \
|
||||||
DECLARE_SERVE_SERIALISER \
|
DECLARE_SERVE_SERIALISER \
|
||||||
LENGTH_PREFIXED_PROTO_HELPER
|
LENGTH_PREFIXED_PROTO_HELPER
|
||||||
|
|
||||||
# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
|
|
||||||
# Stripping is only done if one of the specified strings matches the left-hand
|
|
||||||
# part of the path. The tag can be used to show relative paths in the file list.
|
|
||||||
# If left blank the directory from which doxygen is run is used as the path to
|
|
||||||
# strip.
|
|
||||||
#
|
|
||||||
# Note that you can specify absolute paths here, but also relative paths, which
|
|
||||||
# will be relative from the directory where doxygen is started.
|
|
||||||
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
|
|
||||||
|
|
||||||
STRIP_FROM_PATH = "@PROJECT_SOURCE_ROOT@"
|
|
||||||
|
|||||||
@@ -1,35 +1,3 @@
|
|||||||
internal_api_sources = [
|
|
||||||
'lix/libcmd',
|
|
||||||
'lix/libexpr',
|
|
||||||
'lix/libexpr/flake',
|
|
||||||
'tests/unit/libexpr',
|
|
||||||
'tests/unit/libexpr/value',
|
|
||||||
'tests/unit/libexpr/test',
|
|
||||||
'tests/unit/libexpr/test/value',
|
|
||||||
'lix/libexpr/value',
|
|
||||||
'lix/libfetchers',
|
|
||||||
'lix/libmain',
|
|
||||||
'lix/libstore',
|
|
||||||
'lix/libstore/build',
|
|
||||||
'lix/libstore/builtins',
|
|
||||||
'tests/unit/libstore',
|
|
||||||
'tests/unit/libstore/test',
|
|
||||||
'lix/libutil',
|
|
||||||
'tests/unit/libutil',
|
|
||||||
'tests/unit/libutil/test',
|
|
||||||
'lix/nix',
|
|
||||||
'lix/nix-env',
|
|
||||||
'lix/nix-store',
|
|
||||||
]
|
|
||||||
|
|
||||||
# We feed Doxygen absolute paths so it can be invoked from any working directory.
|
|
||||||
internal_api_sources_absolute = []
|
|
||||||
foreach src : internal_api_sources
|
|
||||||
internal_api_sources_absolute += '"' + (meson.project_source_root() / src) + '"'
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
internal_api_sources_oneline = ' \\\n '.join(internal_api_sources_absolute)
|
|
||||||
|
|
||||||
doxygen_cfg = configure_file(
|
doxygen_cfg = configure_file(
|
||||||
input : 'doxygen.cfg.in',
|
input : 'doxygen.cfg.in',
|
||||||
output : 'doxygen.cfg',
|
output : 'doxygen.cfg',
|
||||||
@@ -37,16 +5,22 @@ doxygen_cfg = configure_file(
|
|||||||
'PACKAGE_VERSION': meson.project_version(),
|
'PACKAGE_VERSION': meson.project_version(),
|
||||||
'RAPIDCHECK_HEADERS': rapidcheck_meson.get_variable('includedir'),
|
'RAPIDCHECK_HEADERS': rapidcheck_meson.get_variable('includedir'),
|
||||||
'docdir' : meson.current_build_dir(),
|
'docdir' : meson.current_build_dir(),
|
||||||
'INPUT_PATHS' : internal_api_sources_oneline,
|
|
||||||
'PROJECT_SOURCE_ROOT' : meson.project_source_root(),
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
internal_api_docs = custom_target(
|
internal_api_docs = custom_target(
|
||||||
'internal-api-docs',
|
'internal-api-docs',
|
||||||
command : [
|
command : [
|
||||||
doxygen.full_path(),
|
bash,
|
||||||
'@INPUT0@',
|
# Meson can you please just give us a `workdir` argument to custom targets...
|
||||||
|
'-c',
|
||||||
|
# We have to prefix the doxygen_cfg path with the project build root
|
||||||
|
# because of the cd in front.
|
||||||
|
'cd @0@ && @1@ @2@/@INPUT0@'.format(
|
||||||
|
meson.project_source_root(),
|
||||||
|
doxygen.full_path(),
|
||||||
|
meson.project_build_root(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
input : [
|
input : [
|
||||||
doxygen_cfg,
|
doxygen_cfg,
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ def map_contents_recursively(transformer):
|
|||||||
def process_command:
|
def process_command:
|
||||||
.[0] as $context |
|
.[0] as $context |
|
||||||
.[1] as $body |
|
.[1] as $body |
|
||||||
$body | .items |= map(map_contents_recursively(if $context.renderer == "html" then transform_anchors_html else transform_anchors_strip end))
|
$body + {
|
||||||
;
|
sections: $body.sections | map(map_contents_recursively(if $context.renderer == "html" then transform_anchors_html else transform_anchors_strip end)),
|
||||||
|
};
|
||||||
|
|
||||||
process_command
|
process_command
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ create-missing = false
|
|||||||
[output.html]
|
[output.html]
|
||||||
additional-css = ["custom.css"]
|
additional-css = ["custom.css"]
|
||||||
additional-js = ["redirects.js"]
|
additional-js = ["redirects.js"]
|
||||||
# Jumps directly into a new Gerrit CL editing the file in question.
|
# Using our GitHub mirror enables easier typo fixes since there is no easy way
|
||||||
edit-url-template = "https://gerrit.lix.systems/admin/repos/edit/repo/lix/branch/main/file/doc/manual/{path}"
|
# to just submit a Gerrit CL by the web for trivial stuff.
|
||||||
|
edit-url-template = "https://github.com/lix-project/lix/tree/main/doc/manual/{path}"
|
||||||
git-repository-url = "https://git.lix.systems/lix-project/lix"
|
git-repository-url = "https://git.lix.systems/lix-project/lix"
|
||||||
# Folding by default would prevent things like "Ctrl+F for nix-env" from working
|
# Folding by default would prevent things like "Ctrl+F for nix-env" from working
|
||||||
# trivially, but the user should be able to fold if they want to.
|
# trivially, but the user should be able to fold if they want to.
|
||||||
@@ -22,16 +23,16 @@ fold.level = 30
|
|||||||
# not want to disable the links preprocessor entirely though because that requires
|
# not want to disable the links preprocessor entirely though because that requires
|
||||||
# disabling *all* built-in preprocessors and selectively reenabling those we want.
|
# disabling *all* built-in preprocessors and selectively reenabling those we want.
|
||||||
[preprocessor.substitute]
|
[preprocessor.substitute]
|
||||||
command = "python3 substitute.py"
|
command = "python3 doc/manual/substitute.py"
|
||||||
before = ["anchors", "links"]
|
before = ["anchors", "links"]
|
||||||
|
|
||||||
[preprocessor.anchors]
|
[preprocessor.anchors]
|
||||||
renderers = ["html"]
|
renderers = ["html"]
|
||||||
command = "jq --from-file anchors.jq"
|
command = "jq --from-file doc/manual/anchors.jq"
|
||||||
|
|
||||||
[output.markdown]
|
[output.markdown]
|
||||||
|
|
||||||
[output.linkcheck2]
|
[output.linkcheck]
|
||||||
# no Internet during the build (in the sandbox)
|
# no Internet during the build (in the sandbox)
|
||||||
follow-web-links = false
|
follow-web-links = false
|
||||||
|
|
||||||
|
|||||||
@@ -3,19 +3,11 @@
|
|||||||
#
|
#
|
||||||
# It's used for crediting people accurately in release notes. The release notes
|
# It's used for crediting people accurately in release notes. The release notes
|
||||||
# script will link to forgejo, then to GitHub if forgejo is not present.
|
# script will link to forgejo, then to GitHub if forgejo is not present.
|
||||||
#
|
|
||||||
# When adding someone from outside the Lix project, you generally want to simply link their GitHub profile without adding a display name unless they are well-known in the community by that display name.
|
|
||||||
#
|
|
||||||
# See doc/manual/src/contributing/hacking.md for more documentation on this file's format and typical usage.
|
|
||||||
9999years:
|
9999years:
|
||||||
display_name: wiggles
|
display_name: wiggles
|
||||||
forgejo: rbt
|
forgejo: rbt
|
||||||
github: 9999years
|
github: 9999years
|
||||||
|
|
||||||
9p4:
|
|
||||||
display_name: Ersei Saggi
|
|
||||||
github: 9p4
|
|
||||||
|
|
||||||
Artturin:
|
Artturin:
|
||||||
github: Artturin
|
github: Artturin
|
||||||
|
|
||||||
@@ -40,80 +32,22 @@ alois31:
|
|||||||
forgejo: alois31
|
forgejo: alois31
|
||||||
github: alois31
|
github: alois31
|
||||||
|
|
||||||
andrewhamon:
|
|
||||||
display_name: Andrew Hamon
|
|
||||||
github: andrewhamon
|
|
||||||
|
|
||||||
artemist:
|
artemist:
|
||||||
display_name: Artemis Tosini
|
display_name: Artemis Tosini
|
||||||
forgejo: artemist
|
forgejo: artemist
|
||||||
|
|
||||||
astreaprtcl:
|
|
||||||
display_name: Astreaprtcl
|
|
||||||
forgejo: astreaprtcl
|
|
||||||
github: astreaprtcl
|
|
||||||
|
|
||||||
bb010g:
|
|
||||||
display_name: Dusk Banks
|
|
||||||
forgejo: bb010g
|
|
||||||
github: bb010g
|
|
||||||
|
|
||||||
blitz:
|
|
||||||
display_name: Julian Stecklina
|
|
||||||
github: blitz
|
|
||||||
|
|
||||||
blokyk:
|
|
||||||
display_name: blokyk
|
|
||||||
github: blokyk
|
|
||||||
|
|
||||||
cole-h:
|
cole-h:
|
||||||
display_name: Cole Helbling
|
display_name: Cole Helbling
|
||||||
github: cole-h
|
github: cole-h
|
||||||
|
|
||||||
delan:
|
|
||||||
display_name: delan
|
|
||||||
forgejo: delan
|
|
||||||
github: delan
|
|
||||||
|
|
||||||
delroth:
|
|
||||||
github: delroth
|
|
||||||
|
|
||||||
detroyejr:
|
|
||||||
display_name: Jonathan De Troye
|
|
||||||
github: detroyejr
|
|
||||||
|
|
||||||
edef:
|
|
||||||
github: edef1c
|
|
||||||
|
|
||||||
edolstra:
|
edolstra:
|
||||||
display_name: Eelco Dolstra
|
display_name: Eelco Dolstra
|
||||||
github: edolstra
|
github: edolstra
|
||||||
|
|
||||||
emilazy:
|
|
||||||
display_name: Emily
|
|
||||||
forgejo: emilazy
|
|
||||||
github: emilazy
|
|
||||||
|
|
||||||
ericson:
|
ericson:
|
||||||
display_name: John Ericson
|
display_name: John Ericson
|
||||||
github: ericson2314
|
github: ericson2314
|
||||||
|
|
||||||
getchoo:
|
|
||||||
display_name: Seth Flynn
|
|
||||||
forgejo: getchoo
|
|
||||||
github: getchoo
|
|
||||||
|
|
||||||
gilice:
|
|
||||||
forgejo: gilice
|
|
||||||
|
|
||||||
goldstein:
|
|
||||||
display_name: goldstein
|
|
||||||
forgejo: goldstein
|
|
||||||
github: GoldsteinE
|
|
||||||
|
|
||||||
gustavderdrache:
|
|
||||||
github: gustavderdrache
|
|
||||||
|
|
||||||
horrors:
|
horrors:
|
||||||
display_name: eldritch horrors
|
display_name: eldritch horrors
|
||||||
forgejo: pennae
|
forgejo: pennae
|
||||||
@@ -122,65 +56,10 @@ horrors:
|
|||||||
iFreilicht:
|
iFreilicht:
|
||||||
github: iFreilicht
|
github: iFreilicht
|
||||||
|
|
||||||
ian-h-chamberlain:
|
|
||||||
forgejo: ian-h-chamberlain
|
|
||||||
github: ian-h-chamberlain
|
|
||||||
|
|
||||||
infinisil:
|
|
||||||
github: infinisil
|
|
||||||
|
|
||||||
isabelroses:
|
|
||||||
forgejo: isabelroses
|
|
||||||
github: isabelroses
|
|
||||||
|
|
||||||
jade:
|
jade:
|
||||||
forgejo: jade
|
forgejo: jade
|
||||||
github: lf-
|
github: lf-
|
||||||
|
|
||||||
just1602:
|
|
||||||
forgejo: just1602
|
|
||||||
|
|
||||||
k900:
|
|
||||||
display_name: K900
|
|
||||||
forgejo: K900
|
|
||||||
github: K900
|
|
||||||
|
|
||||||
kasimeka:
|
|
||||||
display_name: ورد
|
|
||||||
forgejo: janw4ld
|
|
||||||
github: kasimeka
|
|
||||||
|
|
||||||
keysmashes:
|
|
||||||
github: keysmashes
|
|
||||||
|
|
||||||
kfears:
|
|
||||||
display_name: KFears
|
|
||||||
forgejo: kfearsoff
|
|
||||||
github: kfearsoff
|
|
||||||
|
|
||||||
kiara:
|
|
||||||
github: KiaraGrouwstra
|
|
||||||
|
|
||||||
kjeremy:
|
|
||||||
github: kjeremy
|
|
||||||
|
|
||||||
kloenk:
|
|
||||||
display_name: Fiona Behrens
|
|
||||||
forgejo: kloenk
|
|
||||||
github: kloenk
|
|
||||||
|
|
||||||
lheckemann:
|
|
||||||
forgejo: lheckemann
|
|
||||||
github: lheckemann
|
|
||||||
|
|
||||||
lily:
|
|
||||||
forgejo: lilyinstarlight
|
|
||||||
github: lilyinstarlight
|
|
||||||
|
|
||||||
lilyball:
|
|
||||||
forgejo: lilyball
|
|
||||||
github: lilyball
|
|
||||||
|
|
||||||
lovesegfault:
|
lovesegfault:
|
||||||
github: lovesegfault
|
github: lovesegfault
|
||||||
|
|
||||||
@@ -191,63 +70,19 @@ ma27:
|
|||||||
matthewbauer:
|
matthewbauer:
|
||||||
github: matthewbauer
|
github: matthewbauer
|
||||||
|
|
||||||
mic92:
|
|
||||||
github: mic92
|
|
||||||
|
|
||||||
midnightveil:
|
midnightveil:
|
||||||
display_name: julia
|
display_name: julia
|
||||||
forgejo: midnightveil
|
forgejo: midnightveil
|
||||||
github: midnightveil
|
github: midnightveil
|
||||||
|
|
||||||
milibopp:
|
|
||||||
display_name: Emilia Bopp
|
|
||||||
forgejo: milibopp
|
|
||||||
github: milibopp
|
|
||||||
|
|
||||||
nan-git:
|
|
||||||
display_name: NaN-git
|
|
||||||
github: NaN-git
|
|
||||||
|
|
||||||
ncfavier:
|
ncfavier:
|
||||||
github: ncfavier
|
github: ncfavier
|
||||||
|
|
||||||
nkk0:
|
|
||||||
github: nkk0
|
|
||||||
|
|
||||||
not-my-profile:
|
|
||||||
display_name: Martin Fischer
|
|
||||||
github: not-my-profile
|
|
||||||
|
|
||||||
p-e-meunier:
|
|
||||||
display_name: Pierre-Etienne Meunier
|
|
||||||
github: P-E-Meunier
|
|
||||||
|
|
||||||
pamplemousse:
|
|
||||||
display_name: Xavier Maso
|
|
||||||
github: pamplemousse
|
|
||||||
|
|
||||||
piegames:
|
|
||||||
display_name: piegames
|
|
||||||
forgejo: piegames
|
|
||||||
github: piegamesde
|
|
||||||
|
|
||||||
poliorcetics:
|
|
||||||
display_name: Poliorcetics
|
|
||||||
github: poliorcetics
|
|
||||||
|
|
||||||
puck:
|
puck:
|
||||||
display_name: puck
|
display_name: puck
|
||||||
forgejo: puck
|
forgejo: puck
|
||||||
github: puckipedia
|
github: puckipedia
|
||||||
|
|
||||||
quantenzitrone:
|
|
||||||
display_name: Zitrone
|
|
||||||
forgejo: quantenzitrone
|
|
||||||
|
|
||||||
quantumjump:
|
|
||||||
display_name: Quantum Jump
|
|
||||||
github: QuantumBJump
|
|
||||||
|
|
||||||
r-vdp:
|
r-vdp:
|
||||||
github: r-vdp
|
github: r-vdp
|
||||||
|
|
||||||
@@ -256,41 +91,10 @@ raito:
|
|||||||
forgejo: raito
|
forgejo: raito
|
||||||
github: RaitoBezarius
|
github: RaitoBezarius
|
||||||
|
|
||||||
rkjnsn:
|
|
||||||
display_name: Erik Jensen
|
|
||||||
forgejo: rkjnsn
|
|
||||||
github: rkjnsn
|
|
||||||
|
|
||||||
roberth:
|
roberth:
|
||||||
display_name: Robert Hensing
|
display_name: Robert Hensing
|
||||||
github: roberth
|
github: roberth
|
||||||
|
|
||||||
rootile:
|
|
||||||
display_name: rootile (Rutile)
|
|
||||||
forgejo: rootile
|
|
||||||
|
|
||||||
sandydoo:
|
|
||||||
github: sandydoo
|
|
||||||
|
|
||||||
seppel3210:
|
|
||||||
github: Seppel3210
|
|
||||||
|
|
||||||
sterni:
|
|
||||||
forgejo: sterni
|
|
||||||
github: sternenseemann
|
|
||||||
|
|
||||||
stevalkr:
|
|
||||||
github: stevalkr
|
|
||||||
|
|
||||||
teofilc:
|
|
||||||
forgejo: teofilc
|
|
||||||
github: TeofilC
|
|
||||||
|
|
||||||
thubrecht:
|
|
||||||
display_name: Tom Hubrecht
|
|
||||||
forgejo: tom-hubrecht
|
|
||||||
github: Tom-Hubrecht
|
|
||||||
|
|
||||||
thufschmitt:
|
thufschmitt:
|
||||||
display_name: Théophane Hufschmitt
|
display_name: Théophane Hufschmitt
|
||||||
github: thufschmitt
|
github: thufschmitt
|
||||||
@@ -303,41 +107,9 @@ valentin:
|
|||||||
display_name: Valentin Gagarin
|
display_name: Valentin Gagarin
|
||||||
github: fricklerhandwerk
|
github: fricklerhandwerk
|
||||||
|
|
||||||
vigress8:
|
|
||||||
display_name: Vigress
|
|
||||||
forgejo: vigress8
|
|
||||||
github: vigress8
|
|
||||||
|
|
||||||
vlaci:
|
|
||||||
github: vlaci
|
|
||||||
|
|
||||||
vlinkz:
|
|
||||||
display_name: Victor Fuentes
|
|
||||||
forgejo: vlinkz
|
|
||||||
github: vlinkz
|
|
||||||
|
|
||||||
winter:
|
winter:
|
||||||
forgejo: winter
|
forgejo: winter
|
||||||
github: winterqt
|
github: winterqt
|
||||||
|
|
||||||
xanderio:
|
|
||||||
github: xanderio
|
|
||||||
|
|
||||||
xokdvium:
|
|
||||||
github: xokdvium
|
|
||||||
|
|
||||||
xyenon:
|
|
||||||
forgejo: xyenon
|
|
||||||
github: xyenon
|
|
||||||
|
|
||||||
yorickvp:
|
|
||||||
github: yorickvp
|
|
||||||
|
|
||||||
yshui:
|
yshui:
|
||||||
github: yshui
|
github: yshui
|
||||||
|
|
||||||
ysndr:
|
|
||||||
github: ysndr
|
|
||||||
|
|
||||||
zimbatm:
|
|
||||||
github: zimbatm
|
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
let
|
||||||
|
inherit (builtins) concatStringsSep attrValues mapAttrs;
|
||||||
|
inherit (import ./utils.nix) optionalString squash;
|
||||||
|
in
|
||||||
|
|
||||||
|
builtinsInfo:
|
||||||
|
let
|
||||||
|
showBuiltin =
|
||||||
|
name:
|
||||||
|
{
|
||||||
|
doc,
|
||||||
|
type,
|
||||||
|
impure-only,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
type' = optionalString (type != null) " (${type})";
|
||||||
|
|
||||||
|
impureNotice = optionalString impure-only ''
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> Not available in [pure evaluation mode](@docroot@/command-ref/conf-file.md#conf-pure-eval).
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
squash ''
|
||||||
|
<dt id="builtins-${name}">
|
||||||
|
<a href="#builtins-${name}"><code>${name}</code></a>${type'}
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
${doc}
|
||||||
|
|
||||||
|
${impureNotice}
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
concatStringsSep "\n" (attrValues (mapAttrs showBuiltin builtinsInfo))
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
let
|
||||||
|
inherit (builtins) concatStringsSep attrValues mapAttrs;
|
||||||
|
inherit (import ./utils.nix) optionalString squash;
|
||||||
|
in
|
||||||
|
|
||||||
|
builtinsInfo:
|
||||||
|
let
|
||||||
|
showBuiltin =
|
||||||
|
name:
|
||||||
|
{
|
||||||
|
doc,
|
||||||
|
args,
|
||||||
|
arity,
|
||||||
|
experimental-feature,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
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.
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
squash ''
|
||||||
|
<dt id="builtins-${name}">
|
||||||
|
<a href="#builtins-${name}"><code>${name} ${listArgs args}</code></a>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
${doc}
|
||||||
|
|
||||||
|
${experimentalNotice}
|
||||||
|
|
||||||
|
</dd>
|
||||||
|
'';
|
||||||
|
listArgs = args: concatStringsSep " " (map (s: "<var>${s}</var>") args);
|
||||||
|
in
|
||||||
|
concatStringsSep "\n" (attrValues (mapAttrs showBuiltin builtinsInfo))
|
||||||
+23
-131
@@ -1,134 +1,26 @@
|
|||||||
with builtins;
|
|
||||||
|
|
||||||
let
|
let
|
||||||
splitLines = s: filter (x: !isList x) (split "\n" s);
|
inherit (builtins)
|
||||||
|
attrNames
|
||||||
concatStrings = concatStringsSep "";
|
attrValues
|
||||||
|
fromJSON
|
||||||
replaceStringsRec =
|
listToAttrs
|
||||||
from: to: string:
|
mapAttrs
|
||||||
# recursively replace occurrences of `from` with `to` within `string`
|
concatStringsSep
|
||||||
# example:
|
concatMap
|
||||||
# replaceStringRec "--" "-" "hello-----world"
|
length
|
||||||
# => "hello-world"
|
lessThan
|
||||||
let
|
replaceStrings
|
||||||
replaced = replaceStrings [ from ] [ to ] string;
|
sort
|
||||||
in
|
;
|
||||||
if replaced == string then string else replaceStringsRec from to replaced;
|
inherit (import ./utils.nix)
|
||||||
|
concatStrings
|
||||||
squash = replaceStringsRec "\n\n\n" "\n\n";
|
optionalString
|
||||||
|
filterAttrs
|
||||||
trim =
|
trim
|
||||||
string:
|
squash
|
||||||
# trim trailing spaces and squash non-leading spaces
|
unique
|
||||||
let
|
showSettings
|
||||||
trimLine =
|
;
|
||||||
line:
|
|
||||||
let
|
|
||||||
# separate leading spaces from the rest
|
|
||||||
parts = split "(^ *)" line;
|
|
||||||
spaces = head (elemAt parts 1);
|
|
||||||
rest = elemAt parts 2;
|
|
||||||
# drop trailing spaces
|
|
||||||
body = head (split " *$" rest);
|
|
||||||
in
|
|
||||||
spaces + replaceStringsRec " " " " body;
|
|
||||||
in
|
|
||||||
concatStringsSep "\n" (map trimLine (splitLines string));
|
|
||||||
|
|
||||||
# FIXME: O(n^2)
|
|
||||||
unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) [ ];
|
|
||||||
|
|
||||||
nameValuePair = name: value: { inherit name value; };
|
|
||||||
|
|
||||||
filterAttrs =
|
|
||||||
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 "";
|
|
||||||
|
|
||||||
showSetting =
|
|
||||||
{ inlineHTML }:
|
|
||||||
name:
|
|
||||||
{
|
|
||||||
description,
|
|
||||||
documentDefault,
|
|
||||||
defaultValue,
|
|
||||||
aliases,
|
|
||||||
value,
|
|
||||||
experimentalFeature,
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
result = squash ''
|
|
||||||
- ${
|
|
||||||
if inlineHTML then ''<span id="conf-${name}">[`${name}`](#conf-${name})</span>'' else "`${name}`"
|
|
||||||
}
|
|
||||||
|
|
||||||
${indent " " body}
|
|
||||||
'';
|
|
||||||
|
|
||||||
experimentalFeatureNote = optionalString (experimentalFeature != null) ''
|
|
||||||
> **Warning**
|
|
||||||
> This setting is part of an
|
|
||||||
> [experimental feature](@docroot@/contributing/experimental-features.md).
|
|
||||||
|
|
||||||
To change this setting, you need to make sure the corresponding experimental feature,
|
|
||||||
[`${experimentalFeature}`](@docroot@/contributing/experimental-features.md#xp-feature-${experimentalFeature}),
|
|
||||||
is enabled.
|
|
||||||
For example, include the following in [`nix.conf`](#):
|
|
||||||
|
|
||||||
```
|
|
||||||
extra-experimental-features = ${experimentalFeature}
|
|
||||||
${name} = ...
|
|
||||||
```
|
|
||||||
'';
|
|
||||||
|
|
||||||
# separate body to cleanly handle indentation
|
|
||||||
body = ''
|
|
||||||
${description}
|
|
||||||
|
|
||||||
${experimentalFeatureNote}
|
|
||||||
|
|
||||||
**Default:** ${showDefault documentDefault defaultValue}
|
|
||||||
|
|
||||||
${showAliases aliases}
|
|
||||||
'';
|
|
||||||
|
|
||||||
showDefault =
|
|
||||||
documentDefault: defaultValue:
|
|
||||||
if documentDefault then
|
|
||||||
# a StringMap value type is specified as a string, but
|
|
||||||
# this shows the value type. The empty stringmap is `null` in
|
|
||||||
# JSON, but that converts to `{ }` here.
|
|
||||||
if defaultValue == "" || defaultValue == [ ] || isAttrs defaultValue then
|
|
||||||
"*empty*"
|
|
||||||
else if isBool defaultValue then
|
|
||||||
if defaultValue then "`true`" else "`false`"
|
|
||||||
else
|
|
||||||
"`${toString defaultValue}`"
|
|
||||||
else
|
|
||||||
"*machine-specific*";
|
|
||||||
|
|
||||||
showAliases =
|
|
||||||
aliases:
|
|
||||||
optionalString (aliases != [ ])
|
|
||||||
"**Deprecated alias:** ${(concatStringsSep ", " (map (s: "`${s}`") aliases))}";
|
|
||||||
in
|
|
||||||
result;
|
|
||||||
|
|
||||||
indent =
|
|
||||||
prefix: s: concatStringsSep "\n" (map (x: if x == "" then x else "${prefix}${x}") (splitLines s));
|
|
||||||
|
|
||||||
showSettings =
|
|
||||||
args: settingsInfo: concatStrings (attrValues (mapAttrs (showSetting args) settingsInfo));
|
|
||||||
in
|
in
|
||||||
|
|
||||||
inlineHTML: commandDump:
|
inlineHTML: commandDump:
|
||||||
@@ -225,7 +117,7 @@ let
|
|||||||
showCategory = cat: ''
|
showCategory = cat: ''
|
||||||
${optionalString (cat != "") "**${cat}:**"}
|
${optionalString (cat != "") "**${cat}:**"}
|
||||||
|
|
||||||
${listOptions (filterAttrs (n: v: v.category == cat && !v.hidden) 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 =
|
showOption =
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
with builtins;
|
||||||
|
with import ./utils.nix;
|
||||||
|
|
||||||
|
let
|
||||||
|
showExperimentalFeature = name: doc: ''
|
||||||
|
- [`${name}`](@docroot@/contributing/experimental-features.md#xp-feature-${name})
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
xps: indent " " (concatStrings (attrValues (mapAttrs showExperimentalFeature xps)))
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
with builtins;
|
||||||
|
with import ./utils.nix;
|
||||||
|
|
||||||
|
let
|
||||||
|
showExperimentalFeature =
|
||||||
|
name: doc:
|
||||||
|
squash ''
|
||||||
|
## [`${name}`]{#xp-feature-${name}}
|
||||||
|
|
||||||
|
${doc}
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
xps: (concatStringsSep "\n" (attrValues (mapAttrs showExperimentalFeature xps)))
|
||||||
+59
-24
@@ -1,7 +1,6 @@
|
|||||||
nix_env_for_docs = {
|
nix_env_for_docs = {
|
||||||
'HOME': '/dummy',
|
'HOME': '/dummy',
|
||||||
'NIX_CONF_DIR': '/dummy',
|
'NIX_CONF_DIR': '/dummy',
|
||||||
'XDG_CONFIG_HOME': '/dummy',
|
|
||||||
'NIX_SSL_CERT_FILE': '/dummy/no-ca-bundle.crt',
|
'NIX_SSL_CERT_FILE': '/dummy/no-ca-bundle.crt',
|
||||||
'NIX_STATE_DIR': '/dummy',
|
'NIX_STATE_DIR': '/dummy',
|
||||||
'NIX_CONFIG': 'cores = 0',
|
'NIX_CONFIG': 'cores = 0',
|
||||||
@@ -16,21 +15,67 @@ nix_eval_for_docs_common = nix_for_docs + [
|
|||||||
]
|
]
|
||||||
nix_eval_for_docs = nix_eval_for_docs_common + '--raw'
|
nix_eval_for_docs = nix_eval_for_docs_common + '--raw'
|
||||||
|
|
||||||
|
conf_file_json = custom_target(
|
||||||
|
command : nix_for_docs + [ 'show-config', '--json' ],
|
||||||
|
capture : true,
|
||||||
|
output : 'conf-file.json',
|
||||||
|
env : nix_env_for_docs,
|
||||||
|
)
|
||||||
|
|
||||||
|
nix_conf_file_md_body = custom_target(
|
||||||
|
command : nix_eval_for_docs + [
|
||||||
|
'--expr',
|
||||||
|
'(import @INPUT0@).showSettings { inlineHTML = true; } (builtins.fromJSON (builtins.readFile @INPUT1@))',
|
||||||
|
],
|
||||||
|
capture : true,
|
||||||
|
input : [
|
||||||
|
'utils.nix',
|
||||||
|
conf_file_json,
|
||||||
|
],
|
||||||
|
output : 'conf-file.md.body',
|
||||||
|
env : nix_env_for_docs,
|
||||||
|
)
|
||||||
|
|
||||||
|
nix_conf_file_md = custom_target(
|
||||||
|
command : [ 'cat', '@INPUT@' ],
|
||||||
|
capture : true,
|
||||||
|
input : [
|
||||||
|
'src/command-ref/conf-file.md',
|
||||||
|
nix_conf_file_md_body,
|
||||||
|
],
|
||||||
|
output : 'conf-file.md',
|
||||||
|
)
|
||||||
|
|
||||||
|
nix_exp_features_json = custom_target(
|
||||||
|
command : [ nix, '__dump-xp-features' ],
|
||||||
|
capture : true,
|
||||||
|
output : 'xp-features.json',
|
||||||
|
)
|
||||||
|
|
||||||
|
language_json = custom_target(
|
||||||
|
command: [nix, '__dump-language'],
|
||||||
|
output : 'language.json',
|
||||||
|
capture : true,
|
||||||
|
env : nix_env_for_docs,
|
||||||
|
)
|
||||||
|
|
||||||
nix3_cli_json = custom_target(
|
nix3_cli_json = custom_target(
|
||||||
command : [ nix, '__dump-cli' ],
|
command : [ nix, '__dump-cli' ],
|
||||||
capture : true,
|
capture : true,
|
||||||
output : 'nix.json',
|
output : 'nix.json',
|
||||||
env : nix_env_for_docs,
|
env : nix_env_for_docs,
|
||||||
# FIXME: put the actual lib targets in here? meson have introspection challenge 2024 though.
|
|
||||||
build_always_stale : true,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
generate_manual_deps = files(
|
generate_manual_deps = files(
|
||||||
'generate-deps.py',
|
'generate-deps.py',
|
||||||
)
|
)
|
||||||
|
|
||||||
# Generates new-cli pages and conf-file.md.
|
# Generates builtins.md and builtin-constants.md.
|
||||||
|
subdir('src/language')
|
||||||
|
# Generates new-cli pages, experimental-features-shortlist.md, and conf-file.md.
|
||||||
subdir('src/command-ref')
|
subdir('src/command-ref')
|
||||||
|
# Generates experimental-feature-descriptions.md.
|
||||||
|
subdir('src/contributing')
|
||||||
# Generates rl-next-generated.md.
|
# Generates rl-next-generated.md.
|
||||||
subdir('src/release-notes')
|
subdir('src/release-notes')
|
||||||
|
|
||||||
@@ -41,13 +86,9 @@ manual = custom_target(
|
|||||||
'-euo', 'pipefail',
|
'-euo', 'pipefail',
|
||||||
'-c',
|
'-c',
|
||||||
'''
|
'''
|
||||||
@0@ @INPUT0@ @3@ > @DEPFILE@
|
@0@ @INPUT0@ @CURRENT_SOURCE_DIR@ > @DEPFILE@
|
||||||
|
cd @SOURCE_ROOT@
|
||||||
# Needs to be in lix/doc/manual for e.g. substitute.py
|
@1@ build doc/manual -d @2@ | { grep -Fv "because fragment resolution isn't implemented" || :; }
|
||||||
pushd @3@
|
|
||||||
@1@ build . -d @2@
|
|
||||||
popd
|
|
||||||
|
|
||||||
rm -rf @2@/manual
|
rm -rf @2@/manual
|
||||||
mv @2@/html @2@/manual
|
mv @2@/html @2@/manual
|
||||||
find @2@/manual -iname meson.build -delete
|
find @2@/manual -iname meson.build -delete
|
||||||
@@ -55,7 +96,6 @@ manual = custom_target(
|
|||||||
python.full_path(),
|
python.full_path(),
|
||||||
mdbook.full_path(),
|
mdbook.full_path(),
|
||||||
meson.current_build_dir(),
|
meson.current_build_dir(),
|
||||||
meson.current_source_dir()
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
input : [
|
input : [
|
||||||
@@ -66,31 +106,29 @@ manual = custom_target(
|
|||||||
nix3_cli_files,
|
nix3_cli_files,
|
||||||
experimental_features_shortlist_md,
|
experimental_features_shortlist_md,
|
||||||
experimental_feature_descriptions_md,
|
experimental_feature_descriptions_md,
|
||||||
deprecated_features_shortlist_md,
|
|
||||||
deprecated_feature_descriptions_md,
|
|
||||||
conf_file_md,
|
conf_file_md,
|
||||||
builtins_md,
|
builtins_md,
|
||||||
builtin_constants_md,
|
builtin_constants_md,
|
||||||
rl_next_generated,
|
rl_next_generated,
|
||||||
nix,
|
|
||||||
],
|
],
|
||||||
output : [
|
output : [
|
||||||
'manual',
|
'manual',
|
||||||
'markdown',
|
'markdown',
|
||||||
],
|
],
|
||||||
install : true,
|
|
||||||
install_dir : [
|
|
||||||
datadir / 'doc/nix',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
depfile : 'manual.d',
|
depfile : 'manual.d',
|
||||||
env : {
|
env : {
|
||||||
'RUST_LOG': 'info',
|
'RUST_LOG': 'info',
|
||||||
'MANUAL_SUBSTITUTE_SEARCH': meson.current_build_dir() / 'src',
|
'MDBOOK_SUBSTITUTE_SEARCH': meson.current_build_dir() / 'src',
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
manual_html = manual[0]
|
||||||
manual_md = manual[1]
|
manual_md = manual[1]
|
||||||
|
|
||||||
|
install_subdir(
|
||||||
|
manual_html.full_path(),
|
||||||
|
install_dir : datadir / 'doc/nix',
|
||||||
|
)
|
||||||
|
|
||||||
nix_nested_manpages = [
|
nix_nested_manpages = [
|
||||||
[ 'nix-env',
|
[ 'nix-env',
|
||||||
[
|
[
|
||||||
@@ -148,7 +186,6 @@ foreach command : nix_nested_manpages
|
|||||||
],
|
],
|
||||||
input : [
|
input : [
|
||||||
manual_md,
|
manual_md,
|
||||||
nix,
|
|
||||||
],
|
],
|
||||||
output : command[0] + '-' + page + '.1',
|
output : command[0] + '-' + page + '.1',
|
||||||
install : true,
|
install : true,
|
||||||
@@ -261,7 +298,6 @@ foreach page : nix3_manpages
|
|||||||
input : [
|
input : [
|
||||||
'render-manpage.sh',
|
'render-manpage.sh',
|
||||||
manual_md,
|
manual_md,
|
||||||
nix,
|
|
||||||
],
|
],
|
||||||
output : page + '.1',
|
output : page + '.1',
|
||||||
install : true,
|
install : true,
|
||||||
@@ -305,7 +341,6 @@ foreach entry : nix_manpages
|
|||||||
'render-manpage.sh',
|
'render-manpage.sh',
|
||||||
manual_md,
|
manual_md,
|
||||||
entry.get(3, []),
|
entry.get(3, []),
|
||||||
nix,
|
|
||||||
],
|
],
|
||||||
output : '@0@.@1@'.format(entry[0], entry[1]),
|
output : '@0@.@1@'.format(entry[0], entry[1]),
|
||||||
install : true,
|
install : true,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env bash
|
#!/bin/sh
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ const redirects = {
|
|||||||
"linux": "uninstall.html#linux",
|
"linux": "uninstall.html#linux",
|
||||||
"macos": "uninstall.html#macos",
|
"macos": "uninstall.html#macos",
|
||||||
"uninstalling": "uninstall.html",
|
"uninstalling": "uninstall.html",
|
||||||
},
|
}
|
||||||
"contributing/hacking.html": {
|
"contributing/hacking.html": {
|
||||||
"nix-with-flakes": "#building-nix-with-flakes",
|
"nix-with-flakes": "#building-nix-with-flakes",
|
||||||
"classic-nix": "#building-nix",
|
"classic-nix": "#building-nix",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env bash
|
#!/bin/sh
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "allow setting nested attributes via `--arg`/`--argstr`"
|
|
||||||
cls: [5338]
|
|
||||||
category: "Features"
|
|
||||||
credits: [ma27]
|
|
||||||
issues: [fj#496]
|
|
||||||
---
|
|
||||||
|
|
||||||
Passing `--arg config.allowUnfree true` to e.g. `nix-build` now results in `config` with value
|
|
||||||
`{ allowUnfree = true; }` passed to the expression.
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "check for missing ca-file or netrc-file if one is specified"
|
|
||||||
cls: [5646]
|
|
||||||
category: "Improvements"
|
|
||||||
credits: [astreaprtcl]
|
|
||||||
issues: [fj#1106]
|
|
||||||
---
|
|
||||||
|
|
||||||
If the settings `ssl-cert-file` or `netrc-file` have been set by the user, check if those files actually exist and fail if they are missing.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "libexpr: allow empty attr-names in parseAttrPath if they are quoted"
|
|
||||||
cls: [5375]
|
|
||||||
category: "Miscellany"
|
|
||||||
credits: [ma27]
|
|
||||||
---
|
|
||||||
|
|
||||||
Empty strings are now allowed in attribute paths as consumed by e.g. `nix-build`.
|
|
||||||
I.e. `nix-build -A 'foo."".bar'` works now.
|
|
||||||
The quotes are necessary, i.e. `nix-build -A foo..bar` will throw an error.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "don't treat tarball fetches with empty or zero hash as locked"
|
|
||||||
cls: []
|
|
||||||
category: "Fixes"
|
|
||||||
credits: [horrors]
|
|
||||||
issues: [fj#1233]
|
|
||||||
---
|
|
||||||
|
|
||||||
Lix no longer treats tarball fetches with empty or zero hashes as locked.
|
|
||||||
All such fetches are now also affected by `tarball-ttl` as a consequence.
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: builtins.floor/builtins.ceil handle out-of-range inputs correctly
|
|
||||||
issues: [nix#12899]
|
|
||||||
cls: [3923]
|
|
||||||
prs: [nix#13013]
|
|
||||||
category: "Breaking Changes"
|
|
||||||
credits: [jade, nan-git, rootile]
|
|
||||||
---
|
|
||||||
Previously, `builtins.floor` and `builtins.ceil` always cast the input into a floating point value before running the operation and casting the floating point result back into an integer.
|
|
||||||
No checks were made for precision loss in either coercing integer inputs or converting the output to an integer (and in fact in the latter case, invoked undefined behaviour).
|
|
||||||
|
|
||||||
Now, Lix checks for precision loss on integer input (to avoid a silent eval semantics change if we were to simply pass it through as-is) and on integer output.
|
|
||||||
If your code fails to evaluate after this change, use `--extra-deprecated-features floor-ceil-corrupt-integers`.
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "builtins.break doesn't break expression anymore"
|
|
||||||
issues: [1165]
|
|
||||||
cls: [5422]
|
|
||||||
category: "Fixes"
|
|
||||||
credits: [blokyk]
|
|
||||||
---
|
|
||||||
|
|
||||||
Wrapping an expression in `builtins.break` used to break some builtins like
|
|
||||||
`map` and the `is*` functions, which could modify the execution path of code
|
|
||||||
inadvertently, made debugging nix harder than it already is, and in some cases
|
|
||||||
even crashed the interpreter. Now, using `break` should be completely
|
|
||||||
transparent to whatever function receives it as an input, preventing the
|
|
||||||
above-mentioned issues.
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "flake config warnings are now printed to stderr"
|
|
||||||
issues: [1155]
|
|
||||||
cls: [5379]
|
|
||||||
category: "Fixes"
|
|
||||||
credits: [lheckemann]
|
|
||||||
---
|
|
||||||
|
|
||||||
The settings listed in a flake-config confirmation prompt are now printed to stderr rather than stdout, which allows `nix print-dev-env` to emit valid bash again even in the presence of untrusted settings.
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Use a lock when fetching inputs"
|
|
||||||
issues: [1122]
|
|
||||||
cls: [5438]
|
|
||||||
category: "Fixes"
|
|
||||||
credits: [lheckemann]
|
|
||||||
---
|
|
||||||
|
|
||||||
Up to now, attempting to fetch the same git input from multiple processes
|
|
||||||
concurrently when the input is not yet cached presented multiple issues:
|
|
||||||
|
|
||||||
- If the input was not already present, it would unnecessarily be fetched
|
|
||||||
multiple times;
|
|
||||||
|
|
||||||
- Access to the fetcher cache database was contentious, and could lead to
|
|
||||||
evaluation or flake locking failing unnecessary because the fetcher cache
|
|
||||||
was locked.
|
|
||||||
|
|
||||||
We now acquire a lock on a path based on a hash of the input specification
|
|
||||||
before accessing the fetcher db, reducing contention significantly, and
|
|
||||||
preventing more than one process from fetching the same path at the same time.
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Use mimalloc for faster evaluation"
|
|
||||||
cls: [5645]
|
|
||||||
category: Features
|
|
||||||
credits: [getchoo, lovesegfault]
|
|
||||||
---
|
|
||||||
|
|
||||||
Lix now links with [mimalloc](https://github.com/microsoft/mimalloc),
|
|
||||||
replacing the system's default `malloc()` for all non-GC allocations.
|
|
||||||
|
|
||||||
This yields a **5–12% wall-clock improvement** on evaluation workloads,
|
|
||||||
ranging from `nix-instantiate hello` to `nix-env -qa` and full NixOS
|
|
||||||
configurations.
|
|
||||||
|
|
||||||
The allocator can be disabled at build time with `-Dmimalloc=disabled`,
|
|
||||||
or by passing the `useMimalloc = false` override to the `lix` package.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Lix now requires lowdown 1.4.0 or later"
|
|
||||||
issues: []
|
|
||||||
cls: [5374]
|
|
||||||
category: Packaging
|
|
||||||
credits: [sterni]
|
|
||||||
---
|
|
||||||
|
|
||||||
Support for linking against `lowdown < 1.4.0` has been removed from Lix since
|
|
||||||
all supported Nixpkgs channels distribute lowdown 2.0.4 or later.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "nix-eval-jobs support `--apply` flag"
|
|
||||||
cls: [5748]
|
|
||||||
category: "Features"
|
|
||||||
credits: [isabelroses,mic92,ysndr]
|
|
||||||
issues: [fj#1214]
|
|
||||||
---
|
|
||||||
|
|
||||||
`nix-eval-jobs` now supports the `--apply` flag. With this you can apply the
|
|
||||||
provided function to the each derivation, the result of this function will then
|
|
||||||
be serialized as a JSON value and stored inside `"extraValue"` key of the json
|
|
||||||
line output.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Fix `nix-copy-closure --include-outputs`"
|
|
||||||
issues: [gh#5105]
|
|
||||||
cls: [5588]
|
|
||||||
category: "Fixes"
|
|
||||||
credits: [rkjnsn]
|
|
||||||
---
|
|
||||||
|
|
||||||
The `--include-outputs` flag for `nix-copy-closure` now works as intended.
|
|
||||||
Previously, the option was accepted but silently ignored.
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Improve nix doctor"
|
|
||||||
cls: [5316, 5317, 5318, 5319, 5320, 5768, 5829]
|
|
||||||
category: Features
|
|
||||||
credits: [rootile, raito]
|
|
||||||
---
|
|
||||||
The `nix doctor` diagnosics interface now provides a lot more useful information including, but not limited to:
|
|
||||||
- General system information (OS, Hardware etc)
|
|
||||||
- Nix Information like Sandbox, Version, Store, State and other directories
|
|
||||||
- Flake registry
|
|
||||||
- Search path Information
|
|
||||||
- Nixpkgs provenance
|
|
||||||
- Remote builder configuration (including remote connection)
|
|
||||||
- fix crash when having relative Paths in PATH
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Shadowing internal files through the Nix search path is now an error"
|
|
||||||
issues: [998]
|
|
||||||
cls: [4632, 5370]
|
|
||||||
category: "Breaking Changes"
|
|
||||||
credits: [thubrecht, jade, horrors]
|
|
||||||
---
|
|
||||||
|
|
||||||
As Lix uses the path `<nix/fetchurl.nix>` for bootstrapping purposes, the ability to shadow it by adding `nix=/some/path` (or `/other/path` that contains a `nix` directory) to the search path is not desirable.
|
|
||||||
|
|
||||||
Lix 2.95 deprecated this behavior with a warning, Lix 2.96 now turns it into a hard error if the `nix-path-shadow` deprecated feature isn't enabled. This deprecated feature is slated to be removed in Lix 2.98.
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Remove `max-connections` store parameters for `ssh://` and `ssh-ng://` stores"
|
|
||||||
cls: []
|
|
||||||
category: Miscellany
|
|
||||||
credits: [horrors]
|
|
||||||
---
|
|
||||||
|
|
||||||
The `max-connections` parameter was undocumented, untested, and (in the case of `ssh`) even ignored
|
|
||||||
entirely for remote builds. During a survey of public nixos configurations we have found *two* uses
|
|
||||||
of `max-connections` for `ssh-ng`, and none at all for `ssh`. Since it is so rarely used but brings
|
|
||||||
significant internal complexity that hinders improvements we have decided to remove these features.
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Allow moving between stack frames relative to current debugger frame"
|
|
||||||
issues: [1156]
|
|
||||||
cls: [5411]
|
|
||||||
category: "Improvements"
|
|
||||||
credits: [blokyk]
|
|
||||||
---
|
|
||||||
|
|
||||||
Debugging functional programs often involve switching between a bunch of stack
|
|
||||||
frames to get the full context of what's happening and who's calling who.
|
|
||||||
Before this change, going up or down the stack in the nix debugger with `:st`
|
|
||||||
meant remembering the absolute index of each stack frame, instead of their
|
|
||||||
positions relative to one another; this got tiring *fast*.
|
|
||||||
|
|
||||||
Now, you can prepend `:st`'s argument with a + or - sign to indicate you want to
|
|
||||||
move relative to the current stack frame. For example, typing `:st +3` when you
|
|
||||||
were on frame `10` will go frame `13`; vice-versa, typing `:st -4` on frame `6`
|
|
||||||
will go to frame `2`.
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Print REPL backtraces in more convenient order"
|
|
||||||
issues: []
|
|
||||||
cls: [5491]
|
|
||||||
category: "Improvements"
|
|
||||||
credits: [blokyk]
|
|
||||||
---
|
|
||||||
|
|
||||||
When using the debugger, stack traces printed with the `:bt` command were
|
|
||||||
previously printed in reverse order compared to most other situations where they
|
|
||||||
appeared: the current stack frame would be printed at the very top, with the
|
|
||||||
most outer frame at the bottom, meaning that you'd have to scroll up to get a
|
|
||||||
sense of where you are.
|
|
||||||
|
|
||||||
With this change, the stack frames are printed such that the most relevant ones
|
|
||||||
are immediatly visible at the bottom, just like other traces in lix (e.g.
|
|
||||||
ones caused by errors).
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "invalid arguments to :st now print an error"
|
|
||||||
cls: [5386]
|
|
||||||
category: "Improvements"
|
|
||||||
credits: [blokyk]
|
|
||||||
---
|
|
||||||
|
|
||||||
When using the debugger, the `:st` command used to traverse the call stack would
|
|
||||||
silently fail and put the debugger in an invalid state if the argument given to
|
|
||||||
it wasn't a valid stack frame index.
|
|
||||||
|
|
||||||
This change adds an error message warning the user if the given index wasn't a
|
|
||||||
valid frame (telling them the range of valid indices), as well as if it wasn't
|
|
||||||
even a valid integer to begin with.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "REPL now uses rustyline"
|
|
||||||
cls: [5703]
|
|
||||||
category: "Improvements"
|
|
||||||
credits: [horrors]
|
|
||||||
issues: []
|
|
||||||
---
|
|
||||||
|
|
||||||
The REPL now uses [rustyline](https://github.com/kkawakam/rustyline) for input processing instead
|
|
||||||
of editline. This comes with some improvements to REPL behavior: wrapping lines no longer confuse
|
|
||||||
the line editor, unicode is fully supported, pasting multiline expressions is noew possible, even
|
|
||||||
undo commands are now available! We plan to improve the REPL further using these newfound powers.
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Hash mismatch diagnostics now work with `structuredAttrs`"
|
|
||||||
issues: [fj#1175]
|
|
||||||
cls: [5441]
|
|
||||||
category: Fixes
|
|
||||||
credits: [keysmashes]
|
|
||||||
---
|
|
||||||
|
|
||||||
Nixpkgs fetchers like `fetchurl` now use `structuredAttrs`, which broke the
|
|
||||||
hash mismatch diagnostics added in Lix 2.91. This has been fixed and the likely
|
|
||||||
URL is now shown again.
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Changes to `flake.nix` validation"
|
|
||||||
cls: [5523]
|
|
||||||
category: "Breaking Changes"
|
|
||||||
credits: [piegames, Qyriad, horrors]
|
|
||||||
issues: [gh#4945]
|
|
||||||
---
|
|
||||||
|
|
||||||
Flakes try to keep their inputs and metadata "simple", to make sure no unbounded computation may happen when calling e.g. `nix flake show`.
|
|
||||||
Those checks were haphazard, a maintenance burden, and also easily circumventable.
|
|
||||||
|
|
||||||
Lix has now replaced all the old checks by a simple rule: **No function calls outside of `outputs`.**
|
|
||||||
This is easier to reason about than the previous set of inconsistent rules, and crucially now also allows syntax features that users felt like they *should* have worked in the past, like let bindings.
|
|
||||||
However, some warts still remain for now: Some syntax constructs like `-1` internally desugar to `__sub 0 1`, which is a function call and thus remains forbidden.
|
|
||||||
This will be rectified as soon as the deprecation period of the respective anti-features has been completed.
|
|
||||||
|
|
||||||
This change is **breaking** in the sense that flakes which are written with the newly allowed language features will not evaluate with an older Lix version which still uses the old, more restrictive checks.
|
|
||||||
Crucially, this also affects **all transitive dependants** of such Flakes.
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Fix unsigned overflow leading to out-of-band write in the NAR parser"
|
|
||||||
cls: [5554]
|
|
||||||
category: "Fixes"
|
|
||||||
credits: [horrors, raito, edef, sandydoo]
|
|
||||||
issues: []
|
|
||||||
---
|
|
||||||
|
|
||||||
The NAR parser contained an unsigned integer overflow that could be used by an
|
|
||||||
attacker to write arbitrary data to an unknown memory location and possibly
|
|
||||||
achieve code execution. A successful attack on the system-wide Lix daemon
|
|
||||||
could lead to privilege escalation to root. Any process that involves NAR
|
|
||||||
serialization could trigger this issue, including (but not limited to)
|
|
||||||
|
|
||||||
- local user interaction, whether the users are trusted or untrusted
|
|
||||||
- malicious substituters sending malformed NARs
|
|
||||||
- remote builders sending malformed build results
|
|
||||||
- remote daemons sending malformed inputs when requesting remote builds
|
|
||||||
|
|
||||||
Successful attacks using this bug require ASLR weakening of some sort, whether
|
|
||||||
by architecture constraints (e.g. on 32 bit systems, where little randomization
|
|
||||||
is possible) or system configuration (e.g. low ASLR entropy when loading
|
|
||||||
libraries), and millions of attempts. Local attacks can be mounted in less than
|
|
||||||
an hour. Remote builds typically require a fresh SSH connection for each build
|
|
||||||
and are thus less susceptible. Only one attempt can be made by substituters for
|
|
||||||
every build using substituters, they are thus not a likely vector for attacks.
|
|
||||||
|
|
||||||
At the time of writing, MITRE has not assigned this a CVE yet.
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
---
|
|
||||||
synopsis: "Always print frames from `addErrorContext` in error traces"
|
|
||||||
cls: [5847]
|
|
||||||
category: "Improvements"
|
|
||||||
credits: [blokyk]
|
|
||||||
issues: []
|
|
||||||
---
|
|
||||||
|
|
||||||
The [`builtins.addErrorContext`](@docroot@/language/builtins.md#builtins-addErrorContext)
|
|
||||||
function allows an author to add artificial stack frames with custom messages to
|
|
||||||
help end-users understand the context of an error and the path the code took to
|
|
||||||
get there, without having to read and understand the original source code. A
|
|
||||||
particularly notable user of this is the Nixpkgs module system, which adds
|
|
||||||
custom frames detailing what option it's evaluating or which definition it's
|
|
||||||
looking at.
|
|
||||||
|
|
||||||
However, previously, these frames would end up treated just as any other,
|
|
||||||
meaning they would most often not be visible without `--show-trace`; yet, using
|
|
||||||
`--show-trace`, they would be drowned out in the noise of the hundreds of other
|
|
||||||
frames, rendering them just as unusable.
|
|
||||||
|
|
||||||
With this change, these frames are now unconditionally shown, even without
|
|
||||||
`--show-trace`, which makes basic error traces much more informative.
|
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
- [Basic Package Management](package-management/basic-package-mgmt.md)
|
- [Basic Package Management](package-management/basic-package-mgmt.md)
|
||||||
- [Profiles](package-management/profiles.md)
|
- [Profiles](package-management/profiles.md)
|
||||||
- [Garbage Collection](package-management/garbage-collection.md)
|
- [Garbage Collection](package-management/garbage-collection.md)
|
||||||
|
- [Garbage Collector Roots](package-management/garbage-collector-roots.md)
|
||||||
- [Sharing Packages Between Machines](package-management/sharing-packages.md)
|
- [Sharing Packages Between Machines](package-management/sharing-packages.md)
|
||||||
- [Serving a Nix store via HTTP](package-management/binary-cache-substituter.md)
|
- [Serving a Nix store via HTTP](package-management/binary-cache-substituter.md)
|
||||||
- [Copying Closures via SSH](package-management/copy-closure.md)
|
- [Copying Closures via SSH](package-management/copy-closure.md)
|
||||||
@@ -39,9 +40,6 @@
|
|||||||
- [Tuning Cores and Jobs](advanced-topics/cores-vs-jobs.md)
|
- [Tuning Cores and Jobs](advanced-topics/cores-vs-jobs.md)
|
||||||
- [Verifying Build Reproducibility](advanced-topics/diff-hook.md)
|
- [Verifying Build Reproducibility](advanced-topics/diff-hook.md)
|
||||||
- [Using the `post-build-hook`](advanced-topics/post-build-hook.md)
|
- [Using the `post-build-hook`](advanced-topics/post-build-hook.md)
|
||||||
- [Pasta](advanced-topics/pasta.md)
|
|
||||||
- [Known Issues](known-issues/known-issues.md)
|
|
||||||
- [Limitations around non-isolated builds](known-issues/non-isolated-build-limits.md)
|
|
||||||
- [Command Reference](command-ref/command-ref.md)
|
- [Command Reference](command-ref/command-ref.md)
|
||||||
- [Common Options](command-ref/opt-common.md)
|
- [Common Options](command-ref/opt-common.md)
|
||||||
- [Common Environment Variables](command-ref/env-common.md)
|
- [Common Environment Variables](command-ref/env-common.md)
|
||||||
@@ -194,17 +192,11 @@
|
|||||||
- [Hacking](contributing/hacking.md)
|
- [Hacking](contributing/hacking.md)
|
||||||
- [Testing](contributing/testing.md)
|
- [Testing](contributing/testing.md)
|
||||||
- [Experimental Features](contributing/experimental-features.md)
|
- [Experimental Features](contributing/experimental-features.md)
|
||||||
- [Deprecated Features](contributing/deprecated-features.md)
|
|
||||||
- [CLI guideline](contributing/cli-guideline.md)
|
- [CLI guideline](contributing/cli-guideline.md)
|
||||||
- [C++ style guide](contributing/cxx.md)
|
- [C++ style guide](contributing/cxx.md)
|
||||||
- [Release Notes](release-notes/release-notes.md)
|
- [Release Notes](release-notes/release-notes.md)
|
||||||
- [Upcoming release](release-notes/rl-next.md)
|
- [Upcoming release](release-notes/rl-next.md)
|
||||||
<!-- RELENG-AUTO-INSERTION-MARKER (see releng/release_notes.py) -->
|
<!-- RELENG-AUTO-INSERTION-MARKER (see releng/release_notes.py) -->
|
||||||
- [Lix 2.95 (2026-03-13)](release-notes/rl-2.95.md)
|
|
||||||
- [Lix 2.94 (2025-11-17)](release-notes/rl-2.94.md)
|
|
||||||
- [Lix 2.93 (2025-05-09)](release-notes/rl-2.93.md)
|
|
||||||
- [Lix 2.92 (2025-01-18)](release-notes/rl-2.92.md)
|
|
||||||
- [Lix 2.91 (2024-08-12)](release-notes/rl-2.91.md)
|
|
||||||
- [Lix 2.90 (2024-07-10)](release-notes/rl-2.90.md)
|
- [Lix 2.90 (2024-07-10)](release-notes/rl-2.90.md)
|
||||||
- [Nix 2.18 (2023-09-20)](release-notes/rl-2.18.md)
|
- [Nix 2.18 (2023-09-20)](release-notes/rl-2.18.md)
|
||||||
- [Nix 2.17 (2023-07-24)](release-notes/rl-2.17.md)
|
- [Nix 2.17 (2023-07-24)](release-notes/rl-2.17.md)
|
||||||
|
|||||||
@@ -41,17 +41,104 @@ contains Nix.
|
|||||||
> If you are building via the Lix daemon (default on Linux and macOS), it is the Lix daemon user account (that is, `root`) that should have SSH access to a user (not necessarily `root`) on the remote machine.
|
> If you are building via the Lix daemon (default on Linux and macOS), it is the Lix daemon user account (that is, `root`) that should have SSH access to a user (not necessarily `root`) on the remote machine.
|
||||||
>
|
>
|
||||||
> Furthermore, `root` needs to have the public host keys for the remote system in its `.ssh/known_hosts`.
|
> Furthermore, `root` needs to have the public host keys for the remote system in its `.ssh/known_hosts`.
|
||||||
> To add them to `known_hosts` for root, do `ssh-keyscan HOST | sudo tee -a ~root/.ssh/known_hosts`.
|
> To add them to `known_hosts` for root, do `ssh-keyscan USER@HOST | sudo tee -a ~root/.ssh/known_hosts`.
|
||||||
>
|
>
|
||||||
> If you can’t or don’t want to configure `root` to be able to access the remote machine, you can use a private Nix store instead by passing e.g. `--store ~/my-nix` when running a Nix command from the local machine.
|
> If you can’t or don’t want to configure `root` to be able to access the remote machine, you can use a private Nix store instead by passing e.g. `--store ~/my-nix` when running a Nix command from the local machine.
|
||||||
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
The list of remote machines can be specified on the command line or in
|
The list of remote machines can be specified on the command line or in
|
||||||
the Lix configuration file. The former is convenient for testing.
|
the Lix configuration file. The former is convenient for testing. For
|
||||||
Additionally, there are two supported formats to configure remote builders:
|
example, the following command allows you to build a derivation for
|
||||||
The legacy, "space"-separated format and starting with Lix 2.95.0, a TOML.
|
`x86_64-darwin` on a Linux machine:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ uname
|
||||||
|
Linux
|
||||||
|
|
||||||
|
$ nix build --impure \
|
||||||
|
--expr '(with import <nixpkgs> { system = "x86_64-darwin"; }; runCommand "foo" {} "uname > $out")' \
|
||||||
|
--builders 'ssh://mac x86_64-darwin'
|
||||||
|
[1/0/1 built, 0.0 MiB DL] building foo on ssh://mac
|
||||||
|
|
||||||
|
$ cat ./result
|
||||||
|
Darwin
|
||||||
|
```
|
||||||
|
|
||||||
|
It is possible to specify multiple builders separated by a semicolon or
|
||||||
|
a newline, e.g.
|
||||||
|
|
||||||
|
```console
|
||||||
|
--builders 'ssh://mac x86_64-darwin ; ssh://beastie x86_64-freebsd'
|
||||||
|
```
|
||||||
|
|
||||||
|
Each machine specification consists of the following elements, separated
|
||||||
|
by spaces. Only the first element is required. To leave a field at its
|
||||||
|
default, set it to `-`.
|
||||||
|
|
||||||
|
1. The URI of the remote store in the format
|
||||||
|
`ssh://[username@]hostname`, e.g. `ssh://nix@mac` or `ssh://mac`.
|
||||||
|
For backward compatibility, `ssh://` may be omitted. The hostname
|
||||||
|
may be an alias defined in your `~/.ssh/config`.
|
||||||
|
|
||||||
|
2. A comma-separated list of Nix platform type identifiers, such as
|
||||||
|
`x86_64-darwin`. It is possible for a machine to support multiple
|
||||||
|
platform types, e.g., `i686-linux,x86_64-linux`. If omitted, this
|
||||||
|
defaults to the local platform type.
|
||||||
|
|
||||||
|
3. The SSH identity file to be used to log in to the remote machine. If
|
||||||
|
omitted, SSH will use its regular identities.
|
||||||
|
|
||||||
|
4. The maximum number of builds that Lix will execute in parallel on
|
||||||
|
the machine. Typically this should be equal to the number of CPU
|
||||||
|
cores. For instance, the machine `itchy` in the example will execute
|
||||||
|
up to 8 builds in parallel.
|
||||||
|
|
||||||
|
5. The “speed factor”, indicating the relative speed of the machine. If
|
||||||
|
there are multiple machines of the right type, Lix will prefer the
|
||||||
|
fastest, taking load into account.
|
||||||
|
|
||||||
|
6. A comma-separated list of *supported features*. If a derivation has
|
||||||
|
the `requiredSystemFeatures` attribute, then Lix will only perform
|
||||||
|
the derivation on a machine that has the specified features. For
|
||||||
|
instance, the attribute
|
||||||
|
|
||||||
|
```nix
|
||||||
|
requiredSystemFeatures = [ "kvm" ];
|
||||||
|
```
|
||||||
|
|
||||||
|
will cause the build to be performed on a machine that has the `kvm`
|
||||||
|
feature.
|
||||||
|
|
||||||
|
7. A comma-separated list of *mandatory features*. A machine will only
|
||||||
|
be used to build a derivation if all of the machine’s mandatory
|
||||||
|
features appear in the derivation’s `requiredSystemFeatures`
|
||||||
|
attribute.
|
||||||
|
|
||||||
|
8. The (base64-encoded) public host key of the remote machine. If omitted, SSH
|
||||||
|
will use its regular known-hosts file. Specifically, the field is calculated
|
||||||
|
via `base64 -w0 /etc/ssh/ssh_host_ed25519_key.pub`.
|
||||||
|
|
||||||
|
For example, the machine specification
|
||||||
|
|
||||||
|
nix@scratchy.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 1 kvm
|
||||||
|
nix@itchy.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 2
|
||||||
|
nix@poochie.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 1 2 kvm benchmark
|
||||||
|
|
||||||
|
specifies several machines that can perform `i686-linux` builds.
|
||||||
|
However, `poochie` will only do builds that have the attribute
|
||||||
|
|
||||||
|
```nix
|
||||||
|
requiredSystemFeatures = [ "benchmark" ];
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```nix
|
||||||
|
requiredSystemFeatures = [ "benchmark" "kvm" ];
|
||||||
|
```
|
||||||
|
|
||||||
|
`itchy` cannot do builds that require `kvm`, but `scratchy` does support
|
||||||
|
such builds. For regular builds, `itchy` will be preferred over
|
||||||
|
`scratchy` because it has a higher speed factor.
|
||||||
|
|
||||||
Remote builders can also be configured in `nix.conf`, e.g.
|
Remote builders can also be configured in `nix.conf`, e.g.
|
||||||
|
|
||||||
@@ -70,180 +157,3 @@ option `builders-use-substitutes` in your local `nix.conf`.
|
|||||||
|
|
||||||
To build only on remote builders and disable building on the local
|
To build only on remote builders and disable building on the local
|
||||||
machine, you can use the option `--max-jobs 0`.
|
machine, you can use the option `--max-jobs 0`.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Each machine specification consists of the following attributes.
|
|
||||||
How those are combined within the configuration file differs for the formats, and will be explained further down.
|
|
||||||
|
|
||||||
1. `uri` (**required**)
|
|
||||||
The URI of the remote store in the format
|
|
||||||
`ssh[-ng]://[username@]hostname[?port=<port>]`, e.g. `ssh://nix@mac` or `ssh://mac`.
|
|
||||||
If the ssh server is not listening on port 22 (e.g. port 1337 in this case)
|
|
||||||
the URI would be `ssh[-ng]://nix@mac?port=1337`. The hostname
|
|
||||||
may be an alias defined in your `~/.ssh/config`.
|
|
||||||
|
|
||||||
2. `system-types` (**optional**)
|
|
||||||
A list of Nix platform type identifiers, such as
|
|
||||||
`x86_64-darwin`. It is possible for a machine to support multiple
|
|
||||||
platform types, e.g., `i686-linux` and `x86_64-linux`.
|
|
||||||
|
|
||||||
Defaults to the local platform type
|
|
||||||
|
|
||||||
3. `ssh-key` (**optional**)
|
|
||||||
The SSH identity file to be used to log in to the remote machine.
|
|
||||||
|
|
||||||
Defaults to SSHs regular identities.
|
|
||||||
|
|
||||||
4. `jobs` (**optional**)
|
|
||||||
The maximum number of builds that Lix will execute in parallel on
|
|
||||||
the machine. Typically, this should be equal to the number of CPU
|
|
||||||
cores divided by the cores within the target machines configuration, i.e. `jobs * cores ~= cpu cores`
|
|
||||||
|
|
||||||
Defaults to 1; must be a positive integer.
|
|
||||||
|
|
||||||
5. `speed-factor`
|
|
||||||
The “speed factor”, indicating the relative speed of the machine. If
|
|
||||||
there are multiple machines of the right type, Lix will prefer the
|
|
||||||
fastest, taking load into account.
|
|
||||||
|
|
||||||
Defaults to 1; must be a positive float.
|
|
||||||
|
|
||||||
6. `supported-features` (**optional**)
|
|
||||||
A list of *supported features*. If a derivation has
|
|
||||||
the `requiredSystemFeatures` attribute, then Lix will only schedule
|
|
||||||
the derivation on a machine that has the specified features. For
|
|
||||||
example, the attribute
|
|
||||||
|
|
||||||
```nix
|
|
||||||
requiredSystemFeatures = [ "kvm" ];
|
|
||||||
```
|
|
||||||
|
|
||||||
will cause the build to be performed on a machine that has the `kvm`
|
|
||||||
feature.
|
|
||||||
|
|
||||||
Defaults to an empty list.
|
|
||||||
|
|
||||||
7. `mandatory-features` (**optional**)
|
|
||||||
A list of *mandatory features*. A machine will only
|
|
||||||
be used to build a derivation if all the machine’s mandatory
|
|
||||||
features appear in the derivation’s `requiredSystemFeatures`
|
|
||||||
attribute.
|
|
||||||
|
|
||||||
Defaults to an empty list.
|
|
||||||
|
|
||||||
8. `ssh-public-host-key` (**optional**)
|
|
||||||
The public host key of the remote machine.
|
|
||||||
|
|
||||||
Defaults to basic ssh behavior (checking contents of the known-hosts file)
|
|
||||||
|
|
||||||
|
|
||||||
### Using a TOML configuration
|
|
||||||
|
|
||||||
Each machine is configured as an attribute within the map called `machines`.
|
|
||||||
The attributes name is the machines name.
|
|
||||||
Attributes can be in any order.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
```toml
|
|
||||||
version = 1
|
|
||||||
|
|
||||||
[machines.andesite]
|
|
||||||
uri = "ssh://lix@andesite.lix.systems" # toml also allows for comments
|
|
||||||
system-types = ["i686-linux"]
|
|
||||||
jobs = 8
|
|
||||||
speed-factor = 1.0
|
|
||||||
supported-features = ["kvm"]
|
|
||||||
ssh-key = "/home/deepslate/.ssh/id_ed25519"
|
|
||||||
|
|
||||||
[machines.diorite]
|
|
||||||
uri = "ssh://lix@diorite.lix.systems"
|
|
||||||
system-types = ["i686-linux"]
|
|
||||||
jobs = 8
|
|
||||||
speed-factor = 2.0
|
|
||||||
ssh-key = "/home/deepslate/.ssh/id_ed25519"
|
|
||||||
|
|
||||||
[machines.granite]
|
|
||||||
uri = "ssh://lix@granite.lix.systems"
|
|
||||||
system-types = ["i686-linux"]
|
|
||||||
jobs = 1
|
|
||||||
speed-factor = 2.0
|
|
||||||
supported-features = ["kvm", "benchmark"]
|
|
||||||
ssh-key = "/home/deepslate/.ssh/id_ed25519"
|
|
||||||
|
|
||||||
[machines.legacy]
|
|
||||||
uri = "ssh://nix@nix-15-11.nixos.org"
|
|
||||||
enable = false
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> If the version tag is omitted (e.g. in the CLI), it defaults to the latest version.
|
|
||||||
> It is strongly recommended to always provide a version tag for configuration within files to avoid breakage.
|
|
||||||
|
|
||||||
For testing purposes, one can also define a builder ad hoc on the CLI as follows:
|
|
||||||
`--builders 'machines.andesite = {uri = "ssh://lix@andesite.lix.systems", jobs = 8}'`
|
|
||||||
|
|
||||||
|
|
||||||
#### Special handling of fields
|
|
||||||
- `enable` (**optional**)
|
|
||||||
If set to false, the declared machine will not be loaded.
|
|
||||||
This allows one to statically disable machines.
|
|
||||||
|
|
||||||
Defaults to true
|
|
||||||
|
|
||||||
### Using the legacy format
|
|
||||||
> **Warning**
|
|
||||||
>
|
|
||||||
> This format is frozen and new features / configuration options will not be backported to this format.
|
|
||||||
|
|
||||||
It is possible to specify multiple builders separated by a semicolon or
|
|
||||||
a newline, e.g.
|
|
||||||
|
|
||||||
```console
|
|
||||||
--builders 'ssh://mac x86_64-darwin ; ssh://beastie x86_64-freebsd'
|
|
||||||
```
|
|
||||||
|
|
||||||
Every machine specification consists of the elements listed in the section above, seperated by any amount of spaces or tabs.
|
|
||||||
The Attributes need to be provided **in order** and without names.
|
|
||||||
To leave a field at its default, set it to `-`.
|
|
||||||
Lists are colon seperated, without additional spaces.
|
|
||||||
|
|
||||||
```
|
|
||||||
lix@andesite.lix.systems i686-linux /home/deepslate/.ssh/id_ed25519 8 1 kvm
|
|
||||||
lix@diorite.lix.systems i686-linux /home/deepslate/.ssh/id_ed25519 8 2
|
|
||||||
lix@granite.lix.systems i686-linux /home/deepslate/.ssh/id_ed25519 1 2 kvm benchmark
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Special handling of fields
|
|
||||||
- `uri`: Due to backward compatibility, the `ssh://` may be omitted for the store-uri.
|
|
||||||
- `ssh-public-host-key`: The key must be provided encoded in base64. Specifically calculated via `base64 -w0 /etc/ssh/ssh_host_ed25519_key.pub`
|
|
||||||
|
|
||||||
|
|
||||||
### Format detection
|
|
||||||
|
|
||||||
At first, the given configuration is being parsed syntactically as a toml.
|
|
||||||
If parsing fails and the given configuration contains a `"` the error is presented to the user, as those characters are necessary for TOML, but disallowed for the legacy format.
|
|
||||||
Otherwise, parsing is retried using the legacy format.
|
|
||||||
If non-syntactic errors are detected within the toml, the exception will always be shown to the user directly.
|
|
||||||
|
|
||||||
|
|
||||||
## Builder selection
|
|
||||||
The configuration(s) above specify several machines that can perform `i686-linux` builds.
|
|
||||||
However, `granite` will only do builds that have the attribute
|
|
||||||
|
|
||||||
```nix
|
|
||||||
requiredSystemFeatures = [ "benchmark" ];
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```nix
|
|
||||||
requiredSystemFeatures = [ "benchmark" "kvm" ];
|
|
||||||
```
|
|
||||||
|
|
||||||
`diorite` cannot do builds that require `kvm`, but `andesite` does support
|
|
||||||
such builds. For regular builds, `diorite` will be preferred over
|
|
||||||
`andesite` because it has a higher speed factor.
|
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
# [Pasta](https://passt.top/passt/about/): a network sandbox for fixed-output derivations
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
|
|
||||||
This section only applies to **Linux systems** as Pasta is a Linux-only measure.
|
|
||||||
|
|
||||||
Since [CVE-2025-46416](https://lix.systems/blog/2025-06-24-lix-cves/), the Lix project decided to adopt [Pasta](https://passt.top/passt/about/) for all fixed-output derivations, protecting against various attack vectors such as UNIX abstract domain sockets or more manipulation at the network layer from a malicious fixed-output derivation code.
|
|
||||||
|
|
||||||
Pasta acts as a translation layer between a layer-2 network interface and layer-4 sockets (TCP, UDP, ICMP/ICMPv6 echo) on the host. It requires no special privileges and can serve as a alternative to [SLiRP](https://en.wikipedia.org/wiki/Slirp) which was used [by Guix to mitigate the same problem](https://codeberg.org/guix/guix/commit/fb42611b8f27960304db5a1c0d33b8371dcde2a8).
|
|
||||||
|
|
||||||
## How to disable Pasta?
|
|
||||||
|
|
||||||
It's sufficient to pass `pasta-path = ""` in your `/etc/nix/nix.conf` or on the command line `--pasta-path ""` of a Lix invocation.
|
|
||||||
|
|
||||||
## Known issues surrounding Pasta
|
|
||||||
|
|
||||||
- Only the first DNS server in `/etc/resolv.conf` is considered: failover is not possible.
|
|
||||||
- [Reduced feature set compared to the Linux kernel](https://passt.top/passt/about/#features)
|
|
||||||
- [Performance overhead in multi-gigabits contexts and IMIX MTUs](https://passt.top/passt/about/#performance_1)
|
|
||||||
@@ -22,9 +22,9 @@ The following [concept map] shows its main components (rectangles), the objects
|
|||||||
| |
|
| |
|
||||||
+----------|-------------------|--------------------------------+
|
+----------|-------------------|--------------------------------+
|
||||||
| Nix impl.| V |
|
| Nix impl.| V |
|
||||||
| (Lix) | +------------------------+ |
|
| (Lix) | +-------------------------+ |
|
||||||
| | | command line interface |------. |
|
| | | commmand line interface |------. |
|
||||||
| | +------------------------+ | |
|
| | +-------------------------+ | |
|
||||||
| | | | |
|
| | | | |
|
||||||
| evaluated by calls manages |
|
| evaluated by calls manages |
|
||||||
| | | | |
|
| | | | |
|
||||||
|
|||||||
@@ -34,15 +34,9 @@ keep-outputs = true # Nice for developers
|
|||||||
keep-derivations = true # Idem
|
keep-derivations = true # Idem
|
||||||
```
|
```
|
||||||
|
|
||||||
Other files can be included with a line like `include <path>`.
|
Other files can be included with a line like `include <path>`, where `<path>` is interpreted relative to the current configuration file.
|
||||||
A missing file is an error unless `!include` is used instead.
|
A missing file is an error unless `!include` is used instead.
|
||||||
|
|
||||||
Paths in `include`s and option values are interpreted relative to the current configuration file.
|
|
||||||
In user configuration files, paths starting with `~/` are tilde expanded (by replacing the tilde by the value of `$HOME`).
|
|
||||||
|
|
||||||
Only user configuration files (like `$XDG_CONFIG_HOME/nix/nix.conf` or the files listed in `$NIX_USER_CONF_FILES`) can use tilde paths relative to your home directory.
|
|
||||||
Configuration listed in the `$NIX_CONFIG` environment variable may not use relative paths.
|
|
||||||
|
|
||||||
A configuration setting usually overrides any previous value.
|
A configuration setting usually overrides any previous value.
|
||||||
However, for settings that take a list of items, you can prefix the name of the setting by `extra-` to *append* to the previous value.
|
However, for settings that take a list of items, you can prefix the name of the setting by `extra-` to *append* to the previous value.
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
<!--
|
|
||||||
File-ish argument syntax summary.
|
|
||||||
This file gets included into pages like nix-build.md and nix-instantiate.md, and each individual page that includes
|
|
||||||
this also links to nix-build.md for the full explanation.
|
|
||||||
-->
|
|
||||||
- A normal filesystem path, like `/home/meow/nixfiles/default.nix`
|
|
||||||
- Or a directory, like `/home/meow/nixfiles`, equivalent to above
|
|
||||||
- A single lookup path, like `<nixpkgs>` or `<nixos>`
|
|
||||||
- A URL to a tarball, like `https://github.com/NixOS/nixpkgs/archive/refs/heads/release-23.11.tar.gz`
|
|
||||||
- A [flakeref](@docroot@/command-ref/new-cli/nix3-flake.md#flake-references), introduced by the prefix `flake:`, like `flake:git+https://git.lix.systems/lix-project/lix`
|
|
||||||
- A *nixpkgs* channel tarball name, introduced by the prefix `channel:`, like `channel:nixos-unstable`.
|
|
||||||
- This uses a hard-coded URL pattern and is *not* related to the subscribed channels managed by the [nix-channel](@docroot@/command-ref/nix-channel.md) command.
|
|
||||||
@@ -1,3 +1,23 @@
|
|||||||
|
xp_features_json = custom_target(
|
||||||
|
command : [nix, '__dump-xp-features'],
|
||||||
|
capture : true,
|
||||||
|
output : 'xp-features.json',
|
||||||
|
)
|
||||||
|
|
||||||
|
experimental_features_shortlist_md = custom_target(
|
||||||
|
command : nix_eval_for_docs + [
|
||||||
|
'--expr',
|
||||||
|
'import @INPUT0@ (builtins.fromJSON (builtins.readFile @INPUT1@))',
|
||||||
|
],
|
||||||
|
input : [
|
||||||
|
'../../generate-xp-features-shortlist.nix',
|
||||||
|
xp_features_json,
|
||||||
|
],
|
||||||
|
capture : true,
|
||||||
|
output : 'experimental-features-shortlist.md',
|
||||||
|
env : nix_env_for_docs,
|
||||||
|
)
|
||||||
|
|
||||||
# Intermediate step for manpage generation.
|
# Intermediate step for manpage generation.
|
||||||
# This splorks the output of generate-manpage.nix as JSON,
|
# This splorks the output of generate-manpage.nix as JSON,
|
||||||
# which gets written as a directory tree below.
|
# which gets written as a directory tree below.
|
||||||
@@ -31,23 +51,16 @@ nix3_cli_files = custom_target(
|
|||||||
|
|
||||||
conf_file_md = custom_target(
|
conf_file_md = custom_target(
|
||||||
command : [
|
command : [
|
||||||
python.full_path(),
|
nix_eval_for_docs,
|
||||||
'@SOURCE_ROOT@/lix/code-generation/build_settings.py',
|
'--expr',
|
||||||
'--kernel', host_machine.system(),
|
'(import @INPUT0@).showSettings { inlineHTML = true; } (builtins.fromJSON (builtins.readFile @INPUT1@))',
|
||||||
'--docs', '@OUTPUT@',
|
|
||||||
'--experimental-features', '@SOURCE_ROOT@/lix/libutil/experimental-features',
|
|
||||||
'@INPUT@',
|
|
||||||
],
|
],
|
||||||
|
capture : true,
|
||||||
input : [
|
input : [
|
||||||
libexpr_setting_definitions,
|
'../../utils.nix',
|
||||||
libfetchers_setting_definitions,
|
conf_file_json,
|
||||||
file_transfer_setting_definitions,
|
experimental_features_shortlist_md,
|
||||||
libstore_setting_definitions,
|
|
||||||
archive_setting_definitions,
|
|
||||||
feature_setting_definitions,
|
|
||||||
logging_setting_definitions,
|
|
||||||
daemon_setting_definitions,
|
|
||||||
develop_settings_definitions,
|
|
||||||
],
|
],
|
||||||
output : 'conf-file.md',
|
output : 'conf-file.md',
|
||||||
|
env : nix_env_for_docs,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# Synopsis
|
# Synopsis
|
||||||
|
|
||||||
`nix-build` [*fileish…*]
|
`nix-build` [*paths…*]
|
||||||
[`--arg` *name* *value*]
|
[`--arg` *name* *value*]
|
||||||
[`--argstr` *name* *value*]
|
[`--argstr` *name* *value*]
|
||||||
[{`--attr` | `-A`} *attrPath*]
|
[{`--attr` | `-A`} *attrPath*]
|
||||||
@@ -20,55 +20,19 @@ For documentation on the latter, run `nix build --help` or see `man nix3-build`.
|
|||||||
# Description
|
# Description
|
||||||
|
|
||||||
The `nix-build` command builds the derivations described by the Nix
|
The `nix-build` command builds the derivations described by the Nix
|
||||||
expressions in each *fileish*. If the build succeeds, it places a symlink to
|
expressions in *paths*. If the build succeeds, it places a symlink to
|
||||||
the result in the current directory. The symlink is called `result`. If
|
the result in the current directory. The symlink is called `result`. If
|
||||||
there are multiple Nix expressions, or the Nix expressions evaluate to
|
there are multiple Nix expressions, or the Nix expressions evaluate to
|
||||||
multiple derivations, multiple sequentially numbered symlinks are
|
multiple derivations, multiple sequentially numbered symlinks are
|
||||||
created (`result`, `result-2`, and so on).
|
created (`result`, `result-2`, and so on).
|
||||||
|
|
||||||
If no *fileish* is specified, then `nix-build` will use `default.nix` in
|
If no *paths* are specified, then `nix-build` will use `default.nix` in
|
||||||
the current directory, if it exists.
|
the current directory, if it exists.
|
||||||
|
|
||||||
## Fileish Syntax
|
If an element of *paths* starts with `http://` or `https://`, it is
|
||||||
|
interpreted as the URL of a tarball that will be downloaded and unpacked
|
||||||
A given *fileish* may take one of a few different forms, the first being a simple filesystem path, e.g. `nix-build /tmp/some-file.nix`.
|
to a temporary location. The tarball must include a single top-level
|
||||||
Like the [import builtin](../language/builtins.md#builtins-import) specifying a directory is equivalent to specifying `default.nix` within that directory.
|
directory containing at least a file named `default.nix`.
|
||||||
It may also be a [search path](./env-common.md#env-NIX_PATH) (also known as a lookup path) like `<nixpkgs>`, which is convenient to use with `--attr`/`-A`:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ nix-build '<nixpkgs>' -A firefox
|
|
||||||
```
|
|
||||||
|
|
||||||
(Note the quotation marks around `<nixpkgs>`, which will be necessary in most Unix shells.)
|
|
||||||
|
|
||||||
If a *fileish* starts with `http://` or `https://`, it is interpreted as the URL of a tarball which will be fetched and unpacked.
|
|
||||||
Lix will then `import` the unpacked directory, so these tarballs must include at least a single top-level directory with a file called `default.nix`
|
|
||||||
For example, you could build from a specific version of Nixpkgs with something like:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ nix-build "https://github.com/NixOS/nixpkgs/archive/refs/heads/release-23.11.tar.gz" -A firefox
|
|
||||||
```
|
|
||||||
|
|
||||||
If a path starts with `flake:`, the rest of the argument is interpreted as a [flakeref](./new-cli/nix3-flake.md#flake-references) (see `nix flake --help` or `man nix3-flake`), which requires the "flakes" experimental feature to be enabled.
|
|
||||||
Lix will fetch the flake, and then `import` its unpacked directory, so the flake must include a file called `default.nix`.
|
|
||||||
For example, the flake analogues to the above `nix-build` commands are:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ nix-build flake:nixpkgs -A firefox
|
|
||||||
$ nix-build flake:github:NixOS/nixpkgs/release-23.11 -A firefox
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, for legacy reasons, if a path starts with `channel:`, the rest of the argument is interpreted as the name of a *nixpkgs* channel tarball to fetch from `https://channels.nixos.org/$CHANNEL_NAME/nixexprs.tar.xz`.
|
|
||||||
This is a **hard coded URL** pattern and is *not* related to the subscribed channels managed by the [nix-channel](./nix-channel.md) command.
|
|
||||||
|
|
||||||
> **Note**: any of the special syntaxes may always be disambiguated by prefixing the path.
|
|
||||||
> For example: a file in the current directory literally called `<nixpkgs>` can be addressed as `./<nixpkgs>`, to escape the special interpretation.
|
|
||||||
|
|
||||||
In summary, a path argument may be one of:
|
|
||||||
|
|
||||||
{{#include ./fileish-summary.md}}
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
`nix-build` is essentially a wrapper around
|
`nix-build` is essentially a wrapper around
|
||||||
[`nix-instantiate`](nix-instantiate.md) (to translate a high-level Nix
|
[`nix-instantiate`](nix-instantiate.md) (to translate a high-level Nix
|
||||||
|
|||||||
@@ -11,10 +11,10 @@
|
|||||||
Channels are a mechanism for referencing remote Nix expressions and conveniently retrieving their latest version.
|
Channels are a mechanism for referencing remote Nix expressions and conveniently retrieving their latest version.
|
||||||
|
|
||||||
The moving parts of channels are:
|
The moving parts of channels are:
|
||||||
- The official channels listed at <https://channels.nixos.org>
|
- The official channels listed at <https://nixos.org/channels>
|
||||||
- The user-specific list of [subscribed channels](#subscribed-channels)
|
- The user-specific list of [subscribed channels](#subscribed-channels)
|
||||||
- The [downloaded channel contents](#channels)
|
- The [downloaded channel contents](#channels)
|
||||||
- The [Nix expression search path](@docroot@/command-ref/conf-file.md#conf-nix-path), set with the [`-I` option](#opt-I) or the [`NIX_PATH` environment variable](#env-NIX_PATH)
|
- The [Nix expression search path](@docroot@/command-ref/conf-file.md#conf-nix-path), set with the [`-I` option](#opt-i) or the [`NIX_PATH` environment variable](#env-NIX_PATH)
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
@@ -77,9 +77,9 @@ This command has the following operations:
|
|||||||
Subscribe to the Nixpkgs channel and run `hello` from the GNU Hello package:
|
Subscribe to the Nixpkgs channel and run `hello` from the GNU Hello package:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ nix-channel --add https://channels.nixos.org/nixpkgs-unstable
|
$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable
|
||||||
$ nix-channel --list
|
$ nix-channel --list
|
||||||
nixpkgs https://channels.nixos.org/nixpkgs
|
nixpkgs https://nixos.org/channels/nixpkgs
|
||||||
$ nix-channel --update
|
$ nix-channel --update
|
||||||
$ nix-shell -p hello --run hello
|
$ nix-shell -p hello --run hello
|
||||||
hello
|
hello
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ Instead, it looks in a few locations, and acts on all profiles it finds there:
|
|||||||
>
|
>
|
||||||
> Not stable; subject to change
|
> Not stable; subject to change
|
||||||
>
|
>
|
||||||
> Do not rely on this functionality; it just exists for migration purposes and may change in the future.
|
> Do not rely on this functionality; it just exists for migration purposes and is may change in the future.
|
||||||
> These deprecated paths remain a private implementation detail of Lix.
|
> These deprecated paths remain a private implementation detail of Lix.
|
||||||
|
|
||||||
<!-- FIXME(Qyriad): this is inconsistent with https://git.lix.systems/lix-project/lix/issues/215, needs updating when that happens -->
|
<!-- FIXME(Qyriad): this is inconsistent with https://git.lix.systems/lix-project/lix/issues/215, needs updating when that happens -->
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
[`--option` *name* *value*]
|
[`--option` *name* *value*]
|
||||||
[`--arg` *name* *value*]
|
[`--arg` *name* *value*]
|
||||||
[`--argstr` *name* *value*]
|
[`--argstr` *name* *value*]
|
||||||
[{`--file` | `-f`} *fileish*]
|
[{`--file` | `-f`} *path*]
|
||||||
[{`--profile` | `-p`} *path*]
|
[{`--profile` | `-p`} *path*]
|
||||||
[`--system-filter` *system*]
|
[`--system-filter` *system*]
|
||||||
[`--dry-run`]
|
[`--dry-run`]
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ This operation deletes the specified generations of the current profile.
|
|||||||
>
|
>
|
||||||
> Older *and newer* generations will be deleted by this operation.
|
> Older *and newer* generations will be deleted by this operation.
|
||||||
>
|
>
|
||||||
> One might expect this to just delete older generations than the current one, but that is only true if the current generation is also the latest.
|
> One might expect this to just delete older generations than the curent one, but that is only true if the current generation is also the latest.
|
||||||
> Because one can roll back to a previous generation, it is possible to have generations newer than the current one.
|
> Because one can roll back to a previous generation, it is possible to have generations newer than the current one.
|
||||||
> They will also be deleted.
|
> They will also be deleted.
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
[`--from-profile` *path*]
|
[`--from-profile` *path*]
|
||||||
[`--preserve-installed` | `-P`]
|
[`--preserve-installed` | `-P`]
|
||||||
[`--remove-all` | `-r`]
|
[`--remove-all` | `-r`]
|
||||||
[`--priority` *priority*]
|
|
||||||
|
|
||||||
# Description
|
# Description
|
||||||
|
|
||||||
@@ -60,11 +59,6 @@ a number of possible ways:
|
|||||||
unambiguous way, which is necessary if there are multiple
|
unambiguous way, which is necessary if there are multiple
|
||||||
derivations with the same name.
|
derivations with the same name.
|
||||||
|
|
||||||
- If `--priority` *priority* is given, the priority of the derivations being
|
|
||||||
installed is set to *priority*. This can be used to override the priority of
|
|
||||||
the derivations being installed. This is useful if *args* are store paths,
|
|
||||||
which don't have any priority information.
|
|
||||||
|
|
||||||
- If *args* are [store derivations](@docroot@/glossary.md#gloss-store-derivation), then these are
|
- If *args* are [store derivations](@docroot@/glossary.md#gloss-store-derivation), then these are
|
||||||
[realised](@docroot@/command-ref/nix-store/realise.md), and the resulting output paths
|
[realised](@docroot@/command-ref/nix-store/realise.md), and the resulting output paths
|
||||||
are installed.
|
are installed.
|
||||||
@@ -148,8 +142,8 @@ To copy the store path with symbolic name `gcc` from another profile:
|
|||||||
$ nix-env --install --from-profile /nix/var/nix/profiles/foo gcc
|
$ nix-env --install --from-profile /nix/var/nix/profiles/foo gcc
|
||||||
```
|
```
|
||||||
|
|
||||||
To install a specific [store derivation](@docroot@/glossary.md#gloss-store-derivation)
|
To install a specific [store derivation] (typically created by
|
||||||
(typically created by `nix-instantiate`):
|
`nix-instantiate`):
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ nix-env --install /nix/store/fibjb1bfbpm5mrsxc4mh2d8n37sxh91i-gcc-3.4.3.drv
|
$ nix-env --install /nix/store/fibjb1bfbpm5mrsxc4mh2d8n37sxh91i-gcc-3.4.3.drv
|
||||||
|
|||||||
@@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
The following options are allowed for all `nix-env` operations, but may not always have an effect.
|
The following options are allowed for all `nix-env` operations, but may not always have an effect.
|
||||||
|
|
||||||
- `--file` / `-f` *fileish*\
|
- `--file` / `-f` *path*\
|
||||||
Specifies the Nix expression (designated below as the *active Nix
|
Specifies the Nix expression (designated below as the *active Nix
|
||||||
expression*) used by the `--install`, `--upgrade`, and `--query
|
expression*) used by the `--install`, `--upgrade`, and `--query
|
||||||
--available` operations to obtain derivations. The default is
|
--available` operations to obtain derivations. The default is
|
||||||
`~/.nix-defexpr`.
|
`~/.nix-defexpr`.
|
||||||
|
|
||||||
*fileish* is interpreted the same as with [nix-build](../nix-build.md#fileish-syntax).
|
If the argument starts with `http://` or `https://`, it is
|
||||||
See that section for complete details (`nix-build --help`), but in summary, a path argument may be one of:
|
interpreted as the URL of a tarball that will be downloaded and
|
||||||
|
unpacked to a temporary location. The tarball must include a single
|
||||||
{{#include ../fileish-summary.md}}
|
top-level directory containing at least a file named `default.nix`.
|
||||||
|
|
||||||
- `--profile` / `-p` *path*\
|
- `--profile` / `-p` *path*\
|
||||||
Specifies the profile to be used by those operations that operate on
|
Specifies the profile to be used by those operations that operate on
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ left untouched; this is not an error. It is also not an error if an
|
|||||||
element of *args* matches no installed derivations.
|
element of *args* matches no installed derivations.
|
||||||
|
|
||||||
For a description of how *args* is mapped to a set of store paths, see
|
For a description of how *args* is mapped to a set of store paths, see
|
||||||
[`--install`](install.md). If *args* describes multiple
|
[`--install`](#operation---install). If *args* describes multiple
|
||||||
store paths with the same symbolic name, only the one with the highest
|
store paths with the same symbolic name, only the one with the highest
|
||||||
version is installed.
|
version is installed.
|
||||||
|
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
# Synopsis
|
# Synopsis
|
||||||
|
|
||||||
`nix-instantiate`
|
`nix-instantiate`
|
||||||
[`--parse` | `--eval` [`--strict`] [`--raw`] [`--json`] [`--xml`] ]
|
[`--parse` | `--eval` [`--strict`] [`--json`] [`--xml`] ]
|
||||||
[`--read-write-mode`]
|
[`--read-write-mode`]
|
||||||
[`--arg` *name* *value*]
|
[`--arg` *name* *value*]
|
||||||
[{`--attr`| `-A`} *attrPath*]
|
[{`--attr`| `-A`} *attrPath*]
|
||||||
[`--add-root` *path*]
|
[`--add-root` *path*]
|
||||||
[`--expr` | `-E`]
|
[`--expr` | `-E`]
|
||||||
*fileish…*
|
*files…*
|
||||||
|
|
||||||
`nix-instantiate` `--find-file` *files…*
|
`nix-instantiate` `--find-file` *files…*
|
||||||
|
|
||||||
@@ -25,11 +25,8 @@ of the resulting store derivations are printed on standard output.
|
|||||||
|
|
||||||
[store derivation]: ../glossary.md#gloss-store-derivation
|
[store derivation]: ../glossary.md#gloss-store-derivation
|
||||||
|
|
||||||
If *fileish* is the character `-`, then a Nix expression will be read from standard input.
|
If *files* is the character `-`, then a Nix expression will be read from
|
||||||
Otherwise, each *fileish* is interpreted the same as with [nix-build](./nix-build.md#fileish-syntax).
|
standard input.
|
||||||
See that section for complete details (`nix-build --help`), but in summary, a path argument may be one of:
|
|
||||||
|
|
||||||
{{#include ./fileish-summary.md}}
|
|
||||||
|
|
||||||
# Options
|
# Options
|
||||||
|
|
||||||
@@ -38,14 +35,7 @@ See that section for complete details (`nix-build --help`), but in summary, a pa
|
|||||||
|
|
||||||
- `--parse`\
|
- `--parse`\
|
||||||
Just parse the input files, and print their abstract syntax trees on
|
Just parse the input files, and print their abstract syntax trees on
|
||||||
standard output. The output format of the AST depends on the current
|
standard output as a Nix expression.
|
||||||
internal representation and may change in the future.
|
|
||||||
|
|
||||||
Tooling can use the stderr and exit code of `--parse` to check any
|
|
||||||
Nix code for correctness, but should not rely on stdout without careful
|
|
||||||
versioning. Note that `--parse` also checks for unbound variables.
|
|
||||||
In cases where this is undesired, `with {};` can be prepended
|
|
||||||
to the program to transform all such parse errors into eval errors.
|
|
||||||
|
|
||||||
- `--eval`\
|
- `--eval`\
|
||||||
Just parse and evaluate the input files, and print the resulting
|
Just parse and evaluate the input files, and print the resulting
|
||||||
@@ -107,27 +97,15 @@ See that section for complete details (`nix-build --help`), but in summary, a pa
|
|||||||
> This option can cause non-termination, because lazy data
|
> This option can cause non-termination, because lazy data
|
||||||
> structures can be infinitely large.
|
> structures can be infinitely large.
|
||||||
|
|
||||||
- `--raw`\
|
|
||||||
When used with `--eval`, the result must be coercible to a string, i.e.,
|
|
||||||
something that can be converted using `${...}`.
|
|
||||||
|
|
||||||
Integers will always generate an error when output via `--raw`, regardless of
|
|
||||||
[`coerce-integers`](../contributing/experimental-features.md#xp-feature-coerce-integers) being enabled, to avoid ambiguity.
|
|
||||||
|
|
||||||
The output is printed exactly as-is, with no quotes, escaping, or trailing
|
|
||||||
newline.
|
|
||||||
|
|
||||||
- `--json`\
|
- `--json`\
|
||||||
When used with `--eval`, print the resulting value as an JSON
|
When used with `--eval`, print the resulting value as an JSON
|
||||||
representation of the resulting value rather than as a Nix expression.
|
representation of the abstract syntax tree rather than as a Nix expression.
|
||||||
|
|
||||||
The conversion behaviour, if `--strict` is passed, is the same as
|
|
||||||
[`builtins.toJSON`](../language/builtins.md#builtins-toJSON).
|
|
||||||
|
|
||||||
- `--xml`\
|
- `--xml`\
|
||||||
When used with `--eval`, print the resulting value as an XML
|
When used with `--eval`, print the resulting value as an XML
|
||||||
representation of the resulting value rather than as a Nix expression.
|
representation of the abstract syntax tree rather than as a Nix expression.
|
||||||
The schema is the same as that used by [`builtins.toXML`](../language/builtins.md#builtins-toXML).
|
The schema is the same as that used by the [`toXML`
|
||||||
|
built-in](../language/builtins.md).
|
||||||
|
|
||||||
- `--read-write-mode`\
|
- `--read-write-mode`\
|
||||||
When used with `--eval`, perform evaluation in read/write mode so
|
When used with `--eval`, perform evaluation in read/write mode so
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ the environment of a derivation for development.
|
|||||||
If *path* is not given, `nix-shell` defaults to `shell.nix` if it
|
If *path* is not given, `nix-shell` defaults to `shell.nix` if it
|
||||||
exists, and `default.nix` otherwise.
|
exists, and `default.nix` otherwise.
|
||||||
|
|
||||||
If *path* is given it is interpreted like a [*fileish* argument to nix-build](./nix-build.md#fileish-syntax):
|
If *path* starts with `http://` or `https://`, it is interpreted as the
|
||||||
|
URL of a tarball that will be downloaded and unpacked to a temporary
|
||||||
{{#include ./fileish-summary.md}}
|
location. The tarball must include a single top-level directory
|
||||||
|
containing at least a file named `default.nix`.
|
||||||
|
|
||||||
If the derivation defines the variable `shellHook`, it will be run
|
If the derivation defines the variable `shellHook`, it will be run
|
||||||
after `$stdenv/setup` has been sourced. Since this hook is not executed
|
after `$stdenv/setup` has been sourced. Since this hook is not executed
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# Synopsis
|
# Synopsis
|
||||||
|
|
||||||
`nix-store` `--delete` [`--ignore-liveness`] [`--skip-live`] [`--delete-closure`] *paths…*
|
`nix-store` `--delete` [`--ignore-liveness`] *paths…*
|
||||||
|
|
||||||
# Description
|
# Description
|
||||||
|
|
||||||
@@ -18,13 +18,6 @@ With the option `--ignore-liveness`, reachability from the roots is
|
|||||||
ignored. However, the path still won’t be deleted if there are other
|
ignored. However, the path still won’t be deleted if there are other
|
||||||
paths in the store that refer to it (i.e., depend on it).
|
paths in the store that refer to it (i.e., depend on it).
|
||||||
|
|
||||||
This operation will raise an error if any of the paths are still live
|
|
||||||
and `--ignore-liveness` is not passed. Passing `--skip-live` will
|
|
||||||
prevent this from being considered an error.
|
|
||||||
|
|
||||||
The option `--delete-closure` will also attempt to delete any paths
|
|
||||||
that are in the given path's dependency closure.
|
|
||||||
|
|
||||||
{{#include ./opt-common.md}}
|
{{#include ./opt-common.md}}
|
||||||
|
|
||||||
{{#include ../opt-common.md}}
|
{{#include ../opt-common.md}}
|
||||||
|
|||||||
@@ -93,12 +93,9 @@ symlink.
|
|||||||
[deriver]: ../../glossary.md#gloss-deriver
|
[deriver]: ../../glossary.md#gloss-deriver
|
||||||
|
|
||||||
- `--valid-derivers`\
|
- `--valid-derivers`\
|
||||||
Prints the set of all [derivers](../../glossary.md#gloss-deriver) that can be
|
Prints a set of derivation files (`.drv`) which are supposed produce
|
||||||
used to build the store paths *paths*.
|
said paths when realized. Might print nothing, for example for source paths
|
||||||
This differs from `--deriver`, which prints the deriver that actually
|
or paths subsituted from a binary cache.
|
||||||
produced *paths*.
|
|
||||||
No deriver may be returned if is not present in the store,
|
|
||||||
eg, if *paths* were substituted from a binary cache.
|
|
||||||
|
|
||||||
- `--graph`\
|
- `--graph`\
|
||||||
Prints the references graph of the store paths *paths* in the format
|
Prints the references graph of the store paths *paths* in the format
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ Each of *paths* is processed as follows:
|
|||||||
1. If it is not [valid], substitute the store derivation file itself.
|
1. If it is not [valid], substitute the store derivation file itself.
|
||||||
2. Realise its [output paths]:
|
2. Realise its [output paths]:
|
||||||
- Try to fetch from [substituters] the [store objects] associated with the output paths in the store derivation's [closure].
|
- Try to fetch from [substituters] the [store objects] associated with the output paths in the store derivation's [closure].
|
||||||
|
- With [content-addressed derivations] (experimental): Determine the output paths to realise by querying content-addressed realisation entries in the [Nix database].
|
||||||
- For any store paths that cannot be substituted, produce the required store objects. This involves first realising all outputs of the derivation's dependencies and then running the derivation's [`builder`](@docroot@/language/derivations.md#attr-builder) executable. <!-- TODO: Link to build process page #8888 -->
|
- For any store paths that cannot be substituted, produce the required store objects. This involves first realising all outputs of the derivation's dependencies and then running the derivation's [`builder`](@docroot@/language/derivations.md#attr-builder) executable. <!-- TODO: Link to build process page #8888 -->
|
||||||
- Otherwise, and if the path is not already valid: Try to fetch the associated [store objects] in the path's [closure] from [substituters].
|
- Otherwise, and if the path is not already valid: Try to fetch the associated [store objects] in the path's [closure] from [substituters].
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ If no substitutes are available and no store derivation is given, realisation fa
|
|||||||
[store objects]: @docroot@/glossary.md#gloss-store-object
|
[store objects]: @docroot@/glossary.md#gloss-store-object
|
||||||
[closure]: @docroot@/glossary.md#gloss-closure
|
[closure]: @docroot@/glossary.md#gloss-closure
|
||||||
[substituters]: @docroot@/command-ref/conf-file.md#conf-substituters
|
[substituters]: @docroot@/command-ref/conf-file.md#conf-substituters
|
||||||
|
[content-addressed derivations]: @docroot@/contributing/experimental-features.md#xp-feature-ca-derivations
|
||||||
[Nix database]: @docroot@/glossary.md#gloss-nix-database
|
[Nix database]: @docroot@/glossary.md#gloss-nix-database
|
||||||
|
|
||||||
The resulting paths are printed on standard output.
|
The resulting paths are printed on standard output.
|
||||||
|
|||||||
@@ -78,16 +78,6 @@ Most commands in Lix accept the following command-line options:
|
|||||||
|
|
||||||
Display the raw logs, with the progress bar at the bottom.
|
Display the raw logs, with the progress bar at the bottom.
|
||||||
|
|
||||||
- `multiline`
|
|
||||||
|
|
||||||
Display a progress bar during the builds and in the lines below that one line per activity.
|
|
||||||
|
|
||||||
|
|
||||||
- `multiline-with-logs`
|
|
||||||
|
|
||||||
Display the raw logs, with a progress bar and activities each in a new line at the bottom.
|
|
||||||
|
|
||||||
|
|
||||||
- <span id="opt-no-build-output">[`--no-build-output`](#opt-no-build-output)</span> / `-Q`
|
- <span id="opt-no-build-output">[`--no-build-output`](#opt-no-build-output)</span> / `-Q`
|
||||||
|
|
||||||
By default, output written by builders to standard output and standard error is echoed to the Lix command's standard error.
|
By default, output written by builders to standard output and standard error is echoed to the Lix command's standard error.
|
||||||
@@ -177,12 +167,6 @@ Most commands in Lix accept the following command-line options:
|
|||||||
You can override this using `--arg`, e.g., `nix-env --install --attr pkgname --arg system \"i686-freebsd\"`.
|
You can override this using `--arg`, e.g., `nix-env --install --attr pkgname --arg system \"i686-freebsd\"`.
|
||||||
(Note that since the argument is a Nix string literal, you have to escape the quotes.)
|
(Note that since the argument is a Nix string literal, you have to escape the quotes.)
|
||||||
|
|
||||||
Additionally, dots are interpreted as attribute-path separators.
|
|
||||||
I.e. `nix-instantiate '<nixpkgs>' -A hello-unfree --arg config.allowUnfree true` will result in an argument `config` with value `{ allowUnfree = true; }` being passed to `<nixpkgs>`.
|
|
||||||
|
|
||||||
Please note that merging of different arguments is rejected.
|
|
||||||
I.e. `--arg config '{ cudaSupport = true; }' --arg config.allowUnfree true` will not work whereas `--arg config.cudaSupport true --arg config.allowUnfree true` is accepted.
|
|
||||||
|
|
||||||
- <span id="opt-argstr">[`--argstr`](#opt-argstr)</span> *name* *value*
|
- <span id="opt-argstr">[`--argstr`](#opt-argstr)</span> *name* *value*
|
||||||
|
|
||||||
This option is like `--arg`, only the value is not a Nix expression but a string.
|
This option is like `--arg`, only the value is not a Nix expression but a string.
|
||||||
|
|||||||
@@ -661,8 +661,8 @@ Verbosity levels are:
|
|||||||
|
|
||||||
The default level that the command starts is `ERROR`. The simplest way to
|
The default level that the command starts is `ERROR`. The simplest way to
|
||||||
increase the verbosity by stacking `-v` option (eg: `-vvv == level 3 == INFO`).
|
increase the verbosity by stacking `-v` option (eg: `-vvv == level 3 == INFO`).
|
||||||
Use `--quiet` to decrease verbosity by one level.
|
There are also two shortcuts, `--debug` to run in `DEBUG` verbosity level and
|
||||||
There is one shortcut, `--debug` to run in `DEBUG` verbosity level.
|
`--quiet` to run in `ERROR` verbosity level.
|
||||||
|
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
This section describes the notion of *deprecated features*, and how it fits into the big picture of the development of Lix.
|
|
||||||
|
|
||||||
# What are deprecated features?
|
|
||||||
|
|
||||||
Deprecated features are disabled by default, with the intent to eventually remove them.
|
|
||||||
Users must explicitly enable them to keep using them, by toggling the associated [deprecated feature flags](@docroot@/command-ref/conf-file.md#conf-deprecated-features).
|
|
||||||
This allows backwards compatibility and a graceful transition away from undesired features.
|
|
||||||
|
|
||||||
# Which features can be deprecated?
|
|
||||||
|
|
||||||
Undesired features should be soft-deprecated by yielding a warning when used for a significant amount of time before the can be deprecated.
|
|
||||||
Legacy obsolete feature with little to no usage may go through this process faster.
|
|
||||||
Deprecated features should have a migration path to a preferred alternative.
|
|
||||||
|
|
||||||
# Lifecycle of a deprecated feature
|
|
||||||
|
|
||||||
This description is not normative, but a feature removal may roughly happen like this:
|
|
||||||
|
|
||||||
1. Add a warning when the feature is being used.
|
|
||||||
2. Disable the feature by default, putting it behind a deprecated feature flag.
|
|
||||||
- If disabling the feature started out as an opt-in experimental feature, turn that experimental flag into a no-op or remove it entirely.
|
|
||||||
For example, `--extra-experimental-features no-url-literals` becomes `--extra-deprecated-features url-literals`.
|
|
||||||
3. Decide on a time frame for how long that feature will still be supported for backwards compatibility, and clearly communicate that in the error messages.
|
|
||||||
- Sometimes, automatic migration to alternatives is possible, and such should be provided if possible
|
|
||||||
- At least one NixOS release cycle should be the minimum
|
|
||||||
4. Finally remove the feature entirely, only keeping the error message for those still using it.
|
|
||||||
|
|
||||||
# Relation to language versioning
|
|
||||||
|
|
||||||
Obviously, removing anything breaks backwards compatibility.
|
|
||||||
In an ideal world, we'd have SemVer controls over the language and its features, cleanly allowing us to make breaking changes.
|
|
||||||
See https://wiki.lix.systems/books/lix-contributors/page/language-versioning and [RFC 137](https://github.com/nixos/rfcs/pull/137) for efforts on that.
|
|
||||||
However, we do not live in such an ideal world, and currently this goal is so far away, that "just disable it with some back-compat for a couple of years" is the most realistic solution, especially for comparatively minor changes.
|
|
||||||
|
|
||||||
# Currently available deprecated features
|
|
||||||
|
|
||||||
{{#include @generated@/../../../lix/libutil/deprecated-feature-descriptions.md}}
|
|
||||||
@@ -99,4 +99,4 @@ This means that experimental features and RFCs are orthogonal mechanisms, and ca
|
|||||||
|
|
||||||
# Currently available experimental features
|
# Currently available experimental features
|
||||||
|
|
||||||
{{#include @generated@/../../../lix/libutil/experimental-feature-descriptions.md}}
|
{{#include @generated@/contributing/experimental-feature-descriptions.md}}
|
||||||
|
|||||||
@@ -11,19 +11,7 @@ The following instructions assume you already have some version of Nix or Lix in
|
|||||||
|
|
||||||
[installation instructions]: ../installation/installation.md
|
[installation instructions]: ../installation/installation.md
|
||||||
|
|
||||||
A typical development flow for simple changes in Lix looks like:
|
## Building Lix in a development shell
|
||||||
- [Set up and build Lix](#building)
|
|
||||||
- For large changes, check in regarding design and possibly create an RFD issue on Forgejo
|
|
||||||
- Make the changes in your editor
|
|
||||||
- [Send the changes to Gerrit](#sending-to-gerrit)
|
|
||||||
- Once you have the number for the CL from Gerrit to put in the changelog, [write a changelog entry](#release-notes) and amend it into the commit
|
|
||||||
- Update the Gerrit change by submitting it with the same command as the first time
|
|
||||||
- Request and receive a code review
|
|
||||||
- Address feedback from the review
|
|
||||||
- Amend commits, send to Gerrit again
|
|
||||||
- Submit the approved change
|
|
||||||
|
|
||||||
## Building Lix in a development shell {#building}
|
|
||||||
|
|
||||||
### Setting up the development shell
|
### Setting up the development shell
|
||||||
|
|
||||||
@@ -51,66 +39,17 @@ $ nix-shell -A native-clangStdenvPackages
|
|||||||
|
|
||||||
### Building from the development shell
|
### Building from the development shell
|
||||||
|
|
||||||
We have a [justfile](https://just.systems/) for extra convenient building.
|
As always you may run [stdenv's phases by name](https://nixos.org/manual/nixpkgs/unstable/#sec-building-stdenv-package-in-nix-shell), e.g.:
|
||||||
It defaults to using `./build` as the build directory, and `$out` (`./outputs/out`) as the install directory.
|
|
||||||
For most cases, you can clean-build, install, and run the tests with:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ just setup --wipe && just test
|
$ configurePhase
|
||||||
|
$ buildPhase
|
||||||
|
$ checkPhase
|
||||||
|
$ installPhase
|
||||||
|
$ installCheckPhase
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
To build manually, however, use the following:
|
||||||
>
|
|
||||||
> The `--wipe` argument to `meson setup` conveniently works whether you have an existing build directory or not.
|
|
||||||
>
|
|
||||||
> However, it is *mostly*, but not *exactly* equivalent to deleting the build directory first.
|
|
||||||
> In particular, previously specified `-D` build options are **preserved** with `--wipe` (for some reason).
|
|
||||||
> For example, if you fetch and checkout a new version of Lix, and that new version *removes* a Meson build option from `./meson.options`, *and* a previous invocation in that build directory explicitly set that option, then `meson setup --wipe build` will error, complaining about the unknown option.
|
|
||||||
> For these cases, `just clean` will give you a well-and-truly-this-time-for-real clean build.
|
|
||||||
|
|
||||||
Because the integration tests require installation to work, `just test` automatically also calls `just install`, and Meson helpfully will automatically build any targets that need building when trying to install them.
|
|
||||||
|
|
||||||
You can override the build directory or install directory by setting the justfile [variables](https://just.systems/man/en/setting-variables-from-the-command-line.html) `outdir` and `builddir` on the command-line:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ just builddir=build-before-bisect outdir=out-before-bisect setup
|
|
||||||
$ just builddir=build-before-bisect test
|
|
||||||
```
|
|
||||||
|
|
||||||
You'll have to set `builddir` for every target, but `outdir` only needs to be set for `setup`.
|
|
||||||
|
|
||||||
You can also run the unit tests and integration tests separately:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ just setup
|
|
||||||
$ just test-unit
|
|
||||||
$ just test-integration
|
|
||||||
```
|
|
||||||
|
|
||||||
Most justfile targets forward all further arguments to the underlying Meson invocation.
|
|
||||||
For example, to work on both Lix and nix-eval-jobs you can run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ just setup -Dnix-eval-jobs=enabled
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that only targets which *don't* accept extra arguments can have other targets following them.
|
|
||||||
`just clean setup` is equivalent to `just clean && just setup`, but `just build test` runs the `build` target with the argument `test`.
|
|
||||||
This means that if you want to, for example, build with lower parallelism, and then test, you will have to do something like this:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ just build -j4
|
|
||||||
$ just test
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, the rewrite of the integration test suite, functional2, also has its own justfile target which allows passing extra arguments to pytest.
|
|
||||||
For example, to collect and list all functional2 tests without running them, you can pass pytest's `--collect-only` argument:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ just test-functional2 --collect-only
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also build Lix manually:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ meson setup ./build "--prefix=$out" $mesonFlags
|
$ meson setup ./build "--prefix=$out" $mesonFlags
|
||||||
@@ -125,7 +64,9 @@ $ meson install -C build
|
|||||||
$ meson test -C build --suite=installcheck
|
$ meson test -C build --suite=installcheck
|
||||||
```
|
```
|
||||||
|
|
||||||
In both cases, Lix will be installed to `$PWD/outputs`, the `/bin` of which is prepended to PATH in the development shells.
|
(Check and installcheck may both be done after install, allowing you to omit the --suite argument entirely, but this is the order package.nix runs them in.)
|
||||||
|
|
||||||
|
This will install Lix to `$PWD/outputs`, the `/bin` of which is prepended to PATH in the development shells.
|
||||||
|
|
||||||
If the tests fail and Meson helpfully has no output for why, use the `--print-error-logs` option to `meson test`.
|
If the tests fail and Meson helpfully has no output for why, use the `--print-error-logs` option to `meson test`.
|
||||||
|
|
||||||
@@ -161,14 +102,14 @@ $ meson compile -C build nixexpr
|
|||||||
All targets may be addressed as their output, relative to the build directory, e.g.:
|
All targets may be addressed as their output, relative to the build directory, e.g.:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ meson compile -C build lix/libexpr/liblixexpr.so
|
$ meson compile -C build src/libexpr/liblixexpr.so
|
||||||
```
|
```
|
||||||
|
|
||||||
But Meson does not consider intermediate files like object files targets.
|
But Meson does not consider intermediate files like object files targets.
|
||||||
To build a specific object file, use Ninja directly and specify the output file relative to the build directory:
|
To build a specific object file, use Ninja directly and specify the output file relative to the build directory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ ninja -C build lix/libexpr/liblixexpr.so.p/nixexpr.cc.o
|
$ ninja -C build src/libexpr/liblixexpr.so.p/nixexpr.cc.o
|
||||||
```
|
```
|
||||||
|
|
||||||
To inspect the canonical source of truth on what the state of the buildsystem configuration is, use:
|
To inspect the canonical source of truth on what the state of the buildsystem configuration is, use:
|
||||||
@@ -177,59 +118,7 @@ To inspect the canonical source of truth on what the state of the buildsystem co
|
|||||||
$ meson introspect
|
$ meson introspect
|
||||||
```
|
```
|
||||||
|
|
||||||
#### LLD
|
## Building Lix outside of development shells
|
||||||
|
|
||||||
The development shell on Linux uses LLD by default for faster link times.
|
|
||||||
This is set using `mesonFlags`, so to override it, you can simplify re-specify the linker to Meson:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ just setup -Dc_link_args=-fuse-ld=ld -Dcpp_link_args=-fuse-ld=ld
|
|
||||||
```
|
|
||||||
|
|
||||||
While using LLD, you may find it helpful to use ThinLTO for even further improvements to link times for incremental builds:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ just setup -Db_lto=true -Db_lto_mode=thin -Db_thinlto_cache=true
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sending changes to Gerrit for review {#sending-to-gerrit}
|
|
||||||
|
|
||||||
We use Gerrit for all our code review in Lix.
|
|
||||||
Our instance is at <https://gerrit.lix.systems>.
|
|
||||||
|
|
||||||
There's much more information about how to use Gerrit in the [wiki section on Gerrit][wiki-gerrit] including how to use Jujutsu, how to use the UI and more.
|
|
||||||
The Snix project also has some Gerrit information [in their contributing docs][snix-gerrit].
|
|
||||||
|
|
||||||
[wiki-gerrit]: https://wiki.lix.systems/books/contributing/chapter/intro-to-gerrit
|
|
||||||
[snix-gerrit]: https://snix.dev/docs/guides/contributing/
|
|
||||||
|
|
||||||
The gist is that once you have your SSH key and git remote set up, you can send commits for review with:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ git remote set-url origin ssh://YOURUSERNAME@gerrit.lix.systems:2022/lix
|
|
||||||
$ git push origin HEAD:refs/for/main
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, you can request a review via the "Reply" button on the web UI.
|
|
||||||
If you click "Suggest Owners", it will try to suggest the maintainers of the area of the code change to send review requests to.
|
|
||||||
Requesting reviews from multiple people is normal.
|
|
||||||
|
|
||||||
We do our best to respond to directly sent reviews in a few days, so feel free to request another reviewer or ask on Matrix if you've not got a response for a while.
|
|
||||||
Keep in mind that Lix is a volunteer project and we have limited bandwidth, so some changes aren't feasible to shepherd through; please check in on Matrix at design time when doing large changes.
|
|
||||||
|
|
||||||
Once you get a `Code-Review+2` vote on your change, it's rebased on `main` and CI marks it `Verified+1`, you're able (and usually expected, so you can have a second chance to check it over) to hit the Submit button to merge it.
|
|
||||||
If the change appears as "Rebase Required", you need to rebase it on `main` locally or via the Gerrit UI and wait for `Verified+1` before the Submit button is made active
|
|
||||||
The `Code-Review+2` from before will stick around through trivial rebases so no need to re-request review for a mere rebase.
|
|
||||||
|
|
||||||
## Interacting with the CI, Buildkite
|
|
||||||
|
|
||||||
We use Buildkite for our CI, usually you will not have to interact directly with it other than reviewing any errors it produces, which are linked from Gerrit.
|
|
||||||
|
|
||||||
However in certain cases a CI run will fail due to transient issues not related to your code and you will need to rerun it by hand.
|
|
||||||
You can log in to the CI via [SSO](https://buildkite.com/sso/afnix). On your job you can then hit the "Retry failed" button to rerun it, normally you will not have a repeat of the transient issue.
|
|
||||||
If the build still fails on CI issues or all builds are failing this should be reported via [Zulip on #T-infra](https://zulip.lix.systems/#narrow/channel/7-T-infra) or [Matrix on #dev](https://matrix.to/#/%23dev%3Alix.systems?via=lix.systems).
|
|
||||||
|
|
||||||
## Building Lix with `nix`
|
|
||||||
|
|
||||||
To build a release version of Lix for the current operating system and CPU architecture:
|
To build a release version of Lix for the current operating system and CPU architecture:
|
||||||
|
|
||||||
@@ -252,7 +141,6 @@ Lix can be built for various platforms, as specified in [`flake.nix`]:
|
|||||||
|
|
||||||
- `x86_64-linux`
|
- `x86_64-linux`
|
||||||
- `x86_64-darwin`
|
- `x86_64-darwin`
|
||||||
- `x86_64-freebsd`
|
|
||||||
- `i686-linux`
|
- `i686-linux`
|
||||||
- `aarch64-linux`
|
- `aarch64-linux`
|
||||||
- `aarch64-darwin`
|
- `aarch64-darwin`
|
||||||
@@ -280,27 +168,8 @@ or for Nix with the [`flakes`] and [`nix-command`] experimental features enabled
|
|||||||
$ nix build .#packages.aarch64-linux.default
|
$ nix build .#packages.aarch64-linux.default
|
||||||
```
|
```
|
||||||
|
|
||||||
### Cross compiling using the Lix flake
|
Cross-compiled builds are available for ARMv6 (`armv6l-linux`) and ARMv7 (`armv7l-linux`).
|
||||||
|
Add more [system types](#system-type) to `crossSystems` in `flake.nix` to bootstrap Nix on unsupported platforms.
|
||||||
Lix can also be easily cross compiled to the following arbitrarily-chosen system doubles, which can be useful for bootstrapping Lix on new platforms.
|
|
||||||
These are specified in `crossSystems` in `flake.nix`; feel free to submit changes to add new ones if they are useful to you.
|
|
||||||
|
|
||||||
- `armv6l-linux`
|
|
||||||
- `armv7l-linux`
|
|
||||||
- `aarch64-linux`
|
|
||||||
- `riscv64-linux`
|
|
||||||
|
|
||||||
For example, to cross-compile Lix for `armv6l-linux` from another Linux, use the following:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ nix build .#nix-armv6l-linux
|
|
||||||
```
|
|
||||||
|
|
||||||
It's also possible to cross-compile a tarball of binaries suitable for the Lix installer, for example, for `riscv64-linux`:
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ nix build .#nix-riscv64-linux.passthru.binaryTarball
|
|
||||||
```
|
|
||||||
|
|
||||||
### Building for multiple platforms at once
|
### Building for multiple platforms at once
|
||||||
|
|
||||||
@@ -329,7 +198,7 @@ Lix uses a string with the following format to identify the *system type* or *pl
|
|||||||
|
|
||||||
It is set when Lix is compiled for the given system, and determined by [Meson's `host_machine.cpu_family()` and `host_machine.system()` values](https://mesonbuild.com/Reference-manual_builtin_host_machine.html).
|
It is set when Lix is compiled for the given system, and determined by [Meson's `host_machine.cpu_family()` and `host_machine.system()` values](https://mesonbuild.com/Reference-manual_builtin_host_machine.html).
|
||||||
|
|
||||||
For historic reasons and backward-compatibility, some CPU and OS identifiers are translated from the GNU Autotools naming convention in [`meson.build`](https://git.lix.systems/lix-project/lix/src/branch/main/meson.build) as follows:
|
For historic reasons and backward-compatibility, some CPU and OS identifiers are translated from the GNU Autotools naming convention in [`meson.build`](https://git.lix.systems/lix-project/lix/blob/main/meson.build) as follows:
|
||||||
|
|
||||||
| `host_machine.cpu_family()` | Nix |
|
| `host_machine.cpu_family()` | Nix |
|
||||||
|----------------------------|---------------------|
|
|----------------------------|---------------------|
|
||||||
@@ -356,13 +225,13 @@ To build with one of those environments, you can use
|
|||||||
$ nix build .#nix-ccacheStdenv
|
$ nix build .#nix-ccacheStdenv
|
||||||
```
|
```
|
||||||
|
|
||||||
for <a id="nix-with-flakes">flake-enabled Nix</a>, or
|
for flake-enabled Nix, or
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ nix-build --attr nix-ccacheStdenv
|
$ nix-build --attr nix-ccacheStdenv
|
||||||
```
|
```
|
||||||
|
|
||||||
for <a id="classic-nix">classic Nix</a>.
|
for classic Nix.
|
||||||
|
|
||||||
You can use any of the other supported environments in place of `nix-ccacheStdenv`.
|
You can use any of the other supported environments in place of `nix-ccacheStdenv`.
|
||||||
|
|
||||||
@@ -386,10 +255,10 @@ Configure your editor to use the `clangd` from the shell, either by running it i
|
|||||||
> Some other editors (e.g. Emacs, Vim) need a plugin to support LSP servers in general (e.g. [lsp-mode](https://github.com/emacs-lsp/lsp-mode) for Emacs and [vim-lsp](https://github.com/prabirshrestha/vim-lsp) for vim).
|
> Some other editors (e.g. Emacs, Vim) need a plugin to support LSP servers in general (e.g. [lsp-mode](https://github.com/emacs-lsp/lsp-mode) for Emacs and [vim-lsp](https://github.com/prabirshrestha/vim-lsp) for vim).
|
||||||
> Editor-specific setup is typically opinionated, so we will not cover it here in more detail.
|
> Editor-specific setup is typically opinionated, so we will not cover it here in more detail.
|
||||||
|
|
||||||
# Manual and documentation
|
### Checking links in the manual
|
||||||
|
|
||||||
## Building the manual
|
|
||||||
|
|
||||||
|
The build checks for broken internal links.
|
||||||
|
This happens late in the process, so `nix build` is not suitable for iterating.
|
||||||
To build the manual incrementally, run:
|
To build the manual incrementally, run:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
@@ -401,25 +270,21 @@ meson compile -C build manual
|
|||||||
[`mdbook-linkcheck`]: https://github.com/Michael-F-Bryan/mdbook-linkcheck
|
[`mdbook-linkcheck`]: https://github.com/Michael-F-Bryan/mdbook-linkcheck
|
||||||
[URI fragments]: https://en.wikipedia.org/wiki/URI_fragment
|
[URI fragments]: https://en.wikipedia.org/wiki/URI_fragment
|
||||||
|
|
||||||
The built manual is in `build/doc/manual/manual/index.html`.
|
#### `@docroot@` variable
|
||||||
|
|
||||||
The build checks for broken internal links.
|
`@docroot@` provides a base path for links that occur in reusable snippets or other documentation that doesn't have a base path of its own.
|
||||||
This happens late in the process, so `nix build` is not suitable for iterating and it's recommended to use the `meson` command above instead.
|
|
||||||
|
|
||||||
### `@\docroot\@` variable
|
If a broken link occurs in a snippet that was inserted into multiple generated files in different directories, use `@docroot@` to reference the `doc/manual/src` directory.
|
||||||
|
|
||||||
`@\docroot\@` provides a base path for links that occur in reusable snippets or other documentation that doesn't have a base path of its own.
|
If the `@docroot@` literal appears in an error message from the `mdbook-linkcheck` tool, the `@docroot@` replacement needs to be applied to the generated source file that mentions it.
|
||||||
|
See existing `@docroot@` logic in the [Makefile].
|
||||||
If a broken link occurs in a snippet that was inserted into multiple generated files in different directories, use `@\docroot\@` to reference the `doc/manual/src` directory.
|
Regular markdown files used for the manual have a base path of their own and they can use relative paths instead of `@docroot@`.
|
||||||
|
|
||||||
If the `@\docroot\@` literal appears in an error message from the `mdbook-linkcheck` tool, the `@\docroot\@` replacement needs to be applied to the generated source file that mentions it.
|
|
||||||
See existing `@\docroot\@` logic in `doc/manual/substitute.py`.
|
|
||||||
Regular markdown files used for the manual have a base path of their own and they can use relative paths instead of `@\docroot\@`.
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
|
||||||
Doxygen API documentation will be available online in the future ([tracking issue](https://git.lix.systems/lix-project/lix/issues/422)).
|
Doxygen API documentation is [available
|
||||||
You can also build and view it yourself:
|
online](https://hydra.nixos.org/job/nix/master/internal-api-docs/latest/download-by-type/doc/internal-api-docs). You
|
||||||
|
can also build and view it yourself:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
# nix build .#hydraJobs.internal-api-docs
|
# nix build .#hydraJobs.internal-api-docs
|
||||||
@@ -429,50 +294,44 @@ You can also build and view it yourself:
|
|||||||
or inside a `nix develop` shell by running:
|
or inside a `nix develop` shell by running:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ meson configure build -Dinternal-api-docs=enabled
|
|
||||||
$ meson compile -C build internal-api-docs
|
$ meson compile -C build internal-api-docs
|
||||||
$ xdg-open ./outputs/doc/share/doc/nix/internal-api/html/index.html
|
$ xdg-open ./outputs/doc/share/doc/nix/internal-api/html/index.html
|
||||||
```
|
```
|
||||||
|
|
||||||
## Coverage analysis
|
## Coverage analysis
|
||||||
|
|
||||||
A coverage analysis report will be available online in the future (FIXME(lix-hydra)).
|
A coverage analysis report is [available
|
||||||
You can build it yourself:
|
online](https://hydra.nixos.org/job/nix/master/coverage/latest/download-by-type/report/coverage). You
|
||||||
|
can build it yourself:
|
||||||
|
|
||||||
```
|
```
|
||||||
# nix build .#hydraJobs.coverage
|
# nix build .#hydraJobs.coverage
|
||||||
# xdg-open ./result/coverage/index.html
|
# xdg-open ./result/coverage/index.html
|
||||||
```
|
```
|
||||||
|
|
||||||
Metrics about the change in line/function coverage over time will be available in the future (FIXME(lix-hydra)).
|
Metrics about the change in line/function coverage over time are also
|
||||||
|
[available](https://hydra.nixos.org/job/nix/master/coverage#tabs-charts).
|
||||||
|
|
||||||
## Add a release note {#release-notes}
|
## Add a release note
|
||||||
|
|
||||||
`doc/manual/rl-next` contains release notes entries for all unreleased changes.
|
`doc/manual/rl-next` contains release notes entries for all unreleased changes.
|
||||||
|
|
||||||
User-visible changes should come with a release note.
|
User-visible changes should come with a release note.
|
||||||
Developer-facing changes should have a release note in the Development category if they are significant and if developers should know about them.
|
|
||||||
|
|
||||||
### Add an entry
|
### Add an entry
|
||||||
|
|
||||||
Here's what a complete entry looks like.
|
Here's what a complete entry looks like. The file name is not incorporated in the document.
|
||||||
The file name is not incorporated in the final document, and is generally a super brief summary of the change synopsis.
|
|
||||||
|
|
||||||
```markdown
|
```
|
||||||
---
|
---
|
||||||
synopsis: Basically a title
|
synopsis: Basically a title
|
||||||
# 1234 or gh#1234 will refer to CppNix GitHub, fj#1234 will refer to a Lix forgejo issue.
|
# 1234 or gh#1234 will refer to CppNix GitHub, fj#1234 will refer to a Lix forgejo issue.
|
||||||
issues: [1234, fj#1234]
|
issues: [1234, fj#1234]
|
||||||
# Use this *only* if there is a CppNix pull request associated with this change.
|
# Use this *only* if there is a CppNix pull request associated with this change
|
||||||
prs: 1238
|
prs: 1238
|
||||||
# List of Lix Gerrit changelist numbers.
|
# List of Lix Gerrit changelist numbers; if there is an associated Lix GitHub
|
||||||
# If there is an associated Lix GitHub PR, just put in the Gerrit CL number.
|
# PR, just put in the Gerrit CL number.
|
||||||
cls: [123]
|
cls: [123]
|
||||||
# Heading that this release note will appear under.
|
|
||||||
category: Breaking Changes
|
|
||||||
# Add a credit mention in the bottom of the release note.
|
|
||||||
# your-name is used as a key into doc/manual/change-authors.yml for metadata
|
|
||||||
credits: [your-name]
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Here's one or more paragraphs that describe the change.
|
Here's one or more paragraphs that describe the change.
|
||||||
@@ -487,105 +346,7 @@ Significant changes should add the following header, which moves them to the top
|
|||||||
significance: significant
|
significance: significant
|
||||||
```
|
```
|
||||||
|
|
||||||
The following categories of release notes are supported (see `maintainers/build-release-notes.py`):
|
|
||||||
- Breaking Changes
|
|
||||||
- Features
|
|
||||||
- Improvements
|
|
||||||
- Fixes
|
|
||||||
- Packaging
|
|
||||||
- Development
|
|
||||||
- Miscellany
|
|
||||||
|
|
||||||
The `credits` field, if present, gives credit to the author of the patch in the release notes with a message like "Many thanks to (your-name) for this" and linking to GitHub or Forgejo profiles if listed.
|
|
||||||
|
|
||||||
If you are forward-porting a change from CppNix, please credit the original author, and optionally credit yourself.
|
|
||||||
When adding credits metadata for people external to the project and deciding whether to put in a `display_name`, consider what they are generally known as in the community; even if you know their full name (e.g. from their GitHub profile), we suggest only adding it as a display name if that is what they go by in the community.
|
|
||||||
There are multiple reasons we follow this practice, but it boils down to privacy and consent: we would rather not capture full names that are not widely used in the community without the consent of the parties involved, even if they are publicly available.
|
|
||||||
As of this writing, the entries with full names as `display_name` are either members of the CppNix team or people who added them themselves.
|
|
||||||
|
|
||||||
The names specified in `credits` are used as keys to look up the authorship info in `doc/manual/change-authors.yml`.
|
|
||||||
The only mandatory part is that every key appearing in `credits` has an entry present in `change-authors.yml`.
|
|
||||||
All of the following properties are optional; you can specify `{}` as the metadata if you want a simple non-hyperlinked mention.
|
|
||||||
The following properties are supported:
|
|
||||||
|
|
||||||
- `display_name`: display name used in place of the key when showing names, if present.
|
|
||||||
- `forgejo`: Forgejo username. The name in the release notes will be a link to this, if present.
|
|
||||||
- `github`: GitHub username, used if `forgejo` is not set, again making a link.
|
|
||||||
|
|
||||||
### Build process
|
### Build process
|
||||||
|
|
||||||
Releases have a precomputed `rl-MAJOR.MINOR.md`, and no `rl-next.md`.
|
Releases have a precomputed `rl-MAJOR.MINOR.md`, and no `rl-next.md`.
|
||||||
Development releases have a generated `rl-next.md`.
|
Set `buildUnreleasedNotes = true;` in `flake.nix` to build the release notes on the fly.
|
||||||
|
|
||||||
# Adding experimental or deprecated features, global settings, or builtins
|
|
||||||
|
|
||||||
Experimental and deprecated features, global settings, and builtins are generally referenced both in the code and in the documentation.
|
|
||||||
To prevent duplication or divergence, they are defined in data files, and a script generates the necessary glue.
|
|
||||||
The data file format is similar to the release notes: it consists of a YAML metadata header, followed by the documentation in Markdown format.
|
|
||||||
|
|
||||||
## Experimental or deprecated features
|
|
||||||
|
|
||||||
Experimental and deprecated features support the following metadata properties:
|
|
||||||
* `name` (required): user-facing name of the feature, to be used in `nix.conf` options and on the command line.
|
|
||||||
This should also be the stem of the file name (with extension `md`).
|
|
||||||
* `internalName` (required): identifier used to refer to the feature inside the C++ code.
|
|
||||||
|
|
||||||
Experimental feature data files should live in `lix/libutil/experimental-features`, and deprecated features in `lix/libutil/deprecated-features`.
|
|
||||||
They must be listed in the `experimental_feature_definitions` or `deprecated_feature_definitions` lists in `lix/libutil/meson.build` respectively to be considered by the build system.
|
|
||||||
|
|
||||||
## Global settings
|
|
||||||
|
|
||||||
Global settings support the following metadata properties:
|
|
||||||
* `name` (required): user-facing name of the setting, to be used as key in `nix.conf` and in the `--option` command line argument.
|
|
||||||
* `internalName` (required): identifier used to refer to the setting inside the C++ code.
|
|
||||||
* `platforms` (optional): a list specifying the platforms on which this setting is available.
|
|
||||||
If not specified, it is available on all platforms.
|
|
||||||
Valid platform names are `darwin`, `linux`.
|
|
||||||
* `type` (optional): C++ type of the setting value.
|
|
||||||
This specifies the setting object type as `Setting<T>`; if more control is required, use `settingType` instead.
|
|
||||||
* `settingType` (required if `type` is not specified): C++ type of the setting object.
|
|
||||||
* `default` (optional): default value of the setting.
|
|
||||||
`null`, truth values, integers, strings and lists are supported as long as the correct YAML type is used, `type` is not taken into account).
|
|
||||||
Other types, machine-dependent values or non-standard representations must be handled using `defaultExpr` and `defaultText` instead.
|
|
||||||
* `defaultExpr` (required if `default` is not specified): a string containing the C++ expression representing the default value.
|
|
||||||
* `defaultText` (required if `default` is not specified): a string containing the Markdown expression representing the default value in the documentation.
|
|
||||||
Literal values are conventionally surrounded by backticks, and a system-dependent value is signaled by `*machine-specific*`.
|
|
||||||
* `aliases` (optional): a list of secondary user-facing names under which the setting is available.
|
|
||||||
Defaults to empty if not specified.
|
|
||||||
* `experimentalFeature` (optional): the user-facing name of the experimental feature which needs to be enabled to change the setting.
|
|
||||||
If not specified, no experimental feature is required.
|
|
||||||
* `deprecated` (optional): whether the setting is deprecated and shown as such in the documentation for `nix.conf`.
|
|
||||||
Defaults to false if not specified.
|
|
||||||
|
|
||||||
Settings are not collected in a single place in the source tree, so an appropriate place needs to be found for the setting to live.
|
|
||||||
Look for related setting definition files under second-level subdirectories of `lix` whose name includes `settings`.
|
|
||||||
Then add the new file there, and don't forget to register it in the appropriate `meson.build` file.
|
|
||||||
|
|
||||||
## Builtin functions
|
|
||||||
|
|
||||||
The following metadata properties are supported for builtin functions:
|
|
||||||
* `name` (required): the language-facing name (as a member of the `builtins` attribute set) of the function.
|
|
||||||
* `implementation` (optional): a C++ expression specifying the implementation of the builtin.
|
|
||||||
It must be a function of signature `Value(EvalState &, PosIdx, Value * *)`.
|
|
||||||
If not specified, defaults to `prim_${name}`.
|
|
||||||
* `renameInGlobalScope` (optional): whether the definition should be "hidden" in the global scope by prefixing its name with two underscores.
|
|
||||||
If not specified, defaults to `true`.
|
|
||||||
* `args` (required): list containing the names of the arguments, as shown in the documentation.
|
|
||||||
All arguments must be listed here since the function arity is derived as the length of this list.
|
|
||||||
* `experimental_feature` (optional): the user-facing name of the experimental feature which needs to be enabled for the builtin function to be available.
|
|
||||||
If not specified, no experimental feature is required.
|
|
||||||
|
|
||||||
New builtin function definition files must be added to `lix/libexpr/builtins` and registered in the `builtin_definitions` list in `lix/libexpr/meson.build`.
|
|
||||||
|
|
||||||
## Builtin constants
|
|
||||||
The following metadata properties are supported for builtin constants:
|
|
||||||
* `name` (required): the language-facing name (as a member of the `builtins` attribute set) of the constant.
|
|
||||||
* `type` (required): the Nix language type of the constant; the C++ type is automatically derived.
|
|
||||||
* `constructorArgs` (optional): list of strings containing C++ expressions passed as arguments to the appropriate `Value` constructor.
|
|
||||||
If the value computation is more complex, `implementation` can be used instead.
|
|
||||||
* `implementation` (required if `constructorArgs` is not specified): string containing a C++ expressing computing the value of the constant.
|
|
||||||
* `impure` (optional): whether the constant is considered impure.
|
|
||||||
Impure constants are not available when pure evaluation mode is activated.
|
|
||||||
Defaults to `false` when not specified.
|
|
||||||
|
|
||||||
New builtin constant definition files must be added to `lix/libexpr/builtin-constants` and registered in the `builtin_constant_definitions` list in `lix/libexpr/meson.build`.
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# Intermediate step for experimental-feature-descriptions.md.
|
||||||
|
# This splorks the output of generate-xp-features.nix as JSON,
|
||||||
|
# which gets written as a directory tree below.
|
||||||
|
experimental_feature_descriptions_md = custom_target(
|
||||||
|
command : nix_eval_for_docs + [
|
||||||
|
'--expr',
|
||||||
|
'import @INPUT0@ (builtins.fromJSON (builtins.readFile @INPUT1@))',
|
||||||
|
],
|
||||||
|
input : [
|
||||||
|
'../../generate-xp-features.nix',
|
||||||
|
xp_features_json,
|
||||||
|
],
|
||||||
|
capture : true,
|
||||||
|
output : 'experimental-feature-descriptions.md',
|
||||||
|
)
|
||||||
@@ -13,7 +13,7 @@ The unit tests are defined using the [googletest] and [rapidcheck] frameworks.
|
|||||||
>
|
>
|
||||||
> ```
|
> ```
|
||||||
> …
|
> …
|
||||||
> ├── lix
|
> ├── src
|
||||||
> │ ├── libexpr
|
> │ ├── libexpr
|
||||||
> │ │ ├── …
|
> │ │ ├── …
|
||||||
> │ │ ├── value
|
> │ │ ├── value
|
||||||
@@ -46,10 +46,10 @@ The unit tests are defined using the [googletest] and [rapidcheck] frameworks.
|
|||||||
> … … … … … …
|
> … … … … … …
|
||||||
> ```
|
> ```
|
||||||
|
|
||||||
The unit tests for each Lix library (`liblixexpr`, `liblixstore`, etc..) live inside a directory `lix/${library_shortname}/tests` within the directory for the library (`lix/${library_shortname}`).
|
The unit tests for each Lix library (`liblixexpr`, `liblixstore`, etc..) live inside a directory `src/${library_shortname}/tests` within the directory for the library (`src/${library_shortname}`).
|
||||||
|
|
||||||
The data is in `tests/unit/LIBNAME/data/LIBNAME`, with one subdir per library, with the same name as where the code goes.
|
The data is in `tests/unit/LIBNAME/data/LIBNAME`, with one subdir per library, with the same name as where the code goes.
|
||||||
For example, `liblixstore` code is in `lix/libstore`, and its test data is in `tests/unit/libstore/data/libstore`.
|
For example, `liblixstore` code is in `src/libstore`, and its test data is in `tests/unit/libstore/data/libstore`.
|
||||||
The path to the unit test data directory is passed to the unit test executable with the environment variable `_NIX_TEST_UNIT_DATA`.
|
The path to the unit test data directory is passed to the unit test executable with the environment variable `_NIX_TEST_UNIT_DATA`.
|
||||||
|
|
||||||
### Running tests
|
### Running tests
|
||||||
@@ -62,12 +62,6 @@ For `installcheck` specifically, first run `just install` before running the tes
|
|||||||
|
|
||||||
Finer-grained filtering within a test suite is also possible using the [--gtest_filter](https://google.github.io/googletest/advanced.html#running-a-subset-of-the-tests) command-line option to a test suite executable, or the `GTEST_FILTER` environment variable.
|
Finer-grained filtering within a test suite is also possible using the [--gtest_filter](https://google.github.io/googletest/advanced.html#running-a-subset-of-the-tests) command-line option to a test suite executable, or the `GTEST_FILTER` environment variable.
|
||||||
|
|
||||||
### Inspecting failures
|
|
||||||
|
|
||||||
The test suite emits logs in `build/meson-logs/`; the full textual failure logs are in `build/meson-logs/testlog.txt`.
|
|
||||||
|
|
||||||
If you want a much nicer experience of viewing the logs in a structured manner, use `xunit-viewer --results build/meson-logs/testlog.junit.xml --server` to view them in a web browser.
|
|
||||||
|
|
||||||
### Unit test support libraries
|
### Unit test support libraries
|
||||||
|
|
||||||
There are headers and code which are not just used to test the library in question, but also downstream libraries.
|
There are headers and code which are not just used to test the library in question, but also downstream libraries.
|
||||||
@@ -253,6 +247,7 @@ To ensure that characterization testing doesn't make it harder to intentionally
|
|||||||
|
|
||||||
The integration tests are defined in the Nix flake under the `hydraJobs.tests` attribute.
|
The integration tests are defined in the Nix flake under the `hydraJobs.tests` attribute.
|
||||||
These tests include everything that needs to interact with external services or run Lix in a non-trivial distributed setup.
|
These tests include everything that needs to interact with external services or run Lix in a non-trivial distributed setup.
|
||||||
|
Because these tests are expensive and require more than what the standard github-actions setup provides, they only run on the master branch (on <https://hydra.nixos.org/jobset/nix/master>).
|
||||||
|
|
||||||
You can run them manually with `nix build .#hydraJobs.tests.{testName}` or `nix-build -A hydraJobs.tests.{testName}`
|
You can run them manually with `nix build .#hydraJobs.tests.{testName}` or `nix-build -A hydraJobs.tests.{testName}`
|
||||||
|
|
||||||
@@ -351,7 +346,7 @@ rg '(?:[^A-Za-z]|^)(_[A-Z][^-\[ }/:");$(]+)' -r '$1' --no-filename --only-matchi
|
|||||||
rg '\$\{?([A-Z][^-\[ }/:");]+)' -r '$1' --no-filename --only-matching tests | sort -u > vars.txt
|
rg '\$\{?([A-Z][^-\[ }/:");]+)' -r '$1' --no-filename --only-matching tests | sort -u > vars.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
I grepped `lix/` for `get[eE]nv\("` to find the mentions in Lix code.
|
I grepped `src/` for `get[eE]nv\("` to find the mentions in Lix code.
|
||||||
|
|
||||||
### Used by Lix testing support code
|
### Used by Lix testing support code
|
||||||
|
|
||||||
@@ -367,8 +362,8 @@ I grepped `lix/` for `get[eE]nv\("` to find the mentions in Lix code.
|
|||||||
|
|
||||||
- `_NIX_FORCE_HTTP` - Forces file URIs to be treated as remote ones.
|
- `_NIX_FORCE_HTTP` - Forces file URIs to be treated as remote ones.
|
||||||
|
|
||||||
Used by `lix/libfetchers/git.cc`, `lix/libstore/http-binary-cache-store.cc`,
|
Used by `src/libfetchers/git.cc`, `src/libstore/http-binary-cache-store.cc`,
|
||||||
`lix/libstore/local-binary-cache-store.cc`. Seems to be for forcing Git
|
`src/libstore/local-binary-cache-store.cc`. Seems to be for forcing Git
|
||||||
clones of `git+file://` URLs, making the HTTP binary
|
clones of `git+file://` URLs, making the HTTP binary
|
||||||
cache store accept `file://` URLs (presumably passing them to curl?), and
|
cache store accept `file://` URLs (presumably passing them to curl?), and
|
||||||
unknown reasons for the local binary cache.
|
unknown reasons for the local binary cache.
|
||||||
@@ -380,13 +375,10 @@ I grepped `lix/` for `get[eE]nv\("` to find the mentions in Lix code.
|
|||||||
`structuredAttrs` documentation.
|
`structuredAttrs` documentation.
|
||||||
- `NIX_BIN_DIR`, `NIX_STORE_DIR` (or its inconsistently-used old alias `NIX_STORE`), `NIX_DATA_DIR`,
|
- `NIX_BIN_DIR`, `NIX_STORE_DIR` (or its inconsistently-used old alias `NIX_STORE`), `NIX_DATA_DIR`,
|
||||||
`NIX_LOG_DIR`, `NIX_LOG_DIR`, `NIX_STATE_DIR`, `NIX_CONF_DIR` -
|
`NIX_LOG_DIR`, `NIX_LOG_DIR`, `NIX_STATE_DIR`, `NIX_CONF_DIR` -
|
||||||
Overrides compile-time configuration of various locations used by Lix. See `lix/libstore/globals.cc`.
|
Overrides compile-time configuration of various locations used by Lix. See `src/libstore/globals.cc`.
|
||||||
|
|
||||||
**Expected value**: a directory
|
**Expected value**: a directory
|
||||||
- `LIX_DAEMON_SOCKET_DIR` (optional) - Overrides the daemon socket directory from `$NIX_STATE_DIR/daemon-socket`.
|
- `NIX_DAEMON_SOCKET_PATH` (optional) - Overrides the daemon socket path from `$NIX_STATE_DIR/daemon-socket/socket`.
|
||||||
|
|
||||||
**Expected value**: a directory
|
|
||||||
- `NIX_DAEMON_SOCKET_PATH` (optional) - Overrides the daemon socket path from `$NIX_STATE_DIR/daemon-socket/socket`. Ignored if `LIX_DAEMON_SOCKET_DIR` is set.
|
|
||||||
|
|
||||||
**Expected value**: path to a socket
|
**Expected value**: path to a socket
|
||||||
- `NIX_LOG_FD` (output) - An FD number for logs in `internal-json` format to be sent to.
|
- `NIX_LOG_FD` (output) - An FD number for logs in `internal-json` format to be sent to.
|
||||||
@@ -404,6 +396,7 @@ I grepped `lix/` for `get[eE]nv\("` to find the mentions in Lix code.
|
|||||||
|
|
||||||
**Expected value**: the path to an executable shell
|
**Expected value**: the path to an executable shell
|
||||||
- `PRINT_PATH` - Undocumented. Used by `nix-prefetch-url` as an alternative form of `--print-path`. Why???
|
- `PRINT_PATH` - Undocumented. Used by `nix-prefetch-url` as an alternative form of `--print-path`. Why???
|
||||||
|
- `_NIX_IN_TEST` - If present with any value, makes `fetchClosure` accept file URLs in addition to HTTP ones. Why is this not `_NIX_FORCE_HTTP`??
|
||||||
|
|
||||||
Not used anywhere else.
|
Not used anywhere else.
|
||||||
- `NIX_ALLOW_EVAL` - Used by eval-cache tests to block evaluation if set to `0`.
|
- `NIX_ALLOW_EVAL` - Used by eval-cache tests to block evaluation if set to `0`.
|
||||||
@@ -435,12 +428,14 @@ I grepped `lix/` for `get[eE]nv\("` to find the mentions in Lix code.
|
|||||||
- `NIX_SHOW_STATS_PATH` - Writes those statistics into a file at the given path instead of stdout. Undocumented.
|
- `NIX_SHOW_STATS_PATH` - Writes those statistics into a file at the given path instead of stdout. Undocumented.
|
||||||
- `NIX_SHOW_SYMBOLS` - Dumps the symbol table into the show-stats json output.
|
- `NIX_SHOW_SYMBOLS` - Dumps the symbol table into the show-stats json output.
|
||||||
- `TERM` - If `dumb` or unset, disables ANSI colour output.
|
- `TERM` - If `dumb` or unset, disables ANSI colour output.
|
||||||
- `FORCE_COLOR`, `CLICOLOR_FORCE` - Enables ANSI colour output if `NO_COLOR`/`NOCOLOR` not set.
|
|
||||||
- `NO_COLOR`, `NOCOLOR` - Disables ANSI colour output.
|
- `NO_COLOR`, `NOCOLOR` - Disables ANSI colour output.
|
||||||
- `_NIX_DEVELOPER_SHOW_UNKNOWN_LOCATIONS` - Highlights unknown locations in errors.
|
- `_NIX_DEVELOPER_SHOW_UNKNOWN_LOCATIONS` - Highlights unknown locations in errors.
|
||||||
- `NIX_PROFILE` - Selects which profile `nix-env` will operate on. Documented elsewhere.
|
- `NIX_PROFILE` - Selects which profile `nix-env` will operate on. Documented elsewhere.
|
||||||
- `NIX_SSHOPTS` - Options passed to `ssh(1)` when using a ssh remote store.
|
- `NIX_SSHOPTS` - Options passed to `ssh(1)` when using a ssh remote store.
|
||||||
Incorrectly documented on `nix-copy-closure` which is *surely* not the only place they are used??
|
Incorrectly documented on `nix-copy-closure` which is *surely* not the only place they are used??
|
||||||
|
- `_NIX_TEST_NO_LSOF` - Used on non-Linux, non-macOS platforms to disable using `lsof` when finding gc roots.
|
||||||
|
|
||||||
|
Since https://git.lix.systems/lix-project/lix/issues/156 was fixed, this should probably just be removed as it was a bad workaround for a macOS issue.
|
||||||
- `_NIX_TEST_GC_SYNC_1` - Path to a pipe that is used to block the GC briefly to validate invariants from the test suite.
|
- `_NIX_TEST_GC_SYNC_1` - Path to a pipe that is used to block the GC briefly to validate invariants from the test suite.
|
||||||
- `_NIX_TEST_GC_SYNC_2` - Path to a pipe that is used to block the GC briefly to validate invariants from the test suite.
|
- `_NIX_TEST_GC_SYNC_2` - Path to a pipe that is used to block the GC briefly to validate invariants from the test suite.
|
||||||
- `_NIX_TEST_FREE_SPACE_FILE` - Path to a file containing a decimal number with the free space that the GC is to believe it has.
|
- `_NIX_TEST_FREE_SPACE_FILE` - Path to a file containing a decimal number with the free space that the GC is to believe it has.
|
||||||
@@ -457,6 +452,9 @@ I grepped `lix/` for `get[eE]nv\("` to find the mentions in Lix code.
|
|||||||
- `NIX_CLIENT_PACKAGE` - Runs the test suite against an alternate Nix client with the current daemon.
|
- `NIX_CLIENT_PACKAGE` - Runs the test suite against an alternate Nix client with the current daemon.
|
||||||
|
|
||||||
**Expected value**: something like `/nix/store/...-nix-2.18.2`
|
**Expected value**: something like `/nix/store/...-nix-2.18.2`
|
||||||
|
- `NIX_TESTS_CA_BY_DEFAULT` - Pass `__contentAddressed`, `outputHashMode` and `outputHashAlgo` to builds of some input-addressed derivations in the test suite.
|
||||||
|
|
||||||
|
**Expected value**: 1
|
||||||
- `TEST_DATA` - Not an environment variable! This is used in repl characterization tests to refer to `tests/functional/repl_characterization/data`.
|
- `TEST_DATA` - Not an environment variable! This is used in repl characterization tests to refer to `tests/functional/repl_characterization/data`.
|
||||||
More specifically, that path is replaced with the string `$TEST_DATA` in output for reproducibility.
|
More specifically, that path is replaced with the string `$TEST_DATA` in output for reproducibility.
|
||||||
- `TEST_HOME` (output) - Set to the temporary directory that is set as `$HOME` inside the tests, underneath `$TEST_ROOT`.
|
- `TEST_HOME` (output) - Set to the temporary directory that is set as `$HOME` inside the tests, underneath `$TEST_ROOT`.
|
||||||
|
|||||||
@@ -41,6 +41,12 @@
|
|||||||
|
|
||||||
[realise]: #gloss-realise
|
[realise]: #gloss-realise
|
||||||
|
|
||||||
|
- [content-addressed derivation]{#gloss-content-addressed-derivation}
|
||||||
|
|
||||||
|
A derivation which has the
|
||||||
|
[`__contentAddressed`](./language/advanced-attributes.md#adv-attr-__contentAddressed)
|
||||||
|
attribute set to `true`.
|
||||||
|
|
||||||
- [fixed-output derivation]{#gloss-fixed-output-derivation}
|
- [fixed-output derivation]{#gloss-fixed-output-derivation}
|
||||||
|
|
||||||
A derivation which includes the
|
A derivation which includes the
|
||||||
@@ -89,13 +95,13 @@
|
|||||||
|
|
||||||
[store path]: #gloss-store-path
|
[store path]: #gloss-store-path
|
||||||
|
|
||||||
- [file system object]{#gloss-file-system-object}
|
- [file system object]{#gloss-store-object}
|
||||||
|
|
||||||
The Nix data model for representing simplified file system data.
|
The Nix data model for representing simplified file system data.
|
||||||
|
|
||||||
See [File System Object](@docroot@/architecture/file-system-object.md) for details.
|
See [File System Object](@docroot@/architecture/file-system-object.md) for details.
|
||||||
|
|
||||||
[file system object]: #gloss-store-path
|
[file system object]: #gloss-file-system-object
|
||||||
|
|
||||||
- [store object]{#gloss-store-object}
|
- [store object]{#gloss-store-object}
|
||||||
|
|
||||||
@@ -108,13 +114,14 @@
|
|||||||
- [input-addressed store object]{#gloss-input-addressed-store-object}
|
- [input-addressed store object]{#gloss-input-addressed-store-object}
|
||||||
|
|
||||||
A store object produced by building a
|
A store object produced by building a
|
||||||
|
non-[content-addressed](#gloss-content-addressed-derivation),
|
||||||
non-[fixed-output](#gloss-fixed-output-derivation)
|
non-[fixed-output](#gloss-fixed-output-derivation)
|
||||||
derivation.
|
derivation.
|
||||||
|
|
||||||
- [output-addressed store object]{#gloss-output-addressed-store-object}
|
- [output-addressed store object]{#gloss-output-addressed-store-object}
|
||||||
|
|
||||||
A [store object] whose [store path] is determined by its contents.
|
A [store object] whose [store path] is determined by its contents.
|
||||||
This includes derivations and the outputs of [fixed-output derivations](#gloss-fixed-output-derivation).
|
This includes derivations, the outputs of [content-addressed derivations](#gloss-content-addressed-derivation), and the outputs of [fixed-output derivations](#gloss-fixed-output-derivation).
|
||||||
|
|
||||||
- [substitute]{#gloss-substitute}
|
- [substitute]{#gloss-substitute}
|
||||||
|
|
||||||
@@ -242,7 +249,7 @@
|
|||||||
links. NARs are generated and unpacked using `nix-store --dump`
|
links. NARs are generated and unpacked using `nix-store --dump`
|
||||||
and `nix-store --restore`.
|
and `nix-store --restore`.
|
||||||
|
|
||||||
- [`∅`]{#gloss-empty-set}
|
- [`∅`]{#gloss-emtpy-set}
|
||||||
|
|
||||||
The empty set symbol. In the context of profile history, this denotes a package is not present in a particular version of the profile.
|
The empty set symbol. In the context of profile history, this denotes a package is not present in a particular version of the profile.
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user