Snapcraft自定义LD_LIBRARY_PATH

时间:2017-03-24 04:36:20

标签: snapcraft

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

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

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

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

1 个答案:

答案 0 :(得分:6)

Snapcraft维护公共库路径列表(例如/usr/lib//usr/lib/<arch>等)。如果存在这些目录,则会将它们添加到LD_LIBRARY_PATH。想想Ubuntu如何在你提到的那些不可预测的路径中“找到”libs:这是/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