|
| 1 | +use std::path::{Path, PathBuf}; |
| 2 | +use std::{env, iter}; |
| 3 | + |
| 4 | +use super::*; |
| 5 | +use crate::core::config::{Target, TargetSelection}; |
| 6 | +use crate::{Build, Config, Flags}; |
| 7 | + |
| 8 | +#[test] |
| 9 | +fn test_cc2ar_env_specific() { |
| 10 | + let triple = "x86_64-unknown-linux-gnu"; |
| 11 | + let key = "AR_x86_64_unknown_linux_gnu"; |
| 12 | + env::set_var(key, "custom-ar"); |
| 13 | + let target = TargetSelection::from_user(triple); |
| 14 | + let cc = Path::new("/usr/bin/clang"); |
| 15 | + let default_ar = PathBuf::from("default-ar"); |
| 16 | + let result = cc2ar(cc, target, default_ar); |
| 17 | + env::remove_var(key); |
| 18 | + assert_eq!(result, Some(PathBuf::from("custom-ar"))); |
| 19 | +} |
| 20 | + |
| 21 | +#[test] |
| 22 | +fn test_cc2ar_musl() { |
| 23 | + let triple = "x86_64-unknown-linux-musl"; |
| 24 | + env::remove_var("AR_x86_64_unknown_linux_musl"); |
| 25 | + env::remove_var("AR"); |
| 26 | + let target = TargetSelection::from_user(triple); |
| 27 | + let cc = Path::new("/usr/bin/clang"); |
| 28 | + let default_ar = PathBuf::from("default-ar"); |
| 29 | + let result = cc2ar(cc, target, default_ar); |
| 30 | + assert_eq!(result, Some(PathBuf::from("ar"))); |
| 31 | +} |
| 32 | + |
| 33 | +#[test] |
| 34 | +fn test_cc2ar_openbsd() { |
| 35 | + let triple = "x86_64-unknown-openbsd"; |
| 36 | + env::remove_var("AR_x86_64_unknown_openbsd"); |
| 37 | + env::remove_var("AR"); |
| 38 | + let target = TargetSelection::from_user(triple); |
| 39 | + let cc = Path::new("/usr/bin/cc"); |
| 40 | + let default_ar = PathBuf::from("default-ar"); |
| 41 | + let result = cc2ar(cc, target, default_ar); |
| 42 | + assert_eq!(result, Some(PathBuf::from("ar"))); |
| 43 | +} |
| 44 | + |
| 45 | +#[test] |
| 46 | +fn test_cc2ar_vxworks() { |
| 47 | + let triple = "armv7-wrs-vxworks"; |
| 48 | + env::remove_var("AR_armv7_wrs_vxworks"); |
| 49 | + env::remove_var("AR"); |
| 50 | + let target = TargetSelection::from_user(triple); |
| 51 | + let cc = Path::new("/usr/bin/clang"); |
| 52 | + let default_ar = PathBuf::from("default-ar"); |
| 53 | + let result = cc2ar(cc, target, default_ar); |
| 54 | + assert_eq!(result, Some(PathBuf::from("wr-ar"))); |
| 55 | +} |
| 56 | + |
| 57 | +#[test] |
| 58 | +fn test_cc2ar_nto_i586() { |
| 59 | + let triple = "i586-unknown-nto-something"; |
| 60 | + env::remove_var("AR_i586_unknown_nto_something"); |
| 61 | + env::remove_var("AR"); |
| 62 | + let target = TargetSelection::from_user(triple); |
| 63 | + let cc = Path::new("/usr/bin/clang"); |
| 64 | + let default_ar = PathBuf::from("default-ar"); |
| 65 | + let result = cc2ar(cc, target, default_ar); |
| 66 | + assert_eq!(result, Some(PathBuf::from("ntox86-ar"))); |
| 67 | +} |
| 68 | + |
| 69 | +#[test] |
| 70 | +fn test_cc2ar_nto_aarch64() { |
| 71 | + let triple = "aarch64-unknown-nto-something"; |
| 72 | + env::remove_var("AR_aarch64_unknown_nto_something"); |
| 73 | + env::remove_var("AR"); |
| 74 | + let target = TargetSelection::from_user(triple); |
| 75 | + let cc = Path::new("/usr/bin/clang"); |
| 76 | + let default_ar = PathBuf::from("default-ar"); |
| 77 | + let result = cc2ar(cc, target, default_ar); |
| 78 | + assert_eq!(result, Some(PathBuf::from("ntoaarch64-ar"))); |
| 79 | +} |
| 80 | + |
| 81 | +#[test] |
| 82 | +fn test_cc2ar_nto_x86_64() { |
| 83 | + let triple = "x86_64-unknown-nto-something"; |
| 84 | + env::remove_var("AR_x86_64_unknown_nto_something"); |
| 85 | + env::remove_var("AR"); |
| 86 | + let target = TargetSelection::from_user(triple); |
| 87 | + let cc = Path::new("/usr/bin/clang"); |
| 88 | + let default_ar = PathBuf::from("default-ar"); |
| 89 | + let result = cc2ar(cc, target, default_ar); |
| 90 | + assert_eq!(result, Some(PathBuf::from("ntox86_64-ar"))); |
| 91 | +} |
| 92 | + |
| 93 | +#[test] |
| 94 | +#[should_panic(expected = "Unknown architecture, cannot determine archiver for Neutrino QNX")] |
| 95 | +fn test_cc2ar_nto_unknown() { |
| 96 | + let triple = "powerpc-unknown-nto-something"; |
| 97 | + env::remove_var("AR_powerpc_unknown_nto_something"); |
| 98 | + env::remove_var("AR"); |
| 99 | + let target = TargetSelection::from_user(triple); |
| 100 | + let cc = Path::new("/usr/bin/clang"); |
| 101 | + let default_ar = PathBuf::from("default-ar"); |
| 102 | + let _ = cc2ar(cc, target, default_ar); |
| 103 | +} |
| 104 | + |
| 105 | +#[test] |
| 106 | +fn test_ndk_compiler_c() { |
| 107 | + let ndk_path = PathBuf::from("/ndk"); |
| 108 | + let target_triple = "arm-unknown-linux-android"; |
| 109 | + let expected_triple_translated = "armv7a-unknown-linux-android"; |
| 110 | + let expected_compiler = format!("{}21-{}", expected_triple_translated, Language::C.clang()); |
| 111 | + let host_tag = if cfg!(target_os = "macos") { |
| 112 | + "darwin-x86_64" |
| 113 | + } else if cfg!(target_os = "windows") { |
| 114 | + "windows-x86_64" |
| 115 | + } else { |
| 116 | + "linux-x86_64" |
| 117 | + }; |
| 118 | + let expected_path = ndk_path |
| 119 | + .join("toolchains") |
| 120 | + .join("llvm") |
| 121 | + .join("prebuilt") |
| 122 | + .join(host_tag) |
| 123 | + .join("bin") |
| 124 | + .join(&expected_compiler); |
| 125 | + let result = ndk_compiler(Language::C, target_triple, &ndk_path); |
| 126 | + assert_eq!(result, expected_path); |
| 127 | +} |
| 128 | + |
| 129 | +#[test] |
| 130 | +fn test_ndk_compiler_cpp() { |
| 131 | + let ndk_path = PathBuf::from("/ndk"); |
| 132 | + let target_triple = "arm-unknown-linux-android"; |
| 133 | + let expected_triple_translated = "armv7a-unknown-linux-android"; |
| 134 | + let expected_compiler = |
| 135 | + format!("{}21-{}", expected_triple_translated, Language::CPlusPlus.clang()); |
| 136 | + let host_tag = if cfg!(target_os = "macos") { |
| 137 | + "darwin-x86_64" |
| 138 | + } else if cfg!(target_os = "windows") { |
| 139 | + "windows-x86_64" |
| 140 | + } else { |
| 141 | + "linux-x86_64" |
| 142 | + }; |
| 143 | + let expected_path = ndk_path |
| 144 | + .join("toolchains") |
| 145 | + .join("llvm") |
| 146 | + .join("prebuilt") |
| 147 | + .join(host_tag) |
| 148 | + .join("bin") |
| 149 | + .join(&expected_compiler); |
| 150 | + let result = ndk_compiler(Language::CPlusPlus, target_triple, &ndk_path); |
| 151 | + assert_eq!(result, expected_path); |
| 152 | +} |
| 153 | + |
| 154 | +#[test] |
| 155 | +fn test_language_gcc() { |
| 156 | + assert_eq!(Language::C.gcc(), "gcc"); |
| 157 | + assert_eq!(Language::CPlusPlus.gcc(), "g++"); |
| 158 | +} |
| 159 | + |
| 160 | +#[test] |
| 161 | +fn test_language_clang() { |
| 162 | + assert_eq!(Language::C.clang(), "clang"); |
| 163 | + assert_eq!(Language::CPlusPlus.clang(), "clang++"); |
| 164 | +} |
| 165 | + |
| 166 | +#[test] |
| 167 | +fn test_new_cc_build() { |
| 168 | + let build = Build::new(Config { ..Config::parse(Flags::parse(&["check".to_owned()])) }); |
| 169 | + let target = TargetSelection::from_user("x86_64-unknown-linux-gnu"); |
| 170 | + let cfg = new_cc_build(&build, target.clone()); |
| 171 | + let compiler = cfg.get_compiler(); |
| 172 | + assert!(!compiler.path().to_str().unwrap().is_empty(), "Compiler path should not be empty"); |
| 173 | +} |
| 174 | + |
| 175 | +#[test] |
| 176 | +fn test_default_compiler_wasi() { |
| 177 | + let build = Build::new(Config { ..Config::parse(Flags::parse(&["check".to_owned()])) }); |
| 178 | + let target = TargetSelection::from_user("wasm32-wasi"); |
| 179 | + let wasi_sdk = PathBuf::from("/wasi-sdk"); |
| 180 | + env::set_var("WASI_SDK_PATH", &wasi_sdk); |
| 181 | + let mut cfg = cc::Build::new(); |
| 182 | + if let Some(result) = default_compiler(&mut cfg, Language::C, target.clone(), &build) { |
| 183 | + let expected = { |
| 184 | + let compiler = format!("{}-clang", target.triple); |
| 185 | + wasi_sdk.join("bin").join(compiler) |
| 186 | + }; |
| 187 | + assert_eq!(result, expected); |
| 188 | + } else { |
| 189 | + panic!( |
| 190 | + "default_compiler should return a compiler path for wasi target when WASI_SDK_PATH is set" |
| 191 | + ); |
| 192 | + } |
| 193 | + env::remove_var("WASI_SDK_PATH"); |
| 194 | +} |
| 195 | + |
| 196 | +#[test] |
| 197 | +fn test_default_compiler_fallback() { |
| 198 | + let build = Build::new(Config { ..Config::parse(Flags::parse(&["check".to_owned()])) }); |
| 199 | + let target = TargetSelection::from_user("x86_64-unknown-linux-gnu"); |
| 200 | + let mut cfg = cc::Build::new(); |
| 201 | + let result = default_compiler(&mut cfg, Language::C, target, &build); |
| 202 | + assert!(result.is_none(), "default_compiler should return None for generic targets"); |
| 203 | +} |
| 204 | + |
| 205 | +#[test] |
| 206 | +fn test_find_target_with_config() { |
| 207 | + let mut build = Build::new(Config { ..Config::parse(Flags::parse(&["check".to_owned()])) }); |
| 208 | + let target = TargetSelection::from_user("x86_64-unknown-linux-gnu"); |
| 209 | + let mut target_config = Target::default(); |
| 210 | + target_config.cc = Some(PathBuf::from("dummy-cc")); |
| 211 | + target_config.cxx = Some(PathBuf::from("dummy-cxx")); |
| 212 | + target_config.ar = Some(PathBuf::from("dummy-ar")); |
| 213 | + target_config.ranlib = Some(PathBuf::from("dummy-ranlib")); |
| 214 | + build.config.target_config.insert(target.clone(), target_config); |
| 215 | + find_target(&build, target.clone()); |
| 216 | + let binding = build.cc.borrow(); |
| 217 | + let cc_tool = binding.get(&target).unwrap(); |
| 218 | + assert_eq!(cc_tool.path(), &PathBuf::from("dummy-cc")); |
| 219 | + let binding = build.cxx.borrow(); |
| 220 | + let cxx_tool = binding.get(&target).unwrap(); |
| 221 | + assert_eq!(cxx_tool.path(), &PathBuf::from("dummy-cxx")); |
| 222 | + let binding = build.ar.borrow(); |
| 223 | + let ar = binding.get(&target).unwrap(); |
| 224 | + assert_eq!(ar, &PathBuf::from("dummy-ar")); |
| 225 | + let binding = build.ranlib.borrow(); |
| 226 | + let ranlib = binding.get(&target).unwrap(); |
| 227 | + assert_eq!(ranlib, &PathBuf::from("dummy-ranlib")); |
| 228 | +} |
| 229 | + |
| 230 | +#[test] |
| 231 | +fn test_find_target_without_config() { |
| 232 | + let mut build = Build::new(Config { ..Config::parse(Flags::parse(&["check".to_owned()])) }); |
| 233 | + let target = TargetSelection::from_user("x86_64-unknown-linux-gnu"); |
| 234 | + build.config.target_config.clear(); |
| 235 | + find_target(&build, target.clone()); |
| 236 | + assert!(build.cc.borrow().contains_key(&target)); |
| 237 | + if !target.triple.contains("vxworks") { |
| 238 | + assert!(build.cxx.borrow().contains_key(&target)); |
| 239 | + } |
| 240 | + assert!(build.ar.borrow().contains_key(&target)); |
| 241 | +} |
| 242 | + |
| 243 | +#[test] |
| 244 | +fn test_find() { |
| 245 | + let mut build = Build::new(Config { ..Config::parse(Flags::parse(&["check".to_owned()])) }); |
| 246 | + let target1 = TargetSelection::from_user("x86_64-unknown-linux-gnu"); |
| 247 | + let target2 = TargetSelection::from_user("arm-linux-androideabi"); |
| 248 | + build.targets.push(target1.clone()); |
| 249 | + build.hosts.push(target2.clone()); |
| 250 | + find(&build); |
| 251 | + for t in build.hosts.iter().chain(build.targets.iter()).chain(iter::once(&build.build)) { |
| 252 | + assert!(build.cc.borrow().contains_key(t), "CC not set for target {}", t.triple); |
| 253 | + } |
| 254 | +} |
0 commit comments