*-pc-windows-gnullvm

层级: 2 (不含宿主机工具)

类似于 *-pc-windows-gnu 的 Windows 目标,但使用 UCRT 作为运行时,并使用各种 LLVM 工具/库而不是 GCC/Binutils。

目前可用的目标三元组

  • aarch64-pc-windows-gnullvm
  • i686-pc-windows-gnullvm
  • x86_64-pc-windows-gnullvm

目标维护者

要求

获取这些目标的最简单方法是交叉编译,但从 x86_64-pc-windows-gnu 进行本地构建也是可能的,只需一些我不推荐的技巧。Std 支持预计与 *-pc-windows-gnu 持平。

此目标的二进制文件在要求和功能方面应至少与 *-pc-windows-gnu 持平。

这些目标遵循 extern "C" 的 Windows 调用约定。

与任何其他 Windows 目标一样,创建的二进制文件为 PE 格式。

构建目标

这些目标可以使用 llvm-mingw 工具链或 MSYS2 CLANG* 环境轻松交叉编译。只需为构建和生成的编译器填写 [target.*] 部分,并在 config.toml 中设置安装前缀。然后运行 ./x.py install。在我的例子中,我在 MSYS2 MINGW64 shell 中运行了 ./x.py install --host x86_64-pc-windows-gnullvm --target x86_64-pc-windows-gnullvm,所以 x86_64-pc-windows-gnu 是我的构建工具链。

本地引导可以通过两种方式实现

  • 交叉编译 gnullvm 宿主机工具链,并将其用作下一个构建的构建工具链,
  • 复制 libunwind 库并将它们重命名以模仿 libgcc,例如此处:https://github.com/msys2/MINGW-packages/blob/68e640756df2df6df6afa60f025e3f936e7b977c/mingw-w64-rust/PKGBUILD#L108-L109,stage0 编译器在很大程度上会被破坏,但足以构建下一个阶段。

第二种选择可能随时停止工作,因此不建议使用。

构建 Rust 程序

Rust 确实为这些目标发布了预编译的 std 库。这意味着如果安装了合适的 C 工具链,可以很容易地从其他主机为这些目标进行交叉编译。

或者,可以按照上一节中的描述构建完整的工具链。

测试

创建的二进制文件可以在 Windows 或 Wine 上使用本地硬件正常工作。但在 x86_64 上测试 AArch64 存在问题,需要花一些时间使用 QEMU。大多数 x86_64 测试套件在交叉编译时都能通过,除了 rustdocui-fulldeps 失败并出现关于缺少库的错误,但它们在本地构建中通过。唯一失败的测试是 std 的 process::tests::test_proc_thread_attributes,原因不明。

交叉编译工具链和 C 代码

只要使用基于 LLVM 的 C 工具链,兼容的 C 代码可以使用 Clang 的 aarch64-pc-windows-gnui686-pc-windows-gnullvmx86_64-pc-windows-gnu 目标构建。这些工具链包括