]> git.lizzy.rs Git - rust.git/blob - src/tools/compiletest/src/util.rs
Rollup merge of #107192 - fmease:mailmap-me-at-fmease-dev, r=albertlarsan68
[rust.git] / src / tools / compiletest / src / util.rs
1 use crate::common::Config;
2 use std::env;
3 use std::ffi::OsStr;
4 use std::path::PathBuf;
5 use std::process::Command;
6
7 use tracing::*;
8
9 #[cfg(test)]
10 mod tests;
11
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",
19     "i686-linux-android",
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",
27 ];
28
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",
38     "x86_64-pc-solaris",
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",
44 ];
45
46 pub const KCFI_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-none", "x86_64-linux-none"];
47
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",
55 ];
56
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",
62 ];
63
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",
71 ];
72
73 pub const HWASAN_SUPPORTED_TARGETS: &[&str] =
74     &["aarch64-linux-android", "aarch64-unknown-linux-gnu"];
75
76 pub const MEMTAG_SUPPORTED_TARGETS: &[&str] =
77     &["aarch64-linux-android", "aarch64-unknown-linux-gnu"];
78
79 pub const SHADOWCALLSTACK_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-android"];
80
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(),
88     }
89 }
90
91 pub fn lib_path_env_var() -> &'static str {
92     "PATH"
93 }
94 fn path_div() -> &'static str {
95     ";"
96 }
97
98 pub fn logv(config: &Config, s: String) {
99     debug!("{}", s);
100     if config.verbose {
101         println!("{}", s);
102     }
103 }
104
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;
108 }
109
110 impl PathBufExt for PathBuf {
111     fn with_extra_extension<S: AsRef<OsStr>>(&self, extension: S) -> PathBuf {
112         if extension.as_ref().is_empty() {
113             self.clone()
114         } else {
115             let mut fname = self.file_name().unwrap().to_os_string();
116             if !extension.as_ref().to_str().unwrap().starts_with('.') {
117                 fname.push(".");
118             }
119             fname.push(extension);
120             self.with_file_name(fname)
121         }
122     }
123 }
124
125 /// The name of the environment variable that holds dynamic library locations.
126 pub fn dylib_env_var() -> &'static str {
127     if cfg!(windows) {
128         "PATH"
129     } else if cfg!(target_os = "macos") {
130         "DYLD_LIBRARY_PATH"
131     } else if cfg!(target_os = "haiku") {
132         "LIBRARY_PATH"
133     } else {
134         "LD_LIBRARY_PATH"
135     }
136 }
137
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());
145 }