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
--- 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() {