rust: add option of static linking a local Re2 install
authorRaphaël Gomès <rgomes@octobus.net>
Thu, 16 Apr 2020 17:31:11 +0200
changeset 44713 97c10b157665
parent 44712 a825bfbf6642
child 44714 8dbcd5138102
rust: add option of static linking a local Re2 install Previously, only dynamically linking the system-wide install was possible. We force the user to provide one to prevent hard-to-track errors. Differential Revision: https://phab.mercurial-scm.org/D8451
rust/hg-core/build.rs
--- a/rust/hg-core/build.rs	Wed Apr 15 23:11:55 2020 +0900
+++ b/rust/hg-core/build.rs	Thu Apr 16 17:31:11 2020 +0200
@@ -8,15 +8,51 @@
 #[cfg(feature = "with-re2")]
 use cc;
 
+/// Uses either the system Re2 install as a dynamic library or the provided
+/// build as a static library
 #[cfg(feature = "with-re2")]
 fn compile_re2() {
-    cc::Build::new()
+    use cc;
+    use std::path::Path;
+    use std::process::exit;
+
+    let msg = r"HG_RE2_PATH must be one of `system|<path to build source clone of Re2>`";
+    let re2 = match std::env::var_os("HG_RE2_PATH") {
+        None => {
+            eprintln!("{}", msg);
+            exit(1)
+        }
+        Some(v) => {
+            if v == "system" {
+                None
+            } else {
+                Some(v)
+            }
+        }
+    };
+
+    let mut options = cc::Build::new();
+    options
         .cpp(true)
         .flag("-std=c++11")
-        .file("src/re2/rust_re2.cpp")
-        .compile("librustre.a");
+        .file("src/re2/rust_re2.cpp");
+
+    if let Some(ref source) = re2 {
+        options.include(Path::new(source));
+    };
+
+    options.compile("librustre.a");
 
-    println!("cargo:rustc-link-lib=re2");
+    if let Some(ref source) = &re2 {
+        // Link the local source statically
+        println!(
+            "cargo:rustc-link-search=native={}",
+            Path::new(source).join(Path::new("obj")).display()
+        );
+        println!("cargo:rustc-link-lib=static=re2");
+    } else {
+        println!("cargo:rustc-link-lib=re2");
+    }
 }
 
 fn main() {