Installation And Usage

Build from source

Build instructions for CppInterOp and its dependencies are as follows. CppInterOP can be built with either Cling and Clang-REPL, so instructions will differ slightly depending on which option you would like to build, but should be clear from the section title which instructions to follow.

Clone CppInterOp and cppyy-backend

First clone the CppInterOp repository, as this contains patches that need to be applied to the subsequently cloned llvm-project repo (these patches are only applied if building CppInterOp with Clang-REPL)

git clone --depth=1 https://github.com/compiler-research/CppInterOp.git

and clone cppyy-backend repository where we will be installing the CppInterOp library

git clone --depth=1 https://github.com/compiler-research/cppyy-backend.git

Setup Clang-REPL

Clone the 19.x release of the LLVM project repository.

git clone --depth=1 --branch release/19.x https://github.com/llvm/llvm-project.git
cd llvm-project

For Clang 16 & 17, the following patches required for development work. To apply these patches on Linux and MacOS execute the following command(substitute {version} with your clang version):

git apply -v ../CppInterOp/patches/llvm/clang{version}-*.patch

and

cp -r ..\CppInterOp\patches\llvm\clang17* .
git apply -v clang{version}-*.patch

on Windows.

Build Clang-REPL

Clang-REPL is an interpreter that CppInterOp works alongside. Build Clang (and Clang-REPL along with it). On Linux and MaxOS you do this by executing the following command

mkdir build
cd build
cmake   -DLLVM_ENABLE_PROJECTS=clang                        \
        -DLLVM_TARGETS_TO_BUILD="host;NVPTX"                \
        -DCMAKE_BUILD_TYPE=Release                          \
        -DLLVM_ENABLE_ASSERTIONS=ON                         \
        -DCLANG_ENABLE_STATIC_ANALYZER=OFF                  \
        -DCLANG_ENABLE_ARCMT=OFF                            \
        -DCLANG_ENABLE_FORMAT=OFF                           \
        -DCLANG_ENABLE_BOOTSTRAP=OFF                        \
        -DLLVM_ENABLE_ZSTD=OFF                              \
        -DLLVM_ENABLE_TERMINFO=OFF                          \
        -DLLVM_ENABLE_LIBXML2=OFF                           \
        ../llvm
cmake --build . --target clang clang-repl --parallel $(nproc --all)

On Windows you would do this by executing the following

$env:ncpus = $([Environment]::ProcessorCount)
mkdir build
cd build
cmake   -DLLVM_ENABLE_PROJECTS=clang                  `
        -DLLVM_TARGETS_TO_BUILD="host;NVPTX"          `
        -DCMAKE_BUILD_TYPE=Release                    `
        -DLLVM_ENABLE_ASSERTIONS=ON                   `
        -DCLANG_ENABLE_STATIC_ANALYZER=OFF            `
        -DCLANG_ENABLE_ARCMT=OFF                      `
        -DCLANG_ENABLE_FORMAT=OFF                     `
        -DCLANG_ENABLE_BOOTSTRAP=OFF                  `
        ..\llvm
        cmake --build . --target clang clang-repl --parallel $env:ncpus

Note the ‘llvm-project’ directory location. On linux and MacOS you execute the following

cd ../
export LLVM_DIR=$PWD
cd ../

On Windows you execute the following

cd ..\
$env:LLVM_DIR= $PWD.Path
cd ..\

Environment variables

Regardless of whether you are building CppInterOP with Cling or Clang-REPL you will need to define the following environment variables (as they clear for a new session, it is recommended that you also add these to your .bashrc in linux, .bash_profile if on MacOS, or profile.ps1 on Windows). On Linux and MacOS you define as follows

export CB_PYTHON_DIR="$PWD/cppyy-backend/python"
export CPPINTEROP_DIR="$CB_PYTHON_DIR/cppyy_backend"
export CPLUS_INCLUDE_PATH="${CPLUS_INCLUDE_PATH}:${LLVM_DIR}/llvm/include:${LLVM_DIR}/clang/include:${LLVM_DIR}/build/include:${LLVM_DIR}/build/tools/clang/include"

If on MacOS you will also need the following environment variable defined

export SDKROOT=`xcrun --show-sdk-path`

On Windows you define as follows (assumes you have defined $env:PWD_DIR= $PWD.Path )

$env:CB_PYTHON_DIR="$env:PWD_DIR\cppyy-backend\python"
$env:CPPINTEROP_DIR="$env:CB_PYTHON_DIR\cppyy_backend"
$env:CPLUS_INCLUDE_PATH="$env:CPLUS_INCLUDE_PATH;$env:LLVM_DIR\llvm\include;$env:LLVM_DIR\clang\include;$env:LLVM_DIR\build\include;$env:LLVM_DIR\build\tools\clang\include"

