我尝试使用常用的 OCaml 软件包安装命令在新的 Ubuntu 22 虚拟机中安装camlidl软件包:
$ opam install camlidl.1.12
但我收到了以下错误消息,这是我以前从未见过的:
[ERROR] The compilation of camlidl.1.12 failed at "make all".
#=== ERROR while compiling camlidl.1.12 =======================================#
# context 2.1.2 | linux/x86_64 | ocaml.4.13.1 | https://opam.ocaml.org#28c3ca4d
# path ~/.opam/default/.opam-switch/build/camlidl.1.12
# command ~/.opam/opam-init/hooks/sandbox.sh build make all
# exit-code 1
# env-file ~/.opam/log/camlidl-513510-e00e41.env
# output-file ~/.opam/log/camlidl-513510-e00e41.out
### output ###
# bwrap: execvp make: No such file or directory
我之前曾在同一主机下运行的其他 Ubuntu 22 虚拟机中成功安装过相同的软件包,所以我发现这次安装opam
命令失败了,这很奇怪。
该错误消息对我来说也很奇怪,因为我的系统在其标准位置 ( ) 中确实可用 ,并且我可以在同一个系统中成功构建/编译所有依赖于“make”的 C++ 项目,没有任何问题。make
/usr/bin/make
这次我们还能犯什么错呢?
[解决方案]
OcamL 包管理器 (opam) 在“ BubbleWrap ”实用程序 (
brwap
) 的帮助下安装包时会创建一个“沙盒”构建环境。使用该实用程序的一个副作用bwrap
是,它将忽略并拒绝主机文件系统中不直接可用的任何命令,以提供其功能性“沙盒”隔离构建环境。在我的新 Ubuntu 22 虚拟机中,我正在测试该命令的新版本,其存储库驻留在单独的安装点(即另一个硬盘驱动器)中,并且我创建了一个指向标准bin
make
中编译的新版本的“软链接”make
位置如下:所以最后,
brwap
让 Ocaml 构建环境忽略/忽略我的本地make
命令,因为指向的二进制文件位于单独的文件系统中。一种解决方案是将命令的链接重新创建
make
为“硬链接”,但不能在不同的文件系统之间创建“硬链接”。因此,我的解决方案是消除该链接并将
make
二进制文件直接复制到其标准位置 (/usr/bin/make
)。我希望这可以帮助其他用户在安装依赖于内部创建“沙盒环境”的软件包或库时面临类似问题,这些环境可以暂时隐藏/阻止对正常工作的构建实用程序和命令的访问。