@@ -7,6 +7,7 @@ use std::string::String;
77// need to know all the possible cfgs that this script will set. If you need to set another cfg
88// make sure to add it to this list as well.
99const ALLOWED_CFGS : & ' static [ & ' static str ] = & [
10+ "emscripten_new_stat_abi" ,
1011 "freebsd10" ,
1112 "freebsd11" ,
1213 "freebsd12" ,
@@ -69,6 +70,18 @@ fn main() {
6970 Some ( _) | None => set_cfg ( "freebsd11" ) ,
7071 }
7172
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+
7285 // On CI: deny all warnings
7386 if libc_ci {
7487 set_cfg ( "libc_deny_warnings" ) ;
@@ -238,6 +251,33 @@ fn which_freebsd() -> Option<i32> {
238251 }
239252}
240253
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+
241281fn set_cfg ( cfg : & str ) {
242282 if !ALLOWED_CFGS . contains ( & cfg) {
243283 panic ! ( "trying to set cfg {}, but it is not in ALLOWED_CFGS" , cfg) ;
0 commit comments