From 34f4fa1609ac53620f8dd9889b34d7f63c9ed694 Mon Sep 17 00:00:00 2001 From: Divma <26765164+divagant-martian@users.noreply.github.com> Date: Fri, 31 Mar 2023 10:56:56 -0500 Subject: [PATCH] Delegate blst build to crate in preparation for windows bindings (#274) --- bindings/rust/Cargo.lock | 46 ++++++++++++++++++++++++++++++++++ bindings/rust/Cargo.toml | 1 + bindings/rust/build.rs | 53 ++++++++++++++++++---------------------- 3 files changed, 71 insertions(+), 29 deletions(-) diff --git a/bindings/rust/Cargo.lock b/bindings/rust/Cargo.lock index b100348..11c88eb 100644 --- a/bindings/rust/Cargo.lock +++ b/bindings/rust/Cargo.lock @@ -52,6 +52,16 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "blst" +version = "0.3.10" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + [[package]] name = "bumpalo" version = "3.12.0" @@ -63,6 +73,7 @@ name = "c-kzg" version = "0.1.0" dependencies = [ "bindgen", + "blst", "criterion", "glob", "hex", @@ -78,6 +89,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cexpr" version = "0.6.0" @@ -659,6 +676,15 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -802,3 +828,23 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.8", +] diff --git a/bindings/rust/Cargo.toml b/bindings/rust/Cargo.toml index 11accb6..ed070eb 100644 --- a/bindings/rust/Cargo.toml +++ b/bindings/rust/Cargo.toml @@ -14,6 +14,7 @@ minimal-spec = [] hex = "0.4.2" libc = "0.2" serde = { version = "1.0", features = ["derive"] } +blst = { path = "../../blst/bindings/rust" } [dev-dependencies] criterion = "0.4" diff --git a/bindings/rust/build.rs b/bindings/rust/build.rs index a39e0b7..bb5544b 100644 --- a/bindings/rust/build.rs +++ b/bindings/rust/build.rs @@ -15,22 +15,13 @@ fn move_file(src: &Path, dst: &Path) -> Result<(), String> { fn main() { let cargo_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); - let root_dir = cargo_dir.join("../../"); + let root_dir = cargo_dir + .parent() + .expect("rust dir is nested") + .parent() + .expect("bindings dir is nested"); let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); - // Ensure libblst exists in `OUT_DIR` - // Assuming blst submodule exists - Command::new("make") - .current_dir(root_dir.join("src")) - .arg("blst") - .status() - .unwrap(); - move_file( - root_dir.join("lib/libblst.a").as_path(), - out_dir.join("libblst.a").as_path(), - ) - .unwrap(); - let field_elements_per_blob = if cfg!(feature = "minimal-spec") { MINIMAL_FIELD_ELEMENTS_PER_BLOB } else { @@ -41,7 +32,7 @@ fn main() { // Deleting any existing assembly and object files to ensure that compiling with a different // feature flag changes the final linked library file. - let obj_file = root_dir.join("src/c_kzg_4844.o"); + let obj_file = root_dir.join("src").join("c_kzg_4844.o"); if obj_file.exists() { std::fs::remove_file(obj_file).unwrap(); } @@ -63,7 +54,7 @@ fn main() { .status() .unwrap(); move_file( - root_dir.join("src/libckzg.a").as_path(), + root_dir.join("src").join("libckzg.a").as_path(), out_dir.join("libckzg.a").as_path(), ) .unwrap(); @@ -71,22 +62,31 @@ fn main() { println!("cargo:rustc-link-search={}", out_dir.display()); println!("cargo:rustc-link-search={}", out_dir.display()); println!("cargo:rustc-link-lib=static=ckzg"); + // Tell cargo to search for the static blst exposed by the blst-bindings' crate. println!("cargo:rustc-link-lib=static=blst"); - let bindings_out_path = cargo_dir.join("src/bindings/generated.rs"); + let bindings_out_path = cargo_dir.join("src").join("bindings").join("generated.rs"); let build_target = env::var("TARGET").unwrap(); let snapshot_path = cargo_dir.join("snapshots").join(format!( "bindings_{build_target}_{field_elements_per_blob}.rs" )); + + let header_file_path = root_dir.join("src").join("c_kzg_4844.h"); + let header_file = header_file_path.to_str().expect("valid header file"); + + // Obtain the header files exposed by blst-bindings' crate. + let blst_headers_dir = + std::env::var_os("DEP_BLST_BINDINGS").expect("BLST exposes header files for bindings"); make_bindings( field_elements_per_blob, - &root_dir, + header_file, + &blst_headers_dir.to_string_lossy(), bindings_out_path, snapshot_path, ); // Cleanup - let obj_file = root_dir.join("src/c_kzg_4844.o"); + let obj_file = root_dir.join("src").join("c_kzg_4844.o"); if obj_file.exists() { std::fs::remove_file(obj_file).unwrap(); } @@ -94,7 +94,8 @@ fn main() { fn make_bindings

( field_elements_per_blob: usize, - root_dir: &Path, + header_path: &str, + blst_headers_dir: &str, bindings_out_path: P, snapshot_path: P, ) where @@ -120,12 +121,6 @@ fn make_bindings

( } } - let header_file_path = root_dir.join("src/c_kzg_4844.h"); - let header_file = header_file_path.to_str().expect("valid header file"); - - let inc_dir_path = root_dir.join("inc"); - let inc_dir = inc_dir_path.to_str().expect("valid inc dir"); - let bindings = Builder::default() /* * Header definitions. @@ -136,12 +131,12 @@ fn make_bindings

( "consts", &format!("#define FIELD_ELEMENTS_PER_BLOB {field_elements_per_blob}"), ) - .header(header_file) - .clang_args([format!("-I{inc_dir}")]) + .header(header_path) + .clang_args([format!("-I{blst_headers_dir}")]) // Since this is not part of the header file, needs to be allowed explicitly. .allowlist_var("FIELD_ELEMENTS_PER_BLOB") // Get bindings only for the header file. - .allowlist_file(".*/c_kzg_4844.h") + .allowlist_file(".*c_kzg_4844.h") /* * Cleanup instructions. */