# Getting started ## Installation Install CastXML (required) and Clang (recommended). On Ubuntu: ```bash sudo apt-get install castxml clang ``` Clone the repository and install cppwg: ```bash git clone https://github.com/Chaste/cppwg.git cd cppwg pip install . ``` ## Command-line usage ```text 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** ```cpp 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: ```yaml name: pyshapes modules: - name: primitives classes: - name: Rectangle ``` See the [configuration reference](configuration.md) for all available options. To generate the wrappers: ```bash 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** ```cpp void register_Rectangle_class(pybind11::module &m); ``` **Rectangle.cppwg.cpp** ```cpp namespace py = pybind11; void register_Rectangle_class(py::module &m) { py::class_ >(m, "Rectangle") .def(py::init(), py::arg("width")=2, py::arg("height")=1) //... ; } ``` The wrapper for `Rectangle` is registered in the `primitives` module. **primitives.main.cpp** ```cpp PYBIND11_MODULE(_pyshapes_primitives, m) { register_Rectangle_class(m); //... } ``` To compile the wrappers into a Python package: ```bash mkdir build && cd build cmake .. make ``` The compiled wrapper code can now be imported in Python: ```python from pyshapes import Rectangle r = Rectangle(4, 5) ``` Use `examples/shapes` or `examples/cells` as a starting point for your own project.