3 // Test target self-consistency and JSON encoding/decoding roundtrip.
4 pub(super) fn test_target(target
: Target
) {
5 target
.check_consistency();
6 assert_eq
!(Target
::from_json(target
.to_json()).map(|(j
, _
)| j
), Ok(target
));
10 fn check_consistency(&self) {
11 assert_eq
!(self.is_like_osx
, self.vendor
== "apple");
12 assert_eq
!(self.is_like_solaris
, self.os
== "solaris" || self.os
== "illumos");
13 assert_eq
!(self.is_like_windows
, self.os
== "windows" || self.os
== "uefi");
14 assert_eq
!(self.is_like_wasm
, self.arch
== "wasm32" || self.arch
== "wasm64");
15 assert
!(self.is_like_windows
|| !self.is_like_msvc
);
17 // Check that LLD with the given flavor is treated identically to the linker it emulates.
18 // If your target really needs to deviate from the rules below, except it and document the
21 self.linker_flavor
== LinkerFlavor
::Msvc
22 || self.linker_flavor
== LinkerFlavor
::Lld(LldFlavor
::Link
),
23 self.lld_flavor
== LldFlavor
::Link
,
25 assert_eq
!(self.is_like_msvc
, self.lld_flavor
== LldFlavor
::Link
);
29 &self.late_link_args_dynamic
,
30 &self.late_link_args_static
,
34 args
.get(&LinkerFlavor
::Msvc
),
35 args
.get(&LinkerFlavor
::Lld(LldFlavor
::Link
)),
37 if args
.contains_key(&LinkerFlavor
::Msvc
) {
38 assert_eq
!(self.lld_flavor
, LldFlavor
::Link
);
42 (self.pre_link_objects_fallback
.is_empty()
43 && self.post_link_objects_fallback
.is_empty())
44 || self.crt_objects_fallback
.is_some()
46 // Keep the default "unknown" vendor instead.
47 assert_ne
!(self.vendor
, "");
48 if !self.can_use_os_unknown() {
49 // Keep the default "none" for bare metal targets instead.
50 assert_ne
!(self.os
, "unknown");
54 // Add your target to the whitelist if it has `std` library
55 // and you certainly want "unknown" for the OS name.
56 fn can_use_os_unknown(&self) -> bool
{
57 self.llvm_target
== "wasm32-unknown-unknown"
58 || self.llvm_target
== "wasm64-unknown-unknown"
59 || (self.env
== "sgx" && self.vendor
== "fortanix")