*-pc-windows-gnullvm
Tier: 2 (without host tools)
Windows targets similar to *-pc-windows-gnu
but using UCRT as the runtime and various LLVM tools/libraries instead of GCC/Binutils.
Target triples available so far:
aarch64-pc-windows-gnullvm
i686-pc-windows-gnullvm
x86_64-pc-windows-gnullvm
Target maintainers
Requirements
The easiest way to obtain these targets is cross-compilation, but native build from x86_64-pc-windows-gnu
is possible with few hacks which I don't recommend.
Std support is expected to be on pair with *-pc-windows-gnu
.
Binaries for this target should be at least on pair with *-pc-windows-gnu
in terms of requirements and functionality.
Those targets follow Windows calling convention for extern "C"
.
Like with any other Windows target, created binaries are in PE format.
Building the target
These targets can be easily cross-compiled
using llvm-mingw toolchain or MSYS2 CLANG* environments.
Just fill [target.*]
sections for both build and resulting compiler and set installation prefix in config.toml
.
Then run ./x.py install
.
In my case I had ran ./x.py install --host x86_64-pc-windows-gnullvm --target x86_64-pc-windows-gnullvm
inside MSYS2 MINGW64 shell
so x86_64-pc-windows-gnu
was my build toolchain.
Native bootstrapping is doable in two ways:
- cross-compile gnullvm host toolchain and use it as build toolchain for the next build,
- copy libunwind libraries and rename them to mimic libgcc like here: https://github.com/msys2/MINGW-packages/blob/68e640756df2df6df6afa60f025e3f936e7b977c/mingw-w64-rust/PKGBUILD#L108-L109, stage0 compiler will be mostly broken but good enough to build the next stage.
The second option might stop working anytime, so it's not recommended.
Building Rust programs
Rust does ship a pre-compiled std library for those targets. That means one can easily cross-compile for those targets from other hosts if C proper toolchain is installed.
Alternatively full toolchain can be built as described in the previous section.
Testing
Created binaries work fine on Windows or Wine using native hardware. Testing AArch64 on x86_64 is problematic though and requires spending some time with QEMU.
Most of x86_64 testsuite does pass when cross-compiling,
with exception for rustdoc
and ui-fulldeps
that fail with and error regarding a missing library,
they do pass in native builds though.
The only failing test is std's process::tests::test_proc_thread_attributes
for unknown reason.
Cross-compilation toolchains and C code
Compatible C code can be built with Clang's aarch64-pc-windows-gnu
, i686-pc-windows-gnullvm
and x86_64-pc-windows-gnu
targets as long as LLVM-based C toolchains are used.
Those include: