diff --git a/.github/workflows/deploy-github-page.yml b/.github/workflows/deploy-github-page.yml index fc6c728e..b84fa72d 100644 --- a/.github/workflows/deploy-github-page.yml +++ b/.github/workflows/deploy-github-page.yml @@ -56,9 +56,6 @@ jobs: echo "PREFIX=$PREFIX" >> $GITHUB_ENV export SYSROOT_PATH=$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cache/sysroot - micromamba create -n node-env -c conda-forge nodejs=22 - export PATH="$MAMBA_ROOT_PREFIX/envs/node-env/bin:$PATH" - emcmake cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ @@ -142,7 +139,7 @@ jobs: - name: Jupyter Lite integration shell: bash -l {0} run: | - micromamba create -n xeus-lite-host jupyterlite-core=0.6 jupyter_server jupyterlite-xeus -c conda-forge + micromamba create -n xeus-lite-host jupyter_server jupyterlite-xeus -c conda-forge micromamba activate xeus-lite-host jupyter lite build \ --XeusAddon.prefix=${{ env.PREFIX }} \ diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 66278c66..7d36546c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -241,9 +241,6 @@ jobs: echo "PREFIX=$PREFIX" >> $GITHUB_ENV export SYSROOT_PATH=$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cache/sysroot - micromamba create -n node-env -c conda-forge nodejs=22 - export PATH="$MAMBA_ROOT_PREFIX/envs/node-env/bin:$PATH" - emcmake cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ @@ -332,7 +329,7 @@ jobs: - name: Jupyter Lite integration shell: bash -l {0} run: | - micromamba create -n xeus-lite-host jupyterlite-core=0.6 jupyterlite-xeus -c conda-forge + micromamba create -n xeus-lite-host jupyterlite-xeus -c conda-forge micromamba activate xeus-lite-host jupyter lite build --XeusAddon.prefix=${{ env.PREFIX }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e1648fd..c2275b56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,6 +219,8 @@ macro(xeus_cpp_set_common_options target_name) target_compile_options(${target_name} PUBLIC /wd4251 /wd4141) target_compile_options(${target_name} PUBLIC /wd4018 /wd4267 /wd4715 /wd4146 /wd4129) target_compile_options(${target_name} PUBLIC /EHsc) + elseif (EMSCRIPTEN) + target_compile_options(${target_name} PUBLIC -fwasm-exceptions) else () target_compile_options(${target_name} PUBLIC -fexceptions) endif () diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7185b7b0..2ba44550 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,7 +71,7 @@ micromamba create -f environment-wasm-build.yml -y micromamba activate xeus-cpp-wasm-build ``` -You are now in a position to build the xeus-cpp kernel. You build and test it in node by executing the following. Prefer using node 22 and above as prior versions lead to flaky test runs. Once the test pass, run the install command. +You are now in a position to build the xeus-cpp kernel. You build and test it in node by executing the following. Once the test pass, run the install command. ```bash micromamba create -f environment-wasm-host.yml --platform=emscripten-wasm32 @@ -81,9 +81,6 @@ export BUILD_PREFIX=$MAMBA_ROOT_PREFIX/envs/xeus-cpp-wasm-build export PREFIX=$MAMBA_ROOT_PREFIX/envs/xeus-cpp-wasm-host export SYSROOT_PATH=$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cache/sysroot -micromamba create -n node-env -c conda-forge nodejs=22 -export PATH="$MAMBA_ROOT_PREFIX/envs/node-env/bin:$PATH" - emcmake cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ @@ -154,7 +151,7 @@ python $BUILD_PREFIX/bin/emrun.py --browser="google-chrome" --kill_exit --timeou To build and test Jupyter Lite with this kernel locally you can execute the following ```bash -micromamba create -n xeus-lite-host jupyterlite-core=0.6 jupyter_server jupyterlite-xeus -c conda-forge +micromamba create -n xeus-lite-host jupyter_server jupyterlite-xeus -c conda-forge micromamba activate xeus-lite-host jupyter lite serve --XeusAddon.prefix=$PREFIX \ --XeusAddon.mounts="$PREFIX/share/xeus-cpp/tagfiles:/share/xeus-cpp/tagfiles" \ diff --git a/README.md b/README.md index 9d3e86f6..b7acf11d 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ micromamba create -f environment-wasm-build.yml -y micromamba activate xeus-cpp-wasm-build ``` -You are now in a position to build the xeus-cpp kernel. You build and test it in node by executing the following. Prefer using node 22 and above as prior versions lead to flaky test runs. Once the test pass, run the install command. +You are now in a position to build the xeus-cpp kernel. You build and test it in node by executing the following. Once the test pass, run the install command. ```bash micromamba create -f environment-wasm-host.yml --platform=emscripten-wasm32 mkdir build @@ -96,9 +96,6 @@ export BUILD_PREFIX=$MAMBA_ROOT_PREFIX/envs/xeus-cpp-wasm-build export PREFIX=$MAMBA_ROOT_PREFIX/envs/xeus-cpp-wasm-host export SYSROOT_PATH=$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cache/sysroot -micromamba create -n node-env -c conda-forge nodejs=22 -export PATH="$MAMBA_ROOT_PREFIX/envs/node-env/bin:$PATH" - emcmake cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ @@ -169,7 +166,7 @@ python $BUILD_PREFIX/bin/emrun.py --browser="google-chrome" --kill_exit --timeou To build and test Jupyter Lite with this kernel locally you can execute the following ```bash -micromamba create -n xeus-lite-host jupyterlite-core=0.6 jupyter_server jupyterlite-xeus -c conda-forge +micromamba create -n xeus-lite-host jupyter_server jupyterlite-xeus -c conda-forge micromamba activate xeus-lite-host jupyter lite serve --XeusAddon.prefix=$PREFIX \ --XeusAddon.mounts="$PREFIX/share/xeus-cpp/tagfiles:/share/xeus-cpp/tagfiles" \ diff --git a/docs/source/InstallationAndUsage.rst b/docs/source/InstallationAndUsage.rst index e3b95a25..58f034e7 100644 --- a/docs/source/InstallationAndUsage.rst +++ b/docs/source/InstallationAndUsage.rst @@ -66,7 +66,7 @@ the following micromamba create -f environment-wasm-build.yml -y micromamba activate xeus-cpp-wasm-build -You are now in a position to build the xeus-cpp kernel. You build and test it in node by executing the following. Prefer using node 22 and above as prior versions lead to flaky test runs. Once the test pass, run the install command. +You are now in a position to build the xeus-cpp kernel. You build and test it in node by executing the following. Once the test pass, run the install command. .. code-block:: bash @@ -77,9 +77,6 @@ You are now in a position to build the xeus-cpp kernel. You build and test it in export PREFIX=$MAMBA_ROOT_PREFIX/envs/xeus-cpp-wasm-host export SYSROOT_PATH=$BUILD_PREFIX/opt/emsdk/upstream/emscripten/cache/sysroot - micromamba create -n node-env -c conda-forge nodejs=22 - export PATH="$MAMBA_ROOT_PREFIX/envs/node-env/bin:$PATH" - emcmake cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$PREFIX \ @@ -151,7 +148,7 @@ To build and test Jupyter Lite with this kernel locally you can execute the foll .. code-block:: bash - micromamba create -n xeus-lite-host jupyterlite-core=0.6 jupyter_server jupyterlite-xeus -c conda-forge + micromamba create -n xeus-lite-host jupyter_server jupyterlite-xeus -c conda-forge micromamba activate xeus-lite-host jupyter lite serve --XeusAddon.prefix=$PREFIX --XeusAddon.mounts="$PREFIX/share/xeus-cpp/tagfiles:/share/xeus-cpp/tagfiles" \ diff --git a/docs/source/conf.py b/docs/source/conf.py index 9b67a9d1..ba6802db 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -34,9 +34,8 @@ {XEUS_CPP_ROOT}; emmake make -j $(nproc --all) install; cd {XEUS_CPP_ROOT}; -micromamba create -n xeus-lite-host jupyterlite-core=0.6 jupyter_server jupyterlite-xeus -c conda-forge -y; +micromamba create -n xeus-lite-host jupyter_server jupyterlite-xeus -c conda-forge -y; micromamba activate xeus-lite-host; -python -m pip install jupyterlite-xeus jupyter_server; jupyter lite build --XeusAddon.prefix=$PREFIX \\ --XeusAddon.mounts="$PREFIX/share/xeus-cpp/tagfiles:/share/xeus-cpp/tagfiles" \ --XeusAddon.mounts="$PREFIX/etc/xeus-cpp/tags.d:/etc/xeus-cpp/tags.d" \ diff --git a/environment-wasm-build.yml b/environment-wasm-build.yml index cf716ed5..be953293 100644 --- a/environment-wasm-build.yml +++ b/environment-wasm-build.yml @@ -1,7 +1,7 @@ name: xeus-cpp-wasm-build channels: - - https://prefix.dev/emscripten-forge-dev + - https://prefix.dev/emscripten-forge-4x - https://prefix.dev/conda-forge dependencies: - cmake - - emscripten_emscripten-wasm32==3.1.73 \ No newline at end of file + - emscripten_emscripten-wasm32==4.0.9 \ No newline at end of file diff --git a/environment-wasm-host.yml b/environment-wasm-host.yml index 54aa77ca..0230026c 100644 --- a/environment-wasm-host.yml +++ b/environment-wasm-host.yml @@ -1,6 +1,6 @@ name: xeus-cpp-wasm-host channels: - - https://prefix.dev/emscripten-forge-dev + - https://prefix.dev/emscripten-forge-4x - https://prefix.dev/conda-forge dependencies: - nlohmann_json diff --git a/share/jupyter/kernels/xc11/wasm_kernel.json.in b/share/jupyter/kernels/xc11/wasm_kernel.json.in index 009f8a98..a6ea1929 100644 --- a/share/jupyter/kernels/xc11/wasm_kernel.json.in +++ b/share/jupyter/kernels/xc11/wasm_kernel.json.in @@ -6,7 +6,8 @@ "-Xclang", "-iwithsysroot/include/compat", "-xc", "-std=c11", - "-mllvm", "-enable-emscripten-sjlj", + "-fwasm-exceptions", + "-mllvm", "-wasm-enable-sjlj", "-msimd128" ], "language": "c", diff --git a/share/jupyter/kernels/xc17/wasm_kernel.json.in b/share/jupyter/kernels/xc17/wasm_kernel.json.in index 4d6e92a4..d55a4b59 100644 --- a/share/jupyter/kernels/xc17/wasm_kernel.json.in +++ b/share/jupyter/kernels/xc17/wasm_kernel.json.in @@ -6,7 +6,8 @@ "-Xclang", "-iwithsysroot/include/compat", "-xc", "-std=c17", - "-mllvm", "-enable-emscripten-sjlj", + "-fwasm-exceptions", + "-mllvm", "-wasm-enable-sjlj", "-msimd128" ], "language": "c", diff --git a/share/jupyter/kernels/xc23/wasm_kernel.json.in b/share/jupyter/kernels/xc23/wasm_kernel.json.in index 9913d6ea..c733cd3e 100644 --- a/share/jupyter/kernels/xc23/wasm_kernel.json.in +++ b/share/jupyter/kernels/xc23/wasm_kernel.json.in @@ -6,7 +6,8 @@ "-Xclang", "-iwithsysroot/include/compat", "-xc", "-std=c23", - "-mllvm", "-enable-emscripten-sjlj", + "-fwasm-exceptions", + "-mllvm", "-wasm-enable-sjlj", "-msimd128" ], "language": "c", diff --git a/share/jupyter/kernels/xcpp17/wasm_kernel.json.in b/share/jupyter/kernels/xcpp17/wasm_kernel.json.in index a8de4ed0..bcd75ded 100644 --- a/share/jupyter/kernels/xcpp17/wasm_kernel.json.in +++ b/share/jupyter/kernels/xcpp17/wasm_kernel.json.in @@ -4,8 +4,8 @@ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-resource-dir", "/lib/clang/@CPPINTEROP_LLVM_VERSION_MAJOR@", "-Xclang", "-iwithsysroot/include/compat", - "-std=c++17", "-mllvm", "-enable-emscripten-cxx-exceptions", - "-mllvm", "-enable-emscripten-sjlj", "-msimd128" + "-std=c++17", "-fwasm-exceptions", + "-mllvm", "-wasm-enable-sjlj", "-msimd128" ], "language": "cpp", "metadata": { diff --git a/share/jupyter/kernels/xcpp20/wasm_kernel.json.in b/share/jupyter/kernels/xcpp20/wasm_kernel.json.in index a36fa59b..b7cfd673 100644 --- a/share/jupyter/kernels/xcpp20/wasm_kernel.json.in +++ b/share/jupyter/kernels/xcpp20/wasm_kernel.json.in @@ -4,8 +4,8 @@ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-resource-dir", "/lib/clang/@CPPINTEROP_LLVM_VERSION_MAJOR@", "-Xclang", "-iwithsysroot/include/compat", - "-std=c++20", "-mllvm", "-enable-emscripten-cxx-exceptions", - "-mllvm", "-enable-emscripten-sjlj", "-msimd128" + "-std=c++20", "-fwasm-exceptions", + "-mllvm", "-wasm-enable-sjlj", "-msimd128" ], "language": "cpp", "metadata": { diff --git a/share/jupyter/kernels/xcpp23/wasm_kernel.json.in b/share/jupyter/kernels/xcpp23/wasm_kernel.json.in index 3fdd0422..960a7963 100644 --- a/share/jupyter/kernels/xcpp23/wasm_kernel.json.in +++ b/share/jupyter/kernels/xcpp23/wasm_kernel.json.in @@ -4,8 +4,8 @@ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-resource-dir", "/lib/clang/@CPPINTEROP_LLVM_VERSION_MAJOR@", "-Xclang", "-iwithsysroot/include/compat", - "-std=c++23", "-mllvm", "-enable-emscripten-cxx-exceptions", - "-mllvm", "-enable-emscripten-sjlj", "-msimd128" + "-std=c++23", "-fwasm-exceptions", + "-mllvm", "-wasm-enable-sjlj", "-msimd128" ], "language": "cpp", "metadata": { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 01c013ba..b74d2d28 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -54,7 +54,7 @@ if(EMSCRIPTEN) target_link_libraries(test_xeus_cpp PRIVATE xeus-cpp-static doctest::doctest) target_compile_options(test_xeus_cpp - PUBLIC "SHELL: -fexceptions" + PUBLIC "SHELL: -fwasm-exceptions" ) # So we create a html file, as well as the javascript file set_target_properties(test_xeus_cpp PROPERTIES @@ -67,10 +67,10 @@ if(EMSCRIPTEN) # Without this MINIFY_HTML=0 flag you end up with the situation where the creation of the # test_xeus_cpp.html file breaks on MacOS, but not Ubuntu target_link_options(test_xeus_cpp - PUBLIC "SHELL: -fexceptions" + PUBLIC "SHELL: -fwasm-exceptions" PUBLIC "SHELL: -s MAIN_MODULE=1" PUBLIC "SHELL: -s WASM_BIGINT" - PUBLIC "SHELL: -s ASSERTIONS=1" + PUBLIC "SHELL: -s ASSERTIONS=0" PUBLIC "SHELL: -s ALLOW_MEMORY_GROWTH=1" PUBLIC "SHELL: -s STACK_SIZE=32mb" PUBLIC "SHELL: -s INITIAL_MEMORY=128mb" diff --git a/test/test_interpreter.cpp b/test/test_interpreter.cpp index 3c66443b..3bdb32d2 100644 --- a/test/test_interpreter.cpp +++ b/test/test_interpreter.cpp @@ -70,7 +70,10 @@ TEST_SUITE("execute_request") { TEST_CASE("stl") { - std::vector Args = {"stl-test-case", "-v"}; + std::vector Args = { + "-v", + "-Xclang", "-iwithsysroot/include/compat" + }; xcpp::interpreter interpreter((int)Args.size(), Args.data()); std::string code = "#include "; nl::json user_expressions = nl::json::object(); @@ -136,6 +139,45 @@ TEST_SUITE("execute_request") } #endif +#if defined(XEUS_CPP_EMSCRIPTEN_WASM_BUILD) + TEST_CASE("Emscripten Exception Handling") + { + std::vector Args = { + "-std=c++20", + "-v", + "-fwasm-exceptions", + "-mllvm", "-wasm-enable-sjlj" + }; + + xcpp::interpreter interpreter((int)Args.size(), Args.data()); + std::string code = "try { throw 1; } catch (...) { 0; }"; + nl::json user_expressions = nl::json::object(); + xeus::execute_request_config config; + config.silent = false; + config.store_history = false; + config.allow_stdin = false; + nl::json header = nl::json::object(); + xeus::xrequest_context::guid_list id = {}; + xeus::xrequest_context context(header, id); + + std::promise promise; + std::future future = promise.get_future(); + auto callback = [&promise](nl::json result) { + promise.set_value(result); + }; + + interpreter.execute_request( + std::move(context), + std::move(callback), + code, + std::move(config), + user_expressions + ); + nl::json result = future.get(); + REQUIRE(result["status"] == "ok"); + } +#endif + TEST_CASE("fetch_documentation") { std::vector Args = {/*"-v", "resource-dir", "....."*/}; @@ -810,7 +852,10 @@ TEST_SUITE("complete_request") { TEST_CASE("completion_test") { - std::vector Args = {/*"-v", "resource-dir", "....."*/}; + std::vector Args = { + "-v", + "-Xclang", "-iwithsysroot/include/compat" + }; xcpp::interpreter interpreter((int)Args.size(), Args.data()); std::string code1 = "#include "; nl::json user_expressions = nl::json::object();