xtask: LLVM clone, clone progress
This commit is contained in:
parent
afdc86ef3a
commit
c4b18c3379
@ -1,2 +1,2 @@
|
|||||||
[alias]
|
[alias]
|
||||||
xtask = "run --manifest-path ./xtask/Cargo.toml --"
|
xtask = "run --manifest-path ./xtask/Cargo.toml --release --"
|
||||||
|
61
Cargo.lock
generated
61
Cargo.lock
generated
@ -391,6 +391,19 @@ dependencies = [
|
|||||||
"rustc-std-workspace-core",
|
"rustc-std-workspace-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "console"
|
||||||
|
version = "0.15.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b"
|
||||||
|
dependencies = [
|
||||||
|
"encode_unicode",
|
||||||
|
"libc",
|
||||||
|
"once_cell",
|
||||||
|
"unicode-width",
|
||||||
|
"windows-sys 0.59.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "core-foundation-sys"
|
name = "core-foundation-sys"
|
||||||
version = "0.8.7"
|
version = "0.8.7"
|
||||||
@ -482,6 +495,12 @@ version = "0.7.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b"
|
checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "encode_unicode"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "endian-type-rs"
|
name = "endian-type-rs"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
@ -824,6 +843,19 @@ dependencies = [
|
|||||||
"hashbrown 0.15.0",
|
"hashbrown 0.15.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indicatif"
|
||||||
|
version = "0.17.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281"
|
||||||
|
dependencies = [
|
||||||
|
"console",
|
||||||
|
"number_prefix",
|
||||||
|
"portable-atomic",
|
||||||
|
"unicode-width",
|
||||||
|
"web-time",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "is_terminal_polyfill"
|
name = "is_terminal_polyfill"
|
||||||
version = "1.70.1"
|
version = "1.70.1"
|
||||||
@ -1227,6 +1259,12 @@ dependencies = [
|
|||||||
"libm 0.2.11",
|
"libm 0.2.11",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "number_prefix"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.36.5"
|
version = "0.36.5"
|
||||||
@ -1300,6 +1338,12 @@ version = "0.3.31"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
|
checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "portable-atomic"
|
||||||
|
version = "1.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ppv-lite86"
|
name = "ppv-lite86"
|
||||||
version = "0.2.20"
|
version = "0.2.20"
|
||||||
@ -1811,6 +1855,12 @@ dependencies = [
|
|||||||
"tinyvec",
|
"tinyvec",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-width"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unsafe_unwrap"
|
name = "unsafe_unwrap"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -1945,6 +1995,16 @@ version = "0.2.95"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
|
checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "web-time"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
|
||||||
|
dependencies = [
|
||||||
|
"js-sys",
|
||||||
|
"wasm-bindgen",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "which"
|
name = "which"
|
||||||
version = "6.0.3"
|
version = "6.0.3"
|
||||||
@ -2114,6 +2174,7 @@ dependencies = [
|
|||||||
"fatfs",
|
"fatfs",
|
||||||
"fscommon",
|
"fscommon",
|
||||||
"git2",
|
"git2",
|
||||||
|
"indicatif",
|
||||||
"log",
|
"log",
|
||||||
"qemu",
|
"qemu",
|
||||||
"semver 1.0.23",
|
"semver 1.0.23",
|
||||||
|
@ -21,3 +21,4 @@ dependency-graph = "0.1.5"
|
|||||||
semver = { version = "1.0.22", features = ["serde"] }
|
semver = { version = "1.0.22", features = ["serde"] }
|
||||||
fatfs = "0.3.6"
|
fatfs = "0.3.6"
|
||||||
fscommon = "0.1.1"
|
fscommon = "0.1.1"
|
||||||
|
indicatif = "0.17.9"
|
||||||
|
@ -185,7 +185,7 @@ fn build_openlibm(env: &BuildEnv, llvm: &Llvm) -> Result<Openlibm, Error> {
|
|||||||
.workspace_root
|
.workspace_root
|
||||||
.join(format!("toolchain-c/libs/openlibm-{}", env.arch.name()));
|
.join(format!("toolchain-c/libs/openlibm-{}", env.arch.name()));
|
||||||
|
|
||||||
git_clone(&libm_path, OPENLIBM_URL, "alnyan/yggdrasil")?;
|
git_clone(&libm_path, OPENLIBM_URL, "alnyan/yggdrasil", false)?;
|
||||||
|
|
||||||
log::info!("Building openlibm");
|
log::info!("Building openlibm");
|
||||||
|
|
||||||
|
@ -160,7 +160,7 @@ pub fn clean_all(env: &BuildEnv, clean_toolchain: bool, repos: bool) -> Result<(
|
|||||||
|
|
||||||
CargoBuilder::Host(env.verbose).run(&env.workspace_root, "clean")?;
|
CargoBuilder::Host(env.verbose).run(&env.workspace_root, "clean")?;
|
||||||
clean_userspace(env)?;
|
clean_userspace(env)?;
|
||||||
fs::remove_dir_all(&env.llvm_sysroot)?;
|
fs::remove_dir_all(env.workspace_root.join("toolchain-c/sysroot"))?;
|
||||||
// Clean libm
|
// Clean libm
|
||||||
for target in Arch::all() {
|
for target in Arch::all() {
|
||||||
Command::new("make")
|
Command::new("make")
|
||||||
|
@ -34,8 +34,6 @@ struct RustRustConfig {
|
|||||||
#[serde(rename_all = "kebab-case")]
|
#[serde(rename_all = "kebab-case")]
|
||||||
struct RustToolchainConfig {
|
struct RustToolchainConfig {
|
||||||
profile: String,
|
profile: String,
|
||||||
changelog_seen: u32,
|
|
||||||
change_id: u32,
|
|
||||||
|
|
||||||
build: RustBuildConfig,
|
build: RustBuildConfig,
|
||||||
target: HashMap<String, RustTargetConfig>,
|
target: HashMap<String, RustTargetConfig>,
|
||||||
@ -45,8 +43,6 @@ struct RustToolchainConfig {
|
|||||||
fn configure<P: AsRef<Path>>(env: &BuildEnv, config_toml_path: P) -> Result<(), Error> {
|
fn configure<P: AsRef<Path>>(env: &BuildEnv, config_toml_path: P) -> Result<(), Error> {
|
||||||
let config = RustToolchainConfig {
|
let config = RustToolchainConfig {
|
||||||
profile: "user".into(),
|
profile: "user".into(),
|
||||||
changelog_seen: 2,
|
|
||||||
change_id: 102579,
|
|
||||||
|
|
||||||
build: RustBuildConfig {
|
build: RustBuildConfig {
|
||||||
host: vec![env.host_triple.clone()],
|
host: vec![env.host_triple.clone()],
|
||||||
@ -143,7 +139,7 @@ fn install_shims<P: AsRef<Path>>(env: &BuildEnv, toolchain_root: P) -> Result<()
|
|||||||
|
|
||||||
pub fn fetch(env: &BuildEnv, branch: &str) -> Result<(), Error> {
|
pub fn fetch(env: &BuildEnv, branch: &str) -> Result<(), Error> {
|
||||||
let path = env.workspace_root.join("toolchain");
|
let path = env.workspace_root.join("toolchain");
|
||||||
git_clone(path, TOOLCHAIN_URL, branch)
|
git_clone(path, TOOLCHAIN_URL, branch, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build(env: &BuildEnv) -> Result<(), Error> {
|
pub fn build(env: &BuildEnv) -> Result<(), Error> {
|
||||||
|
@ -7,8 +7,11 @@ use std::{
|
|||||||
use crate::{
|
use crate::{
|
||||||
env::BuildEnv,
|
env::BuildEnv,
|
||||||
error::{CommandExt, Error},
|
error::{CommandExt, Error},
|
||||||
|
util,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const LLVM_URL: &str = "https://git.alnyan.me/yggdrasil/llvm-project.git";
|
||||||
|
|
||||||
pub struct Llvm {
|
pub struct Llvm {
|
||||||
root: PathBuf,
|
root: PathBuf,
|
||||||
}
|
}
|
||||||
@ -180,12 +183,13 @@ pub fn install_llvm_cxx_runtime(env: &BuildEnv, llvm: &Llvm) -> Result<(), Error
|
|||||||
|
|
||||||
pub fn install_llvm_compiler(env: &BuildEnv) -> Result<Llvm, Error> {
|
pub fn install_llvm_compiler(env: &BuildEnv) -> Result<Llvm, Error> {
|
||||||
let root = env.workspace_root.join("toolchain-c/prefix/host");
|
let root = env.workspace_root.join("toolchain-c/prefix/host");
|
||||||
let build_dir = env.workspace_root.join("toolchain-c/llvm-project/build");
|
let src_dir = env.workspace_root.join("toolchain-c/llvm-project");
|
||||||
|
let build_dir = src_dir.join("build");
|
||||||
let makefile = build_dir.join("build.ninja");
|
let makefile = build_dir.join("build.ninja");
|
||||||
|
|
||||||
fs::create_dir_all(&build_dir)?;
|
util::git_clone(&src_dir, LLVM_URL, "alnyan/yggdrasil", true)?;
|
||||||
|
|
||||||
// TODO clone LLVM
|
fs::create_dir_all(&build_dir)?;
|
||||||
|
|
||||||
// Configure LLVM
|
// Configure LLVM
|
||||||
// TODO option to force reconfig
|
// TODO option to force reconfig
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
use std::{
|
use std::{
|
||||||
ffi::OsStr,
|
ffi::OsStr,
|
||||||
fs,
|
fs,
|
||||||
|
io::{stderr, Write},
|
||||||
path::Path,
|
path::Path,
|
||||||
process::{Command, Stdio},
|
process::{Command, Stdio},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use indicatif::ProgressBar;
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
@ -59,16 +61,45 @@ pub fn copy_dir_recursive<S: AsRef<Path>, D: AsRef<Path>>(src: S, dst: D) -> Res
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn git_clone(dst: impl AsRef<Path>, url: &str, branch: &str) -> Result<(), Error> {
|
pub fn git_clone(
|
||||||
|
dst: impl AsRef<Path>,
|
||||||
|
url: &str,
|
||||||
|
branch: &str,
|
||||||
|
shallow: bool,
|
||||||
|
) -> Result<(), Error> {
|
||||||
let path = dst.as_ref();
|
let path = dst.as_ref();
|
||||||
match git2::Repository::open(path) {
|
match git2::Repository::open(path) {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(err) if err.code() == git2::ErrorCode::NotFound => {
|
Err(err) if err.code() == git2::ErrorCode::NotFound => {
|
||||||
log::info!("Fetching: src={}, branch={}", url, branch);
|
log::info!("Fetching: src={}, branch={}", url, branch);
|
||||||
|
let progress_bar = ProgressBar::no_length();
|
||||||
|
|
||||||
|
let mut remote_cbs = git2::RemoteCallbacks::new();
|
||||||
|
remote_cbs.sideband_progress(|bytes| {
|
||||||
|
stderr().write_all(bytes).ok();
|
||||||
|
true
|
||||||
|
});
|
||||||
|
remote_cbs.transfer_progress(|progress| {
|
||||||
|
progress_bar.set_message("Receiving objects");
|
||||||
|
if progress_bar.length().is_none() {
|
||||||
|
progress_bar.set_length(progress.total_objects() as _);
|
||||||
|
}
|
||||||
|
progress_bar.set_position(progress.received_objects() as _);
|
||||||
|
true
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut fetch_opts = git2::FetchOptions::new();
|
||||||
|
if shallow {
|
||||||
|
fetch_opts.depth(1);
|
||||||
|
}
|
||||||
|
fetch_opts.remote_callbacks(remote_cbs);
|
||||||
|
|
||||||
git2::build::RepoBuilder::new()
|
git2::build::RepoBuilder::new()
|
||||||
.branch(branch)
|
.branch(branch)
|
||||||
|
.fetch_options(fetch_opts)
|
||||||
.clone(url, &path)?;
|
.clone(url, &path)?;
|
||||||
|
|
||||||
|
progress_bar.finish_and_clear();
|
||||||
}
|
}
|
||||||
Err(err) => return Err(err.into()),
|
Err(err) => return Err(err.into()),
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user