From 361dea25ca62bd193f2a626e5bc88b235028310e Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Tue, 11 Nov 2025 13:48:34 +0530 Subject: [PATCH 1/3] Add Emscripten compat include paths to wasm kernel specs. Add supporting tests --- .../jupyter/kernels/xc11/wasm_kernel.json.in | 1 + .../jupyter/kernels/xc17/wasm_kernel.json.in | 1 + .../jupyter/kernels/xc23/wasm_kernel.json.in | 1 + .../kernels/xcpp17/wasm_kernel.json.in | 1 + .../kernels/xcpp20/wasm_kernel.json.in | 1 + .../kernels/xcpp23/wasm_kernel.json.in | 1 + src/xinterpreter.cpp | 1 + test/test_interpreter.cpp | 35 ++++++++++++++++++- 8 files changed, 41 insertions(+), 1 deletion(-) diff --git a/share/jupyter/kernels/xc11/wasm_kernel.json.in b/share/jupyter/kernels/xc11/wasm_kernel.json.in index 554591a4..009f8a98 100644 --- a/share/jupyter/kernels/xc11/wasm_kernel.json.in +++ b/share/jupyter/kernels/xc11/wasm_kernel.json.in @@ -3,6 +3,7 @@ "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-resource-dir", "/lib/clang/@CPPINTEROP_LLVM_VERSION_MAJOR@", + "-Xclang", "-iwithsysroot/include/compat", "-xc", "-std=c11", "-mllvm", "-enable-emscripten-sjlj", diff --git a/share/jupyter/kernels/xc17/wasm_kernel.json.in b/share/jupyter/kernels/xc17/wasm_kernel.json.in index 2af2c3f6..4d6e92a4 100644 --- a/share/jupyter/kernels/xc17/wasm_kernel.json.in +++ b/share/jupyter/kernels/xc17/wasm_kernel.json.in @@ -3,6 +3,7 @@ "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-resource-dir", "/lib/clang/@CPPINTEROP_LLVM_VERSION_MAJOR@", + "-Xclang", "-iwithsysroot/include/compat", "-xc", "-std=c17", "-mllvm", "-enable-emscripten-sjlj", diff --git a/share/jupyter/kernels/xc23/wasm_kernel.json.in b/share/jupyter/kernels/xc23/wasm_kernel.json.in index c20a2388..9913d6ea 100644 --- a/share/jupyter/kernels/xc23/wasm_kernel.json.in +++ b/share/jupyter/kernels/xc23/wasm_kernel.json.in @@ -3,6 +3,7 @@ "argv": [ "@XEUS_CPP_KERNELSPEC_PATH@xcpp", "-resource-dir", "/lib/clang/@CPPINTEROP_LLVM_VERSION_MAJOR@", + "-Xclang", "-iwithsysroot/include/compat", "-xc", "-std=c23", "-mllvm", "-enable-emscripten-sjlj", diff --git a/share/jupyter/kernels/xcpp17/wasm_kernel.json.in b/share/jupyter/kernels/xcpp17/wasm_kernel.json.in index fc2a3d61..a8de4ed0 100644 --- a/share/jupyter/kernels/xcpp17/wasm_kernel.json.in +++ b/share/jupyter/kernels/xcpp17/wasm_kernel.json.in @@ -3,6 +3,7 @@ "argv": [ "@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" ], diff --git a/share/jupyter/kernels/xcpp20/wasm_kernel.json.in b/share/jupyter/kernels/xcpp20/wasm_kernel.json.in index f84b07d3..a36fa59b 100644 --- a/share/jupyter/kernels/xcpp20/wasm_kernel.json.in +++ b/share/jupyter/kernels/xcpp20/wasm_kernel.json.in @@ -3,6 +3,7 @@ "argv": [ "@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" ], diff --git a/share/jupyter/kernels/xcpp23/wasm_kernel.json.in b/share/jupyter/kernels/xcpp23/wasm_kernel.json.in index 097fd552..3fdd0422 100644 --- a/share/jupyter/kernels/xcpp23/wasm_kernel.json.in +++ b/share/jupyter/kernels/xcpp23/wasm_kernel.json.in @@ -3,6 +3,7 @@ "argv": [ "@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" ], diff --git a/src/xinterpreter.cpp b/src/xinterpreter.cpp index 15d6861b..5ea15b2e 100644 --- a/src/xinterpreter.cpp +++ b/src/xinterpreter.cpp @@ -45,6 +45,7 @@ void* createInterpreter(const Args &ExtraArgs = {}) { ClangArgs.push_back("-isystem"); ClangArgs.push_back(CxxInclude.c_str()); } + ClangArgs.insert(ClangArgs.end(), ExtraArgs.begin(), ExtraArgs.end()); // FIXME: We should process the kernel input options and conditionally pass // the gpu args here. diff --git a/test/test_interpreter.cpp b/test/test_interpreter.cpp index 5ce9d540..ca4f4cec 100644 --- a/test/test_interpreter.cpp +++ b/test/test_interpreter.cpp @@ -99,6 +99,39 @@ TEST_SUITE("execute_request") REQUIRE(result["status"] == "ok"); } +#if defined(XEUS_CPP_EMSCRIPTEN_WASM_BUILD) + TEST_CASE("headers found in sysroot/include/compat") + { + std::vector Args = {}; + xcpp::interpreter interpreter((int)Args.size(), Args.data()); + std::string code = "#include "; + 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", "....."*/}; @@ -1135,4 +1168,4 @@ TEST_CASE("C and C++ stdout/stderr capture") REQUIRE(captured_out.find("C++ stdout") != std::string::npos); REQUIRE(captured_err.find("C stderr") != std::string::npos); REQUIRE(captured_err.find("C++ stderr") != std::string::npos); -} +} \ No newline at end of file From 9a162bb3c194c4c0d4d7a3e8ec5d3b6464248355 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Thu, 13 Nov 2025 12:04:28 +0530 Subject: [PATCH 2/3] fix test --- test/test_interpreter.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/test_interpreter.cpp b/test/test_interpreter.cpp index ca4f4cec..ed510f4e 100644 --- a/test/test_interpreter.cpp +++ b/test/test_interpreter.cpp @@ -102,7 +102,11 @@ TEST_SUITE("execute_request") #if defined(XEUS_CPP_EMSCRIPTEN_WASM_BUILD) TEST_CASE("headers found in sysroot/include/compat") { - std::vector Args = {}; + 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(); From e2fa913a9fd4348d2d99d6a563b4588283cdd2ad Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Thu, 13 Nov 2025 12:10:55 +0530 Subject: [PATCH 3/3] remove whitespace in xinterpreter.cpp --- src/xinterpreter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/xinterpreter.cpp b/src/xinterpreter.cpp index 5ea15b2e..15d6861b 100644 --- a/src/xinterpreter.cpp +++ b/src/xinterpreter.cpp @@ -45,7 +45,6 @@ void* createInterpreter(const Args &ExtraArgs = {}) { ClangArgs.push_back("-isystem"); ClangArgs.push_back(CxxInclude.c_str()); } - ClangArgs.insert(ClangArgs.end(), ExtraArgs.begin(), ExtraArgs.end()); // FIXME: We should process the kernel input options and conditionally pass // the gpu args here.