Skip to content

Commit 23fb2f4

Browse files
Initial merge with xeus-clang-repl
1 parent 216dbed commit 23fb2f4

File tree

17 files changed

+663
-171
lines changed

17 files changed

+663
-171
lines changed

.github/workflows/main.yml

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ concurrency:
1515

1616
jobs:
1717
unix:
18-
18+
1919
runs-on: ${{ matrix.os }}
20-
20+
2121
strategy:
2222
fail-fast: false
2323
matrix:
@@ -51,10 +51,10 @@ jobs:
5151
mkdir -p build
5252
cd build
5353
cmake .. \
54-
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
55-
-DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
56-
-DXEUS_CPP_ENABLE_CODE_COVERAGE=${{ matrix.coverage }} \
57-
${{ matrix.extra_cmake_flags }}
54+
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
55+
-DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
56+
-DXEUS_CPP_ENABLE_CODE_COVERAGE=${{ matrix.coverage }} \
57+
${{ matrix.extra_cmake_flags }}
5858
5959
- name: build
6060
shell: bash -l {0}
@@ -72,14 +72,14 @@ jobs:
7272
shell: bash -l {0}
7373
run: |
7474
cd build/test
75+
export CPLUS_INCLUDE_PATH=$CONDA_PREFIX/include:$CONDA_BUILD_SYSROOT:$CONDA_BUILD_SYSROOT/..:$CONDA_BUILD_SYSROOT/../x86_64-conda-linux-gnu/include/c++/12.3.0:$CONDA_BUILD_SYSROOT/../x86_64-conda-linux-gnu/include/c++/12.3.0/include:$CONDA_BUILD_SYSROOT/../include:$CONDA_BUILD_SYSROOT/usr/include:/home/runner/micromamba-root/envs/xeus-cpp/bin/../lib/gcc/x86_64-conda-linux-gnu/12.3.0/include:/home/runner/micromamba-root/envs/xeus-cpp/bin/../lib/gcc/x86_64-conda-linux-gnu/12.3.0/include-fixed:/home/runner/micromamba-root/envs/xeus-cpp/bin/../lib/gcc/x86_64-conda-linux-gnu/12.3.0/../../../../x86_64-conda-linux-gnu/include:/home/runner/micromamba-root/envs/xeus-cpp/bin/../x86_64-conda-linux-gnu/sysroot/usr/include
7576
./test_xeus_cpp
7677
timeout-minutes: 4
7778

7879
- name: test
7980
shell: bash -l {0}
8081
run: |
81-
cd test
82-
pytest . --reruns 5
82+
$CONDA_PREFIX/bin/pytest test --reruns 5
8383
8484
- name: Prepare code coverage report
8585
if: ${{ success() && (matrix.coverage == true) }}
@@ -167,15 +167,15 @@ jobs:
167167
- name: Setup emsdk
168168
shell: bash -l {0}
169169
run: |
170-
emsdk install ${{matrix.emsdk_ver}}
170+
emsdk install ${{matrix.emsdk_ver}}
171171
172172
- name: Build xeus-cpp
173173
shell: bash -l {0}
174174
run: |
175175
emsdk activate ${{matrix.emsdk_ver}}
176176
source $CONDA_EMSDK_DIR/emsdk_env.sh
177177
micromamba create -f environment-wasm-host.yml --platform=emscripten-wasm32
178-
178+
179179
mkdir build
180180
pushd build
181181
@@ -192,3 +192,9 @@ jobs:
192192
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ON \
193193
..
194194
EMCC_CFLAGS='-sERROR_ON_UNDEFINED_SYMBOLS=0' emmake make -j5
195+
196+
- name: Setup tmate session
197+
if: ${{ failure() && runner.debug }}
198+
uses: mxschmitt/action-tmate@v3
199+
# When debugging increase to a suitable value!
200+
timeout-minutes: 30

CMakeLists.txt

Lines changed: 131 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
1212

