223 lines
5.2 KiB
Rust
Raw Normal View History

2024-03-12 18:17:47 +02:00
use std::path::PathBuf;
use clap::ValueEnum;
#[derive(Debug, serde::Deserialize)]
#[serde(default)]
pub struct ToolchainConfig {
pub branch: String,
}
#[derive(Debug, serde::Deserialize)]
#[serde(default)]
pub struct BuildComponents {
pub libc: bool,
// Depends on .libc
pub libcxx: bool,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default)]
pub struct AArch64TargetConfig {
pub components: BuildComponents,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default)]
pub struct X86_64TargetConfig {
pub components: BuildComponents,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default)]
pub struct I686TargetConfig {
pub components: BuildComponents,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default)]
pub struct TargetConfig {
pub aarch64: AArch64TargetConfig,
pub x86_64: X86_64TargetConfig,
pub i686: I686TargetConfig,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default)]
pub struct XTaskConfig {
pub toolchain: ToolchainConfig,
pub target: TargetConfig,
}
2024-03-12 18:17:47 +02:00
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum Profile {
#[default]
Debug,
Release,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, ValueEnum)]
#[allow(non_camel_case_types)]
#[clap(rename_all = "verbatim")]
pub enum Arch {
#[default]
aarch64,
x86_64,
2024-11-11 23:50:38 +02:00
i686,
2024-03-12 18:17:47 +02:00
}
2024-12-13 23:35:17 +02:00
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, ValueEnum)]
#[allow(non_camel_case_types)]
#[clap(rename_all = "verbatim")]
pub enum Board {
#[default]
default,
// AArch64 boards
raspi4b,
virt,
}
2024-03-12 18:17:47 +02:00
#[derive(Debug)]
pub struct BuildEnv {
pub config: XTaskConfig,
pub verbose: bool,
2024-03-12 18:17:47 +02:00
pub profile: Profile,
pub arch: Arch,
2024-12-13 23:35:17 +02:00
pub board: Board,
pub kernel_triple: &'static str,
pub kernel_linker_script: String,
2024-03-12 18:17:47 +02:00
pub host_triple: String,
pub workspace_root: PathBuf,
pub kernel_output_dir: PathBuf,
pub userspace_output_dir: PathBuf,
2024-04-01 17:23:12 +03:00
pub kernel_symbol_file: PathBuf,
2024-11-11 23:50:38 +02:00
pub llvm_sysroot: PathBuf,
2024-03-12 18:17:47 +02:00
}
impl Default for ToolchainConfig {
fn default() -> Self {
Self {
branch: "alnyan/yggdrasil-1.84.0".into(),
}
}
}
impl Default for BuildComponents {
fn default() -> Self {
Self {
libc: true,
libcxx: true,
}
}
}
2024-03-12 18:17:47 +02:00
impl BuildEnv {
pub fn new(
config: XTaskConfig,
verbose: bool,
profile: Profile,
arch: Arch,
2024-12-13 23:35:17 +02:00
board: Board,
workspace_root: PathBuf,
) -> Self {
2024-12-13 23:35:17 +02:00
let kernel_triple = match (arch, board) {
(Arch::aarch64, Board::virt | Board::default) => "aarch64-unknown-qemu",
(Arch::aarch64, Board::raspi4b) => "aarch64-unknown-raspi4b",
(Arch::x86_64, Board::default) => "x86_64-unknown-none",
2024-12-14 13:10:46 +02:00
(Arch::i686, Board::default) => "i686-unknown-none",
2024-12-13 23:35:17 +02:00
_ => {
log::error!("Invalid arch/board combination: {arch:?}/{board:?}");
panic!();
}
};
let kernel_linker_script = match arch {
Arch::aarch64 => format!("arm/{kernel_triple}.ld"),
Arch::i686 | Arch::x86_64 => format!("x86/{kernel_triple}.ld"),
};
2024-03-12 18:17:47 +02:00
let kernel_output_dir =
2024-12-13 23:35:17 +02:00
workspace_root.join(format!("target/{}/{}", kernel_triple, profile.dir()));
2024-03-12 18:17:47 +02:00
let userspace_output_dir = workspace_root.join(format!(
"userspace/target/{}-unknown-yggdrasil/{}",
arch.name(),
profile.dir()
));
2024-04-01 17:23:12 +03:00
let kernel_symbol_file = kernel_output_dir.join("symbols.dat");
2024-03-12 18:17:47 +02:00
let host = env!("TARGET");
2024-11-11 23:50:38 +02:00
let llvm_sysroot = workspace_root.join(format!(
"toolchain-c/sysroot/{}-unknown-yggdrasil",
arch.name()
));
2024-03-12 18:17:47 +02:00
Self {
config,
verbose,
2024-03-12 18:17:47 +02:00
profile,
arch,
2024-12-13 23:35:17 +02:00
board,
kernel_triple,
kernel_linker_script,
2024-03-12 18:17:47 +02:00
host_triple: host.into(),
workspace_root,
2024-04-01 17:23:12 +03:00
kernel_symbol_file,
2024-03-12 18:17:47 +02:00
kernel_output_dir,
userspace_output_dir,
2024-11-11 23:50:38 +02:00
llvm_sysroot,
2024-03-12 18:17:47 +02:00
}
}
}
2024-11-18 20:59:29 +02:00
impl XTaskConfig {
pub fn components(&self, env: &BuildEnv) -> &BuildComponents {
match env.arch {
Arch::aarch64 => &self.target.aarch64.components,
Arch::x86_64 => &self.target.x86_64.components,
Arch::i686 => &self.target.i686.components,
}
}
}
2024-03-12 18:17:47 +02:00
impl Profile {
pub fn dir(&self) -> &str {
match self {
Self::Debug => "debug",
Self::Release => "release",
}
}
pub fn name(&self) -> &str {
self.dir()
}
}
impl Arch {
pub fn all() -> impl Iterator<Item = Self> {
[Self::aarch64, Self::x86_64, Self::i686].into_iter()
}
2024-03-12 18:17:47 +02:00
pub fn user_triple(&self) -> &str {
match self {
Self::aarch64 => "aarch64-unknown-yggdrasil",
Self::x86_64 => "x86_64-unknown-yggdrasil",
2024-11-11 23:50:38 +02:00
Self::i686 => "i686-unknown-yggdrasil",
2024-03-12 18:17:47 +02:00
}
}
pub fn name(&self) -> &str {
match self {
Self::aarch64 => "aarch64",
Self::x86_64 => "x86_64",
2024-10-10 18:06:54 +03:00
Self::i686 => "i686",
2024-03-12 18:17:47 +02:00
}
}
}