I follow a bit of that post https://forum.nim-lang.org/t/2838#18350 and other to get start compiling to wasm.
But I'm stock with some error. Anyone tried to compile to wasm recently?
First error is that the compiler is complaining that I don't have 'mach.h'
So I modified the config to include it -I/usr/include
@if emscripten:
...
cpu = "i386"
passC = "-s WASM=1 -s 'BINARYEN_METHOD=\"native-wasm\"' -I/usr/include -Iemscripten "
...
@end
Now I have a couple of architecture error
Error: execution of an external compiler program '/emsdk/emscripten/1.38.12/emcc -c -w -s WASM=1 -s 'BINARYEN_METHOD="native-wasm"' -I/usr/include -Iemscripten -O3 -I/usr/local/Cellar/nim/0.18.0_1/nim/lib -o /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.o /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.c' failed with exit code: 1
In file included from /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.c:10:
In file included from /usr/local/Cellar/nim/0.18.0_1/nim/lib/nimbase.h:255:
In file included from /usr/include/limits.h:63:
/usr/include/sys/cdefs.h:763:2: error: Unsupported architecture
#error Unsupported architecture
^
In file included from /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.c:10:
In file included from /usr/local/Cellar/nim/0.18.0_1/nim/lib/nimbase.h:255:
In file included from /usr/include/limits.h:64:
/usr/include/machine/limits.h:8:2: error: architecture not supported
#error architecture not supported
^
In file included from /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.c:10:
In file included from /usr/local/Cellar/nim/0.18.0_1/nim/lib/nimbase.h:256:
In file included from /usr/include/stddef.h:64:
In file included from /usr/include/_types.h:27:
In file included from /usr/include/sys/_types.h:33:
/usr/include/machine/_types.h:34:2: error: architecture not supported
#error architecture not supported
^
In file included from /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.c:10:
In file included from /usr/local/Cellar/nim/0.18.0_1/nim/lib/nimbase.h:256:
In file included from /usr/include/stddef.h:64:
In file included from /usr/include/_types.h:27:
/usr/include/sys/_types.h:55:9: error: unknown type name '__int64_t'
typedef __int64_t __darwin_blkcnt_t; /* total blocks */
^
/usr/include/sys/_types.h:56:9: error: unknown type name '__int32_t'
typedef __int32_t __darwin_blksize_t; /* preferred block size */
^
/usr/include/sys/_types.h:57:9: error: unknown type name '__int32_t'
typedef __int32_t __darwin_dev_t; /* dev_t */
^
/usr/include/sys/_types.h:60:9: error: unknown type name '__uint32_t'
typedef __uint32_t __darwin_gid_t; /* [???] process and group IDs */
^
/usr/include/sys/_types.h:61:9: error: unknown type name '__uint32_t'
typedef __uint32_t __darwin_id_t; /* [XSI] pid_t, uid_t, or gid_t*/
^
/usr/include/sys/_types.h:62:9: error: unknown type name '__uint64_t'
typedef __uint64_t __darwin_ino64_t; /* [???] Used for 64 bit inodes */
^
/usr/include/sys/_types.h:68:9: error: unknown type name '__darwin_natural_t'
typedef __darwin_natural_t __darwin_mach_port_name_t; /* Used by mach */
^
/usr/include/sys/_types.h:70:9: error: unknown type name '__uint16_t'
typedef __uint16_t __darwin_mode_t; /* [???] Some file attributes */
^
/usr/include/sys/_types.h:71:9: error: unknown type name '__int64_t'
typedef __int64_t __darwin_off_t; /* [???] Used for file sizes */
^
/usr/include/sys/_types.h:72:9: error: unknown type name '__int32_t'
typedef __int32_t __darwin_pid_t; /* [???] process and group IDs */
^
/usr/include/sys/_types.h:73:9: error: unknown type name '__uint32_t'
typedef __uint32_t __darwin_sigset_t; /* [???] signal set */
^
/usr/include/sys/_types.h:74:9: error: unknown type name '__int32_t'
typedef __int32_t __darwin_suseconds_t; /* [???] microseconds */
^
/usr/include/sys/_types.h:75:9: error: unknown type name '__uint32_t'
typedef __uint32_t __darwin_uid_t; /* [???] user IDs */
^
/usr/include/sys/_types.h:76:9: error: unknown type name '__uint32_t'
typedef __uint32_t __darwin_useconds_t; /* [???] microseconds */
^
In file included from /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.c:10:
In file included from /usr/local/Cellar/nim/0.18.0_1/nim/lib/nimbase.h:256:
In file included from /usr/include/stddef.h:69:
In file included from /usr/include/sys/_types/_ptrdiff_t.h:31:
/usr/include/machine/types.h:37:2: error: architecture not supported
#error architecture not supported
^
In file included from /private/var/workspace/fl/cacheim/src/nimcache/stdlib_typetraits.c:10:
In file included from /usr/local/Cellar/nim/0.18.0_1/nim/lib/nimbase.h:256:
In file included from /usr/include/stddef.h:69:
/usr/include/sys/_types/_ptrdiff_t.h:32:9: error: unknown type name '__darwin_ptrdiff_t'; did you mean '__darwin_pthread_t'?
typedef __darwin_ptrdiff_t ptrdiff_t;
^~~~~~~~~~~~~~~~~~
__darwin_pthread_t
/usr/include/sys/_pthread/_pthread_types.h:118:35: note: '__darwin_pthread_t' declared here
typedef struct _opaque_pthread_t *__darwin_pthread_t;
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
ERROR:root:compiler frontend failed to generate LLVM bitcode, halting
I'm guessing that now it use /usr/include instead of emscripten one. But How do I solve my mach.h not found if I don't do this? Anyone with a idea?
Like this I have the same error. Plus I don't see that command when i type nim --help
nim c -d:useRealtimeGC -d:release -d:emscripten --os:linux --out=index.html src/cacheim.nim
of
nim c -d:useRealtimeGC -d:release -d:emscripten --os=linux --out=index.html src/cacheim.nim
I tried a bit more to solve my issue. I remove the -I/usr/include and now the compilation go through.
But I'm now facing a linking issue. here is my new configuration
@if emscripten:
cc = clang
clang.exe = "/emsdk/emscripten/1.38.12/emcc"
clang.linkerexe = "/emsdk/emscripten/1.38.12/emcc"
clang.options.linker = ""
out = "cache.js"
cpu = "i386"
os = "linux"
passC = "-s WASM=1 -s 'BINARYEN_METHOD=\"asmjs,native-wasm\"' -s 'BINARYEN_TRAP_MODE=\"clamp\"' -Iemscripten "
passL = "-s WASM=1 -Lemscripten -s TOTAL_MEMORY=335544320"
#passL = "-s WASM=1 -Lemscripten -s TOTAL_MEMORY=671088640"
@end
here is the error :
Hint: [Link]
error: Linking globals named 'read': symbol multiply defined!
ERROR:root:Failed to run llvm optimizations:
Error: execution of an external program failed: '/emsdk/emscripten/1.38.12/emcc -o o ~/workspace/fl/cacheim/cache.js o ~/.cache/nim/cacheim_d/cacheim_cacheim.c.o o ~/.cache/nim/cacheim_d/stdlib_system.c.o o ~/.cache/nim/cacheim_d/cacheim_store.c.o o ~/.cache/nim/cacheim_d/stdlib_sequtils.c.o o ~/.cache/nim/cacheim_d/stdlib_macros.c.o o ~/.cache/nim/cacheim_d/stdlib_options.c.o ~/.cache/nim/cacheim_d/stdlib_typetraits.c.o -s WASM=1 -Lemscripten -s TOTAL_MEMORY=335544320 '
What I guess is the a standard C library name read is redefined. But it's only a guess since I don't really have experience working with C. Anybody with pointers?
Thanks