# HG changeset patch # User Raphaël Gomès # Date 1587051071 -7200 # Node ID 97c10b157665ae01de72f759332cc1fac28178b8 # Parent a825bfbf66429e63b46f5d91ec5bd725b68e098d 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 diff -r a825bfbf6642 -r 97c10b157665 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|`"; + 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() {