@@ -4,22 +4,55 @@ use std::io;
4
4
use std:: path:: { Path , PathBuf } ;
5
5
use std:: process:: Command ;
6
6
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
+
7
24
fn main ( ) {
8
25
let https = env:: var ( "CARGO_FEATURE_HTTPS" ) . is_ok ( ) ;
9
26
let ssh = env:: var ( "CARGO_FEATURE_SSH" ) . is_ok ( ) ;
10
27
let vendored = env:: var ( "CARGO_FEATURE_VENDORED" ) . is_ok ( ) ;
11
28
let zlib_ng_compat = env:: var ( "CARGO_FEATURE_ZLIB_NG_COMPAT" ) . is_ok ( ) ;
12
29
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
+
13
51
// To use zlib-ng in zlib-compat mode, we have to build libgit2 ourselves.
14
52
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 ;
23
56
}
24
57
25
58
println ! ( "cargo:rustc-cfg=libgit2_vendored" ) ;
0 commit comments