@@ -39,30 +39,88 @@ extension module can be created with just a few lines of code:
39
39
40
40
This assumes that the pybind11 repository is located in a subdirectory named
41
41
:file: `pybind11 ` and that the code is located in a file named :file: `example.cpp `.
42
- The CMake command ``add_subdirectory `` will import a function with the signature
43
- ``pybind11_add_module(<name> source1 [source2 ...]) ``. It will take care of all
44
- the details needed to build a Python extension module on any platform.
45
-
46
- The target Python version can be selected by setting the ``PYBIND11_PYTHON_VERSION ``
47
- variable before adding the pybind11 subdirectory. Alternatively, an exact Python
48
- installation can be specified by setting ``PYTHON_EXECUTABLE ``.
42
+ The CMake command ``add_subdirectory `` will import the pybind11 project which
43
+ provides the ``pybind11_add_module `` function. It will take care of all the
44
+ details needed to build a Python extension module on any platform.
49
45
50
46
A working sample project, including a way to invoke CMake from :file: `setup.py ` for
51
47
PyPI integration, can be found in the [cmake_example ]_ repository.
52
48
53
49
.. [cmake_example ] https://github.com/pybind/cmake_example
54
50
55
- For CMake-based projects that don't include the pybind11
56
- repository internally, an external installation can be detected
57
- through `find_package(pybind11 ... CONFIG ...) `. See the `Config file
58
- <https://github.com/pybind/pybind11/blob/master/tools/pybind11Config.cmake.in> `_
59
- docstring for details of relevant CMake variables.
51
+ pybind11_add_module
52
+ -------------------
53
+
54
+ To ease the creation of Python extension modules, pybind11 provides a CMake
55
+ function with the following signature:
56
+
57
+ .. code-block :: cmake
58
+
59
+ pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL]
60
+ [NO_EXTRAS] [THIN_LTO] source1 [source2 ...])
61
+
62
+ This function behaves very much like CMake's builtin ``add_library `` (in fact,
63
+ it's a wrapper function around that command). It will add a library target
64
+ called ``<name> `` to be built from the listed source files. In addition, it
65
+ will take care of all the Python-specific compiler and linker flags as well
66
+ as the OS- and Python-version-specific file extension. The produced target
67
+ ``<name> `` can be further manipulated with regular CMake commands.
68
+
69
+ ``MODULE `` or ``SHARED `` may be given to specify the type of library. If no
70
+ type is given, ``MODULE `` is used by default which ensures the creation of a
71
+ Python-exclusive module. Specifying ``SHARED `` will create a more traditional
72
+ dynamic library which can also be linked from elsewhere. ``EXCLUDE_FROM_ALL ``
73
+ removes this target from the default build (see CMake docs for details).
74
+
75
+ Since pybind11 is a template library, ``pybind11_add_module `` adds compiler
76
+ flags to ensure high quality code generation without bloat arising from long
77
+ symbol names and duplication of code in different translation units. The
78
+ additional flags enable LTO (Link Time Optimization), set default visibility
79
+ to *hidden * and strip unneeded symbols. See the :ref: `FAQ entry <faq:symhidden >`
80
+ for a more detailed explanation. These optimizations are never applied in
81
+ ``Debug `` mode. If ``NO_EXTRAS `` is given, they will always be disabled, even
82
+ in ``Release `` mode. However, this will result in code bloat and is generally
83
+ not recommended.
84
+
85
+ As stated above, LTO is enabled by default. Some newer compilers also support
86
+ different flavors of LTO such as `ThinLTO `_. Setting ``THIN_LTO `` will cause
87
+ the function to prefer this flavor if available. The function falls back to
88
+ regular LTO if ``-flto=thin `` is not available.
89
+
90
+ .. _ThinLTO : http://clang.llvm.org/docs/ThinLTO.html
91
+
92
+ Configuration variables
93
+ -----------------------
94
+
95
+ By default, pybind11 will compile modules with the latest C++ standard
96
+ available on the target compiler. To override this, the standard flag can
97
+ be given explicitly in ``PYBIND11_CPP_STANDARD ``:
98
+
99
+ .. code-block :: cmake
100
+
101
+ set(PYBIND11_CPP_STANDARD -std=c++11)
102
+ add_subdirectory(pybind11) # or find_package(pybind11)
103
+
104
+ Note that this and all other configuration variables must be set **before ** the
105
+ call to ``add_subdiretory `` or ``find_package ``. The variables can also be set
106
+ when calling CMake from the command line using the ``-D<variable>=<value> `` flag.
107
+
108
+ The target Python version can be selected by setting ``PYBIND11_PYTHON_VERSION ``
109
+ or an exact Python installation can be specified with ``PYTHON_EXECUTABLE ``.
110
+ For example:
60
111
61
- Once detected, and after setting any variables to guide Python and
62
- C++ standard detection, the aforementioned ``pybind11_add_module ``
63
- wrapper to ``add_library `` can be employed as described above (after
64
- ``include(pybind11Tools) ``). This procedure is available when using CMake
65
- >= 2.8.12. A working example can be found at [test_installed_module ]_ .
112
+ .. code-block :: bash
113
+
114
+ cmake -DPYBIND11_PYTHON_VERSION=3.6 ..
115
+ # or
116
+ cmake -DPYTHON_EXECUTABLE=path/to/python ..
117
+
118
+ find_package vs. add_subdirectory
119
+ ---------------------------------
120
+
121
+ For CMake-based projects that don't include the pybind11 repository internally,
122
+ an external installation can be detected through ``find_package(pybind11) ``.
123
+ See the `Config file `_ docstring for details of relevant CMake variables.
66
124
67
125
.. code-block :: cmake
68
126
@@ -72,27 +130,32 @@ wrapper to ``add_library`` can be employed as described above (after
72
130
find_package(pybind11 REQUIRED)
73
131
pybind11_add_module(example example.cpp)
74
132
75
- .. [test_installed_module ] https://github.com/pybind/pybind11/blob/master/tests/test_installed_module/CMakeLists.txt
133
+ Once detected, the aforementioned ``pybind11_add_module `` can be employed as
134
+ before. The function usage and configuration variables are identical no matter
135
+ if pybind11 is added as a subdirectory or found as an installed package. You
136
+ can refer to the same [cmake_example ]_ repository for a full sample project
137
+ -- just swap out ``add_subdirectory `` for ``find_package ``.
138
+
139
+ .. _Config file : https://github.com/pybind/pybind11/blob/master/tools/pybind11Config.cmake.in
140
+
141
+ Advanced: interface library target
142
+ ----------------------------------
76
143
77
- When using a version of CMake greater than 3.0, pybind11 can
78
- additionally be used as a special *interface library * following the
79
- call to ``find_package ``. CMake variables to guide Python and C++
80
- standard detection should be set *before * ``find_package ``. When
81
- ``find_package `` returns, the target ``pybind11::pybind11 `` is
82
- available with pybind11 headers, Python headers and libraries as
83
- needed, and C++ compile definitions attached. This target is suitable
84
- for linking to an independently constructed (through ``add_library ``,
85
- not ``pybind11_add_module ``) target in the consuming project. A working
86
- example can be found at [test_installed_target ]_ .
144
+ When using a version of CMake greater than 3.0, pybind11 can additionally
145
+ be used as a special *interface library * . The target ``pybind11::pybind11 ``
146
+ is available with pybind11 headers, Python headers and libraries as needed,
147
+ and C++ compile definitions attached. This target is suitable for linking
148
+ to an independently constructed (through ``add_library ``, not
149
+ ``pybind11_add_module ``) target in the consuming project.
87
150
88
151
.. code-block :: cmake
89
152
90
153
cmake_minimum_required(VERSION 3.0)
91
154
project(example)
92
155
93
- add_library(example MODULE main.cpp )
156
+ find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11 )
94
157
95
- find_package(pybind11 REQUIRED )
158
+ add_library(example MODULE main.cpp )
96
159
target_link_libraries(example PRIVATE pybind11::pybind11)
97
160
set_target_properties(example PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}"
98
161
SUFFIX "${PYTHON_MODULE_EXTENSION}")
@@ -111,6 +174,3 @@ example can be found at [test_installed_target]_ .
111
174
(``-fvisibility=hidden ``) and .OBJ files with many sections on Visual Studio
112
175
(``/bigobj ``). The :ref: `FAQ <faq:symhidden >` contains an
113
176
explanation on why these are needed.
114
-
115
- .. [test_installed_target ] https://github.com/pybind/pybind11/blob/master/tests/test_installed_target/CMakeLists.txt
116
-
0 commit comments