@@ -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,12 @@ fn main() {
6970 Some ( _) | None => set_cfg ( "freebsd11" ) ,
7071 }
7172
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+
7279 // On CI: deny all warnings
7380 if libc_ci {
7481 set_cfg ( "libc_deny_warnings" ) ;
@@ -238,6 +245,33 @@ fn which_freebsd() -> Option<i32> {
238245 }
239246}
240247
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+
241275fn set_cfg ( cfg : & str ) {
242276 if !ALLOWED_CFGS . contains ( & cfg) {
243277 panic ! ( "trying to set cfg {}, but it is not in ALLOWED_CFGS" , cfg) ;
0 commit comments