conan.tools.apple.fix_apple_shared_install_name()

fix_apple_shared_install_name(conanfile)

在 conanfile 的 package_folder 中搜索所有 dylib 文件,并使用 macOS 中可用的 install_name_tool 实用程序修复这些文件上的 LC_ID_DYLIBLC_LOAD_DYLIB 字段,以设置 @rpath

此工具将搜索 conanfile 的 package_folder 中的所有 dylib 文件,并修复库的 安装名称LC_ID_DYLIB 标头)。包文件夹内的库和可执行文件也将更新 LC_LOAD_DYLIB 字段以反映已修补的安装名称。包内的可执行文件还将获得一个指向包文件夹内库的相对位置的 LC_RPATH 条目。这是使用 macOS 中可用的 install_name_tool 实用程序完成的,如下所示

  • 对于 LC_ID_DYLIB(包含库安装名称的字段),它会将安装名称更改为使用 @rpath 的名称。例如,如果安装名称是 /path/to/lib/libname.dylib,则新的安装名称将为 @rpath/libname.dylib。这是通过在内部执行类似以下内容来完成的

install_name_tool /path/to/lib/libname.dylib -id @rpath/libname.dylib
  • 对于 LC_LOAD_DYLIB(包含库依赖项路径的字段),它会将依赖项的路径更改为使用 @rpath 的路径。例如,如果二进制文件依赖于 /path/to/lib/dependency.dylib,则将其更新为 @rpath/dependency.dylib。这对于包文件夹内的库和可执行文件都是如此,调用 install_name_tool 如下

install_name_tool /path/to/lib/libname.dylib -change /path/to/lib/dependency.dylib @rpath/dependency.dylib
  • 对于 LC_RPATH,在包也包含依赖于同一包内库的二进制可执行文件的情况下,将添加条目以反映库相对于可执行文件的的位置。如果包在 bin 子文件夹中具有可执行文件,而在 lib 子文件夹中具有库,则可以使用以下调用执行此操作

install_name_tool /path/to/bin/my_executable -add_rpath @executable_path/../lib

此工具通常由使用 Autotools 作为构建系统的配方以及在未修复正在打包的库中的正确安装名称的情况下需要。如果需要,请在 conanfile 的 package() 方法中使用此工具,例如

from conan.tools.apple import fix_apple_shared_install_name

class HelloConan(ConanFile):

  ...

  def package(self):
      autotools = Autotools(self)
      autotools.install()
      fix_apple_shared_install_name(self)

conan.tools.apple.is_apple_os()

is_apple_os(conanfile)

如果操作系统是 Apple 操作系统(Macos、iOS、watchOS、tvOS 或 visionOS),则返回 True。

conan.tools.apple.to_apple_arch()

to_apple_arch(conanfile, default=None)

将 conan 样式的体系结构转换为 Apple 样式的体系结构。

conan.tools.apple.XCRun()

class XCRun(conanfile, sdk=None, use_settings_target=False)

XCRun 是 Apple xcrun 工具的包装器,用于获取构建信息。

参数:
  • conanfile – Conanfile 实例。

  • sdk – 当传递 False 时将跳过标志,如果传递 None 则将尝试自动调整 sdk。

  • use_settings_target – 在存在 settings_target 的情况下尝试使用它们(默认为 False)。

find(tool)

查找 SDK 工具(例如 clang、ar、ranlib、lipo、codesign 等)。

property sdk_path

获取 sdk 路径(也称为 apple sysroot 或 -isysroot)。

property sdk_version

获取 sdk 版本。

property sdk_platform_path

获取 sdk 平台路径。

property sdk_platform_version

获取 sdk 平台版本。

property cc

C 编译器 (CC) 的路径。

property cxx

C++ 编译器 (CXX) 的路径。

property ar

归档器 (AR) 的路径。

property ranlib

归档索引器 (RANLIB) 的路径。

property strip

符号移除实用程序 (STRIP) 的路径。

property libtool

libtool 的路径。

property otool

otool 的路径。

property install_name_tool

install_name_tool 的路径。