.. _generating-pybind11-bindings:

Generating pybind11 bindings
============================

SMTK's pybind11_ bindings are generated via python scripts that use
pygccxml_ to construct a C++ header file corresponding to each header
file in SMTK, and a C++ source file for each namespace in
SMTK. Generally, python modules are a reflection of C++ namespaces
(which are generally contained within a subdirectory). The generated
pybind11 C++ files for each module are in the ``pybind`` subdirectory of
the module.

To generate a C++ header file for a new SMTK class, use
``[smtk-root-directory]/utilities/python/cpp_to_pybind11.py`` with the
appropriate arguments for the header file, project root directory,
include directories (e.g. ``-I "[smtk-build-directory]
[smtk-root-directory]/thirdparty/cJSON path/to/vtk/include"``) and
generated file prefix; the module's binding source file (also located
in the ``pybind`` subdirectory of the module) must then be updated to
call the functions defined in the generated header file. To generate
all of the C++ headers and the module C++ source file for a namespace
at once, use
``[smtk-root-directory]/utilities/python/generate_pybind11_module.py``
with the appropriate arguments for the module directory, project root
directory and include directories.

The generated bindings should be treated as a starting point for
customization to create a more *pythonic* interface.

.. _pybind11: http://pybind11.readthedocs.io
.. _pygccxml: http://pygccxml.readthedocs.io
