From c23b3798e88e517dafb948d8ff486ce745e6f102 Mon Sep 17 00:00:00 2001 From: inv2004 Date: Wed, 31 Oct 2018 20:51:23 -0400 Subject: [PATCH] trying to build for windows --- mongoc-sys/Cargo.toml | 1 + mongoc-sys/build.rs | 180 ++++++++++++++++++++++++------------------ src/bsonc.rs | 2 +- 3 files changed, 107 insertions(+), 76 deletions(-) diff --git a/mongoc-sys/Cargo.toml b/mongoc-sys/Cargo.toml index f9a4046..4772675 100644 --- a/mongoc-sys/Cargo.toml +++ b/mongoc-sys/Cargo.toml @@ -16,3 +16,4 @@ openssl-sys = "0.9" [build-dependencies] pkg-config = "0.3" +vcpkg = "0.2.6" \ No newline at end of file diff --git a/mongoc-sys/build.rs b/mongoc-sys/build.rs index a57ccae..9d0c5cd 100644 --- a/mongoc-sys/build.rs +++ b/mongoc-sys/build.rs @@ -1,100 +1,130 @@ extern crate pkg_config; +#[cfg(target_env = "msvc")] +extern crate vcpkg; use std::env; use std::path::Path; use std::process::Command; -fn main() { - let mongoc_version = env!("CARGO_PKG_VERSION") - .split('-') - .next() - .expect("Crate version is not valid"); - +#[cfg(not(target_env = "msvc"))] +fn main_linux(mongoc_version: &str) { if pkg_config::Config::new() .atleast_version(mongoc_version) .statik(true) .probe("libmongoc-1.0") .is_err() - { - let out_dir_var = env::var("OUT_DIR").expect("No out dir"); - let out_dir = format!("{}/{}", out_dir_var, mongoc_version); - let driver_src_path = format!("mongo-c-driver-{}", mongoc_version); + { + let out_dir_var = env::var("OUT_DIR").expect("No out dir"); + let out_dir = format!("{}/{}", out_dir_var, mongoc_version); + let driver_src_path = format!("mongo-c-driver-{}", mongoc_version); - let libmongoc_path = Path::new(&out_dir).join("lib/libmongoc-1.0.a"); - if !libmongoc_path.exists() { - // Download and extract driver archive - let url = format!( - "https://github.com/mongodb/mongo-c-driver/releases/download/{}/mongo-c-driver-{}.tar.gz", - mongoc_version, - mongoc_version - ); - assert!( - Command::new("curl").arg("-O") // Save to disk - .arg("-L") // Follow redirects - .arg(url) - .status() - .expect("Could not run curl") - .success() - ); + let libmongoc_path = Path::new(&out_dir).join("lib/libmongoc-1.0.a"); + if !libmongoc_path.exists() { + // Download and extract driver archive + let url = format!( + "https://github.com/mongodb/mongo-c-driver/releases/download/{}/mongo-c-driver-{}.tar.gz", + mongoc_version, + mongoc_version + ); + assert!( + Command::new("curl").arg("-O") // Save to disk + .arg("-L") // Follow redirects + .arg(url) + .status() + .expect("Could not run curl") + .success() + ); - let archive_name = format!("mongo-c-driver-{}.tar.gz", mongoc_version); - assert!( - Command::new("tar") - .arg("xzf") - .arg(&archive_name) - .status() - .expect("Could not run tar") - .success() - ); + let archive_name = format!("mongo-c-driver-{}.tar.gz", mongoc_version); + assert!( + Command::new("tar") + .arg("xzf") + .arg(&archive_name) + .status() + .expect("Could not run tar") + .success() + ); - // Configure and install - let mut command = Command::new("sh"); - command.arg("configure"); - command.arg("--enable-ssl=openssl"); - command.arg("--enable-sasl=no"); - command.arg("--enable-static=yes"); - command.arg("--enable-shared=no"); - command.arg("--enable-shm-counters=no"); - command.arg("--with-libbson=bundled"); - command.arg("--with-pic=yes"); - command.arg("--with-snappy=no"); - command.arg("--with-zlib=no"); - command.arg(format!("--prefix={}", &out_dir)); - command.current_dir(&driver_src_path); + // Configure and install + let mut command = Command::new("sh"); + command.arg("configure"); + command.arg("--enable-ssl=openssl"); + command.arg("--enable-sasl=no"); + command.arg("--enable-static=yes"); + command.arg("--enable-shared=no"); + command.arg("--enable-shm-counters=no"); + command.arg("--with-libbson=bundled"); + command.arg("--with-pic=yes"); + command.arg("--with-snappy=no"); + command.arg("--with-zlib=no"); + command.arg(format!("--prefix={}", &out_dir)); + command.current_dir(&driver_src_path); - // Enable debug symbols if configured for this profile - if env::var("DEBUG") == Ok("true".to_string()) { - command.arg("--enable-debug-symbols=yes"); - } + // Enable debug symbols if configured for this profile + if env::var("DEBUG") == Ok("true".to_string()) { + command.arg("--enable-debug-symbols=yes"); + } - // Use target that Cargo sets - if let Ok(target) = env::var("TARGET") { - command.arg(format!("--build={}", target)); + // Use target that Cargo sets + if let Ok(target) = env::var("TARGET") { + command.arg(format!("--build={}", target)); + } + + assert!(command.status().expect("Could not run configure").success()); + assert!( + Command::new("make") + .current_dir(&driver_src_path) + .env("CFLAGS", "-DMONGOC_TRACE") + .status() + .expect("Could not run make") + .success() + ); + assert!( + Command::new("make") + .arg("install") + .current_dir(&driver_src_path) + .status() + .expect("Could not run make install") + .success() + ); } - assert!(command.status().expect("Could not run configure").success()); - assert!( - Command::new("make") - .current_dir(&driver_src_path) - .env("CFLAGS", "-DMONGOC_TRACE") - .status() - .expect("Could not run make") - .success() - ); - assert!( - Command::new("make") - .arg("install") - .current_dir(&driver_src_path) - .status() - .expect("Could not run make install") - .success() - ); + // Output to Cargo + println!("cargo:rustc-link-search=native={}/lib", &out_dir); + println!("cargo:rustc-link-lib=static=bson-1.0"); + println!("cargo:rustc-link-lib=static=mongoc-1.0"); } +} + +#[cfg(target_env = "msvc")] +fn main_win(mongoc_version: &str) { + use vcpkg; + if vcpkg::Config::new() + .emit_includes(true) + .probe("mongo-c-driver") + .is_ok() + { + let out_dir_var = env::var("OUT_DIR").expect("No out dir"); + let out_dir = format!("{}/{}", out_dir_var, mongoc_version); + +// println!("found"); // Output to Cargo println!("cargo:rustc-link-search=native={}/lib", &out_dir); - println!("cargo:rustc-link-lib=static=bson-1.0"); - println!("cargo:rustc-link-lib=static=mongoc-1.0"); + println!("cargo:rustc-link-lib=bson"); + println!("cargo:rustc-link-lib=mongo-c-driver"); } } + +fn main() { + let mongoc_version = env!("CARGO_PKG_VERSION") + .split('-') + .next() + .expect("Crate version is not valid"); + + #[cfg(target_env = "msvc")] + main_win(mongoc_version); + #[cfg(not(target_env = "msvc"))] + main_linux(mongoc_version); +} diff --git a/src/bsonc.rs b/src/bsonc.rs index 45bf2d6..a6de49d 100644 --- a/src/bsonc.rs +++ b/src/bsonc.rs @@ -30,7 +30,7 @@ impl Bsonc { let inner = unsafe { bindings::bson_new_from_data( buffer[..].as_ptr(), - buffer.len() as u64 + buffer.len() as u32 ) };