aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2024-03-22 22:41:50 +0100
committerK900 <me@0upti.me>2024-06-24 11:30:32 +0300
commitd86009bd76ae85e56e1d26aab26d38f90ecb6439 (patch)
tree99a2396cc247c9857bf896910a74b4aa2f51321e /src/libstore
parent4c3d93611f2848c56ebc69c85f2b1e18001ed3c7 (diff)
Add build-dir setting, clean up default TMPDIR handling
This is a squash of upstream PRs #10303, #10312 and #10883. fix: Treat empty TMPDIR as unset Fixes an instance of nix: src/libutil/util.cc:139: nix::Path nix::canonPath(PathView, bool): Assertion `path != ""' failed. ... which I've been getting in one of my shells for some reason. I have yet to find out why TMPDIR was empty, but it's no reason for Nix to break. (cherry picked from commit c3fb2aa1f9d1fa756dac38d3588c836c5a5395dc) fix: Treat empty XDG_RUNTIME_DIR as unset See preceding commit. Not observed in the wild, but is sensible and consistent with TMPDIR behavior. (cherry picked from commit b9e7f5aa2df3f0e223f5c44b8089cbf9b81be691) local-derivation-goal.cc: Reuse defaultTempDir() (cherry picked from commit fd31945742710984de22805ee8d97fbd83c3f8eb) fix: remove usage of XDG_RUNTIME_DIR for TMP (cherry picked from commit 1363f51bcb24ab9948b7b5093490a009947f7453) tests/functional: Add count() (cherry picked from commit 6221770c9de4d28137206bdcd1a67eea12e1e499) Remove uncalled for message (cherry picked from commit b1fe388d33530f0157dcf9f461348b61eda13228) Add build-dir setting (cherry picked from commit 8b16cced18925aa612049d08d5e78eccbf0530e4) Change-Id: Ic7b75ff0b6a3b19e50a4ac8ff2d70f15c683c16a
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/build/local-derivation-goal.cc6
-rw-r--r--src/libstore/globals.cc2
-rw-r--r--src/libstore/globals.hh30
3 files changed, 29 insertions, 9 deletions
diff --git a/src/libstore/build/local-derivation-goal.cc b/src/libstore/build/local-derivation-goal.cc
index efba648a4..968f669ec 100644
--- a/src/libstore/build/local-derivation-goal.cc
+++ b/src/libstore/build/local-derivation-goal.cc
@@ -495,7 +495,7 @@ void LocalDerivationGoal::startBuilder()
/* Create a temporary directory where the build will take
place. */
- tmpDir = createTempDir("", "nix-build-" + std::string(drvPath.name()), false, false, 0700);
+ tmpDir = createTempDir(settings.buildDir.get().value_or(""), "nix-build-" + std::string(drvPath.name()), false, false, 0700);
chownToBuilder(tmpDir);
@@ -2107,8 +2107,8 @@ void LocalDerivationGoal::runChild()
bool allowLocalNetworking = parsedDrv->getBoolAttr("__darwinAllowLocalNetworking");
/* The tmpDir in scope points at the temporary build directory for our derivation. Some packages try different mechanisms
- to find temporary directories, so we want to open up a broader place for them to dump their files, if needed. */
- Path globalTmpDir = canonPath(getEnvNonEmpty("TMPDIR").value_or("/tmp"), true);
+ to find temporary directories, so we want to open up a broader place for them to put their files, if needed. */
+ Path globalTmpDir = canonPath(defaultTempDir(), true);
/* They don't like trailing slashes on subpath directives */
if (globalTmpDir.back() == '/') globalTmpDir.pop_back();
diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc
index 763dc9158..02d26e034 100644
--- a/src/libstore/globals.cc
+++ b/src/libstore/globals.cc
@@ -429,7 +429,7 @@ void initLibStore() {
/* On macOS, don't use the per-session TMPDIR (as set e.g. by
sshd). This breaks build users because they don't have access
to the TMPDIR, in particular in ‘nix-store --serve’. */
- if (getEnv("TMPDIR").value_or("/tmp").starts_with("/var/folders/"))
+ if (defaultTempDir().starts_with("/var/folders/"))
unsetenv("TMPDIR");
#endif
diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh
index 947a2fbf0..d360e5c5e 100644
--- a/src/libstore/globals.hh
+++ b/src/libstore/globals.hh
@@ -582,16 +582,36 @@ public:
Setting<std::string> sandboxShmSize{
this, "50%", "sandbox-dev-shm-size",
R"(
- This option determines the maximum size of the `tmpfs` filesystem
- mounted on `/dev/shm` in Linux sandboxes. For the format, see the
- description of the `size` option of `tmpfs` in mount(8). The default
- is `50%`.
+ *Linux only*
+
+ This option determines the maximum size of the `tmpfs` filesystem
+ mounted on `/dev/shm` in Linux sandboxes. For the format, see the
+ description of the `size` option of `tmpfs` in mount(8). The default
+ is `50%`.
)"};
Setting<Path> sandboxBuildDir{this, "/build", "sandbox-build-dir",
- "The build directory inside the sandbox."};
+ R"(
+ *Linux only*
+
+ The build directory inside the sandbox.
+
+ This directory is backed by [`build-dir`](#conf-build-dir) on the host.
+ )"};
#endif
+ Setting<std::optional<Path>> buildDir{this, std::nullopt, "build-dir",
+ R"(
+ The directory on the host, in which derivations' temporary build directories are created.
+
+ If not set, Nix will use the system temporary directory indicated by the `TMPDIR` environment variable.
+ Note that builds are often performed by the Nix daemon, so its `TMPDIR` is used, and not that of the Nix command line interface.
+
+ This is also the location where [`--keep-failed`](@docroot@/command-ref/opt-common.md#opt-keep-failed) leaves its files.
+
+ If Nix runs without sandbox, or if the platform does not support sandboxing with bind mounts (e.g. macOS), then the [`builder`](@docroot@/language/derivations.md#attr-builder)'s environment will contain this directory, instead of the virtual location [`sandbox-build-dir`](#conf-sandbox-build-dir).
+ )"};
+
Setting<PathSet> allowedImpureHostPrefixes{this, {}, "allowed-impure-host-deps",
"Which prefixes to allow derivations to ask for access to (primarily for Darwin)."};