Проблема
Я запускаю проект на Haskell в NixOS (с использованием stack
), который использует XDG_RUNTIME_DIR
(в случае, если это имеет значение: это проект компоновщика Wayland, который выполняется с бэкэндом X11).Когда моя программа запускается:
stack exec my-compositor-project-exe # nix is enabled by default
Я получаю сообщение об ошибке:
error: XDG_RUNTIME_DIR not set in the environment
Однако, если я запускаю с --no-nix-pure
, я не получаю сообщение об ошибке:
stack --no-nix-pure exec my-compositor-project-exe
# ... no error ...
Но разве это лучший способ исправить эту ошибку?
Обратите внимание, что когда я запускаю echo $XDG_RUNTIME_DIR
в терминале NixOS, я получаю
echo $XDG_RUNTIME_DIR
/run/user/1000
и когда я запускаю nix-shell
в моем стековом проекте на Haskell я также получаю
[nix-shell:~/my-project]$ echo $XDG_RUNTIME_DIR
/run/user/1000
, поэтому совершенно непонятно, почему я вообще получаю эту ошибку.
Вопрос: Как правильно решить эту проблему?
Контекст
В случае, если это имеет значение здесь - некоторая информация о том, что означает $XDG_RUNTIME_DIR
:
Существует один базовый каталог, относительно которого должны быть размещены пользовательские исполняемые файлы и другие файловые объекты.Этот каталог определяется переменной среды $ XDG_RUNTIME_DI.
...
$ XDG_RUNTIME_DIR определяет базовый каталог, относительно которого пользовательские несущественные файлы времени выполнения и другие файловые объекты (такие какрозетки, именованные каналы,…) должны храниться.Каталог ДОЛЖЕН принадлежать пользователю, и он ДОЛЖЕН быть единственным, имеющим доступ к нему для чтения и записи.Его режим доступа Unix ДОЛЖЕН быть 0700.
...
Если $ XDG_RUNTIME_DIR не установлен, приложения должны вернуться в каталог замены с аналогичными возможностями и напечатать предупреждающее сообщение.Приложения должны использовать этот каталог для целей связи и синхронизации и не должны помещать в него файлы большего размера, поскольку он может находиться в оперативной памяти и не обязательно может быть выгружен на диск.
Специальный вызов FFI в моемПрограмма, которая выдает ошибку, является вызовом wl_display_add_socket
(функция wayland), которая имеет в верхней части тела:
WL_EXPORT int
wl_display_add_socket(struct wl_display *display, const char *name)
{
runtime_dir = getenv("XDG_RUNTIME_DIR");
if (!runtime_dir) {
wl_log("error: XDG_RUNTIME_DIR not set in the environment\n");
/* to prevent programs reporting
* "failed to add socket: Success" */
errno = ENOENT;
return -1;
}
//...
}