From 4144f2efdc8b3627a6c404736dfcdc7702093f21 Mon Sep 17 00:00:00 2001 From: maciektr Date: Mon, 20 Nov 2023 17:31:12 +0100 Subject: [PATCH] Fix corelib rev for buildrs --- Cargo.lock | 10 +++ Cargo.toml | 1 + scarb/Cargo.toml | 2 + scarb/build.rs | 93 ++++++++++++++------------- utils/scarb-build-metadata/build.rs | 32 ++++++++- utils/scarb-build-metadata/src/lib.rs | 1 + 6 files changed, 95 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 848cad135..c0d98701b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1272,6 +1272,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "copy_dir" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "543d1dd138ef086e2ff05e3a48cf9da045da2033d16f8538fd76b86cd49b2ca3" +dependencies = [ + "walkdir", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -4429,6 +4438,7 @@ dependencies = [ "camino", "clap", "clap-verbosity-flag", + "copy_dir", "create-output-dir", "data-encoding", "deno_task_shell", diff --git a/Cargo.toml b/Cargo.toml index 5ca058a5b..ffc377823 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ cargo_metadata = ">=0.18" clap = { version = "4", features = ["derive", "env", "string"] } clap-verbosity-flag = "2" console = "0.15" +copy_dir = "0.1" darling = "0.20" data-encoding = "2" deno_task_shell = ">=0.13" diff --git a/scarb/Cargo.toml b/scarb/Cargo.toml index f3b6f3814..8f7489b1c 100644 --- a/scarb/Cargo.toml +++ b/scarb/Cargo.toml @@ -29,6 +29,7 @@ cairo-lang-utils.workspace = true camino.workspace = true clap-verbosity-flag.workspace = true clap.workspace = true +copy_dir.workspace = true create-output-dir = { path = "../utils/create-output-dir" } data-encoding.workspace = true deno_task_shell.workspace = true @@ -102,3 +103,4 @@ test-for-each-example = { path = "../utils/test-for-each-example" } scarb-build-metadata = { path = "../utils/scarb-build-metadata" } toml.workspace = true zip.workspace = true +copy_dir.workspace = true \ No newline at end of file diff --git a/scarb/build.rs b/scarb/build.rs index 611684b3b..9de183060 100644 --- a/scarb/build.rs +++ b/scarb/build.rs @@ -1,3 +1,4 @@ +use copy_dir::copy_dir; use std::fs::File; use std::path::PathBuf; use std::process::Command; @@ -5,7 +6,7 @@ use std::{env, fs, io}; use zip::ZipArchive; -use scarb_build_metadata::{CAIRO_COMMIT_REV, CAIRO_VERSION}; +use scarb_build_metadata::{CAIRO_COMMIT_REV, CAIRO_VERSION, SCARB_CORELIB_LOCAL_SOURCE}; fn main() { download_core(CAIRO_COMMIT_REV); @@ -28,61 +29,67 @@ fn download_core(rev: &str) { ); return; } - let core_path = PathBuf::from_iter([&out_dir, &format!("core-{}", ident(rev))]); if !core_path.is_dir() { - let cairo_zip = PathBuf::from_iter([&out_dir, "cairo.zip"]); - - if let Ok(cairo_archive) = env::var("CAIRO_ARCHIVE") { - // Copy archive to `cairo_zip`, without keeping file attributes. - eprintln!("Copying Cairo archive from `CAIRO_ARCHIVE={cairo_archive}`."); - let mut src = File::open(&cairo_archive).unwrap(); - let mut dst = File::create(&cairo_zip).unwrap(); - io::copy(&mut src, &mut dst).unwrap(); + if !SCARB_CORELIB_LOCAL_SOURCE.is_empty() { + copy_dir(PathBuf::from(SCARB_CORELIB_LOCAL_SOURCE), core_path.clone()).unwrap(); } else { - let url = format!("https://github.com/starkware-libs/cairo/archive/{rev}.zip"); - let mut curl = Command::new("curl"); - curl.args(["--proto", "=https", "--tlsv1.2", "-fL"]); - curl.arg("-o"); - curl.arg(&cairo_zip); - curl.arg(&url); - eprintln!("{curl:?}"); - let curl_exit = curl.status().expect("Failed to start curl"); - if !curl_exit.success() { - panic!("Failed to download {url} with curl") - } + extract_corelib(rev, out_dir, core_path.clone()); } + } - fs::create_dir_all(&core_path).unwrap(); - let cairo_file = File::open(cairo_zip).unwrap(); - let mut cairo_archive = ZipArchive::new(cairo_file).unwrap(); - for i in 0..cairo_archive.len() { - let mut input = cairo_archive.by_index(i).unwrap(); + check_corelib_version(core_path.join("Scarb.toml")); + println!("cargo:rustc-env=SCARB_CORE_PATH={}", core_path.display()); +} - if input.name().ends_with('/') { - continue; - } +fn extract_corelib(rev: &str, out_dir: String, core_path: PathBuf) { + let cairo_zip = PathBuf::from_iter([&out_dir, "cairo.zip"]); + if let Ok(cairo_archive) = env::var("CAIRO_ARCHIVE") { + // Copy archive to `cairo_zip`, without keeping file attributes. + eprintln!("Copying Cairo archive from `CAIRO_ARCHIVE={cairo_archive}`."); + let mut src = File::open(&cairo_archive).unwrap(); + let mut dst = File::create(&cairo_zip).unwrap(); + io::copy(&mut src, &mut dst).unwrap(); + } else { + let url = format!("https://github.com/starkware-libs/cairo/archive/{rev}.zip"); + let mut curl = Command::new("curl"); + curl.args(["--proto", "=https", "--tlsv1.2", "-fL"]); + curl.arg("-o"); + curl.arg(&cairo_zip); + curl.arg(&url); + eprintln!("{curl:?}"); + let curl_exit = curl.status().expect("Failed to start curl"); + if !curl_exit.success() { + panic!("Failed to download {url} with curl") + } + } - let path = input.enclosed_name().unwrap(); + fs::create_dir_all(&core_path).unwrap(); + let cairo_file = File::open(cairo_zip).unwrap(); + let mut cairo_archive = ZipArchive::new(cairo_file).unwrap(); + for i in 0..cairo_archive.len() { + let mut input = cairo_archive.by_index(i).unwrap(); - let path = PathBuf::from_iter(path.components().skip(1)); - let Ok(path) = path.strip_prefix("corelib") else { - continue; - }; + if input.name().ends_with('/') { + continue; + } + + let path = input.enclosed_name().unwrap(); - let path = core_path.join(path); + let path = PathBuf::from_iter(path.components().skip(1)); + let Ok(path) = path.strip_prefix("corelib") else { + continue; + }; - if let Some(parent) = path.parent() { - fs::create_dir_all(parent).unwrap(); - } + let path = core_path.join(path); - let mut output = File::create(path).unwrap(); - io::copy(&mut input, &mut output).unwrap(); + if let Some(parent) = path.parent() { + fs::create_dir_all(parent).unwrap(); } - } - check_corelib_version(core_path.join("Scarb.toml")); - println!("cargo:rustc-env=SCARB_CORE_PATH={}", core_path.display()); + let mut output = File::create(path).unwrap(); + io::copy(&mut input, &mut output).unwrap(); + } } fn ident(id: &str) -> String { diff --git a/utils/scarb-build-metadata/build.rs b/utils/scarb-build-metadata/build.rs index cc94ddfad..2ae8465be 100644 --- a/utils/scarb-build-metadata/build.rs +++ b/utils/scarb-build-metadata/build.rs @@ -66,10 +66,40 @@ fn cairo_version() { .iter() .find(|pkg| pkg.id == compiler_dep.pkg) .unwrap(); - let version = compiler_package.version.to_string(); println!("cargo:rustc-env=SCARB_CAIRO_VERSION={version}"); + let corelib_local_path = compiler_package + .id + .clone() + .repr + .strip_prefix(&format!("cairo-lang-compiler {version} (")) + .map(ToString::to_string) + .and_then(|source| source.split_once('+').map(|(s, _)| s.to_string())) + .and_then(|source| { + if source == "registry" { + None + } else { + // Source is local or git - corelib already downloaded by Cargo + let path = compiler_package.manifest_path.clone(); + let path = path + .parent() + .expect("cairo-lang-compiler Cargo.toml parent must exist"); + let path = path + .parent() + .expect("cairo-lang-compiler crate root parent must exist"); + let path = path + .parent() + .expect("cairo-lang-compiler crates dir parent must exist"); + let path = path.join("corelib"); + assert!(path.exists(), "cairo-lang-compiler corelib must exist"); + Some(path) + } + }) + .map(|p| p.to_string()) + .unwrap_or("".into()); + println!("cargo:rustc-env=SCARB_CORELIB_LOCAL_SOURCE={corelib_local_path}"); + let mut rev = format!("refs/tags/v{version}"); if let Some(source) = &compiler_package.source { let source = source.to_string(); diff --git a/utils/scarb-build-metadata/src/lib.rs b/utils/scarb-build-metadata/src/lib.rs index 2c99f15de..cfc1c410c 100644 --- a/utils/scarb-build-metadata/src/lib.rs +++ b/utils/scarb-build-metadata/src/lib.rs @@ -26,6 +26,7 @@ pub const CAIRO_COMMIT_HASH: Option = match ( _ => panic!("Either SCARB_CAIRO_COMMIT_HASH or SCARB_CAIRO_SHORT_COMMIT_HASH is missing."), }; pub const CAIRO_COMMIT_REV: &str = env!("SCARB_CAIRO_COMMIT_REV"); +pub const SCARB_CORELIB_LOCAL_SOURCE: &str = env!("SCARB_CORELIB_LOCAL_SOURCE"); #[cfg(test)] mod tests {