1- use std:: { env, path:: PathBuf } ;
1+ use std:: { env, fs , path:: PathBuf } ;
22
33fn main ( ) {
44 let out_dir = env:: var ( "OUT_DIR" ) . unwrap ( ) ;
55
66 let iconv = if cfg ! ( feature = "iconv" ) { "ON" } else { "OFF" } ;
77 let zlib = if cfg ! ( feature = "zlib" ) { "ON" } else { "OFF" } ;
8+
89 let path = cmake:: Config :: new ( "libxml2" )
910 . define ( "BUILD_SHARED_LIBS" , "OFF" )
1011 . define ( "LIBXML2_WITH_ICONV" , iconv)
@@ -14,19 +15,52 @@ fn main() {
1415
1516 println ! ( "cargo::rerun-if-changed=libxml2" ) ;
1617
17- let libs = std:: process:: Command :: new ( format ! ( "{}/bin/xml2-config" , path. display( ) , ) )
18+ let host = env:: var ( "HOST" ) . unwrap ( ) ;
19+
20+ let mut libs = std:: process:: Command :: new ( "sh" )
21+ . arg ( path. join ( "bin/xml2-config" ) )
1822 . arg ( "--libs" )
1923 . output ( )
20- . expect ( "" ) ;
21- let libs = String :: from_utf8_lossy ( & libs. stdout ) ;
22- println ! ( "cargo::rustc-flags={}" , libs) ;
23-
24- let cflags = std:: process:: Command :: new ( format ! ( "{}/bin/xml2-config" , path. display( ) , ) )
24+ . map ( |output| String :: from_utf8_lossy ( & output. stdout ) . to_string ( ) ) ;
25+ let mut cflags = std:: process:: Command :: new ( "sh" )
26+ . arg ( path. join ( "bin/xml2-config" ) )
2527 . arg ( "--cflags" )
2628 . output ( )
27- . expect ( "" ) ;
28- let cflags = String :: from_utf8_lossy ( & cflags. stdout ) ;
29+ . map ( |output| String :: from_utf8_lossy ( & output. stdout ) . to_string ( ) ) ;
30+
31+ if host. contains ( "windows" ) {
32+ let reg = regex:: Regex :: new ( "-(.)/(.)/" ) . expect ( "reg" ) ;
33+ libs = libs. map ( |v| reg. replace_all ( & v, "-$1$2:/" ) . to_string ( ) ) ;
34+ cflags = cflags. map ( |v| reg. replace_all ( & v, "-$1$2:/" ) . to_string ( ) ) ;
35+ }
36+ // NOTE: Manually specify
37+ let mut libs = libs. unwrap_or_else ( |_| format ! ( "-L{} -lxml2" , path. join( "lib" ) . display( ) ) ) ;
38+ if host. contains ( "msvc" ) {
39+ let mut iters = fs:: read_dir ( path. join ( "lib" ) )
40+ . expect ( "read_dir" )
41+ . filter_map ( |p| {
42+ p. ok ( ) . and_then ( |p| {
43+ let metadata = p. metadata ( ) . ok ( ) ?;
44+ let file_name = p. file_name ( ) ;
45+ let name = file_name. to_string_lossy ( ) ;
46+ if metadata. is_file ( ) && name. starts_with ( "libxml2" ) && name. ends_with ( ".lib" ) {
47+ return Some (
48+ name
49+ . trim_end_matches ( ".lib" )
50+ . to_string ( ) ,
51+ ) ;
52+ }
53+ None
54+ } )
55+ } ) ;
56+ let name = iters. next ( ) . expect ( "xml name" ) ;
57+ println ! ( "cargo:rustc-link-lib=bcrypt" ) ;
58+ libs = libs. replace ( "-lxml2" , & format ! ( "-l{}" , name) ) ;
59+ }
60+ println ! ( "cargo::rustc-flags={}" , libs) ;
2961
62+ // Note: Manually specify
63+ let cflags = cflags. unwrap_or_else ( |_| format ! ( "-I{}" , path. join( "include/libxml2" ) . display( ) ) ) ;
3064 let bindings_path = PathBuf :: from ( out_dir) . join ( "bindings.rs" ) ;
3165 bindgen:: builder ( )
3266 . opaque_type ( "max_align_t" )
0 commit comments