1 use std::{env, path::PathBuf}; 2 3 lazy_static! { 4 static ref CARGO_HANDLER_DATA: CargoHandlerData = CargoHandlerData::new(); 5 } 6 7 struct CargoHandlerData { 8 target_arch: TargetArch, 9 } 10 11 impl CargoHandlerData { 12 fn new() -> Self { 13 CargoHandlerData { 14 target_arch: TargetArch::new(), 15 } 16 } 17 } 18 19 #[derive(Debug)] 20 pub struct CargoHandler; 21 22 impl CargoHandler { 23 pub fn readenv(key: &str) -> Option<String> { 24 if let Ok(value) = env::var(key) { 25 Some(value) 26 } else { 27 None 28 } 29 } 30 31 /// 获取当前编译的目标架构 32 pub fn target_arch() -> TargetArch { 33 CARGO_HANDLER_DATA.target_arch 34 } 35 36 /// 设置Cargo对文件更改的监听 37 /// 38 /// ## Parameters 39 /// 40 /// - `files` - The files to set rerun build 41 pub fn emit_rerun_if_files_changed(files: &[PathBuf]) { 42 for f in files { 43 println!("cargo:rerun-if-changed={}", f.to_str().unwrap()); 44 } 45 } 46 } 47 48 /// 目标架构 49 #[derive(Debug, Clone, Copy, PartialEq, Eq)] 50 pub enum TargetArch { 51 X86_64, 52 Aarch64, 53 Riscv64, 54 Mips64, 55 Powerpc64, 56 S390x, 57 Sparc64, 58 Unknown, 59 } 60 61 impl TargetArch { 62 pub fn new() -> Self { 63 let data = CargoHandler::readenv("CARGO_CFG_TARGET_ARCH") 64 .expect("CARGO_CFG_TARGET_ARCH is not set") 65 .to_ascii_lowercase(); 66 67 match data.as_str() { 68 "x86_64" => TargetArch::X86_64, 69 "aarch64" => TargetArch::Aarch64, 70 "riscv64" => TargetArch::Riscv64, 71 "mips64" => TargetArch::Mips64, 72 "powerpc64" => TargetArch::Powerpc64, 73 "s390x" => TargetArch::S390x, 74 "sparc64" => TargetArch::Sparc64, 75 _ => TargetArch::Unknown, 76 } 77 } 78 } 79