Skip to content

Emscripten support broken: missing function: emscripten_set_mousemove_callback / assertion failed: validate_hidpi_factor(dpi_factor) #760

@iceiix

Description

@iceiix

Is winit compatible with emscripten sdk 1.38.22? When running the examples I'm getting this error, interested if anyone else is seeing it, or if it is a misconfiguration on my end:

window.js:7196 missing function: emscripten_set_mousemove_callback

window.js:7196 missing function: emscripten_set_mousemove_callback
_emscripten_set_mousemove_callback @ window.js:7196
__ZN5winit8platform8platform6Window3new17h036fa7310bcbf823E @ grisu.rs:491
dynCall_viii @ grisu.rs:491
Module.dynCall_viii @ window.js:7835
invoke_viii @ window.js:7510
__ZN5winit6window38__LT_impl_u20_winit__WindowBuilder_GT_5build17h500b3e62957b8a6fE @ grisu.rs:491
dynCall_viii @ grisu.rs:491
Module.dynCall_viii @ window.js:7835
invoke_viii @ window.js:7510
__ZN6window4main17h6c9df911c3ebf060E @ grisu.rs:491
__ZN3std2rt10lang_start28__u7b__u7b_closure_u7d__u7d_17hc3810b9cbdf76d05E @ grisu.rs:491
__ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17h45d765e0ad7e854fE @ grisu.rs:491
__ZN3std9panicking3try7do_call17he4712eb84191fb3bE_llvm_369D5A5A @ grisu.rs:491
dynCall_vi @ grisu.rs:491
Module.dynCall_vi @ window.js:7823
invoke_vi @ window.js:7477
___rust_maybe_catch_panic @ grisu.rs:491
__ZN3std2rt19lang_start_internal17h76f990c2b2c74932E @ grisu.rs:491
__ZN3std2rt10lang_start17h018a6e635825245eE @ grisu.rs:491
_main @ grisu.rs:491
Module._main @ window.js:7739
callMain @ window.js:7973
doRun @ window.js:8031
run @ window.js:8045
runCaller @ window.js:7950
removeRunDependency @ window.js:1462
receiveInstance @ window.js:1624
receiveInstantiatedSource @ window.js:1649
Promise.then (async)
doNativeWasm @ window.js:1665
Module.asm @ window.js:1751
(anonymous) @ window.js:7556
window.js:8131 -1
window.js:8132 -1
abort @ window.js:8132
_emscripten_set_mousemove_callback @ window.js:7196
__ZN5winit8platform8platform6Window3new17h036fa7310bcbf823E @ grisu.rs:491
dynCall_viii @ grisu.rs:491
Module.dynCall_viii @ window.js:7835
invoke_viii @ window.js:7510
__ZN5winit6window38__LT_impl_u20_winit__WindowBuilder_GT_5build17h500b3e62957b8a6fE @ grisu.rs:491
dynCall_viii @ grisu.rs:491
Module.dynCall_viii @ window.js:7835
invoke_viii @ window.js:7510
__ZN6window4main17h6c9df911c3ebf060E @ grisu.rs:491
__ZN3std2rt10lang_start28__u7b__u7b_closure_u7d__u7d_17hc3810b9cbdf76d05E @ grisu.rs:491
__ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17h45d765e0ad7e854fE @ grisu.rs:491
__ZN3std9panicking3try7do_call17he4712eb84191fb3bE_llvm_369D5A5A @ grisu.rs:491
dynCall_vi @ grisu.rs:491
Module.dynCall_vi @ window.js:7823
invoke_vi @ window.js:7477
___rust_maybe_catch_panic @ grisu.rs:491
__ZN3std2rt19lang_start_internal17h76f990c2b2c74932E @ grisu.rs:491
__ZN3std2rt10lang_start17h018a6e635825245eE @ grisu.rs:491
_main @ grisu.rs:491
Module._main @ window.js:7739
callMain @ window.js:7973
doRun @ window.js:8031
run @ window.js:8045
runCaller @ window.js:7950
removeRunDependency @ window.js:1462
receiveInstance @ window.js:1624
receiveInstantiatedSource @ window.js:1649
Promise.then (async)
doNativeWasm @ window.js:1665
Module.asm @ window.js:1751
(anonymous) @ window.js:7556
window.js:311 warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling
warnOnce @ window.js:311
demangle @ window.js:1051
(anonymous) @ window.js:1060
demangleAll @ window.js:1058
stackTrace @ window.js:1085
abort @ window.js:8142
_emscripten_set_mousemove_callback @ window.js:7196
__ZN5winit8platform8platform6Window3new17h036fa7310bcbf823E @ grisu.rs:491
dynCall_viii @ grisu.rs:491
Module.dynCall_viii @ window.js:7835
invoke_viii @ window.js:7510
__ZN5winit6window38__LT_impl_u20_winit__WindowBuilder_GT_5build17h500b3e62957b8a6fE @ grisu.rs:491
dynCall_viii @ grisu.rs:491
Module.dynCall_viii @ window.js:7835
invoke_viii @ window.js:7510
__ZN6window4main17h6c9df911c3ebf060E @ grisu.rs:491
__ZN3std2rt10lang_start28__u7b__u7b_closure_u7d__u7d_17hc3810b9cbdf76d05E @ grisu.rs:491
__ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17h45d765e0ad7e854fE @ grisu.rs:491
__ZN3std9panicking3try7do_call17he4712eb84191fb3bE_llvm_369D5A5A @ grisu.rs:491
dynCall_vi @ grisu.rs:491
Module.dynCall_vi @ window.js:7823
invoke_vi @ window.js:7477
___rust_maybe_catch_panic @ grisu.rs:491
__ZN3std2rt19lang_start_internal17h76f990c2b2c74932E @ grisu.rs:491
__ZN3std2rt10lang_start17h018a6e635825245eE @ grisu.rs:491
_main @ grisu.rs:491
Module._main @ window.js:7739
callMain @ window.js:7973
doRun @ window.js:8031
run @ window.js:8045
runCaller @ window.js:7950
removeRunDependency @ window.js:1462
receiveInstance @ window.js:1624
receiveInstantiatedSource @ window.js:1649
Promise.then (async)
doNativeWasm @ window.js:1665
Module.asm @ window.js:1751
(anonymous) @ window.js:7556
window.js:7993 exception thrown: abort(-1) at Error
at jsStackTrace (http://localhost:1235/window.js:1066:13)
at stackTrace (http://localhost:1235/window.js:1083:12)
at abort (http://localhost:1235/window.js:8142:44)
at _emscripten_set_mousemove_callback (http://localhost:1235/window.js:7196:63)
at __ZN5winit8platform8platform6Window3new17h036fa7310bcbf823E (wasm-function[431]:1924)
at dynCall_viii (wasm-function[1281]:17)
at Object.Module.dynCall_viii (http://localhost:1235/window.js:7835:40)
at invoke_viii (http://localhost:1235/window.js:7510:27)
at __ZN5winit6window38__LT_impl_u20_winit__WindowBuilder_GT_5build17h500b3e62957b8a6fE (wasm-function[182]:510)
at dynCall_viii (wasm-function[1281]:17)

To build:

rustup target install wasm32-unknown-emscripten
cargo build --example window --target wasm32-unknown-emscripten

This creates window.js and .wasm in target/wasm32-unknown-emscripten/debug/examples/, to load I added this file test.html in that directory, following the requirements outlined in https://github.com/tomaka/winit#emscripten-and-webassembly:

<!DOCTYPE html>
<head>
<title></title>
</head>
<body>
<canvas id="my_id"></canvas>
<script>
window.Module = { canvas: document.getElementById('my_id') };
</script>
<script src="window.js"></script>
</body>
</html>

then served the files through a simple Python web server:

import SimpleHTTPServer
import SocketServer
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map['.wasm'] = 'application/wasm'
httpd = SocketServer.TCPServer(("", 1234), Handler)
httpd.serve_forever()

visited http://localhost:1234/test.html in Chrome, then I received the window.js:7196 missing function: emscripten_set_mousemove_callback error in the JavaScript debugger.

Searching for this error message finds only one issue: emscripten-core/emscripten#7525 Emscripten 1.38.17+ incompatible with upstream SDL 2.0.8, slightly different situation, that user was able to resolve their problem by rebuilding. However I reinstalled the SDK, cargo clean, cleared out ~/.emscripten_cache, so I'm not sure what else I would need to rebuild?


Next I tried to build on a completely different system (Ubuntu Linux in a VM, first system was macOS 10.14.2) to isolate whether there was a stale misconfiguration with emscripten or something, but with the same emsdk 1.38.22, it failed even earlier, on cargo build --example window --target wasm32-unknown-emscripten compilation:

ubuntu@ubuntu-virtual-machine:~/winit$ cargo build --example window --target wasm32-unknown-emscripten
   Compiling libc v0.2.46                                                                                                                                                       
   Compiling cfg-if v0.1.6                                                                                                                                                      
   Compiling lazy_static v1.2.0                                                                                                                                                 
   Compiling log v0.4.6                                                                                                                                                         
   Compiling winit v0.18.1 (/home/ubuntu/winit)                                                                                                                                 
warning: unused `#[macro_use]` import                                                                                                                                           
  --> src/lib.rs:91:1                                                                                                                                                           
   |                                                                                                                                                                            
91 | #[macro_use]                                                                                                                                                               
   | ^^^^^^^^^^^^                                                                                                                                                               
   |                                                                                                                                                                            
   = note: #[warn(unused_imports)] on by default                                                                                                                                
                                                                                                                                                                                
warning: method is never used: `interrupt`                                                                                                                                      
   --> src/platform/emscripten/mod.rs:106:5                                                                                                                                     
    |                                                                                                                                                                           
106 |     pub fn interrupt(&self) {                                                                                                                                             
    |     ^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                               
    |                                                                                                                                                                           
    = note: #[warn(dead_code)] on by default                                                                                                                                    
                                                                                                                                                                                
warning: unused `std::result::Result` that must be used                                                                                                                         
   --> src/platform/emscripten/mod.rs:637:13                                                                                                                                    
    |                                                                                                                                                                           
637 |             self.grab_cursor(false);                                                                                                                                      
    |             ^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                      
    |                                                                                                                                                                           
    = note: #[warn(unused_must_use)] on by default                                                                                                                              
    = note: this `Result` may be an `Err` variant, which should be handled                                                                                                      
                                                                                                                                                                                
error: linking with `emcc` failed: exit code: 1                                                                                                                                 
  |                                                                                                                                                                             
  = note: "emcc" "-s" "DISABLE_EXCEPTION_CATCHING=0" "-L" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.10dxdxrs7zw90t7w.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.112p8kxaw8li07xn.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.1byri58jj3kgrm6p.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.1otiygkv9sqgwlm.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.1qy7jefab5zoyqvw.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.2avkabs4kucwq8k0.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.2j8jzbnkne1fufnk.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.2kb6lcwdsalzswye.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.2mjt5tg33laii3w.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.2ps4sb69egjig53x.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.2ubgkfkdaiumtfvk.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.30zhzew84tqsckiv.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.31nqc83gnwuihsum.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.39gv1tdykhc6zxid.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.3bmxtu9pai4w7bal.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.3hj86efhaywkvxay.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.3l6zmxcgxksruc1h.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.3r73wok95hzuewtd.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.3zftok7e4xm0bfxm.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.43soldk7xly8mcll.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.4e7msdguj4dsq5ee.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.4glgxh4cj2rzjd7c.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.4m8tsdp3ceytssgi.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.4urr3ciozaveezj9.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.59jdz47l3yg11pz6.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.5br8susbkrf0ip7k.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.5fmj62rl3b0862ux.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.6ey0ajfh30a5f4n.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.i0cbfotjaof81bs.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.ktsc5g5kc71n4v4.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.sdh2iyltljzkjto.rcgu.o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.ygq3gmy8sgtwtcq.rcgu.o" "-o" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.js" "-s" "EXPORTED_FUNCTIONS=[\"_main\",\"_rust_eh_personality\"]" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/examples/window-ad7c4d1114999516.y05gmiveyef4hib.rcgu.o" "-O0" "--memory-init-file" "0" "-g4" "-s" "DEFAULT_LIBRARY_FUNCS_TO_INCLUDE=[]" "-L" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/deps" "-L" "/home/ubuntu/winit/target/debug/deps" "-L" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/deps/libwinit-fb1da3298d337e9f.rlib" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/deps/liblog-2cde884c8ec75d89.rlib" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/deps/libcfg_if-47ae4f4904545192.rlib" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/deps/liblibc-66d20d13397431c1.rlib" "/home/ubuntu/winit/target/wasm32-unknown-emscripten/debug/deps/liblazy_static-2f3507fe8c59b581.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/libstd-d3c8530a2103c66a.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/libpanic_unwind-020f881579077ed2.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/libunwind-9d7cbb3306207ed0.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/liballoc_system-8883cbfabc444af4.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/liblibc-1340b367e717a7b5.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/liballoc-18e00c9c4b7e8101.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/libcore-41e8ad90a408e7c3.rlib" "/home/ubuntu/.rustup/toolchains/beta-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-emscripten/lib/libcompiler_builtins-354cd92321f64700.rlib" "-l" "c" "-s" "BINARYEN=1" "-s" "ERROR_ON_UNDEFINED_SYMBOLS=1"
  = note: Traceback (most recent call last):                                                                                                                                    
            File "/home/ubuntu/emsdk/emscripten/1.38.22/emcc.py", line 3088, in <module>                                                                                        
              sys.exit(run())                                                                                                                                                   
            File "/home/ubuntu/emsdk/emscripten/1.38.22/emcc.py", line 1642, in run                                                                                             
              extra_files_to_link += system_libs.calculate([f for _, f in sorted(temp_files)] + extra_files_to_link, in_temp, stdout_=None, stderr_=None, forced=forced_stdlibs)
            File "/home/ubuntu/emsdk/emscripten/1.38.22/tools/system_libs.py", line 550, in calculate                                                                           
              symbolses = shared.Building.parallel_llvm_nm([os.path.abspath(t) for t in temp_files])                                                                            
            File "/home/ubuntu/emsdk/emscripten/1.38.22/tools/shared.py", line 1801, in parallel_llvm_nm                                                                        
              object_contents = pool.map(g_llvm_nm_uncached, files)                                                                                                             
            File "/usr/lib/python2.7/multiprocessing/pool.py", line 253, in map                                                                                                 
              return self.map_async(func, iterable, chunksize).get()                                                                                                            
            File "/usr/lib/python2.7/multiprocessing/pool.py", line 572, in get                                                                                                 
              raise self._value                                                                                                                                                 
          OSError: [Errno 8] Exec format error                                                                                                                                  
                                                                                                                                                                                
                                                                                                                                                                                
error: aborting due to previous error                                                                                                                                           
                                                                                                                                                                                
error: Could not compile `winit`.                                                                                                                                               

To learn more, run the command again with --verbose.

With an earlier emscripten 1.37.12 installation on macOS 10.14.2, I could build but running would fail with yet a different error:

thread 'main' panicked at 'assertion failed: validate_hidpi_factor(dpi_factor)', .cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.18.0/src/dpi.rs:236:9

https://github.com/tomaka/winit/blob/master/src/dpi.rs#L236

    #[inline]
    pub fn to_physical(&self, dpi_factor: f64) -> PhysicalSize {
        assert!(validate_hidpi_factor(dpi_factor));
        let width = self.width * dpi_factor;
        let height = self.height * dpi_factor;
        PhysicalSize::new(width, height)
    }

assuming this was an incompatibility fixed in newer emsdk, I updated to 1.38.22, but then hit the error described above. I see #548 "DPI for everyone" changed this code last, but the author couldn't get anything to run in the browser.

Is there a known-working compatible version of emsdk I should use? Any help appreciated

Metadata

Metadata

Assignees

No one assigned

    Labels

    B - bugDang, that shouldn't have happenedC - in progressImplementation is proceeding smoothly

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions