@@ -89,12 +89,14 @@ use std::env;
89
89
use std:: error;
90
90
use std:: ffi:: { OsStr , OsString } ;
91
91
use std:: fmt;
92
+ use std:: fmt:: Arguments ;
92
93
use std:: fmt:: Display ;
93
94
use std:: io;
94
95
use std:: ops:: { Bound , RangeBounds } ;
95
96
use std:: path:: PathBuf ;
96
97
use std:: process:: { Command , Output } ;
97
98
use std:: str;
99
+ use std:: sync:: Mutex ;
98
100
99
101
/// Wrapper struct to polyfill methods introduced in 1.57 (`get_envs`, `get_args` etc).
100
102
/// This is needed to reconstruct the pkg-config command for output in a copy-
@@ -106,7 +108,7 @@ struct WrappedCommand {
106
108
args : Vec < OsString > ,
107
109
}
108
110
109
- #[ derive( Clone , Debug ) ]
111
+ #[ derive( Debug ) ]
110
112
pub struct Config {
111
113
statik : Option < bool > ,
112
114
min_version : Bound < String > ,
@@ -116,6 +118,24 @@ pub struct Config {
116
118
env_metadata : bool ,
117
119
print_system_libs : bool ,
118
120
print_system_cflags : bool ,
121
+ /// If `Some`, cargo directives will be buffered instead of being printed directly
122
+ metadata_buffer : Option < Mutex < Vec < String > > > ,
123
+ }
124
+
125
+ impl Clone for Config {
126
+ fn clone ( & self ) -> Config {
127
+ Config {
128
+ statik : self . statik ,
129
+ min_version : self . min_version . clone ( ) ,
130
+ max_version : self . max_version . clone ( ) ,
131
+ extra_args : self . extra_args . clone ( ) ,
132
+ print_system_cflags : self . print_system_cflags ,
133
+ print_system_libs : self . print_system_libs ,
134
+ cargo_metadata : self . cargo_metadata ,
135
+ env_metadata : self . env_metadata ,
136
+ metadata_buffer : None ,
137
+ }
138
+ }
119
139
}
120
140
121
141
#[ derive( Clone , Debug ) ]
@@ -463,6 +483,16 @@ impl Config {
463
483
print_system_libs : true ,
464
484
cargo_metadata : true ,
465
485
env_metadata : true ,
486
+ metadata_buffer : None ,
487
+ }
488
+ }
489
+
490
+ /// Emit buffered metadata, if any
491
+ fn print_bufferred ( & self ) {
492
+ if let Some ( mut buf) = self . metadata_buffer . as_ref ( ) . and_then ( |m| m. lock ( ) . ok ( ) ) {
493
+ for line in buf. drain ( ..) {
494
+ println ! ( "cargo:{}" , line) ;
495
+ }
466
496
}
467
497
}
468
498
@@ -643,11 +673,19 @@ impl Config {
643
673
644
674
fn env_var_os ( & self , name : & str ) -> Option < OsString > {
645
675
if self . env_metadata {
646
- println ! ( "cargo: rerun-if-env-changed={}" , name) ;
676
+ self . emit_cargo_directive ( format_args ! ( "rerun-if-env-changed={}" , name) ) ;
647
677
}
648
678
env:: var_os ( name)
649
679
}
650
680
681
+ fn emit_cargo_directive ( & self , fmt : Arguments ) {
682
+ if let Some ( mut buf) = self . metadata_buffer . as_ref ( ) . and_then ( |m| m. lock ( ) . ok ( ) ) {
683
+ buf. push ( fmt. to_string ( ) ) ;
684
+ } else {
685
+ println ! ( "cargo:{}" , fmt) ;
686
+ }
687
+ }
688
+
651
689
fn is_static ( & self , name : & str ) -> bool {
652
690
self . statik . unwrap_or_else ( || self . infer_static ( name) )
653
691
}
@@ -733,7 +771,7 @@ impl Config {
733
771
734
772
fn print_metadata ( & self , s : & str ) {
735
773
if self . cargo_metadata {
736
- println ! ( "cargo: {}" , s) ;
774
+ self . emit_cargo_directive ( format_args ! ( "{}" , s) ) ;
737
775
}
738
776
}
739
777
@@ -765,6 +803,7 @@ impl Default for Config {
765
803
print_system_libs : false ,
766
804
cargo_metadata : false ,
767
805
env_metadata : false ,
806
+ metadata_buffer : None ,
768
807
}
769
808
}
770
809
}
0 commit comments