I want to compile grpc library to wasm in order to build standalone wasm applications linking against libgrpc.a, and run it in wasmtime.
tools version:
emsdk: 3.1.31
cmake: 3.25.0
Run emcmake cmake .. and emmake make in grpc source directory with compile arguments STANDALONE_WASM and --no-entry, then got the error "epoll.h not found":
In file included from /home/xxx/grpc_emscripten/grpc/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc:16:
/home/xxx/grpc_emscripten/grpc/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h:38:10: fatal error: 'sys/epoll.h' file not found
#include <sys/epoll.h>
^~~~~~~~~~~~~
25 warnings and 1 error generated.
em++: error: '/home/xxx/emsdk/upstream/bin/clang++ -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -DEMSCRIPTEN -I/home/xxx/emsdk/upstream/emscripten/cache/sysroot/include/SDL --sysroot=/home/xxx/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/compat -DCARES_STATICLIB -I/home/xxx/grpc_emscripten/grpc/third_party/re2 -I/home/xxx/grpc_emscripten/grpc/third_party/zlib -I/home/xxx/grpc_emscripten/grpc/include -I/home/xxx/grpc_emscripten/grpc -I/home/xxx/grpc_emscripten/grpc/third_party/address_sorting/include -I/home/xxx/grpc_emscripten/grpc/build/third_party/re2 -I/home/xxx/grpc_emscripten/grpc/third_party/boringssl-with-bazel/src/include -I/home/xxx/grpc_emscripten/grpc/src/core/ext/upb-generated -I/home/xxx/grpc_emscripten/grpc/src/core/ext/upbdefs-generated -I/home/xxx/grpc_emscripten/grpc/third_party/upb -I/home/xxx/grpc_emscripten/grpc/third_party/xxhash -I/home/xxx/grpc_emscripten/grpc/build/third_party/zlib -I/home/xxx/grpc_emscripten/grpc/build/third_party/cares/cares -I/home/xxx/grpc_emscripten/grpc/third_party/cares/cares -I/home/xxx/grpc_emscripten/grpc/third_party/cares/cares/include -I/home/xxx/grpc_emscripten/grpc/third_party/abseil-cpp -fPIC -std=gnu++14 -MD -MT CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o -MF CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o.d -c /home/xxx/grpc_emscripten/grpc/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc -o CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o' failed (returned 1)
make[2]: *** [CMakeFiles/grpc.dir/build.make:7112: CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:1124: CMakeFiles/grpc.dir/all] Error 2
make: *** [Makefile:156: all] Error 2
emmake: error: 'make' failed (returned 2)
In order to compile successfully, I just added epoll.h and eventfd.h in emsdk include/sys directory and got libgrpc.a, although I know it may fail In the phase of link.
As expected, when built my demo.cpp, I got error when link against libgrpc:
configure: cmake .. -DCMAKE_CXX_FLAGS=-std=c++17 -DCMAKE_TOOLCHAIN_FILE=/home/xxx/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/home/xxx/emsdk/node/14.18.2_64bit/bin/node;--experimental-wasm-bulk-memory;--experimental-wasm-threads
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/code_test/grpc_test_wasm/build
make: make
[ 14%] Building CXX object CMakeFiles/hw_grpc_proto.dir/protobuf/grpc_test.grpc.pb.cc.o
[ 28%] Building CXX object CMakeFiles/hw_grpc_proto.dir/protobuf/grpc_test.pb.cc.o
[ 42%] Linking CXX static library libhw_grpc_proto.a
[ 42%] Built target hw_grpc_proto
[ 57%] Building CXX object CMakeFiles/server.dir/server.cpp.o
[ 71%] Linking CXX executable server.wasm
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_read
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_write
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_wait
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_create1
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_read
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_write
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_create1
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_wait
em++: error: '/home/xxx/emsdk/upstream/bin/wasm-ld @/tmp/emscripten_k16or6kb.rsp.utf-8' failed (returned 1)
make[2]: *** [CMakeFiles/server.dir/build.make:101: server.wasm] Error 1
make[1]: *** [CMakeFiles/Makefile2:113: CMakeFiles/server.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
emmake: error: 'make' failed (returned 2)
I think the reason is that there is no epoll.h functions in libc.a. So I try to recompile the musl/libc in emsdk with epoll files, but it turns out that the directories and Make files in /home/hzb/emsdk/upstream/emscripten/system/lib/libc/musl missing some files and doesn't support for wasm32
root@pekphis292586:/home/xxx/emsdk/upstream/emscripten/system/lib/libc/musl# emconfigure ./configure --prefix=./my_install --exec-prefix=./my_binary --syslibdir=./my_lib/
configure: ./configure --prefix=./my_install --exec-prefix=./my_binary --syslibdir=./my_lib/
./configure: error: chosen malloc implementation 'mallocng' does not exist
emconfigure: error: './configure --prefix=./my_install --exec-prefix=./my_binary --syslibdir=./my_lib/' failed (returned 1)
learned from #17638, emscripten doesn't supprt epoll system calls, but I found poll system calls in libc.a:
poll.o:
00000000 d .debug_abbrev
00000000 d .debug_line
00000000 d .debug_str
U __stack_pointer
U __syscall_poll
U __syscall_ret
00000001 T poll
I wonder,
- If epoll.h is added to the musl/libc source and recompiled, can epoll system calls be supported? (which I failed recompile) or why not?
- If not, maybe I need to change epoll to poll in grpc source code to avoid epoll.
I appreciate any reply and suggestions. Thanks.
I want to compile grpc library to wasm in order to build standalone wasm applications linking against libgrpc.a, and run it in wasmtime.
tools version:
emsdk: 3.1.31
cmake: 3.25.0
Run
emcmake cmake ..andemmake makein grpc source directory with compile argumentsSTANDALONE_WASMand--no-entry, then got the error "epoll.h not found":In order to compile successfully, I just added epoll.h and eventfd.h in emsdk include/sys directory and got libgrpc.a, although I know it may fail In the phase of link.
As expected, when built my demo.cpp, I got error when link against libgrpc:
I think the reason is that there is no epoll.h functions in libc.a. So I try to recompile the musl/libc in emsdk with epoll files, but it turns out that the directories and Make files in
/home/hzb/emsdk/upstream/emscripten/system/lib/libc/muslmissing some files and doesn't support for wasm32learned from #17638, emscripten doesn't supprt epoll system calls, but I found poll system calls in libc.a:
I wonder,
I appreciate any reply and suggestions. Thanks.