Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build/**/*
build
48 changes: 42 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ jobs:
fail-fast: false
matrix:
include:
- name: ubu22-gcc12-clang15
- name: ubu22-gcc12-clang16
os: ubuntu-22.04
compiler: gcc-12
clang-runtime: '15'
clang-runtime: '16'
steps:
- uses: actions/checkout@v3
with:
Expand Down Expand Up @@ -79,8 +79,8 @@ jobs:
git clone --depth=1 --branch "release/${{ matrix.clang-runtime }}.x" --single-branch https://github.com/llvm/llvm-project.git clang-dev
cd clang-dev
# Apply patches
echo "Apply clang${{ matrix.clang-runtime }}-*.patch patches"
[ -f ../patches/llvm/clang${{ matrix.clang-runtime }}-*.patch ] && git apply ../patches/llvm/clang${{ matrix.clang-runtime }}-*.patch
echo "Apply clang${{ matrix.clang-runtime }}-*.patch patches:"
compgen -G "../patches/llvm/clang${{ matrix.clang-runtime }}-*.patch" > /dev/null && find ../patches/llvm/clang${{ matrix.clang-runtime }}-*.patch -printf "%f\n" && git apply ../patches/llvm/clang${{ matrix.clang-runtime }}-*.patch
# Build clang-dev
mkdir build
mkdir inst
Expand Down Expand Up @@ -128,6 +128,9 @@ jobs:
if: runner.os == 'Linux' #TODO: exclude on release
run: |
# Install xeus-clang-repl deps
sudo apt-get update --yes
sudo apt-get install --yes --no-install-recommends ncurses-dev libtinfo-dev libtinfo5
#
conda update --all
conda install -y -q -c conda-forge \
'xeus>=2.0,<3.0' \
Expand All @@ -139,17 +142,50 @@ jobs:
libuuid \
pytest \
jupyter_kernel_test
- name: Build and Install CppInterOp on Linux
if: runner.os == 'Linux'
run: |
# Build CppInterOp next to cling and llvm-project.
LLVM_DIR="$(realpath clang-dev)"
LLVM_BUILD_DIR="$(realpath clang-dev/build)"
CPLUS_INCLUDE_PATH="${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_BUILD_DIR}/include:${LLVM_BUILD_DIR}/tools/clang/include"
git clone https://github.com/compiler-research/CppInterOp.git
export CPPINTEROP_DIR=$PWD/cppyy-backend/python/cppyy_backend/
cd CppInterOp
mkdir build
cd build
export CPPINTEROP_BUILD_DIR=$PWD
cmake -DCMAKE_BUILD_TYPE=Release \
-DUSE_CLING=OFF \
-DUSE_REPL=ON \
-DLLVM_DIR=$LLVM_BUILD_DIR \
-DLLVM_USE_LINKER=gold \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX=$CPPINTEROP_DIR \
../
cmake --build . --parallel $(nproc --all)
cd ../..
# We need CPPINTEROP_DIR, LLVM_BUILD_DIR and CPLUS_INCLUDE_PATH later
echo "CPPINTEROP_DIR=$CPPINTEROP_DIR" >> $GITHUB_ENV
echo "CPPINTEROP_BUILD_DIR=$CPPINTEROP_BUILD_DIR" >> $GITHUB_ENV
echo "LLVM_BUILD_DIR=$LLVM_BUILD_DIR" >> $GITHUB_ENV
echo "CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> $GITHUB_ENV
- name: Build xeus-clang-repl on Linux
if: runner.os == 'Linux' #TODO: exclude on release
run: |
# Build and Install xeus-clang-repl
## Build and Install xeus-clang-repl
mkdir build
cd build
PP=$KERNEL_PYTHON_PREFIX
if [[ -z "$PP" ]]; then
PP=$(conda info --base)
fi
cmake -DCMAKE_PREFIX_PATH=$PP -DCMAKE_INSTALL_PREFIX=$PP -DCMAKE_INSTALL_LIBDIR=lib -DLLVM_CONFIG_EXTRA_PATH_HINTS=$PATH_TO_LLVM_BUILD -DLLVM_USE_LINKER=gold -DLLVM_REQUIRED_VERSION=${{ matrix.clang-runtime }} ..
cmake -DCMAKE_PREFIX_PATH=$PP -DCMAKE_INSTALL_PREFIX=$PP \
-DCMAKE_INSTALL_LIBDIR=lib -DLLVM_DIR=$PATH_TO_LLVM_BUILD \
-DLLVM_CONFIG_EXTRA_PATH_HINTS=$PATH_TO_LLVM_BUILD \
-DCPPINTEROP_DIR=$CPPINTEROP_BUILD_DIR \
-DLLVM_USE_LINKER=gold \
-DLLVM_REQUIRED_VERSION=${{ matrix.clang-runtime }} ..
make install
- name: Setup tmate session
if: ${{ failure() }}
Expand Down
89 changes: 61 additions & 28 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ message(STATUS "Building xeus-clang-repl v${${PROJECT_NAME}_VERSION}")

