构建快照包时,包装程序脚本会自动将$SNAP/usr/lib
添加到LD_LIBRARY_PATH
。
在docker上构建我的软件包时,一些库(在本例中为liblapack
和libblas
)分别安装在以下子目录中:$SNAP/usr/lib/lapack
和$SNAP/usr/lib/libblas
。
尽管所有依赖项都在我的snapcraft.yaml中的stage-packages
下定义,但是上述路径未包含在包装脚本中。
如何强制snapcraft将所有库的路径自动添加到包装脚本?
最佳答案
Snapcraft维护一个常用库路径的列表(例如/usr/lib/
,/usr/lib/<arch>
等)。如果这些目录存在,它将把它们添加到LD_LIBRARY_PATH
。想一想Ubuntu如何以您提到的那种不可预测的方式“找到” libs:这是/etc/ld.so.conf
背后的原因之一。但是,软件包将新库通知Ubuntu的典型方式是在安装Debian软件包后运行的挂钩中。在Snapcraft的情况下,这些挂钩永远不会运行-阶段包装只是解包了。这意味着Snapcraft无法轻松地得知刚刚解压缩的Stage-Pack在不可预测的位置具有一个库。
尽管Snapcraft目前无法自动为您提供帮助,但您绝对可以使用以下两种方法之一自行完成此操作:
创建一个设置LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/usr/lib/lapack
的包装器脚本,然后执行您实际要运行的二进制文件。然后在apps
部分中使用该包装器脚本。
使用new和as yet undocumented environment
关键字,如下所示:
apps:
my-app:
command: my-binary
environment:
LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$SNAP/usr/lib/lapack