@@ -4,22 +4,55 @@ use std::io;
44use std:: path:: { Path , PathBuf } ;
55use std:: process:: Command ;
66
7+ /// Tries to use system libgit2 and emits necessary build script instructions.
8+ fn try_system_libgit2 ( ) -> Result < pkg_config:: Library , pkg_config:: Error > {
9+ let mut cfg = pkg_config:: Config :: new ( ) ;
10+ match cfg. range_version ( "1.7.0" .."1.8.0" ) . probe ( "libgit2" ) {
11+ Ok ( lib) => {
12+ for include in & lib. include_paths {
13+ println ! ( "cargo:root={}" , include. display( ) ) ;
14+ }
15+ Ok ( lib)
16+ }
17+ Err ( e) => {
18+ println ! ( "cargo:warning=failed to probe system libgit2: {e}" ) ;
19+ Err ( e)
20+ }
21+ }
22+ }
23+
724fn main ( ) {
825 let https = env:: var ( "CARGO_FEATURE_HTTPS" ) . is_ok ( ) ;
926 let ssh = env:: var ( "CARGO_FEATURE_SSH" ) . is_ok ( ) ;
1027 let vendored = env:: var ( "CARGO_FEATURE_VENDORED" ) . is_ok ( ) ;
1128 let zlib_ng_compat = env:: var ( "CARGO_FEATURE_ZLIB_NG_COMPAT" ) . is_ok ( ) ;
1229
30+ // Specify `LIBGIT2_NO_VENDOR` to force to use system libgit2.
31+ // Due to the additive nature of Cargo features, if some crate in the
32+ // dependency graph activates `vendored` feature, there is no way to revert
33+ // it back. This env var serves as a workaround for this purpose.
34+ println ! ( "cargo:rerun-if-env-changed=LIBGIT2_NO_VENDOR" ) ;
35+ let forced_no_vendor = env:: var_os ( "LIBGIT2_NO_VENDOR" ) . map_or ( false , |s| s != "0" ) ;
36+
37+ if forced_no_vendor {
38+ if try_system_libgit2 ( ) . is_err ( ) {
39+ panic ! (
40+ "\
41+ The environment variable `LIBGIT2_NO_VENDOR` has been set but no compatible system libgit2 could be found.
42+ The build is now aborting. To disable, unset the variable or use `LIBGIT2_NO_VENDOR=0`.
43+ " ,
44+ ) ;
45+ }
46+
47+ // We've reached here, implying we're using system libgit2.
48+ return ;
49+ }
50+
1351 // To use zlib-ng in zlib-compat mode, we have to build libgit2 ourselves.
1452 let try_to_use_system_libgit2 = !vendored && !zlib_ng_compat;
15- if try_to_use_system_libgit2 {
16- let mut cfg = pkg_config:: Config :: new ( ) ;
17- if let Ok ( lib) = cfg. range_version ( "1.7.0" .."1.8.0" ) . probe ( "libgit2" ) {
18- for include in & lib. include_paths {
19- println ! ( "cargo:root={}" , include. display( ) ) ;
20- }
21- return ;
22- }
53+ if try_to_use_system_libgit2 && try_system_libgit2 ( ) . is_ok ( ) {
54+ // using system libgit2 has worked
55+ return ;
2356 }
2457
2558 println ! ( "cargo:rustc-cfg=libgit2_vendored" ) ;
0 commit comments