1313
set(XEUS_CPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
1414

15+
enable_language(CXX)
16+
set(CMAKE_CXX_EXTENSIONS NO)
17+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
18+
19+
include(GNUInstallDirs)
20+
1521
# Versionning
1622
# ===========
1723

@@ -26,29 +32,15 @@ set(${PROJECT_NAME}_VERSION
2632
${XEUS_CPP_VERSION_MAJOR}.${XEUS_CPP_VERSION_MINOR}.${XEUS_CPP_VERSION_PATCH})
2733
message(STATUS "Building xeus-cpp v${${PROJECT_NAME}_VERSION}")
2834

29-
# Configuration
30-
# =============
31-
32-
include(GNUInstallDirs)
33-
34-
if (NOT DEFINED XEUS_CPP_KERNELSPEC_PATH)
35-
set(XEUS_CPP_KERNELSPEC_PATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/")
36-
endif ()
37-
38-
configure_file (
39-
"${CMAKE_CURRENT_SOURCE_DIR}/share/jupyter/kernels/xcpp/kernel.json.in"
40-
"${CMAKE_CURRENT_SOURCE_DIR}/share/jupyter/kernels/xcpp/kernel.json"
41-
)
42-
4335
# Build options
4436
# =============
4537

4638
option(XEUS_CPP_BUILD_STATIC "Build xeus-cpp static library" ON)
4739
OPTION(XEUS_CPP_BUILD_SHARED "Split xcpp build into executable and library" ON)
4840
OPTION(XEUS_CPP_BUILD_EXECUTABLE "Build the xcpp executable" ON)
4941

50-
OPTION(XEUS_CPP_USE_SHARED_XEUS "Link xcpp with the xeus shared library (instead of the static library)" ON)
51-
OPTION(XEUS_CPP_USE_SHARED_XEUS_CPP "Link xcpp with the xeus shared library (instead of the static library)" ON)
42+
OPTION(XEUS_CPP_USE_SHARED_XEUS "Link xcpp with the xeus shared library (instead of the static library)" ON)
43+
OPTION(XEUS_CPP_USE_SHARED_XEUS_CPP "Link xcpp with the xeus shared library (instead of the static library)" ON)
5244

5345
# Test options
5446
OPTION(XEUS_CPP_BUILD_TESTS "xeus-cpp test suite" ON)
@@ -77,7 +69,6 @@ if(EMSCRIPTEN)
7769
SET(XEUS_CPP_BUILD_TESTS OFF)
7870
endif()
7971

80-
8172
# Dependencies
8273
# ============
8374

@@ -103,15 +94,17 @@ else()
10394
add_compile_options(-fexceptions)
10495
endif ()
10596

106-
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
97+
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
98+
CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
99+
CMAKE_CXX_COMPILER_ID MATCHES "Intel")
107100
if(NOT EMSCRIPTEN)
108101
add_compile_options(-Wunused-parameter -Wextra -Wreorder)
109102
endif()
110-
111103

112104
CHECK_CXX_COMPILER_FLAG("-std=c++17" HAS_CPP_17_FLAG)
113105
if (HAS_CPP_17_FLAG)
114-
add_compile_options(-std=c++17)
106+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
107+
set(CMAKE_CXX_STANDARD 17)
115108
else ()
116109
message(FATAL_ERROR "Unsupported compiler -- xeus requires C++17 support!")
117110
endif ()
@@ -120,21 +113,85 @@ endif ()
120113
if(EMSCRIPTEN)
121114
# ENV (https://github.com/emscripten-core/emscripten/commit/6d9681ad04f60b41ef6345ab06c29bbc9eeb84e0)
122115
set(EMSCRIPTEN_FEATURES "${EMSCRIPTEN_FEATURES} -s \"EXTRA_EXPORTED_RUNTIME_METHODS=[ENV']\"")
116+
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
117+
endif()
118+
119+
find_package(CppInterOp REQUIRED CONFIG PATHS "${CMAKE_PREFIX_PATH}" "${CMAKE_PREFIX_PATH}/lib" "${CPPINTEROP_DIR}" "${CPPINTEROP_DIR}/lib")
120+
if(CppInterOp_FOUND)
121+
set(CppInterOp_CLANG_VERSION "17")
122+
message(STATUS "Found CppInterOp: config=${CppInterOp_CONFIG} dir=${CppInterOp_DIR} (found version=${CppInterOp_VERSION} compatible with Clang ${CppInterOp_CLANG_VERSION}.x)")
123123
endif()
124124

125-
find_package(Clang REQUIRED)
126-
include(AddLLVM)
127-
include(HandleLLVMOptions)
128-
add_definitions(${LLVM_DEFINITIONS})
129125
find_package(argparse REQUIRED)
130126
find_package(pugixml REQUIRED)
131127

128+
set(Python_FIND_VIRTUALENV ONLY)
129+
find_package(Python COMPONENTS Interpreter Development)
130+
131+
# Configuration
132+
# =============
133+
134+
if (NOT DEFINED XEUS_CPP_KERNELSPEC_PATH)
135+
set(XEUS_CPP_KERNELSPEC_PATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/")
136+
set(XEUS_CPP_RESOURCE_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/clang/${CppInterOp_CLANG_VERSION})
137+
endif ()
138+
139+
function(configure_kernel kernel)
140+
set(XEUS_CPP_CPLUS_INCLUDE_PATH "$ENV{CPLUS_INCLUDE_PATH}")
141+
set(XEUS_CPP_PATH "$ENV{PATH}")
142+
set(XEUS_CPP_LD_LIBRARY_PATH "$ENV{LD_LIBRARY_PATH}")
143+
set(XEUS_CPP_PYTHONPATH "$ENV{PYTHONPATH}")
144+
set(XEUS_CPP_VENV_PATH "$ENV{VENV}")
145+
146+
message(STATUS "Debug: Replace in kernels")
147+
message(STATUS "Debug: XEUS_CPP_CPLUS_INCLUDE_PATH=${XEUS_CPP_CPLUS_INCLUDE_PATH}")
148+
message(STATUS "Debug: XEUS_CPP_PATH=${XEUS_CPP_PATH}")
149+
message(STATUS "Debug: XEUS_CPP_LD_LIBRARY_PATH=${XEUS_CPP_LD_LIBRARY_PATH}")
150+
message(STATUS "Debug: XEUS_CPP_PYTHONPATH=${XEUS_CPP_PYTHONPATH}")
151+
message(STATUS "Debug: XEUS_CPP_VENV_PATH=${XEUS_CPP_VENV_PATH}")
152+
message(STATUS "Debug: CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}")
153+
message(STATUS "Debug: CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}")
154+
155+
configure_file (
156+
"${CMAKE_CURRENT_SOURCE_DIR}/${kernel}/kernel.json.in"
157+
"${CMAKE_CURRENT_BINARY_DIR}/${kernel}/kernel.json"
158+
)
159+
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/${kernel}/*.png")
160+
foreach(file ${files})
161+
configure_file(
162+
"${file}"
163+
"${CMAKE_CURRENT_BINARY_DIR}/${kernel}/"
164+
COPYONLY
165+
)
166+
endforeach()
167+
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/${kernel}/*.svg")
168+
foreach(file ${files})
169+
configure_file(
170+
"${file}"
171+
"${CMAKE_CURRENT_BINARY_DIR}/${kernel}/"
172+
COPYONLY
173+
)
174+
endforeach()
175+
endfunction()
176+
177+
file(GLOB _kernels LIST_DIRECTORIES true RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "share/jupyter/kernels/*")
178+
foreach(_kernel IN LISTS _kernels)
179+
message("Configure kernel: ${_kernel}")
180+
configure_kernel("${_kernel}")
181+
endforeach()
182+
132183
# Source files
133184
# ============
134185

135186
set(XEUS_CPP_HEADERS
187+
include/xeus-cpp/xbuffer.hpp
188+
include/xeus-cpp/xholder.hpp
189+
include/xeus-cpp/xmagics.hpp
190+
include/xeus-cpp/xoptions.hpp
136191
include/xeus-cpp/xeus_cpp_config.hpp
137192
include/xeus-cpp/xinterpreter.hpp
193+
include/xeus-cpp/xmanager.hpp
194+
include/xeus-cpp/xpreamble.hpp
138195
)
139196

140197
set(XEUS_CPP_SRC
@@ -144,10 +201,18 @@ set(XEUS_CPP_SRC
144201
src/xoptions.cpp
145202
src/xparser.cpp
146203
src/xutils.cpp
204+
src/xdemangle.hpp
205+
src/xinspect.hpp
206+
src/xsystem.hpp
207+
src/xparser.hpp
208+
src/xmagics/os.hpp
209+
src/xmagics/os.cpp
147210
)
148211

149212
if(EMSCRIPTEN)
150213
list(APPEND XEUS_CPP_SRC src/xinterpreter_wasm.cpp)
214+
else()
215+
list(APPEND XEUS_CPP_SRC src/xmagics/pythonexec.hpp src/xmagics/pythonexec.cpp)
151216
endif()
152217

153218
set(XEUS_CPP_MAIN_SRC
@@ -161,7 +226,8 @@ include(CheckCXXCompilerFlag)
161226

162227
string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
163228

164-
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib; ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
229+
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
230+
list(REMOVE_DUPLICATES CMAKE_INSTALL_RPATH)
165231

166232
macro(xeus_cpp_set_common_options target_name)
167233
if (MSVC)
@@ -215,7 +281,6 @@ macro(xeus_cpp_set_kernel_options target_name)
215281
find_package(Threads)
216282
target_link_libraries(${target_name} PRIVATE ${CMAKE_THREAD_LIBS_INIT})
217283
endif()
218-
219284
endmacro()
220285

221286
# Common macro for shared and static library
@@ -251,7 +316,11 @@ macro(xeus_cpp_create_target target_name linkage output_name)
251316
set(XEUS_CPP_XEUS_TARGET xeus-static)
252317
endif ()
253318

254-
target_link_libraries(${target_name} PUBLIC ${XEUS_CPP_XEUS_TARGET} clangInterpreter pugixml argparse::argparse xtl)
319+
target_link_libraries(${target_name} PUBLIC ${XEUS_CPP_XEUS_TARGET} clangCppInterOp pugixml argparse::argparse xtl)
320+
if (NOT EMSCRIPTEN)
321+
target_link_libraries(${target_name} PUBLIC Python::Python)
322+
endif()
323+
255324
if (WIN32 OR CYGWIN)
256325
#
257326
elseif (APPLE)
@@ -261,7 +330,7 @@ macro(xeus_cpp_create_target target_name linkage output_name)
261330
find_package(Threads) # TODO: add Threads as a dependence of xeus-static?
262331
target_link_libraries(${target_name} PRIVATE ${CMAKE_THREAD_LIBS_INIT})
263332
endif()
264-
333+
265334
endmacro()
266335

267336
# xeus-cpp-headers
@@ -308,6 +377,30 @@ if (XEUS_CPP_BUILD_EXECUTABLE)
308377
xeus_cpp_set_common_options(xcpp)
309378
xeus_cpp_set_kernel_options(xcpp)
310379
target_link_libraries(xcpp PRIVATE xeus-zmq)
380+
set_target_properties(xcpp PROPERTIES
381+
ENABLE_EXPORTS 1
382+
CXX_STANDARD ${CMAKE_CXX_STANDARD})
383+
target_link_libraries(xcpp PUBLIC xeus-cpp pthread Python::Python)
384+
385+
##TODO: We may be need sse RPATH
386+
set_target_properties(xcpp clangCppInterOp PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
387+
if(APPLE)
388+
target_link_libraries(xcpp PUBLIC -Wl,-w -Wl,-bind_at_load -Wl,-undefined,dynamic_lookup)
389+
elseif(NOT MSVC)
390+
target_link_libraries(xcpp PUBLIC -Wl,--unresolved-symbols=ignore-in-object-files)
391+
endif()
392+
393+
target_include_directories(xeus-cpp PUBLIC ${Python_INCLUDE_DIRS})
394+
target_link_libraries(xeus-cpp PUBLIC ${PYTHON_LIBRARIES})
395+
target_link_libraries(xeus-cpp ${PYTHON_LIBRARIES_Development_Main})
396+
set_target_properties(xeus-cpp PROPERTIES
397+
PUBLIC_HEADER "${XEUS_CPP_HEADERS}"
398+
COMPILE_DEFINITIONS "XEUS_CPP_EXPORTS"
399+
PREFIX ""
400+
VERSION ${${PROJECT_NAME}_VERSION}
401+
SOVERSION ${XEUS_CPP_VERSION_MAJOR}
402+
OUTPUT_NAME "libxeus-cpp"
403+
CXX_STANDARD ${CMAKE_CXX_STANDARD})
311404
endif()
312405

313406
if(EMSCRIPTEN)
@@ -337,10 +430,10 @@ set(XEUS_CPP_CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NA
337430
if (XEUS_CPP_BUILD_SHARED)
338431
install(TARGETS ${XEUS_CPP_TARGETS}
339432
EXPORT ${PROJECT_NAME}-targets
340-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
341-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
342-
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
343-
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/xeus-cpp)
433+
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
434+
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
435+
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}
436+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/xeus-cpp)
344437

345438
# Makes the project importable from the build directory
346439
export(EXPORT ${PROJECT_NAME}-targets
@@ -350,15 +443,15 @@ endif ()
350443
# Install xcpp
351444
if (XEUS_CPP_BUILD_EXECUTABLE)
352445
install(TARGETS xcpp
353-
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
446+
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})
354447
endif()
355448

356449
if(XEUS_CPP_BUILD_EXECUTABLE OR EMSCRIPTEN)
357450
# Configuration and data directories for jupyter and xeus-cpp
358451
set(XJUPYTER_DATA_DIR "share/jupyter" CACHE STRING "Jupyter data directory")
359452

360453
# Install xcpp Jupyter kernelspec
361-
set(KERNELSPEC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/share/jupyter/kernels)
454+
set(KERNELSPEC_DIR ${CMAKE_CURRENT_BINARY_DIR}/share/jupyter/kernels)
362455
install(DIRECTORY ${KERNELSPEC_DIR}
363456
DESTINATION ${XJUPYTER_DATA_DIR}
364457
PATTERN "*.in" EXCLUDE)
@@ -428,3 +521,7 @@ if(EMSCRIPTEN)
428521
"$<TARGET_FILE_DIR:xcpp>/xcpp.wasm"
429522
DESTINATION ${CMAKE_INSTALL_BINDIR})
430523
endif ()
524+
525+
if(XEUS_CPP_INCLUDE_DOCS)
526+
add_subdirectory(docs)
527+
endif()

environment-dev.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ dependencies:
1111
- nlohmann_json
1212
- cppzmq
1313
- xtl
14-
- clangdev >=16,<17
14+
- CppInterOp
1515
- pugixml
16-
- cpp-argparse
16+
- cpp-argparse <3.0
1717
- zlib
1818
# Test dependencies
1919
- pytest

environment-wasm-host.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ dependencies:
77
- xeus-lite
88
- xeus >=3.0.5,<4.0
99
- xtl >=0.7,<0.8
10-
- llvm =16.0.6
10+
- CppInterOp
1111
- cpp-argparse
1212
- pugixml

include/xcpp/xdisplay.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
#include "xcpp/xmime.hpp"
1616

17+
#include "xeus/xinterpreter.hpp"
18+
1719
namespace nl = nlohmann;
1820

1921
namespace xcpp

0 commit comments

Comments
 (0)