使软件包可重定位#
通常,构建 conda 软件包最困难的事情是使其可重定位。可重定位意味着软件包可以安装到任何前缀中。否则,软件包将仅在构建它的环境中可用。
Conda-build 自动执行以下操作以使软件包可重定位
二进制对象文件被转换为使用相对路径,在 macOS 上使用
install_name_tool
,在 Linux 上使用 patchelf。任何不包含 NULL 字节且包含构建前缀或占位符前缀
/opt/anaconda1anaconda2anaconda3
的文本文件都会在软件包元数据中的info/has_prefix
文件中注册。当 conda 安装软件包时,info/has_prefix
中的任何文件都会将其注册的前缀替换为安装前缀。有关更多信息,请参阅软件包元数据。任何包含构建前缀的二进制文件都可以使用
meta.yaml
中的build/detect_binary_files_with_prefix
自动在info/has_prefix
中注册。或者,可以通过在meta.yaml
的build/binary_has_prefix_files
中列出单个二进制文件来注册它们。注册的文件将在安装时将其构建前缀替换为安装前缀。这通过用空终止符填充安装前缀来实现,从而使二进制文件的长度保持不变。因此,构建前缀必须足够长,以适应任何合理的安装前缀。在 macOS 和 Linux 上,conda-build 通过在构建目录名称的末尾附加_placehold
将构建前缀填充到 255 个字符。
注意
前缀长度在 conda-build 2.0 中从 80 个字符更改为 255 个字符。具有 80 字符前缀的旧软件包必须重建才能利用更长的前缀。
在某些情况下,conda 可能会将文件识别为二进制文件,但它需要像文本一样替换构建前缀——不使用空终止符填充。此类文件可以在
meta.yaml
的build/has_prefix_files
中列出。