xref: /DragonOS/build-scripts/kernel_build/src/utils/cargo_handler.rs (revision 11f78b73e7b18ef04e05e63612f8027eda0740e7)
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