summaryrefslogtreecommitdiffstats
path: root/vendor/libgit2-sys/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/libgit2-sys/build.rs')
-rw-r--r--vendor/libgit2-sys/build.rs63
1 files changed, 54 insertions, 9 deletions
diff --git a/vendor/libgit2-sys/build.rs b/vendor/libgit2-sys/build.rs
index 24df572ef..b49700583 100644
--- a/vendor/libgit2-sys/build.rs
+++ b/vendor/libgit2-sys/build.rs
@@ -4,22 +4,55 @@ use std::io;
use std::path::{Path, PathBuf};
use std::process::Command;
+/// Tries to use system libgit2 and emits necessary build script instructions.
+fn try_system_libgit2() -> Result<pkg_config::Library, pkg_config::Error> {
+ let mut cfg = pkg_config::Config::new();
+ match cfg.range_version("1.7.1".."1.8.0").probe("libgit2") {
+ Ok(lib) => {
+ for include in &lib.include_paths {
+ println!("cargo:root={}", include.display());
+ }
+ Ok(lib)
+ }
+ Err(e) => {
+ println!("cargo:warning=failed to probe system libgit2: {e}");
+ Err(e)
+ }
+ }
+}
+
fn main() {
let https = env::var("CARGO_FEATURE_HTTPS").is_ok();
let ssh = env::var("CARGO_FEATURE_SSH").is_ok();
let vendored = env::var("CARGO_FEATURE_VENDORED").is_ok();
let zlib_ng_compat = env::var("CARGO_FEATURE_ZLIB_NG_COMPAT").is_ok();
+ // Specify `LIBGIT2_NO_VENDOR` to force to use system libgit2.
+ // Due to the additive nature of Cargo features, if some crate in the
+ // dependency graph activates `vendored` feature, there is no way to revert
+ // it back. This env var serves as a workaround for this purpose.
+ println!("cargo:rerun-if-env-changed=LIBGIT2_NO_VENDOR");
+ let forced_no_vendor = env::var_os("LIBGIT2_NO_VENDOR").map_or(false, |s| s != "0");
+
+ if forced_no_vendor {
+ if try_system_libgit2().is_err() {
+ panic!(
+ "\
+The environment variable `LIBGIT2_NO_VENDOR` has been set but no compatible system libgit2 could be found.
+The build is now aborting. To disable, unset the variable or use `LIBGIT2_NO_VENDOR=0`.
+",
+ );
+ }
+
+ // We've reached here, implying we're using system libgit2.
+ return;
+ }
+
// To use zlib-ng in zlib-compat mode, we have to build libgit2 ourselves.
let try_to_use_system_libgit2 = !vendored && !zlib_ng_compat;
- if try_to_use_system_libgit2 {
- let mut cfg = pkg_config::Config::new();
- if let Ok(lib) = cfg.range_version("1.6.4".."1.7.0").probe("libgit2") {
- for include in &lib.include_paths {
- println!("cargo:root={}", include.display());
- }
- return;
- }
+ if try_to_use_system_libgit2 && try_system_libgit2().is_ok() {
+ // using system libgit2 has worked
+ return;
}
println!("cargo:rustc-cfg=libgit2_vendored");
@@ -49,7 +82,6 @@ fn main() {
// Include all cross-platform C files
add_c_files(&mut cfg, "libgit2/src/libgit2");
add_c_files(&mut cfg, "libgit2/src/util");
- add_c_files(&mut cfg, "libgit2/src/libgit2/xdiff");
// These are activated by features, but they're all unconditionally always
// compiled apparently and have internal #define's to make sure they're
@@ -61,6 +93,10 @@ fn main() {
cfg.include("libgit2/deps/http-parser")
.file("libgit2/deps/http-parser/http_parser.c");
+ // external/system xdiff is not yet supported
+ cfg.include("libgit2/deps/xdiff");
+ add_c_files(&mut cfg, "libgit2/deps/xdiff");
+
// Use the included PCRE regex backend.
//
// Ideally these defines would be specific to the pcre files (or placed in
@@ -119,6 +155,14 @@ fn main() {
features.push_str("#define GIT_USE_NSEC 1\n");
}
+ if windows {
+ features.push_str("#define GIT_IO_WSAPOLL 1\n");
+ } else {
+ // Should we fallback to `select` as more systems have that?
+ features.push_str("#define GIT_IO_POLL 1\n");
+ features.push_str("#define GIT_IO_SELECT 1\n");
+ }
+
if target.contains("apple") {
features.push_str("#define GIT_USE_STAT_MTIMESPEC 1\n");
} else {
@@ -199,6 +243,7 @@ fn main() {
println!("cargo:rustc-link-lib=rpcrt4");
println!("cargo:rustc-link-lib=ole32");
println!("cargo:rustc-link-lib=crypt32");
+ println!("cargo:rustc-link-lib=secur32");
}
if target.contains("apple") {