| 
 | 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