Ocaml 安装opam包时以非标准路径链接到库

Ocaml 安装opam包时以非标准路径链接到库,ocaml,opam,Ocaml,Opam,我试图在集群中安装一个opam包(conf zmq.0.1)。我没有根访问权限,并且我已经在/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包(conf zmq.0.1)。我没有根访问权限,并且我已经在/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包之外,没有其他选项可以通过conf-zmq包的安装测试。您可以提交错误报告或要求维护人员提供进一步的支持。您可以在包的文件中找到所有链接

好消息是有一个解决办法。如果包描述被破坏,那么您总是可以将包下载到您的本地文件系统,修复它,并将pin码转换为修复版本。opam现在将使用您的本地版本。如果您想分发您的包,您当然需要将您的更改推到上游(如果您希望它对公众可用(即通过ocaml.org),或者只需要拥有自己的opam存储库(可能只包含一个或多个包)

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

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

cd zmq.5.1.3/
然后(最难的部分)破解软件包,使其可安装在您的系统上。(您需要做的第一件事是放弃对已损坏的
conf zmq
软件包的依赖)。一旦您准备好了,或者认为您已经准备好了,就这样做

opam pin add .
opam应该从opam文件中选择包名,但如果不这样做,请参见
opam pin--help
,以了解更多选项。然后,它将尝试安装固定的包。如果失败,则继续进行黑客攻击

opam update
opam reinstall zmq # or install
补丁准备好后,您可以将其嵌入到您的automation中,也可以创建自己的opam存储库。这也非常简单,只需创建一个新的GitHub repo(或克隆ocaml/opam存储库,不推荐),然后复制您要更改的包定义(对于我们来说,它将是
packages/zmq/zmq.5.1.3/
)并将您的攻击应用于opam和配置脚本。如果您的攻击还包括对zmq源代码的更改,您可以将其格式化为补丁,并使用opam文件中的
补丁
节动态应用它们