使软件包可重定位#

通常,构建 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.yamlbuild/binary_has_prefix_files 中列出单个二进制文件来注册它们。注册的文件将在安装时将其构建前缀替换为安装前缀。这通过用空终止符填充安装前缀来实现,从而使二进制文件的长度保持不变。因此,构建前缀必须足够长,以适应任何合理的安装前缀。在 macOS 和 Linux 上,conda-build 通过在构建目录名称的末尾附加 _placehold 将构建前缀填充到 255 个字符。

注意

前缀长度在 conda-build 2.0 中从 80 个字符更改为 255 个字符。具有 80 字符前缀的旧软件包必须重建才能利用更长的前缀。

  • 在某些情况下,conda 可能会将文件识别为二进制文件,但它需要像文本一样替换构建前缀——不使用空终止符填充。此类文件可以在 meta.yamlbuild/has_prefix_files 中列出。