Files
DragonOS/build-scripts/kernel_build/src/utils/cargo_handler.rs
LoGin e80796eb82 feat: la64 boot (#1132)
* la64能够进入到kernel_main
* ci: 添加为ubuntu编译qemu-loongarch64的脚本
* feat: la64能输出hello world
* la64 安装gcc && 配置github ci
* chore: 更新CI工作流和构建脚本中的Docker镜像版本至v1.10

Signed-off-by: longjin <longjin@DragonOS.org>
2025-04-20 18:51:45 +08:00

96 lines
2.2 KiB
Rust

use std::{env, path::PathBuf};
use crate::kconfig::Feature;
lazy_static! {
static ref CARGO_HANDLER_DATA: CargoHandlerData = CargoHandlerData::new();
}
struct CargoHandlerData {
target_arch: TargetArch,
}
impl CargoHandlerData {
fn new() -> Self {
CargoHandlerData {
target_arch: TargetArch::new(),
}
}
}
#[derive(Debug)]
pub struct CargoHandler;
impl CargoHandler {
pub fn readenv(key: &str) -> Option<String> {
if let Ok(value) = env::var(key) {
Some(value)
} else {
None
}
}
/// 获取当前编译的目标架构
pub fn target_arch() -> TargetArch {
CARGO_HANDLER_DATA.target_arch
}
/// 设置Cargo对文件更改的监听
///
/// ## Parameters
///
/// - `files` - The files to set rerun build
pub fn emit_rerun_if_files_changed(files: &[PathBuf]) {
for f in files {
println!("cargo:rerun-if-changed={}", f.to_str().unwrap());
}
}
/// 添加features
///
/// ## Parameters
///
/// - `features` - The features to be set
pub fn emit_features(features: &[Feature]) {
for f in features.iter() {
if f.enable() {
println!("cargo:rustc-cfg=feature=\"{}\"", f.name());
}
}
}
}
/// 目标架构
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TargetArch {
X86_64,
Aarch64,
Riscv64,
Mips64,
Powerpc64,
LoongArch64,
S390x,
Sparc64,
Unknown,
}
impl TargetArch {
pub fn new() -> Self {
let data = CargoHandler::readenv("CARGO_CFG_TARGET_ARCH")
.expect("CARGO_CFG_TARGET_ARCH is not set")
.to_ascii_lowercase();
match data.as_str() {
"x86_64" => TargetArch::X86_64,
"aarch64" => TargetArch::Aarch64,
"riscv64" => TargetArch::Riscv64,
"mips64" => TargetArch::Mips64,
"powerpc64" => TargetArch::Powerpc64,
"loongarch64" => TargetArch::LoongArch64,
"s390x" => TargetArch::S390x,
"sparc64" => TargetArch::Sparc64,
_ => TargetArch::Unknown,
}
}
}