use crate::common::Config; use std::env; use std::ffi::OsStr; use std::path::PathBuf; use std::process::Command; use tracing::*; #[cfg(test)] mod tests; pub const ASAN_SUPPORTED_TARGETS: &[&str] = &[ "aarch64-apple-darwin", "aarch64-unknown-fuchsia", "aarch64-linux-android", "aarch64-unknown-linux-gnu", "arm-linux-androideabi", "armv7-linux-androideabi", "i686-linux-android", "i686-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-fuchsia", "x86_64-linux-android", "x86_64-unknown-freebsd", "x86_64-unknown-linux-gnu", ]; // FIXME(rcvalle): More targets are likely supported. pub const CFI_SUPPORTED_TARGETS: &[&str] = &[ "aarch64-apple-darwin", "aarch64-unknown-fuchsia", "aarch64-linux-android", "aarch64-unknown-freebsd", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-fuchsia", "x86_64-pc-solaris", "x86_64-unknown-freebsd", "x86_64-unknown-illumos", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "x86_64-unknown-netbsd", ]; pub const KCFI_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-none", "x86_64-linux-none"]; pub const LSAN_SUPPORTED_TARGETS: &[&str] = &[ // FIXME: currently broken, see #88132 // "aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", ]; pub const MSAN_SUPPORTED_TARGETS: &[&str] = &["aarch64-unknown-linux-gnu", "x86_64-unknown-freebsd", "x86_64-unknown-linux-gnu"]; pub const TSAN_SUPPORTED_TARGETS: &[&str] = &[ "aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-freebsd", "x86_64-unknown-linux-gnu", ]; pub const HWASAN_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-android", "aarch64-unknown-linux-gnu"]; pub const MEMTAG_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-android", "aarch64-unknown-linux-gnu"]; pub const SHADOWCALLSTACK_SUPPORTED_TARGETS: &[&str] = &["aarch64-linux-android"]; pub fn make_new_path(path: &str) -> String { assert!(cfg!(windows)); // Windows just uses PATH as the library search path, so we have to // maintain the current value while adding our own match env::var(lib_path_env_var()) { Ok(curr) => format!("{}{}{}", path, path_div(), curr), Err(..) => path.to_owned(), } } pub fn lib_path_env_var() -> &'static str { "PATH" } fn path_div() -> &'static str { ";" } pub fn logv(config: &Config, s: String) { debug!("{}", s); if config.verbose { println!("{}", s); } } pub trait PathBufExt { /// Append an extension to the path, even if it already has one. fn with_extra_extension>(&self, extension: S) -> PathBuf; } impl PathBufExt for PathBuf { fn with_extra_extension>(&self, extension: S) -> PathBuf { if extension.as_ref().is_empty() { self.clone() } else { let mut fname = self.file_name().unwrap().to_os_string(); if !extension.as_ref().to_str().unwrap().starts_with('.') { fname.push("."); } fname.push(extension); self.with_file_name(fname) } } } /// The name of the environment variable that holds dynamic library locations. pub fn dylib_env_var() -> &'static str { if cfg!(windows) { "PATH" } else if cfg!(target_os = "macos") { "DYLD_LIBRARY_PATH" } else if cfg!(target_os = "haiku") { "LIBRARY_PATH" } else { "LD_LIBRARY_PATH" } } /// Adds a list of lookup paths to `cmd`'s dynamic library lookup path. /// If the dylib_path_var is already set for this cmd, the old value will be overwritten! pub fn add_dylib_path(cmd: &mut Command, paths: impl Iterator>) { let path_env = env::var_os(dylib_env_var()); let old_paths = path_env.as_ref().map(env::split_paths); let new_paths = paths.map(Into::into).chain(old_paths.into_iter().flatten()); cmd.env(dylib_env_var(), env::join_paths(new_paths).unwrap()); }