pub enum Env {
None,
Gnu,
Musl,
Msvc,
Android,
Simulator,
MacAbi,
}Expand description
The environment component of a tuple.
For Linux this is the C library, and it is the field that decides the syscall wrappers, the
start files, the symbol versions and whether a static link is supported. For Darwin it is
the ABI variant, simulator or Mac Catalyst, which is not a libc at all. For Windows it is
both at once: gnu means mingw-w64 and msvcrt, msvc means the Microsoft SDK and the
universal CRT, and the two produce different object code for the same source.
One field carrying two meanings is not ideal, and it is what every existing toolchain does,
so a tuple that spelled it differently would not round-trip through the tools everyone else
uses. spec/cross-compile/03-target-model.md section 3.5 takes the compatibility.
Variants§
None
No environment component. Darwin, the BSDs, illumos, WASI and freestanding.
Gnu
glibc. Versioned, and the version is load bearing: spec/cross-compile/09-libc-stubs.md is mostly
about the fact that a symbol here has a version node attached to it.
Musl
musl. The default for static linking and the first cross target, because it is one
tarball with no version nodes and no abilist.
Msvc
The Microsoft toolchain: the Windows SDK headers and the universal CRT.
Android
Bionic. A Linux kernel with an API level instead of a libc version.
Simulator
A Darwin simulator ABI. Same architecture as the host, different platform value in
LC_BUILD_VERSION, different SDK.
MacAbi
Mac Catalyst. An iOS ABI hosted on macOS.
Implementations§
Source§impl Env
impl Env
Sourcepub const fn as_str(self) -> &'static str
pub const fn as_str(self) -> &'static str
The canonical name, without the version and without any ABI suffix.
The suffixes that GCC fuses into this component, eabihf on ARM and x32 on x86-64, are
not here. They come from the ABI and the data model, and crate::TargetTuple puts them
back when it formats the tuple. Storing them here as well would be the same fact in two
places, which is the shape of every bug where a target is configured half one way.
Sourcepub const fn is_libc(self) -> bool
pub const fn is_libc(self) -> bool
Whether this environment is a C library whose version the tuple may pin.
Sourcepub const fn supports_static_link(self) -> bool
pub const fn supports_static_link(self) -> bool
Whether a fully static link is supported.
glibc technically permits one and it is a trap: dlopen, NSS and iconv all stop
working, quietly, at run time on the user’s machine rather than at link time on ours.
spec/cross-compile/10-runtime.md section 10.6 says the driver warns instead of refusing, because a
program that uses none of those three is fine and it is not our place to say which.
Sourcepub const fn version_is_api_level(self) -> bool
pub const fn version_is_api_level(self) -> bool
Whether a version attached to this environment is an API level rather than a release number, which changes how it is compared and how the stub set is chosen.