ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Rust 编译器 macOS 目标平台(*-apple-darwin)完整支持指南

Rust 编译器 macOS 目标平台(*-apple-darwin)完整支持指南 Rust 编译器 macOS 目标平台*-apple-darwin完整支持指南【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust本指南基于 rustc 官方平台支持文档 src/doc/rustc/src/platform-support/apple-darwin.md系统讲解 Rust 在 Apple macOS 上的两个官方目标aarch64-apple-darwin与x86_64-apple-darwin的支持等级、最低系统版本、部署目标deployment target配置、宿主工具链要求、Mach-O 二进制格式、交叉编译与 C 代码链接等核心内容。读完本文你将掌握如何确认目标可用性、如何通过MACOSX_DEPLOYMENT_TARGET调整部署目标、如何获取默认部署目标、以及如何在非 macOS 主机上为 macOS 进行交叉编译。目标平台总览与支持等级*-apple-darwin是 rustc 对 Apple macOS 官方目标的统称。根据 rustc_target 的目标定义目前该系列包含两个受支持的官方目标目标三元组支持等级说明最低 macOS 版本aarch64-apple-darwinTier 1macOS on ARM64适用于 M1 系列及更新的 Apple Silicon CPU11.0 Big Surx86_64-apple-darwinTier 2macOS on 64 位 x8610.12 SierraTier 1 意味着该目标被保证能够构建、测试并持续通过 rustc 的 CI 验证可以放心作为主开发目标使用Tier 2 则代表官方认可的正式目标但不参与同等强度的 CI 保障。两个目标都启用了host_tools: true与std: true见 aarch64_apple_darwin.rs 中的TargetMetadata即支持作为宿主工具链运行且标准库可用。除了这两个官方目标仓库中还存在arm64e-apple-darwin、x86_64h-apple-darwin、i686-apple-darwin等相关目标定义见 spec/targets 目录它们的支持情况在各自的平台文档中单独说明不在本文范围内。目标维护者当前文档登记的维护者为 thomcc其中由架构Arch、OSOs与 ABI 环境TargetEnv区分Normal/Simulator/MacCatalyst三者唯一确定一份基础TargetOptions。最低系统版本与部署目标Deployment Targetrustc 支持的 macOS 最低版本x86_64-apple-darwin最低支持macOS 10.12 Sierraaarch64-apple-darwin最低支持macOS 11.0 Big Sur。这两组数字在源码中有两处对应定义其一在目标文件元数据描述中aarch64 目标标注ARM64 Apple macOS (11.0, Big Sur)x86_64 目标标注x86_64 Apple macOS (10.12, Sierra)其二在 base/apple/mod.rs 的OSVersion::os_minimum_deployment_target中Os::MacOs对应的默认值为(10, 12, 0)而minimum_deployment_target对(MacOs, AArch64)组合额外提升为(11, 0, 0)。源码注释还特别提醒这些默认值可能在未来的 rustc 版本中变化如需确认当前版本的默认部署目标应直接执行rustc --print deployment-target。按二进制调整部署目标MACOSX_DEPLOYMENT_TARGET文档明确指出最低支持版本可以按单个二进制进行提升——只需修改部署目标deployment target且更高的部署目标可能带来更多性能优化机会。rustc 会遵循 Xcode 常用的环境变量来完成这一调整对 macOS 而言即为MACOSX_DEPLOYMENT_TARGET。底层解析逻辑在 compiler/rustc_session/src/session.rs#L1144-L1178 的Session::apple_deployment_target中实现其行为可以总结为读取环境变量变量名由deployment_target_env_var按 OS 决定macOS 对应MACOSX_DEPLOYMENT_TARGET见 base/apple/mod.rs#L353-L363若变量未设置回退到上述最低版本若变量有效但低于 rustc 支持的最低 OS 版本则发出TooLow警告并将部署目标抬升到最低支持版本此处特意只与 rustc 全局最低版本比较而非与具体目标的最低版本比较——一个常见场景是用户在 AArch64 的 macOS 上为了兼容旧 x86_64 而把目标设得过低若变量格式非法无法解析为主.次.补丁版本号则发出Invalid错误并回退到最低版本。查询当前默认部署目标$ rustc --printdeployment-target该命令由 print_request.rs 中的DeploymentTarget请求实现输出内容即当前目标默认的部署目标版本例如aarch64-apple-darwin会输出11.0。--print选项的完整说明见 src/doc/rustc/src/command-line-arguments.md#option-print。版本号的数据模型部署目标版本在 base/apple/mod.rs#L252-L278 中以OSVersion { major: u16, minor: u8, patch: u8 }表示其数值范围受 Mach-O 的LC_BUILD_VERSION加载命令限制。字符串解析支持12、10.12、11.0.1等多种写法省略的部分按 0 补齐。宿主工具链要求Host Tooling文档规定宿主工具链rustc、cargo等的最低受支持 OS 版本与应用二进制相同即 x86 为 10.12、ARM64 为 11.0最低 Xcode 版本为9.2。需要额外注意如果要从源码构建 rustc 本身很可能也需要从源码构建 LLVM。文档说明针对 LLVM 19这一过程要求Xcode 10.0 与 macOS 10.13及以上高于普通应用的最低要求。因此在较老的 macOS 环境上构建完整工具链时应先核对宿主的 Xcode 与系统版本是否满足 LLVM 的构建前提。二进制格式Mach-O所有 Apple 平台的默认二进制格式均为Mach-O即 Apple 平台上可执行文件与库使用的原生格式。这一点在 base/apple/mod.rs#L129-L148 的TargetOptions中有直接体现binary_format: BinaryFormat::MachO动态库后缀为.dylibdll_suffix归档格式为darwinarchive_format链接器风格为LinkerFlavor::Darwin(Cc::Yes, Lld::No)即默认调用基于 Clang 驱动的外部ld64风格链接器dynamic_linking: true支持动态链接has_thread_local: truemacOS 10.7 起即支持 TLS远低于最低版本要求is_like_darwin: true与families: [unix]使编译器中大量面向 Darwin 平台的路径得以生效。调试信息与可复现构建细节同一份基础选项还包含若干值得注意的细节默认调试信息格式为 DWARF 4default_dwarf_version: 4与 LLVM 对 macOS 10.11 的默认一致并通过dsymutil生成Packed形式的.dSYM包debuginfo_kind: DebuginfoKind::DwarfDsym、split_debuginfo: SplitDebuginfo::Packed同时支持Unpacked与Off两种变体链接时会设置ZERO_AR_DATE1环境变量见 base/apple/mod.rs#L181-L199要求链接器忽略时间戳以生成可复现deterministic的二进制这是ld64自 Xcode 9.3 起支持的行为源码注释也提到更干净的替代方案是-reproducible标志但其要求 Xcode 14 附带的ld64-819.6高于本项目支持的最低 Xcode 版本故未采用各架构的帧指针策略不同x86_64 与 i386 始终保留帧指针FramePointer::AlwaysARM64 采用NonLeaf省略叶子函数的帧指针——这与 clang 在对应架构上的默认行为保持一致。安装与构建通过 rustup 分发两个目标均通过rustup直接分发无需任何特殊配置即可安装使用# 为 macOS 目标添加工具链在任意主机上均可 $ rustup target add aarch64-apple-darwin $ rustup target add x86_64-apple-darwin # 本机直接构建 $ cargo build --target aarch64-apple-darwin # 查看已安装目标 $ rustup target list --installed由于两个目标均启用了host_tools在 macOS 主机上它们本身就是可运行的宿主工具链在非 macOS 主机上安装后即具备交叉编译能力详见下文交叉编译章节。测试与运行文档指出该目标在测试与运行方面没有特殊要求标准的cargo test即可在目标平台上直接执行。一个值得一提的运行时特性是x86_64 二进制可以通过 Rosetta 在 Apple Silicon 上运行。这意味着在尚未为 Apple Silicon 完成原生适配的过渡期x86_64-apple-darwin产物仍可在 M1 及更新机型上以模拟方式执行为兼容性验证提供了便利。交叉编译工具链与 C 代码使用 Clang 与 macOS SDK对*-apple-darwin目标进行交叉编译时官方支持使用Clang但编译 C 代码及链接环节通常需要 Xcode 或 macOS SDKMacOSX.sdk可用。核心要点如下Clang 目标后缀Clang 中 Apple 目标的后缀是-macosx例如aarch64-apple-macosx而 Clang 的-darwin泛指 Darwin 平台macOS/iOS/tvOS/watchOS/visionOS必须配合-mmacosx-version-min...、-miphoneos-version-min...等标志才能消除歧义、指明具体平台SDK 路径可通过环境变量SDKROOT将 SDK 路径传给 rustc若在宿主 macOS 上编译则会自动推断推断逻辑与执行xcrun --sdk macosx --show-sdk-path的结果基本一致。LLVM 目标的完整三元组在 base/apple/mod.rs#L214-L232 的unversioned_llvm_target中生成macOS 对应x86_64-apple-macosx、arm64-apple-macosx等形式。链接环境变量的清理逻辑交叉链接时链接器相关的部署目标环境变量会被自动清理以避免冲突。在 base/apple/mod.rs#L234-L250 的link_env_remove中当编译目标是 macOS 时会移除IPHONEOS_DEPLOYMENT_TARGET、TVOS_DEPLOYMENT_TARGET、XROS_DEPLOYMENT_TARGET——这些环境变量一旦残留会干扰 Xcode 链接器位于XcodeDefault.xctoolchain/usr/bin/ld的决策当交叉编译到其他 OS/SDK包括 Mac Catalyst时则移除MACOSX_DEPLOYMENT_TARGET防止本机的 macOS 部署目标被错误地带入跨系统链接。这种「按目标 OS 定向清理」的设计保证了同一台机器上的多平台构建互不干扰相关行为在 base/apple/tests.rs 中有对应测试覆盖如simulator_targets_set_env、macos_link_environment_unmodified。目标特定的实现细节CPU、原子操作与 sanitizer两个目标的差异不仅体现在支持等级上还体现在目标特性中可分别对照 aarch64_apple_darwin.rs 与 x86_64_apple_darwin.rs默认 CPUaarch64-apple-darwin的默认 CPU 为apple-m1x86_64-apple-darwin的基础 CPU 为penrynbase 中按最低 macOS 10.12 反推的最老 x86_64 微架构保证兼容所有受支持硬件原子宽度两个目标均支持 128 位原子操作max_atomic_width: Some(128)x86_64 侧依赖 penryn 及以上的cmpxchg16b指令Sanitizer两个目标都支持 Address、Control Flow IntegrityCFI、Thread 与 Realtime sanitizerx86_64 目标额外支持 Leak sanitizeraarch64因已知测试问题暂未启用X-Ray两者均声明supports_xray: true支持 Apple 的 X-Ray 性能分析插桩插桩函数均使用符号化的mcount\u{1}mcount作为函数入口插桩符号这是 Darwin 平台的约定。小结*-apple-darwin是 rustc 对 macOS 平台的官方支持目标族aarch64-apple-darwinTier 1macOS 11.0与x86_64-apple-darwinTier 2macOS 10.12通过 rustup 直接分发、无需特殊配置。实际开发中需要记住的关键操作包括用rustc --printdeployment-target查询默认部署目标、用MACOSX_DEPLOYMENT_TARGET按二进制提升部署目标以换取性能优化、交叉编译时准备 Clang 与MacOSX.sdk或通过SDKROOT指定、以及利用 Rosetta 在 Apple Silicon 上运行 x86_64 产物。相关的部署目标解析、链接环境清理与目标特性定义均可从 compiler/rustc_target/src/spec/base/apple/mod.rs 及其测试文件 base/apple/tests.rs 中继续深入阅读。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表