clangd broke because it can't look through symlinks. compile_commands manipulation does not fix it, clangd configuration does not fix it, a vfs overlay does not fix it, and while a combination of those can fix it with a bind mount in place that's just too cursed to even consider clangd bug: https://github.com/llvm/llvm-project/issues/116877 Change-Id: I8e3e8489548eb3a7aa65ac9d12a5ec8abf814aec
43 lines
1.3 KiB
C++
43 lines
1.3 KiB
C++
#include "lix/libstore/temporary-dir.hh"
|
||
|
||
#include "lix/libutil/file-system.hh"
|
||
#include "lix/libstore/globals.hh"
|
||
|
||
namespace nix {
|
||
|
||
Path createTempDir(const Path & tmpRoot, const Path & prefix,
|
||
bool includePid, bool useGlobalCounter, mode_t mode)
|
||
{
|
||
return createTempSubdir(tmpRoot.empty() ? defaultTempDir() : tmpRoot, prefix, includePid, useGlobalCounter, mode);
|
||
}
|
||
|
||
std::pair<AutoCloseFD, Path> createTempFile(const Path & prefix)
|
||
{
|
||
Path tmpl(defaultTempDir() + "/" + prefix + ".XXXXXX");
|
||
// FIXME: use O_TMPFILE.
|
||
AutoCloseFD fd(mkstemp(tmpl.data()));
|
||
if (!fd)
|
||
throw SysError("creating temporary file '%s'", tmpl);
|
||
closeOnExec(fd.get());
|
||
return {std::move(fd), tmpl};
|
||
}
|
||
|
||
Path defaultTempDir()
|
||
{
|
||
return settings.tempDir.get().or_else([] {
|
||
return getEnvNonEmpty("TMPDIR").and_then([](auto val) -> std::optional<Path> {
|
||
#if __APPLE__
|
||
/* 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 (val.starts_with("/var/folders/")) {
|
||
return std::nullopt;
|
||
}
|
||
#endif
|
||
return val;
|
||
});
|
||
}).value_or("/tmp");
|
||
}
|
||
|
||
}
|