如何在 CMake 时找到正确的 ZSH $fpath(Linux 发行版差异)?

How to find the right ZSH $fpath at CMake time (Linux distro differences)?

情况

软件作者想在他的项目中添加 zsh 补全。 Has written completion script,有效。

需要找出 $CMAKE_INSTALL_PREFIX 下的安装位置,以便默认找到它。

问题

针对Ubuntu 20.04测试Fedora 34,发现$fpath唯一的公共成员是/usr/local/share/zsh/site-functions; none 的 /usr/share fpaths 重叠。特别是,Ubuntu 读取 /usr/share/zsh/site-functions.

所以,我不能只安装到 $CMAKE_INSTALL_PREFIX/share/zsh/site-functions,因为这只适用于 $CMAKE_INSTALL_PREFIX==/usr/local,但在以后的打包 ($CMAKE_INSTALL_PREFIX==/usr) 中不起作用。我认为这是 Ubuntu 不一致,但这并不重要。

问题

有没有一种明智的方法可以在 CMake 时确定将完成脚本放在哪里?

请注意,CMake 不是 通常 运行 来自 zsh,因此检查 $fpath 不是一个选项。

$CMAKE_INSTALL_PREFIX/share/zsh/site-functions 是正确的地方。

这与手册页、信息页、pkg-config 路径、二进制文件和库以及其他任何内容相同。在默认安装中,man 只会查看预定义的位置,例如 /usr/share/man/usr/local/share/man.

如果有人决定安装到 /opt/gnuradio 或其他任何地方,那么他们也有责任确保他们相应地设置 $PATH$MANPATH $INFOPATH 和其他任何内容. $fpath 也一样。最好的软件可以做的是确保它们遵守既定的约定,而不是在 $PREFIX.

之外的文件系统上的其他地方喷出文件。

如果 Ubuntu 想变得聪明并发明他们自己的 vendor-completion 目录,那么这样做的结果是他们需要修补他们打包的所有内容,包括 zsh 完成。那是他们的问题,因为他们为自己制造了问题。