Snapcraft 自定义 LD_LIBRARY_PATH

Snapcraft custom LD_LIBRARY_PATH

构建 snap 包时,包装器脚本会自动将 $SNAP/usr/lib 添加到 LD_LIBRARY_PATH

在 docker 上构建我的包时,一些库(在本例中为 liblapacklibblas)安装在子目录中:$SNAP/usr/lib/lapack$SNAP/usr/lib/libblas分别

虽然我的snapcraft.yaml中的stage-packages下定义了所有的依赖,但是上面的路径没有包含在wrapper脚本中。

如何强制 snapcraft 自动将所有库的路径添加到包装器脚本?

Snapcraft 维护着一个公共库路径列表(例如 /usr/lib//usr/lib/<arch> 等)。如果这些目录存在,它将把它们添加到 LD_LIBRARY_PATH。想一想 Ubuntu "finds" 如何在您提到的这种不可预测的路径中进行库:这是 /etc/ld.so.conf 背后的原因之一。但是,软件包通知 Ubuntu 新库的典型方式是在安装 Debian 软件包后 运行 的挂钩中。在 Snapcraft 的情况下,这些挂钩永远不会 运行-- 阶段包只是简单地解包。这意味着 Snapcraft 没有简单的方法来了解它刚刚解压的阶段包在不可预测的地方有一个库。

虽然 Snapcraft 目前无法自动帮助您,但您绝对可以使用以下两种方式之一自行完成此操作:

  1. 创建一个设置 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/usr/lib/lapack 的包装脚本,然后执行您真正想要 运行 的二进制文件。然后在 apps 部分使用该包装脚本。
  2. 利用新的 as yet undocumented environment 关键字,像这样:

    apps:
      my-app:
        command: my-binary
        environment:
          LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$SNAP/usr/lib/lapack