commit 9413c9c3f8c6bd39d664525f9a826e43c0792fc1
parent 88a113ccdb10d78a715a978c97b14a349c4bc69f
Author: William Casarin <jb55@jb55.com>
Date: Wed, 13 Dec 2023 20:23:58 -0800
rust: build secp256k1 as a part of the build process
couldn't seem to get secp256k1-sys working, this works though
Diffstat:
M | build.rs | | | 77 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- |
1 file changed, 66 insertions(+), 11 deletions(-)
diff --git a/build.rs b/build.rs
@@ -3,9 +3,63 @@ use cc::Build;
use std::env;
use std::path::PathBuf;
+fn secp256k1_build() {
+ // Actual build
+ let mut base_config = cc::Build::new();
+ base_config
+ .include("deps/secp256k1/")
+ .include("deps/secp256k1/include")
+ .include("deps/secp256k1/src")
+ .flag_if_supported("-Wno-unused-function") // some ecmult stuff is defined but not used upstream
+ .flag_if_supported("-Wno-unused-parameter") // patching out printf causes this warning
+ //.define("SECP256K1_API", Some(""))
+ .define("ENABLE_MODULE_ECDH", Some("1"))
+ .define("ENABLE_MODULE_SCHNORRSIG", Some("1"))
+ .define("ENABLE_MODULE_EXTRAKEYS", Some("1"))
+ //.define("ENABLE_MODULE_ELLSWIFT", Some("0"))
+ // upstream sometimes introduces calls to printf, which we cannot compile
+ // with WASM due to its lack of libc. printf is never necessary and we can
+ // just #define it away.
+ .define("printf(...)", Some(""));
+
+ //if cfg!(feature = "lowmemory") {
+ // base_config.define("ECMULT_WINDOW_SIZE", Some("4")); // A low-enough value to consume negligible memory
+ // base_config.define("ECMULT_GEN_PREC_BITS", Some("2"));
+ //} else {
+ // base_config.define("ECMULT_GEN_PREC_BITS", Some("4"));
+ // base_config.define("ECMULT_WINDOW_SIZE", Some("15")); // This is the default in the configure file (`auto`)
+ //}
+
+ //base_config.define("USE_EXTERNAL_DEFAULT_CALLBACKS", Some("1"));
+ //#[cfg(feature = "recovery")]
+ //base_config.define("ENABLE_MODULE_RECOVERY", Some("1"));
+
+ // WASM headers and size/align defines.
+ if env::var("CARGO_CFG_TARGET_ARCH").unwrap() == "wasm32" {
+ base_config.include("wasm/wasm-sysroot").file("wasm/wasm.c");
+ }
+
+ // secp256k1
+ base_config
+ .file("deps/secp256k1/contrib/lax_der_parsing.c")
+ .file("deps/secp256k1/src/precomputed_ecmult_gen.c")
+ .file("deps/secp256k1/src/precomputed_ecmult.c")
+ .file("deps/secp256k1/src/secp256k1.c");
+
+ if base_config.try_compile("libsecp256k1.a").is_err() {
+ // Some embedded platforms may not have, eg, string.h available, so if the build fails
+ // simply try again with the wasm sysroot (but without the wasm type sizes) in the hopes
+ // that it works.
+ base_config.include("wasm/wasm-sysroot");
+ base_config.compile("libsecp256k1.a");
+ }
+}
+
fn main() {
// Compile the C file
- Build::new()
+ let mut build = Build::new();
+
+ build
.files([
"nostrdb.c",
"sha256.c",
@@ -15,21 +69,22 @@ fn main() {
"deps/flatcc/src/runtime/builder.c",
"deps/flatcc/src/runtime/emitter.c",
"deps/flatcc/src/runtime/refmap.c",
- // Add all your C source files here
- // For flatcc sources, you might want to iterate over an array of paths
+ "deps/lmdb/mdb.c",
+ "deps/lmdb/midl.c",
])
- .include("deps/secp256k1/include")
.include("deps/lmdb")
.include("deps/flatcc/include")
+ .include("deps/secp256k1/include")
// Add other include paths
//.flag("-Wall")
.flag("-Wno-misleading-indentation")
.flag("-Wno-unused-function")
- .flag("-Werror")
- .flag("-O2")
- .flag("-g")
+ //.flag("-Werror")
+ //.flag("-g")
.compile("libnostrdb.a");
+ secp256k1_build();
+
// Re-run the build script if any of the C files or headers change
for file in &[
"src/nostrdb.c",
@@ -43,10 +98,10 @@ fn main() {
println!("cargo:rerun-if-changed={}", file);
}
- println!("cargo:rustc-link-search=native=deps/lmdb");
- println!("cargo:rustc-link-lib=static=lmdb");
- println!("cargo:rustc-link-search=native=deps/secp256k1/.libs");
- println!("cargo:rustc-link-lib=static=secp256k1");
+ //println!("cargo:rustc-link-search=native=deps/lmdb");
+ //println!("cargo:rustc-link-lib=static=lmdb");
+ //println!("cargo:rustc-link-search=native=deps/secp256k1/.libs");
+ println!("cargo:rustc-link-lib=secp256k1");
// Print out the path to the compiled library
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());