blob: ca4dc756e633c79ff3ee0d5e9766ef6bc670a40a [file] [log] [blame]
Ivan Smirnov5cbfda52017-08-30 20:58:43 +01001.. _compiling:
2
Wenzel Jakob4a48afb2016-03-09 21:31:21 +01003Build systems
4#############
5
6Building with setuptools
7========================
8
9For projects on PyPI, building with setuptools is the way to go. Sylvain Corlay
10has kindly provided an example project which shows how to set up everything,
11including automatic generation of documentation using Sphinx. Please refer to
Wenzel Jakobca8dc082016-06-03 14:24:17 +020012the [python_example]_ repository.
Wenzel Jakob4a48afb2016-03-09 21:31:21 +010013
Wenzel Jakobca8dc082016-06-03 14:24:17 +020014.. [python_example] https://github.com/pybind/python_example
Wenzel Jakob4a48afb2016-03-09 21:31:21 +010015
Wenzel Jakoba439cca2016-05-17 10:47:52 +020016Building with cppimport
17========================
18
Dean Moldovan8665ee82017-08-17 15:01:43 +020019[cppimport]_ is a small Python import hook that determines whether there is a C++
20source file whose name matches the requested module. If there is, the file is
21compiled as a Python extension using pybind11 and placed in the same folder as
22the C++ source file. Python is then able to find the module and load it.
Wenzel Jakoba439cca2016-05-17 10:47:52 +020023
24.. [cppimport] https://github.com/tbenthompson/cppimport
25
Wenzel Jakob28f98aa2015-10-13 02:57:16 +020026.. _cmake:
27
28Building with CMake
29===================
30
Wenzel Jakobfe342412016-09-06 13:02:29 +090031For C++ codebases that have an existing CMake-based build system, a Python
Dean Moldovan24ddf4b2016-05-27 00:11:52 +020032extension module can be created with just a few lines of code:
Wenzel Jakob28f98aa2015-10-13 02:57:16 +020033
34.. code-block:: cmake
35
Henry Schreiner1729aae2020-08-19 12:26:26 -040036 cmake_minimum_required(VERSION 3.4...3.18)
37 project(example LANGUAGES CXX)
Wenzel Jakob28f98aa2015-10-13 02:57:16 +020038
Dean Moldovan24ddf4b2016-05-27 00:11:52 +020039 add_subdirectory(pybind11)
40 pybind11_add_module(example example.cpp)
Wenzel Jakobf64feaf2016-04-28 14:33:45 +020041
Wenzel Jakobfe342412016-09-06 13:02:29 +090042This assumes that the pybind11 repository is located in a subdirectory named
Dean Moldovan24ddf4b2016-05-27 00:11:52 +020043:file:`pybind11` and that the code is located in a file named :file:`example.cpp`.
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010044The CMake command ``add_subdirectory`` will import the pybind11 project which
45provides the ``pybind11_add_module`` function. It will take care of all the
46details needed to build a Python extension module on any platform.
Wenzel Jakob28f98aa2015-10-13 02:57:16 +020047
Dean Moldovan24ddf4b2016-05-27 00:11:52 +020048A working sample project, including a way to invoke CMake from :file:`setup.py` for
49PyPI integration, can be found in the [cmake_example]_ repository.
Wenzel Jakobcaa9d442016-01-17 22:36:34 +010050
Wenzel Jakobaa79af02016-06-03 12:23:24 +020051.. [cmake_example] https://github.com/pybind/cmake_example
Lori A. Burns5cafc992016-12-13 10:55:38 -050052
Henry Schreiner1729aae2020-08-19 12:26:26 -040053.. versionchanged:: 2.6
54 CMake 3.4+ is required.
55
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010056pybind11_add_module
57-------------------
Lori A. Burns5cafc992016-12-13 10:55:38 -050058
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010059To ease the creation of Python extension modules, pybind11 provides a CMake
60function with the following signature:
61
62.. code-block:: cmake
63
64 pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL]
Wenzel Jakob36c666f2020-09-04 23:31:05 +020065 [NO_EXTRAS] [THIN_LTO] [OPT_SIZE] source1 [source2 ...])
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010066
67This function behaves very much like CMake's builtin ``add_library`` (in fact,
68it's a wrapper function around that command). It will add a library target
69called ``<name>`` to be built from the listed source files. In addition, it
70will take care of all the Python-specific compiler and linker flags as well
71as the OS- and Python-version-specific file extension. The produced target
72``<name>`` can be further manipulated with regular CMake commands.
73
74``MODULE`` or ``SHARED`` may be given to specify the type of library. If no
75type is given, ``MODULE`` is used by default which ensures the creation of a
76Python-exclusive module. Specifying ``SHARED`` will create a more traditional
77dynamic library which can also be linked from elsewhere. ``EXCLUDE_FROM_ALL``
78removes this target from the default build (see CMake docs for details).
79
80Since pybind11 is a template library, ``pybind11_add_module`` adds compiler
81flags to ensure high quality code generation without bloat arising from long
Jason Rhinelander97aa54f2017-08-10 12:08:42 -040082symbol names and duplication of code in different translation units. It
83sets default visibility to *hidden*, which is required for some pybind11
84features and functionality when attempting to load multiple pybind11 modules
85compiled under different pybind11 versions. It also adds additional flags
86enabling LTO (Link Time Optimization) and strip unneeded symbols. See the
87:ref:`FAQ entry <faq:symhidden>` for a more detailed explanation. These
88latter optimizations are never applied in ``Debug`` mode. If ``NO_EXTRAS`` is
89given, they will always be disabled, even in ``Release`` mode. However, this
90will result in code bloat and is generally not recommended.
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010091
92As stated above, LTO is enabled by default. Some newer compilers also support
93different flavors of LTO such as `ThinLTO`_. Setting ``THIN_LTO`` will cause
94the function to prefer this flavor if available. The function falls back to
Henry Schreiner1729aae2020-08-19 12:26:26 -040095regular LTO if ``-flto=thin`` is not available. If
96``CMAKE_INTERPROCEDURAL_OPTIMIZATION`` is set (either ON or OFF), then that
97will be respected instead of the built-in flag search.
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010098
Wenzel Jakob36c666f2020-09-04 23:31:05 +020099The ``OPT_SIZE`` flag enables size-based optimization equivalent to the
100standard ``/Os`` or ``-Os`` compiler flags and the ``MinSizeRel`` build type,
101which avoid optimizations that that can substantially increase the size of the
102resulting binary. This flag is particularly useful in projects that are split
103into performance-critical parts and associated bindings. In this case, we can
104compile the project in release mode (and hence, optimize performance globally),
105and specify ``OPT_SIZE`` for the binding target, where size might be the main
106concern as performance is often less critical here. A ~25% size reduction has
107been observed in practice. This flag only changes the optimization behavior at
108a per-target level and takes precedence over the global CMake build type
109(``Release``, ``RelWithDebInfo``) except for ``Debug`` builds, where
110optimizations remain disabled.
111
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100112.. _ThinLTO: http://clang.llvm.org/docs/ThinLTO.html
113
114Configuration variables
115-----------------------
116
Henry Schreiner6ec17752020-07-28 00:43:12 -0400117By default, pybind11 will compile modules with the compiler default or the
Henry Schreiner1651c322020-07-30 16:04:26 -0400118minimum standard required by pybind11, whichever is higher. You can set the
Henry Schreiner6ec17752020-07-28 00:43:12 -0400119standard explicitly with
120`CMAKE_CXX_STANDARD <https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_STANDARD.html>`_:
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100121
122.. code-block:: cmake
123
Henry Schreiner1b92cd12020-07-29 15:02:53 -0400124 set(CMAKE_CXX_STANDARD 14) # or 11, 14, 17, 20
125 set(CMAKE_CXX_STANDARD_REQUIRED ON) # optional, ensure standard is supported
126 set(CMAKE_CXX_EXTENSIONS OFF) # optional, keep compiler extensionsn off
Jason Rhinelander77710ff2017-05-09 14:37:48 -0400127
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100128
Henry Schreiner6ec17752020-07-28 00:43:12 -0400129The variables can also be set when calling CMake from the command line using
130the ``-D<variable>=<value>`` flag. You can also manually set ``CXX_STANDARD``
131on a target or use ``target_compile_features`` on your targets - anything that
132CMake supports.
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100133
Henry Schreiner1729aae2020-08-19 12:26:26 -0400134Classic Python support: The target Python version can be selected by setting
135``PYBIND11_PYTHON_VERSION`` or an exact Python installation can be specified
136with ``PYTHON_EXECUTABLE``. For example:
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100137
138.. code-block:: bash
139
140 cmake -DPYBIND11_PYTHON_VERSION=3.6 ..
Henry Schreiner1b92cd12020-07-29 15:02:53 -0400141
142 # Another method:
143 cmake -DPYTHON_EXECUTABLE=/path/to/python ..
144
Henry Schreiner1651c322020-07-30 16:04:26 -0400145 # This often is a good way to get the current Python, works in environments:
Henry Schreiner6ec17752020-07-28 00:43:12 -0400146 cmake -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") ..
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100147
Henry Schreiner1729aae2020-08-19 12:26:26 -0400148
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100149find_package vs. add_subdirectory
150---------------------------------
151
152For CMake-based projects that don't include the pybind11 repository internally,
153an external installation can be detected through ``find_package(pybind11)``.
154See the `Config file`_ docstring for details of relevant CMake variables.
Lori A. Burns5cafc992016-12-13 10:55:38 -0500155
156.. code-block:: cmake
157
Henry Schreiner1729aae2020-08-19 12:26:26 -0400158 cmake_minimum_required(VERSION 3.4...3.18)
159 project(example LANGUAGES CXX)
Lori A. Burns5cafc992016-12-13 10:55:38 -0500160
161 find_package(pybind11 REQUIRED)
162 pybind11_add_module(example example.cpp)
163
nstelzenc2514342019-06-10 16:35:36 +0200164Note that ``find_package(pybind11)`` will only work correctly if pybind11
165has been correctly installed on the system, e. g. after downloading or cloning
166the pybind11 repository :
167
168.. code-block:: bash
169
Henry Schreiner1b92cd12020-07-29 15:02:53 -0400170 # Classic CMake
nstelzenc2514342019-06-10 16:35:36 +0200171 cd pybind11
172 mkdir build
173 cd build
174 cmake ..
175 make install
176
Henry Schreiner1b92cd12020-07-29 15:02:53 -0400177 # CMake 3.15+
178 cd pybind11
179 cmake -S . -B build
180 cmake --build build -j 2 # Build on 2 cores
181 cmake --install build
182
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100183Once detected, the aforementioned ``pybind11_add_module`` can be employed as
184before. The function usage and configuration variables are identical no matter
185if pybind11 is added as a subdirectory or found as an installed package. You
186can refer to the same [cmake_example]_ repository for a full sample project
187-- just swap out ``add_subdirectory`` for ``find_package``.
Lori A. Burns5cafc992016-12-13 10:55:38 -0500188
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100189.. _Config file: https://github.com/pybind/pybind11/blob/master/tools/pybind11Config.cmake.in
190
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100191
Henry Schreiner1729aae2020-08-19 12:26:26 -0400192.. _find-python-mode:
193
194FindPython mode
195---------------
196
197CMake 3.12+ (3.15+ recommended) added a new module called FindPython that had a
198highly improved search algorithm and modern targets and tools. If you use
199FindPython, pybind11 will detect this and use the existing targets instead:
Lori A. Burns5cafc992016-12-13 10:55:38 -0500200
201.. code-block:: cmake
202
Henry Schreiner1729aae2020-08-19 12:26:26 -0400203 cmake_minumum_required(VERSION 3.15...3.18)
204 project(example LANGUAGES CXX)
205
206 find_package(Python COMPONENTS Interpreter Development REQUIRED)
207 find_package(pybind11 CONFIG REQUIRED)
208 # or add_subdirectory(pybind11)
209
210 pybind11_add_module(example example.cpp)
211
212You can also use the targets (as listed below) with FindPython. If you define
213``PYBIND11_FINDPYTHON``, pybind11 will perform the FindPython step for you
214(mostly useful when building pybind11's own tests, or as a way to change search
215algorithms from the CMake invocation, with ``-DPYBIND11_FINDPYTHON=ON``.
216
217.. warning::
218
219 If you use FindPython2 and FindPython3 to dual-target Python, use the
220 individual targets listed below, and avoid targets that directly include
221 Python parts.
222
223There are `many ways to hint or force a discovery of a specific Python
224installation <https://cmake.org/cmake/help/latest/module/FindPython.html>`_),
225setting ``Python_ROOT_DIR`` may be the most common one (though with
226virtualenv/venv support, and Conda support, this tends to find the correct
227Python version more often than the old system did).
228
229.. versionadded:: 2.6
230
231Advanced: interface library targets
232-----------------------------------
233
234Pybind11 supports modern CMake usage patterns with a set of interface targets,
235available in all modes. The targets provided are:
236
237 ``pybind11::headers``
238 Just the pybind11 headers and minimum compile requirements
239
240 ``pybind11::python2_no_register``
241 Quiets the warning/error when mixing C++14 or higher and Python 2
242
243 ``pybind11::pybind11``
244 Python headers + ``pybind11::headers`` + ``pybind11::python2_no_register`` (Python 2 only)
245
246 ``pybind11::python_link_helper``
247 Just the "linking" part of pybind11:module
248
249 ``pybind11::module``
250 Everything for extension modules - ``pybind11::pybind11`` + ``Python::Module`` (FindPython CMake 3.15+) or ``pybind11::python_link_helper``
251
252 ``pybind11::embed``
253 Everything for embedding the Python interpreter - ``pybind11::pybind11`` + ``Python::Embed`` (FindPython) or Python libs
254
255 ``pybind11::lto`` / ``pybind11::thin_lto``
256 An alternative to `INTERPROCEDURAL_OPTIMIZATION` for adding link-time optimization.
257
258 ``pybind11::windows_extras``
259 ``/bigobj`` and ``/mp`` for MSVC.
260
Wenzel Jakob36c666f2020-09-04 23:31:05 +0200261 ``pybind11::opt_size``
262 ``/Os`` for MSVC, ``-Os`` for other compilers. Does nothing for debug builds.
263
Henry Schreiner1729aae2020-08-19 12:26:26 -0400264Two helper functions are also provided:
265
266 ``pybind11_strip(target)``
267 Strips a target (uses ``CMAKE_STRIP`` after the target is built)
268
269 ``pybind11_extension(target)``
270 Sets the correct extension (with SOABI) for a target.
271
272You can use these targets to build complex applications. For example, the
273``add_python_module`` function is identical to:
274
275.. code-block:: cmake
276
277 cmake_minimum_required(VERSION 3.4)
278 project(example LANGUAGES CXX)
Lori A. Burns5cafc992016-12-13 10:55:38 -0500279
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100280 find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
Lori A. Burns5cafc992016-12-13 10:55:38 -0500281
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100282 add_library(example MODULE main.cpp)
Henry Schreiner1729aae2020-08-19 12:26:26 -0400283
284 target_link_libraries(example PRIVATE pybind11::module pybind11::lto pybind11::windows_extras)
285
286 pybind11_extension(example)
287 pybind11_strip(example)
288
289 set_target_properties(example PROPERTIES CXX_VISIBILITY_PRESET "hidden"
290 CUDA_VISIBILITY_PRESET "hidden")
291
292Instead of setting properties, you can set ``CMAKE_*`` variables to initialize these correctly.
Lori A. Burns5cafc992016-12-13 10:55:38 -0500293
294.. warning::
295
296 Since pybind11 is a metatemplate library, it is crucial that certain
297 compiler flags are provided to ensure high quality code generation. In
298 contrast to the ``pybind11_add_module()`` command, the CMake interface
Henry Schreiner1729aae2020-08-19 12:26:26 -0400299 provides a *composable* set of targets to ensure that you retain flexibility.
300 It can be expecially important to provide or set these properties; the
301 :ref:`FAQ <faq:symhidden>` contains an explanation on why these are needed.
Lori A. Burns5cafc992016-12-13 10:55:38 -0500302
Henry Schreiner1729aae2020-08-19 12:26:26 -0400303.. versionadded:: 2.6
Wenzel Jakobf3de2d52016-12-26 13:34:28 +0100304
Henry Schreiner1729aae2020-08-19 12:26:26 -0400305.. _nopython-mode:
Henry Schreiner6ec17752020-07-28 00:43:12 -0400306
Henry Schreiner1729aae2020-08-19 12:26:26 -0400307Advanced: NOPYTHON mode
308-----------------------
Henry Schreiner6ec17752020-07-28 00:43:12 -0400309
Henry Schreiner1729aae2020-08-19 12:26:26 -0400310If you want complete control, you can set ``PYBIND11_NOPYTHON`` to completely
311disable Python integration (this also happens if you run ``FindPython2`` and
312``FindPython3`` without running ``FindPython``). This gives you complete
313freedom to integrate into an existing system (like `Scikit-Build's
314<https://scikit-build.readthedocs.io>`_ ``PythonExtensions``).
315``pybind11_add_module`` and ``pybind11_extension`` will be unavailable, and the
316targets will be missing any Python specific behavior.
Henry Schreiner6ec17752020-07-28 00:43:12 -0400317
Henry Schreiner1729aae2020-08-19 12:26:26 -0400318.. versionadded:: 2.6
Henry Schreiner6ec17752020-07-28 00:43:12 -0400319
Dean Moldovan6d2411f2017-04-22 23:24:13 +0200320Embedding the Python interpreter
321--------------------------------
322
323In addition to extension modules, pybind11 also supports embedding Python into
324a C++ executable or library. In CMake, simply link with the ``pybind11::embed``
325target. It provides everything needed to get the interpreter running. The Python
326headers and libraries are attached to the target. Unlike ``pybind11::module``,
327there is no need to manually set any additional properties here. For more
328information about usage in C++, see :doc:`/advanced/embedding`.
329
330.. code-block:: cmake
331
Henry Schreiner1729aae2020-08-19 12:26:26 -0400332 cmake_minimum_required(VERSION 3.4...3.18)
333 project(example LANGUAGES CXX)
Dean Moldovan6d2411f2017-04-22 23:24:13 +0200334
335 find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
336
Dean Moldovan8f6c1292017-05-31 13:48:39 +0200337 add_executable(example main.cpp)
Dean Moldovan6d2411f2017-04-22 23:24:13 +0200338 target_link_libraries(example PRIVATE pybind11::embed)
339
Ivan Smirnov5cbfda52017-08-30 20:58:43 +0100340.. _building_manually:
341
342Building manually
343=================
344
345pybind11 is a header-only library, hence it is not necessary to link against
346any special libraries and there are no intermediate (magic) translation steps.
347
348On Linux, you can compile an example such as the one given in
349:ref:`simple_example` using the following command:
350
351.. code-block:: bash
352
353 $ c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`
354
355The flags given here assume that you're using Python 3. For Python 2, just
356change the executable appropriately (to ``python`` or ``python2``).
357
358The ``python3 -m pybind11 --includes`` command fetches the include paths for
359both pybind11 and Python headers. This assumes that pybind11 has been installed
360using ``pip`` or ``conda``. If it hasn't, you can also manually specify
361``-I <path-to-pybind11>/include`` together with the Python includes path
362``python3-config --includes``.
363
364Note that Python 2.7 modules don't use a special suffix, so you should simply
365use ``example.so`` instead of ``example`python3-config --extension-suffix```.
366Besides, the ``--extension-suffix`` option may or may not be available, depending
367on the distribution; in the latter case, the module extension can be manually
368set to ``.so``.
369
370On Mac OS: the build command is almost the same but it also requires passing
371the ``-undefined dynamic_lookup`` flag so as to ignore missing symbols when
372building the module:
373
374.. code-block:: bash
375
376 $ c++ -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`
377
378In general, it is advisable to include several additional build parameters
379that can considerably reduce the size of the created binary. Refer to section
380:ref:`cmake` for a detailed example of a suitable cross-platform CMake-based
381build system that works on all platforms including Windows.
382
383.. note::
384
385 On Linux and macOS, it's better to (intentionally) not link against
386 ``libpython``. The symbols will be resolved when the extension library
387 is loaded into a Python binary. This is preferable because you might
388 have several different installations of a given Python version (e.g. the
389 system-provided Python, and one that ships with a piece of commercial
390 software). In this way, the plugin will work with both versions, instead
391 of possibly importing a second Python library into a process that already
392 contains one (which will lead to a segfault).
Dean Moldovan6d2411f2017-04-22 23:24:13 +0200393
Wenzel Jakobf3de2d52016-12-26 13:34:28 +0100394Generating binding code automatically
395=====================================
396
397The ``Binder`` project is a tool for automatic generation of pybind11 binding
398code by introspecting existing C++ codebases using LLVM/Clang. See the
399[binder]_ documentation for details.
400
401.. [binder] http://cppbinder.readthedocs.io/en/latest/about.html
Dustin Spicuzza2c4cd842019-11-24 02:36:48 -0500402
403[AutoWIG]_ is a Python library that wraps automatically compiled libraries into
404high-level languages. It parses C++ code using LLVM/Clang technologies and
405generates the wrappers using the Mako templating engine. The approach is automatic,
406extensible, and applies to very complex C++ libraries, composed of thousands of
407classes or incorporating modern meta-programming constructs.
408
409.. [AutoWIG] https://github.com/StatisKit/AutoWIG
Dustin Spicuzza6f3470f2020-08-10 16:10:45 -0400410
411[robotpy-build]_ is a is a pure python, cross platform build tool that aims to
412simplify creation of python wheels for pybind11 projects, and provide
413cross-project dependency management. Additionally, it is able to autogenerate
414customizable pybind11-based wrappers by parsing C++ header files.
415
416.. [robotpy-build] https://robotpy-build.readthedocs.io