1 use crate::common::Config;
4 use std::path::PathBuf;
5 use std::process::Command;
12 pub const ASAN_SUPPORTED_TARGETS: &[&str] = &[
13 "aarch64-apple-darwin",
14 "aarch64-unknown-fuchsia",
15 "aarch64-linux-android",
16 "aarch64-unknown-linux-gnu",
17 "arm-linux-androideabi",
18 "armv7-linux-androideabi",
20 "i686-unknown-linux-gnu",
21 "x86_64-apple-darwin",
22 "x86_64-unknown-fuchsia",
23 "x86_64-linux-android",
24 "x86_64-unknown-freebsd",
25 "x86_64-unknown-linux-gnu",
26 "s390x-unknown-linux-gnu",
29 // FIXME(rcvalle): More targets are likely supported.
30 pub const CFI_SUPPORTED_TARGETS: &[&str] = &[
31 "aarch64-apple-darwin",
32 "aarch64-unknown-fuchsia",
33 "aarch64-linux-android",
34 "aarch64-unknown-freebsd",
35 "aarch64-unknown-linux-gnu",
36 "x86_64-apple-darwin",
37 "x86_64-unknown-fuchsia",
39 "x86_64-unknown-freebsd",
40 "x86_64-unknown-illumos",
41 "x86_64-unknown-linux-gnu",
42 "x86_64-unknown-linux-musl",
43 "x86_64-unknown-netbsd",
46 pub const KCFI_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-none", "x86_64-linux-none"];
48 pub const LSAN_SUPPORTED_TARGETS: &[&str] = &[
49 // FIXME: currently broken, see #88132
50 // "aarch64-apple-darwin",
51 "aarch64-unknown-linux-gnu",
52 "x86_64-apple-darwin",
53 "x86_64-unknown-linux-gnu",
54 "s390x-unknown-linux-gnu",
57 pub const MSAN_SUPPORTED_TARGETS: &[&str] = &[
58 "aarch64-unknown-linux-gnu",
59 "x86_64-unknown-freebsd",
60 "x86_64-unknown-linux-gnu",
61 "s390x-unknown-linux-gnu",
64 pub const TSAN_SUPPORTED_TARGETS: &[&str] = &[
65 "aarch64-apple-darwin",
66 "aarch64-unknown-linux-gnu",
67 "x86_64-apple-darwin",
68 "x86_64-unknown-freebsd",
69 "x86_64-unknown-linux-gnu",
70 "s390x-unknown-linux-gnu",
73 pub const HWASAN_SUPPORTED_TARGETS: &[&str] =
74 &["aarch64-linux-android", "aarch64-unknown-linux-gnu"];
76 pub const MEMTAG_SUPPORTED_TARGETS: &[&str] =
77 &["aarch64-linux-android", "aarch64-unknown-linux-gnu"];
79 pub const SHADOWCALLSTACK_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-android"];
81 pub fn make_new_path(path: &str) -> String {
82 assert!(cfg!(windows));
83 // Windows just uses PATH as the library search path, so we have to
84 // maintain the current value while adding our own
85 match env::var(lib_path_env_var()) {
86 Ok(curr) => format!("{}{}{}", path, path_div(), curr),
87 Err(..) => path.to_owned(),
91 pub fn lib_path_env_var() -> &'static str {
94 fn path_div() -> &'static str {
98 pub fn logv(config: &Config, s: String) {
105 pub trait PathBufExt {
106 /// Append an extension to the path, even if it already has one.
107 fn with_extra_extension<S: AsRef<OsStr>>(&self, extension: S) -> PathBuf;
110 impl PathBufExt for PathBuf {
111 fn with_extra_extension<S: AsRef<OsStr>>(&self, extension: S) -> PathBuf {
112 if extension.as_ref().is_empty() {
115 let mut fname = self.file_name().unwrap().to_os_string();
116 if !extension.as_ref().to_str().unwrap().starts_with('.') {
119 fname.push(extension);
120 self.with_file_name(fname)
125 /// The name of the environment variable that holds dynamic library locations.
126 pub fn dylib_env_var() -> &'static str {
129 } else if cfg!(target_os = "macos") {
131 } else if cfg!(target_os = "haiku") {
138 /// Adds a list of lookup paths to `cmd`'s dynamic library lookup path.
139 /// If the dylib_path_var is already set for this cmd, the old value will be overwritten!
140 pub fn add_dylib_path(cmd: &mut Command, paths: impl Iterator<Item = impl Into<PathBuf>>) {
141 let path_env = env::var_os(dylib_env_var());
142 let old_paths = path_env.as_ref().map(env::split_paths);
143 let new_paths = paths.map(Into::into).chain(old_paths.into_iter().flatten());
144 cmd.env(dylib_env_var(), env::join_paths(new_paths).unwrap());