include(GNUInstallDirs)

message(STATUS "Env CPLUS_INCLUDE_PATH=$ENV{CPLUS_INCLUDE_PATH}")
message(STATUS "Env LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}")
message(STATUS "Env PYTHONPATH=$ENV{PYTHONPATH}")

set(CMAKE_CPLUS_INCLUDE_PATH "$ENV{CPLUS_INCLUDE_PATH}")
set(CMAKE_LD_LIBRARY_PATH "$ENV{LD_LIBRARY_PATH}")
set(CMAKE_PYTHONPATH "$ENV{PYTHONPATH}")

configure_file (
"${CMAKE_CURRENT_SOURCE_DIR}/share/jupyter/kernels/xcpp11/kernel.json.in"
"${CMAKE_CURRENT_BINARY_DIR}/share/jupyter/kernels/xcpp11/kernel.json"
Expand All @@ -44,33 +52,29 @@ configure_file (

set(xeus_REQUIRED_VERSION 1.0.0)
set(cppzmq_REQUIRED_VERSION 4.3.0)
set(llvm_REQUIRED_VERSION 14)
if (LLVM_REQUIRED_VERSION)
set(llvm_REQUIRED_VERSION ${LLVM_REQUIRED_VERSION})
endif()

find_package(xeus ${xeus_REQUIRED_VERSION} REQUIRED)
find_package(cppzmq REQUIRED CONFIG)
find_package(pugixml REQUIRED)

#CppInterOp
#TODO: Make CppInterOp cmake package and use find_package
#find_package(CppInterOp REQUIRED CONFIG PATHS "${CPPINTEROP_DIR}")
add_library(clangCppInterOp SHARED IMPORTED)
set_property(TARGET clangCppInterOp PROPERTY IMPORTED_LOCATION "${CPPINTEROP_DIR}/lib/libclangCppInterOp.so")
set_property(TARGET clangCppInterOp PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CPPINTEROP_DIR}/../include")
#
message(STATUS "CppInterOp Imported location: ${CPPINTEROP_DIR}/lib/libclangCppInterOp.so")
message(STATUS "CppInterOp include location: ${CPPINTEROP_DIR}/../include")

#find_package(LLVM REQUIRED CONFIG PATHS "${LLVM_CONFIG_EXTRA_PATH_HINTS}" NO_DEFAULT_PATH)
#find_package(Clang REQUIRED CONFIG PATHS "${LLVM_CONFIG_EXTRA_PATH_HINTS}/lib/cmake/clang/" NO_DEFAULT_PATH)
find_package(LLVM ${llvm_REQUIRED_VERSION} REQUIRED CONFIG PATHS "${LLVM_CONFIG_EXTRA_PATH_HINTS}")
find_package(Clang REQUIRED CONFIG PATHS "${LLVM_BINARY_DIR}/lib/cmake/clang/" "${LLVM_CONFIG_EXTRA_PATH_HINTS}/lib/cmake/clang/" NO_DEFAULT_PATH)
include_directories(SYSTEM ${LLVM_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS})
link_directories(${LLVM_LIBRARY_DIR})

###

# Before including llvm suppress the option() honors normal variables warning.
if(POLICY CMP0077)
cmake_policy(SET CMP0077 NEW)
endif()

include(AddLLVM)
include(HandleLLVMOptions)

add_definitions(-DCLANG_RESOURCE_DIR="${LLVM_BINARY_DIR}/lib/clang/${LLVM_PACKAGE_VERSION}")

find_package(cxxopts REQUIRED)
find_package(PythonLibs REQUIRED)

Expand Down Expand Up @@ -100,13 +104,23 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU"
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
endif()

CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG)

if (HAS_CPP14_FLAG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
else()
message(FATAL_ERROR "Unsupported compiler -- xeus requires C++14 support!")
## Clang 13 require c++14 or later, Clang 16 require c++17 or later.
if (LLVM_VERSION_MAJOR GREATER_EQUAL 16)
if (NOT CMAKE_CXX_STANDARD)
set (CMAKE_CXX_STANDARD 17)
endif()
if (CMAKE_CXX_STANDARD LESS 17)
message(fatal "LLVM/CppInterOp requires c++17 or later")
endif()
elseif (LLVM_VERSION_MAJOR GREATER_EQUAL 13)
if (NOT CMAKE_CXX_STANDARD)
set (CMAKE_CXX_STANDARD 14)
endif()
if (CMAKE_CXX_STANDARD LESS 14)
message(fatal "LLVM/CppInterOp requires c++14 or later")
endif()
endif()

endif()

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")
Expand Down Expand Up @@ -158,13 +172,27 @@ set(XCPP_HEADERS
# xeus-clang-repl is the target for the library
set(LLVM_REQUIRES_EH ON)
set(LLVM_REQUIRES_RTTI ON)
llvm_add_library(xeus-clang-repl SHARED ${XEUS_CLANG_REPL_SRC} ${XEUS_CLANG_REPL_HEADERS})
add_library(xeus-clang-repl SHARED ${XEUS_CLANG_REPL_SRC} ${XEUS_CLANG_REPL_HEADERS})

# xcpp is the target for the kernel executable
set(CMAKE_CXX_STANDARD 14) # FIXME: Be smarter and check if the standard was defined outside.
add_executable(xcpp ${XCPP_SRC})
set_target_properties(xcpp PROPERTIES ENABLE_EXPORTS 1)
set_target_properties(xcpp PROPERTIES
ENABLE_EXPORTS 1
CXX_STANDARD ${CMAKE_CXX_STANDARD}
)
target_link_libraries(xcpp PUBLIC xeus-clang-repl pthread)

#TODO: We may be need sse RPATH
#set_target_properties(xcpp clangCppInterOp PROPERTIES
# INSTALL_RPATH_USE_LINK_PATH TRUE
#)
if(APPLE)
target_link_libraries(xcpp PUBLIC -Wl,-w -Wl,-bind_at_load -Wl,-undefined,dynamic_lookup)
elseif(NOT MSVC)
target_link_libraries(xcpp PUBLIC -Wl,--unresolved-symbols=ignore-in-object-files)
endif()

set(LLVM_NO_DEAD_STRIP 1)

if (APPLE)
Expand Down Expand Up @@ -195,20 +223,25 @@ target_include_directories(xeus-clang-repl SYSTEM
PUBLIC
$<BUILD_INTERFACE:${XEUS_CLANG-REPL_INCLUDE_DIR}>
$<INSTALL_INTERFACE:include>)
target_link_libraries(xeus-clang-repl PUBLIC clangInterpreter xeus pugixml cxxopts::cxxopts)
target_link_libraries(xeus-clang-repl PUBLIC clangCppInterOp xeus pugixml cxxopts::cxxopts)

if(APPLE)
target_link_libraries(xeus-clang-repl PUBLIC -Wl,-w -Wl,-bind_at_load -Wl,-undefined,dynamic_lookup)
elseif(NOT MSVC)
target_link_libraries(xeus-clang-repl PUBLIC -Wl,--unresolved-symbols=ignore-in-object-files)
endif()

target_include_directories(xeus-clang-repl PUBLIC ${PYTHON_INCLUDE_DIRS})
target_link_libraries(xeus-clang-repl PUBLIC ${PYTHON_LIBRARIES})
target_link_libraries(xeus-clang-repl ${PYTHON_LIBRARIES_Development_Main})

set_target_properties(xeus-clang-repl PROPERTIES
PUBLIC_HEADER "${XEUS_CLANG_REPL_HEADERS}"
COMPILE_DEFINITIONS "XEUS_CLANG_REPL_EXPORTS"
PREFIX ""
VERSION ${${PROJECT_NAME}_VERSION}
SOVERSION ${XEUS_CLANG_REPL_VERSION_MAJOR}
OUTPUT_NAME "libxeus-clang-repl")

OUTPUT_NAME "libxeus-clang-repl"
CXX_STANDARD ${CMAKE_CXX_STANDARD})

################
# Installation #
Expand Down Expand Up @@ -279,4 +312,4 @@ install(EXPORT ${PROJECT_NAME}-targets
# Documentation
if(XEUS_CLANG_REPL_INCLUDE_DOCS)
add_subdirectory(docs)
endif()
endif()
Loading