clair - Automatic Python/C++ bindings
0.9.0
  • Installation
    • Compiling from source
      • clair
      • c2py
        • CMake options
      • Set environment variables
    • Packages
      • OS X (brew)
        • Uninstalling
  • Getting Started
    • C++ Code
    • Generate Python Bindings and Compile the Module
      • Use clair-c2py manually
        • Generate Python Bindings
        • Compile the Module
      • Use CMake integration [Recommended]
        • Generate Python Bindings and Compile the Module
        • CMake Configuration
        • General Workflow
    • Use the Python Module
    • What is a Clang tool?
  • Gallery
    • Functions
    • Classes
    • Class templates
  • Reference documentation
    • Basic notions
      • Type conversion
        • Principle
        • Convertible types
      • Dynamical dispatch
    • Customization
      • Using annotations in the C++ sources
      • Using a TOML configuration file
        • Generating a template TOML file
        • TOML Configuration Options
        • Example
          • Filtering by namespace
          • Filtering by name
          • Filter by file name
          • Wrap no argument methods as properties
    • Functions
      • Default Behavior & Customization
      • Template Functions
      • Coroutines, generators
    • Classes
      • Default Behavior & Customization
        • Constructors
          • User-defined constructors
          • Synthesized aggregate constructor
        • Methods
          • Instance Methods
          • Const Methods
          • Static Methods
        • Operators
          • Operator()
          • Operator[]
          • Arithmetic Operators
          • Comparison Operators
        • Iterable Objects
        • String Representation
    • Enumerations
    • Across multiple modules
      • Example: Two communicating modules
        • Module A: Defining a class
        • Module B
        • CMake configuration
        • Usage in Python
    • Converters
      • Default converters
      • Custom converters for user-defined types
      • Set up for third party libraries
    • c2py
    • HDF5 (TRIQS/h5 Integration)
    • TRIQS/nda
    • Environment Variables
      • CLAIR_VERBOSE
      • CLAIR_SKIP_CLANG_FORMAT
      • CLICOLOR_FORCE / LLVM_FORCE_COLOR
      • SDKROOT (macOS only)
  • Notebook integration
  • Reporting issues
  • Changelog
    • Version 0.9.0
      • General
      • operators
      • codegen
      • c2py
      • clu
      • doc
      • cmake
  • About clair/c2py
    • Authors
    • Source code
clair - Automatic Python/C++ bindings
  • Getting Started
  • Use CMake integration [Recommended]
  • View page source

Use CMake integration [Recommended]

Generate Python Bindings and Compile the Module

To generate the Python bindings and compile the module with CMake, we simply run

$ mkdir build
$ cd build
$ cmake ..
$ make -j 8

CMake Configuration

The recommended way to build a module is the c2py_add_module macro provided by c2py: it declares the Python extension module, links it against c2py, and – when Update_Python_Bindings is ON – (re)generates the bindings with clair-c2py. The CMakeLists.txt for our Getting Started example looks as follows:

 1cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
 2project(getting-started-example LANGUAGES C CXX)
 3set(CMAKE_CXX_STANDARD 20)
 4set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 5
 6# This example ships without generated bindings, so regenerate them with clair-c2py.
 7set(Update_Python_Bindings ON CACHE BOOL "Regenerate bindings via clair-c2py")
 8
 9include(FetchContent)
10
11# Fetch c2py; this also makes the c2py_add_module macro available.
12FetchContent_Declare(c2py
13  GIT_REPOSITORY https://github.com/flatironinstitute/c2py
14  GIT_TAG unstable
15  EXCLUDE_FROM_ALL
16)
17FetchContent_MakeAvailable(c2py)
18
19# Build the getting_started Python module and (re)generate its bindings.
20c2py_add_module(getting_started)

Let’s take a closer look at the CMakeLists.txt file:

  • [Lines 1-4] Standard CMake project configuration: we require c++20 support and tell CMake to generate a compile_commands.json database (clair-c2py relies on it to parse the code).

  • [Line 7] This example ships without generated bindings, so we default Update_Python_Bindings to ON to (re)generate them; see the General Workflow below.

  • [Lines 9-17] We fetch c2py from GitHub and make it available for the current project rather than relying on a system installation. This ensures that c2py and the extension module are built with consistent compiler options and linked against the same Python interpreter, and it makes the c2py_add_module macro available. As c2py compiles quickly, it does not add significant overhead. (If c2py is already installed, find_package(c2py) makes the macro available just as well.)

  • [Line 20] c2py_add_module declares the getting_started extension module, links it against c2py, and – when Update_Python_Bindings is ON – finds clair-c2py and (re)generates the bindings before the module is compiled. It also accepts optional arguments such as LINK_LIBRARIES for extra dependencies and DEPENDS_ON_BINDINGS to order generation across modules (see Across multiple modules).

Note

  • The bindings are only (re)generated if the option Update_Python_Bindings is set to ON.

  • clair-c2py automatically uses the compilation database generated by CMake.

  • Even if CMake uses an out-of-source build, the tool acts in the source directory, where it generates the binding files.

General Workflow

The above CMakeLists.txt file is designed to be used in two different modes, depending on the value of the Update_Python_Bindings option:

  • Developer Mode (Update_Python_Bindings == ON)[default]:

    • The bindings are automatically regenerated using clair-c2py when the C++ code or the options TOML file are modified.

    • At the end, the regenerated bindings should be committed along with the rest of the source (they are produced in the source directory).

    • Any C++20-compliant compiler can be used to compile the module, even though clair-c2py itself relies on Clang and its libraries.

  • User Mode (Update_Python_Bindings == OFF):

    • The compilation uses the bindings already present in the source, as they are included in my_module.cpp.

    • clair-c2py and clair in general are not needed.

    • Any C++20-compliant compiler can be used.

Previous Next

© Copyright 2024 - 2026, The Simons Foundation, author: O. Parcollet.