1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use crate::{commands::wget, LinuxRootfs, XError, ARCHS, TARGET};
use os_xtask_utils::{dir, CommandExt, Tar};
use std::{path::PathBuf, str::FromStr};
#[derive(Clone, Copy)]
pub(crate) enum Arch {
Riscv64,
X86_64,
Aarch64,
}
impl Arch {
#[inline]
pub const fn name(&self) -> &'static str {
match self {
Self::Riscv64 => "riscv64",
Self::X86_64 => "x86_64",
Self::Aarch64 => "aarch64",
}
}
#[inline]
pub fn origin(&self) -> PathBuf {
ARCHS.join(self.name())
}
#[inline]
pub fn target(&self) -> PathBuf {
TARGET.join(self.name())
}
pub fn linux_musl_cross(&self) -> PathBuf {
let name = format!("{}-linux-musl-cross", self.name().to_lowercase());
let origin = self.origin();
let target = self.target();
let tgz = origin.join(format!("{name}.tgz"));
let dir = target.join(&name);
dir::create_parent(&dir).unwrap();
dir::rm(&dir).unwrap();
wget(
format!("https://github.com/YdrMaster/zCore/releases/download/musl-cache/{name}.tgz"),
&tgz,
);
Tar::xf(&tgz, Some(target)).invoke();
dir
}
}
impl FromStr for Arch {
type Err = XError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"riscv64" => Ok(Self::Riscv64),
"x86_64" => Ok(Self::X86_64),
"aarch64" => Ok(Self::Aarch64),
_ => Err(XError::EnumParse {
type_name: "Arch",
value: s.into(),
}),
}
}
}
#[derive(Clone, Copy, Args)]
pub(crate) struct ArchArg {
#[clap(short, long)]
pub arch: Arch,
}
impl ArchArg {
#[inline]
pub fn linux_rootfs(&self) -> LinuxRootfs {
LinuxRootfs::new(self.arch)
}
}