bootstrap/core/config/toml/
target.rs1use std::collections::HashMap;
13
14use serde::de::Error;
15use serde::{Deserialize, Deserializer};
16
17use crate::core::config::{
18 CompilerBuiltins, LlvmLibunwind, Merge, ReplaceOpt, SplitDebuginfo, StringOrBool,
19};
20use crate::{CodegenBackendKind, HashSet, PathBuf, define_config, exit};
21
22define_config! {
23 struct TomlTarget {
25 cc: Option<String> = "cc",
26 cxx: Option<String> = "cxx",
27 ar: Option<String> = "ar",
28 ranlib: Option<String> = "ranlib",
29 default_linker: Option<PathBuf> = "default-linker",
30 default_linker_linux_override: Option<DefaultLinuxLinkerOverride> = "default-linker-linux-override",
31 linker: Option<String> = "linker",
32 split_debuginfo: Option<String> = "split-debuginfo",
33 llvm_config: Option<String> = "llvm-config",
34 llvm_has_rust_patches: Option<bool> = "llvm-has-rust-patches",
35 llvm_filecheck: Option<String> = "llvm-filecheck",
36 llvm_libunwind: Option<String> = "llvm-libunwind",
37 sanitizers: Option<bool> = "sanitizers",
38 profiler: Option<StringOrBool> = "profiler",
39 rpath: Option<bool> = "rpath",
40 rustflags: Option<Vec<String>> = "rustflags",
41 crt_static: Option<bool> = "crt-static",
42 musl_root: Option<String> = "musl-root",
43 musl_libdir: Option<String> = "musl-libdir",
44 wasi_root: Option<String> = "wasi-root",
45 qemu_rootfs: Option<String> = "qemu-rootfs",
46 no_std: Option<bool> = "no-std",
47 codegen_backends: Option<Vec<String>> = "codegen-backends",
48 runner: Option<String> = "runner",
49 optimized_compiler_builtins: Option<CompilerBuiltins> = "optimized-compiler-builtins",
50 jemalloc: Option<bool> = "jemalloc",
51 }
52}
53
54#[derive(Debug, Default, Clone, PartialEq, Eq)]
56pub struct Target {
57 pub llvm_config: Option<PathBuf>,
59 pub llvm_has_rust_patches: Option<bool>,
60 pub llvm_filecheck: Option<PathBuf>,
62 pub llvm_libunwind: Option<LlvmLibunwind>,
63 pub cc: Option<PathBuf>,
64 pub cxx: Option<PathBuf>,
65 pub ar: Option<PathBuf>,
66 pub ranlib: Option<PathBuf>,
67 pub default_linker: Option<PathBuf>,
68 pub default_linker_linux_override: DefaultLinuxLinkerOverride,
69 pub linker: Option<PathBuf>,
70 pub split_debuginfo: Option<SplitDebuginfo>,
71 pub sanitizers: Option<bool>,
72 pub profiler: Option<StringOrBool>,
73 pub rpath: Option<bool>,
74 pub rustflags: Vec<String>,
75 pub crt_static: Option<bool>,
76 pub musl_root: Option<PathBuf>,
77 pub musl_libdir: Option<PathBuf>,
78 pub wasi_root: Option<PathBuf>,
79 pub qemu_rootfs: Option<PathBuf>,
80 pub runner: Option<String>,
81 pub no_std: bool,
82 pub codegen_backends: Option<Vec<CodegenBackendKind>>,
83 pub optimized_compiler_builtins: Option<CompilerBuiltins>,
84 pub jemalloc: Option<bool>,
85}
86
87impl Target {
88 pub fn from_triple(triple: &str) -> Self {
89 let mut target: Self = Default::default();
90 if !build_helper::targets::target_supports_std(triple) {
91 target.no_std = true;
92 }
93 if triple.contains("emscripten") {
94 target.runner = Some("node".into());
95 }
96 target
97 }
98}
99
100#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
104pub enum DefaultLinuxLinkerOverride {
105 #[default]
107 Off,
108 SelfContainedLldCc,
111}
112
113impl<'de> Deserialize<'de> for DefaultLinuxLinkerOverride {
114 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
115 where
116 D: Deserializer<'de>,
117 {
118 let name = String::deserialize(deserializer)?;
119 match name.as_str() {
120 "off" => Ok(Self::Off),
121 "self-contained-lld-cc" => Ok(Self::SelfContainedLldCc),
122 other => Err(D::Error::unknown_variant(other, &["off", "self-contained-lld-cc"])),
123 }
124 }
125}
126
127#[cfg(not(test))]
129pub fn default_linux_linker_overrides() -> HashMap<String, DefaultLinuxLinkerOverride> {
130 [("x86_64-unknown-linux-gnu".to_string(), DefaultLinuxLinkerOverride::SelfContainedLldCc)]
131 .into()
132}
133
134#[cfg(test)]
135thread_local! {
136 static TEST_LINUX_LINKER_OVERRIDES: std::cell::RefCell<Option<HashMap<String, DefaultLinuxLinkerOverride>>> = std::cell::RefCell::new(None);
137}
138
139#[cfg(test)]
140pub fn default_linux_linker_overrides() -> HashMap<String, DefaultLinuxLinkerOverride> {
141 TEST_LINUX_LINKER_OVERRIDES.with(|cell| cell.borrow().clone()).unwrap_or_default()
142}
143
144#[cfg(test)]
145pub fn with_default_linux_linker_overrides<R>(
146 targets: HashMap<String, DefaultLinuxLinkerOverride>,
147 f: impl FnOnce() -> R,
148) -> R {
149 TEST_LINUX_LINKER_OVERRIDES.with(|cell| {
150 let prev = cell.replace(Some(targets));
151 let result = f();
152 cell.replace(prev);
153 result
154 })
155}