Getting started
Installation
Install CastXML (required) and Clang (recommended). On Ubuntu:
sudo apt-get install castxml clang
Clone the repository and install cppwg:
git clone https://github.com/Chaste/cppwg.git
cd cppwg
pip install .
Command-line usage
usage: cppwg [-h] [-w WRAPPER_ROOT] [-p PACKAGE_INFO] [-c CASTXML_BINARY]
[-m CASTXML_COMPILER] [--std STD] [--castxml_cflags CASTXML_CFLAGS]
[-i [INCLUDES ...]] [--overwrite] [-q] [-l [LOGFILE]] [-v] SOURCE_ROOT
Generate Python Wrappers for C++ code
positional arguments:
SOURCE_ROOT Path to the root directory of the input C++ source code.
options:
-h, --help show this help message and exit
-w, --wrapper_root WRAPPER_ROOT
Path to the output directory for the Pybind11 wrapper code.
-p, --package_info PACKAGE_INFO
Path to the package info file.
-c, --castxml_binary CASTXML_BINARY
Path to the castxml executable.
-m, --castxml_compiler CASTXML_COMPILER
Path to a compiler to be used by castxml.
--std STD C++ standard e.g. c++17.
--castxml_cflags CASTXML_CFLAGS
Additional flags for the castxml clang frontend. Pass
values starting with "-" using "=" e.g.
--castxml_cflags="-Wno-deprecated".
-i, --includes [INCLUDES ...]
List of paths to include directories.
--overwrite Force rewrite of all wrapper files, even if unchanged.
-q, --quiet Disable informational messages.
-l, --logfile [LOGFILE]
Output log messages to a file.
-v, --version Print cppwg version.
A worked example
The project in examples/shapes demonstrates cppwg usage. We can walk through
the process with the Rectangle class in examples/shapes/src/cpp/primitives.
Rectangle.hpp
class Rectangle : public Shape<2>
{
public:
Rectangle(double width=2.0, double height=1.0);
~Rectangle();
//...
};
cppwg needs a configuration file that lists the classes to wrap and describes the
structure of the Python package to be created. There is an example at
examples/shapes/wrapper/package_info.yaml.
The extract below describes a Python package named pyshapes with a
primitives module that includes the Rectangle class:
name: pyshapes
modules:
- name: primitives
classes:
- name: Rectangle
See the configuration reference for all available options.
To generate the wrappers:
cd examples/shapes
cppwg src/cpp \
--wrapper_root wrapper \
--package_info wrapper/package_info.yaml \
--includes src/cpp/geometry src/cpp/math_funcs src/cpp/primitives \
--std c++17
For the Rectangle class, this creates two files in
examples/shapes/wrapper/primitives.
Rectangle.cppwg.hpp
void register_Rectangle_class(pybind11::module &m);
Rectangle.cppwg.cpp
namespace py = pybind11;
void register_Rectangle_class(py::module &m)
{
py::class_<Rectangle, Shape<2> >(m, "Rectangle")
.def(py::init<double, double>(), py::arg("width")=2, py::arg("height")=1)
//...
;
}
The wrapper for Rectangle is registered in the primitives module.
primitives.main.cpp
PYBIND11_MODULE(_pyshapes_primitives, m)
{
register_Rectangle_class(m);
//...
}
To compile the wrappers into a Python package:
mkdir build && cd build
cmake ..
make
The compiled wrapper code can now be imported in Python:
from pyshapes import Rectangle
r = Rectangle(4, 5)
Use examples/shapes or examples/cells as a starting point for your own
project.