Patchwork D8451: rust: add option of static linking a local Re2 install

login
register
mail settings
Submitter phabricator
Date April 16, 2020, 4:42 p.m.
Message ID <b2931ac93ffa19c6cde3e5e12a46f033@localhost.localdomain>
Download mbox | patch
Permalink /patch/46159/
State Not Applicable
Headers show

Comments

phabricator - April 16, 2020, 4:42 p.m.
Closed by commit rHG97c10b157665: rust: add option of static linking a local Re2 install (authored by Alphare).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D8451?vs=21128&id=21130

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D8451/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D8451

AFFECTED FILES
  rust/hg-core/build.rs

CHANGE DETAILS




To: Alphare, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/rust/hg-core/build.rs b/rust/hg-core/build.rs
--- a/rust/hg-core/build.rs
+++ b/rust/hg-core/build.rs
@@ -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() {