使包可重定位#

通常,构建 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 中列出。