安装 opam 包时链接到非标准路径中的库

Linking to a library in a non-standard path when installing an opam package

我正在尝试在集群中安装 opam 包 (conf-zmq.0.1)。我没有root权限,我在/path/to/libzmq中手动安装了zmq库。

命令 "opam install zmq" 在以下位置失败:

[ERROR] The compilation of conf-zmq failed at "/hpc/eb/compilerwrappers/compilers/cc test.c -I/usr/local/include -L/usr/local/lib -lzmq".

这看起来很简单,但是在查看手册后,我一直无法找到如何告诉opam 将-L/usr/local/lib 更改为-L/path/to/libzmq。

如有任何帮助,我们将不胜感激。

不可能告诉 opam 任何关于 C 编译器链接规则的信息,也不能告诉 opam 任何关于 OCaml 链接规则或任何其他编译规则的信息,因为 opam 远高于此。 opam 的职责是找到最适合版本的包,下载它,并使用包维护者提供的构建和配置脚本进行安装。

尽管 opam 为包配置参数提供了便利,但 conf-zmq 维护者并未使用它们,也没有为其包提供任何参数化。事实上,除了将它们安装在硬编码位置之外,没有其他选项可以通过 conf-zmq 包的安装测试。您可以提交错误报告或向维护者寻求进一步支持。您可以在包的 the opam 文件中找到所有链接。

好消息是有一个解决方法。如果包描述损坏,那么您可以随时将包下载到您的本地文件系统,修复它,并固定修复后的版本。 opam 现在将使用您的本地版本。如果你想分发你的包,你当然需要将你的更改推送到上游(如果你希望它对一般 public 可用(即通过 ocaml.org),或者只是拥有你自己的opam 存储库(可能只包含一个包或多个包)。

但对于初学者来说,这里是第一个插入式说明,首先通过从 GitHub repository 克隆它或仅通过发出以下命令来获取源代码:

opam source zmq

然后您可以将工作目录更改为 opam 为您创建的文件夹,例如,对我来说是

cd zmq.5.1.3/

然后(最难的部分)破解软件包,使其可以安装在您的系统上。 (您需要做的第一件事是删除对损坏的 conf-zmq 包的依赖)。一旦你准备好了,或者认为你已经准备好了就去做

opam pin add .

opam 应该从 opam 文件中选择包名称,但如果它不会这样做,请参阅 opam pin --help 了解更多选项。然后它将尝试安装固定的包。如果失败了,那就继续hacking做

opam update
opam reinstall zmq # or install

补丁准备就绪后,您可以将其嵌入到您的自动化中或创建您自己的 opam 存储库。这也很简单,只需创建一个新的 GitHub 存储库(或克隆 ocaml/opam-repository,不推荐)然后复制您想要更改的包定义(对我们来说是 packages/zmq/zmq.5.1.3/) 并将您的技巧应用于 opam 和配置脚本。如果您的 hack 还包括对 zmq 源代码的更改,您可以将它们格式化为补丁并在您的 opam 文件中添加使用 patches 节以即时应用它们。