Установка XDG_RUNTIME_DIR в проекте Haskell Stack + Nix - PullRequest
0 голосов
/ 12 февраля 2019

Проблема

Я запускаю проект на 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;
  }
  //...
}

1 Ответ

0 голосов
/ 12 февраля 2019

Функция чистоты Nix в стеке работает не для всех, как вы заметили.Некоторые переменные среды просто необходимы для взаимодействия определенных программ с их средой, поэтому нет смысла использовать интеграцию Nix в чистом режиме.На мой взгляд, --nix-pure обычно подходит только для компиляции и, кстати, работает для некоторых простых программ.

Если вы чувствуете себя предприимчивым, вы можете попытаться явно передать переменные окружения через shell.nix,добавив эту строку в свой деривацию оболочки:

    XDG_RUNTIME_DIR = builtins.getEnv "XDG_RUNTIME_DIR"

Однако я не стал бы беспокоиться и просто позвонил бы stack exec с --no-nix-pure.

...