【发布时间】:2019-02-12 00:14:33
【问题描述】:
问题
我正在 NixOS 上运行一个 Haskell 项目(使用 stack),该项目使用了 XDG_RUNTIME_DIR(以防万一:这是一个使用 X11 后端运行的 Wayland 合成器项目)。当我的程序启动时:
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 ...
但这真的是解决此错误的最佳方法吗?
请注意,当我在 NixOS 终端中运行 echo $XDG_RUNTIME_DIR 时,我得到了
echo $XDG_RUNTIME_DIR
/run/user/1000
当我在我的 Haskell 堆栈项目中运行 nix-shell 时,我也得到了
[nix-shell:~/my-project]$ echo $XDG_RUNTIME_DIR
/run/user/1000
所以我为什么会得到这个错误是一个谜。
问题:解决这个问题的正确方法是什么?
上下文
如果它很重要here 是一些关于$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;
}
//...
}
【问题讨论】:
标签: haskell haskell-stack nix