@@ -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,12 @@ fn main() {
69
70
Some ( _) | None => set_cfg ( "freebsd11" ) ,
70
71
}
71
72
73
+ match emcc_version_code ( ) {
74
+ Some ( v) if ( v >= 30142 ) => set_cfg ( "emscripten_new_stat_abi" ) ,
75
+ // Non-Emscripten or version < 3.1.42.
76
+ Some ( _) | None => ( ) ,
77
+ }
78
+
72
79
// On CI: deny all warnings
73
80
if libc_ci {
74
81
set_cfg ( "libc_deny_warnings" ) ;
@@ -238,6 +245,33 @@ fn which_freebsd() -> Option<i32> {
238
245
}
239
246
}
240
247
248
+ fn emcc_version_code ( ) -> Option < u64 > {
249
+ let output = std:: process:: Command :: new ( "emcc" )
250
+ . arg ( "-dumpversion" )
251
+ . output ( )
252
+ . ok ( ) ;
253
+ if output. is_none ( ) {
254
+ return None ;
255
+ }
256
+ let output = output. unwrap ( ) ;
257
+ if !output. status . success ( ) {
258
+ return None ;
259
+ }
260
+
261
+ let stdout = String :: from_utf8 ( output. stdout ) . ok ( ) ;
262
+ if stdout. is_none ( ) {
263
+ return None ;
264
+ }
265
+ let version = stdout. unwrap ( ) ;
266
+ let mut pieces = version. trim ( ) . split ( '.' ) ;
267
+
268
+ let major = pieces. next ( ) . and_then ( |x| x. parse ( ) . ok ( ) ) . unwrap_or ( 0 ) ;
269
+ let minor = pieces. next ( ) . and_then ( |x| x. parse ( ) . ok ( ) ) . unwrap_or ( 0 ) ;
270
+ let patch = pieces. next ( ) . and_then ( |x| x. parse ( ) . ok ( ) ) . unwrap_or ( 0 ) ;
271
+
272
+ Some ( major * 10000 + minor * 100 + patch)
273
+ }
274
+
241
275
fn set_cfg ( cfg : & str ) {
242
276
if !ALLOWED_CFGS . contains ( & cfg) {
243
277
panic ! ( "trying to set cfg {}, but it is not in ALLOWED_CFGS" , cfg) ;
0 commit comments