@@ -7,6 +7,7 @@ use std::string::String;
7
7
// need to know all the possible cfgs that this script will set. If you need to set another cfg
8
8
// make sure to add it to this list as well.
9
9
const ALLOWED_CFGS : & ' static [ & ' static str ] = & [
10
+ "emscripten_new_stat_abi" ,
10
11
"freebsd10" ,
11
12
"freebsd11" ,
12
13
"freebsd12" ,
@@ -69,6 +70,18 @@ fn main() {
69
70
Some ( _) | None => set_cfg ( "freebsd11" ) ,
70
71
}
71
72
73
+ match emcc_version ( ) {
74
+ Some ( ( major, minor, patch) )
75
+ if ( major > 3 )
76
+ || ( major == 3 && minor > 1 )
77
+ || ( major == 3 && minor == 1 && patch >= 42 ) =>
78
+ {
79
+ set_cfg ( "emscripten_new_stat_abi" )
80
+ }
81
+ // Non-Emscripten or version < 3.1.42.
82
+ Some ( _) | None => ( ) ,
83
+ }
84
+
72
85
// On CI: deny all warnings
73
86
if libc_ci {
74
87
set_cfg ( "libc_deny_warnings" ) ;
@@ -238,6 +251,33 @@ fn which_freebsd() -> Option<i32> {
238
251
}
239
252
}
240
253
254
+ fn emcc_version ( ) -> Option < ( u32 , u32 , u32 ) > {
255
+ let output = std:: process:: Command :: new ( "emcc" )
256
+ . arg ( "-dumpversion" )
257
+ . output ( )
258
+ . ok ( ) ;
259
+ if output. is_none ( ) {
260
+ return None ;
261
+ }
262
+ let output = output. unwrap ( ) ;
263
+ if !output. status . success ( ) {
264
+ return None ;
265
+ }
266
+
267
+ let stdout = String :: from_utf8 ( output. stdout ) . ok ( ) ;
268
+ if stdout. is_none ( ) {
269
+ return None ;
270
+ }
271
+ let version = stdout. unwrap ( ) ;
272
+ let mut pieces = version. trim ( ) . split ( '.' ) ;
273
+
274
+ let major = pieces. next ( ) ?. parse ( ) . unwrap ( ) ;
275
+ let minor = pieces. next ( ) ?. parse ( ) . unwrap ( ) ;
276
+ let patch = pieces. next ( ) ?. parse ( ) . unwrap ( ) ;
277
+
278
+ Some ( ( major, minor, patch) )
279
+ }
280
+
241
281
fn set_cfg ( cfg : & str ) {
242
282
if !ALLOWED_CFGS . contains ( & cfg) {
243
283
panic ! ( "trying to set cfg {}, but it is not in ALLOWED_CFGS" , cfg) ;
0 commit comments