2024-12-16 16:36:38 +02:00
|
|
|
use std::{io, path::PathBuf};
|
2024-03-12 18:17:47 +02:00
|
|
|
|
|
|
|
use clap::ValueEnum;
|
|
|
|
|
2024-12-16 16:36:38 +02:00
|
|
|
#[derive(Debug, serde::Deserialize, serde::Serialize)]
|
2024-03-12 19:39:04 +02:00
|
|
|
#[serde(default)]
|
|
|
|
pub struct ToolchainConfig {
|
|
|
|
pub branch: String,
|
|
|
|
}
|
|
|
|
|
2024-12-16 16:36:38 +02:00
|
|
|
#[derive(Debug, serde::Deserialize, serde::Serialize)]
|
2024-11-18 20:51:16 +02:00
|
|
|
#[serde(default)]
|
|
|
|
pub struct BuildComponents {
|
|
|
|
pub libc: bool,
|
|
|
|
// Depends on .libc
|
|
|
|
pub libcxx: bool,
|
|
|
|
}
|
|
|
|
|
2024-12-16 16:36:38 +02:00
|
|
|
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
|
2024-11-18 20:51:16 +02:00
|
|
|
#[serde(default)]
|
|
|
|
pub struct AArch64TargetConfig {
|
|
|
|
pub components: BuildComponents,
|
|
|
|
}
|
|
|
|
|
2024-12-16 16:36:38 +02:00
|
|
|
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
|
2024-11-18 20:51:16 +02:00
|
|
|
#[serde(default)]
|
|
|
|
pub struct X86_64TargetConfig {
|
|
|
|
pub components: BuildComponents,
|
|
|
|
}
|
|
|
|
|
2024-12-16 16:36:38 +02:00
|
|
|
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
|
2024-11-18 20:51:16 +02:00
|
|
|
#[serde(default)]
|
|
|
|
pub struct I686TargetConfig {
|
|
|
|
pub components: BuildComponents,
|
|
|
|
}
|
|
|
|
|
2024-12-16 16:36:38 +02:00
|
|
|
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
|
2024-11-18 20:51:16 +02:00
|
|
|
#[serde(default)]
|
|
|
|
pub struct TargetConfig {
|
|
|
|
pub aarch64: AArch64TargetConfig,
|
|
|
|
pub x86_64: X86_64TargetConfig,
|
|
|
|
pub i686: I686TargetConfig,
|
|
|
|
}
|
|
|
|
|
2024-12-16 16:36:38 +02:00
|
|
|
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
|
2024-03-12 19:39:04 +02:00
|
|
|
#[serde(default)]
|
|
|
|
pub struct XTaskConfig {
|
|
|
|
pub toolchain: ToolchainConfig,
|
2024-11-18 20:51:16 +02:00
|
|
|
pub target: TargetConfig,
|
2024-03-12 19:39:04 +02:00
|
|
|
}
|
|
|
|
|
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 {
|
2024-03-12 19:39:04 +02:00
|
|
|
pub config: XTaskConfig,
|
2024-03-20 21:21:39 +02:00
|
|
|
pub verbose: bool,
|
2024-03-12 19:39:04 +02:00
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2024-03-12 19:39:04 +02:00
|
|
|
impl Default for ToolchainConfig {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
2024-11-18 20:51:16 +02:00
|
|
|
branch: "alnyan/yggdrasil-1.84.0".into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for BuildComponents {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
|
|
|
libc: true,
|
|
|
|
libcxx: true,
|
2024-03-12 19:39:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-12 18:17:47 +02:00
|
|
|
impl BuildEnv {
|
2024-03-20 21:21:39 +02:00
|
|
|
pub fn new(
|
|
|
|
config: XTaskConfig,
|
|
|
|
verbose: bool,
|
|
|
|
profile: Profile,
|
|
|
|
arch: Arch,
|
2024-12-13 23:35:17 +02:00
|
|
|
board: Board,
|
2024-03-20 21:21:39 +02:00
|
|
|
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 {
|
2024-03-12 19:39:04 +02:00
|
|
|
config,
|
2024-03-20 21:21:39 +02:00
|
|
|
verbose,
|
2024-03-12 19:39:04 +02:00
|
|
|
|
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-12-16 16:36:38 +02:00
|
|
|
|
|
|
|
pub fn dump<W: io::Write>(&self, output: &mut W) {
|
|
|
|
match toml::to_string_pretty(&self.config) {
|
|
|
|
Ok(string) => {
|
|
|
|
writeln!(output, "{string}").ok();
|
|
|
|
}
|
|
|
|
Err(error) => {
|
|
|
|
log::error!("Config serialization error: {error}");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
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 {
|
2024-12-16 14:48:44 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|