Build CppInterOp

Now CppInterOp can be installed. On Linux and MacOS execute

mkdir CppInterOp/build/
cd CppInterOp/build/

On Windows execute

mkdir CppInterOp\build\
cd CppInterOp\build\

Now if you want to build CppInterOp with Clang-REPL then execute the following commands on Linux and MacOS

cmake -DBUILD_SHARED_LIBS=ON -DLLVM_DIR=$LLVM_DIR/build/lib/cmake/llvm -DClang_DIR=$LLVM_DIR/build/lib/cmake/clang -DCMAKE_INSTALL_PREFIX=$CPPINTEROP_DIR ..
cmake --build . --target install --parallel $(nproc --all)

and

cmake -DLLVM_DIR=$env:LLVM_DIR\build\lib\cmake\llvm -DClang_DIR=$env:LLVM_DIR\build\lib\cmake\clang -DCMAKE_INSTALL_PREFIX=$env:CPPINTEROP_DIR ..
cmake --build . --target install --parallel $env:ncpus

on Windows. If alternatively you would like to install CppInterOp with Cling then execute the following commands on Linux and MacOS

cmake -DBUILD_SHARED_LIBS=ON -DUSE_CLING=ON -DUSE_REPL=Off -DCling_DIR=$LLVM_DIR/build/tools/cling -DLLVM_DIR=$LLVM_DIR/build/lib/cmake/llvm -DClang_DIR=$LLVM_DIR/build/lib/cmake/clang -DCMAKE_INSTALL_PREFIX=$CPPINTEROP_DIR ..
cmake --build . --target install --parallel $(nproc --all)

and

cmake -DUSE_CLING=ON -DUSE_REPL=Off -DCling_DIR=$env:LLVM_DIR\build\tools\cling -DLLVM_DIR=$env:LLVM_DIR\build\lib\cmake\llvm -DClang_DIR=$env:LLVM_DIR\build\lib\cmake\clang -DCMAKE_INSTALL_PREFIX=$env:CPPINTEROP_DIR ..
cmake --build . --target install --parallel $env:ncpus

Testing CppInterOp

To test the built CppInterOp execute the following command in the CppInterOP build folder on Linux and MacOS

cmake --build . --target check-cppinterop --parallel $(nproc --all)

and

cmake --build . --target check-cppinterop --parallel $env:ncpus

on Windows. Now go back to the top level directory in which your building CppInterOP. On Linux and MacOS you do this by executing

cd ../..

and

cd ..\..

on Windows. Now you are in a position to install cppyy following the instructions below.

Building and Install cppyy-backend

Cd into the cppyy-backend directory, build it and copy library files into python/cppyy-backend directory:

cd cppyy-backend
mkdir -p python/cppyy_backend/lib build
cd build
cmake -DCppInterOp_DIR=$CPPINTEROP_DIR ..
cmake --build .

If on a linux system now execute the following command

cp libcppyy-backend.so ../python/cppyy_backend/lib/

and if on MacOS execute the following command

cp libcppyy-backend.dylib ../python/cppyy_backend/lib/

Note go back to the top level build directory

cd ../..

Install CPyCppyy

Create virtual environment and activate it:

python3 -m venv .venv
source .venv/bin/activate
git clone --depth=1 https://github.com/compiler-research/CPyCppyy.git
mkdir CPyCppyy/build
cd CPyCppyy/build
cmake ..
cmake --build .

Note down the path to the build directory as CPYCPPYY_DIR:

export CPYCPPYY_DIR=$PWD
cd ../..

Export the libcppyy path to python:

export PYTHONPATH=$PYTHONPATH:$CPYCPPYY_DIR:$CB_PYTHON_DIR

and on Windows:

$env:PYTHONPATH="$env:PYTHONPATH;$env:CPYCPPYY_DIR;$env:CB_PYTHON_DIR"

Install cppyy

git clone --depth=1 https://github.com/compiler-research/cppyy.git
cd cppyy
python -m pip install --upgrade . --no-deps --no-build-isolation
cd ..

Run cppyy

Each time you want to run cppyy you need to: Activate the virtual environment

source .venv/bin/activate

Now you can import cppyy in python .. code-block:: bash

python -c “import cppyy”

Run cppyy tests

Follow the steps in Run cppyy. Change to the test directory, make the library files and run pytest:

cd cppyy/test
make all
python -m pip install pytest
python -m pytest -sv