You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							217 lines
						
					
					
						
							8.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							217 lines
						
					
					
						
							8.8 KiB
						
					
					
				| Build systems | |
| ############# | |
|  | |
| Building with setuptools | |
| ======================== | |
|  | |
| For projects on PyPI, building with setuptools is the way to go. Sylvain Corlay | |
| has kindly provided an example project which shows how to set up everything, | |
| including automatic generation of documentation using Sphinx. Please refer to | |
| the [python_example]_ repository. | |
|  | |
| .. [python_example] https://github.com/pybind/python_example | |
|  | |
| Building with cppimport | |
| ======================== | |
|  | |
|  cppimport is a small Python import hook that determines whether there is a C++ | |
|  source file whose name matches the requested module. If there is, the file is | |
|  compiled as a Python extension using pybind11 and placed in the same folder as | |
|  the C++ source file. Python is then able to find the module and load it. | |
|  | |
| .. [cppimport] https://github.com/tbenthompson/cppimport | |
|  | |
| .. _cmake: | |
|  | |
| Building with CMake | |
| =================== | |
|  | |
| For C++ codebases that have an existing CMake-based build system, a Python | |
| extension module can be created with just a few lines of code: | |
|  | |
| .. code-block:: cmake | |
| 
 | |
|     cmake_minimum_required(VERSION 2.8.12) | |
|     project(example) | |
|  | |
|     add_subdirectory(pybind11) | |
|     pybind11_add_module(example example.cpp) | |
|  | |
| This assumes that the pybind11 repository is located in a subdirectory named | |
| :file:`pybind11` and that the code is located in a file named :file:`example.cpp`. | |
| The CMake command ``add_subdirectory`` will import the pybind11 project which | |
| provides the ``pybind11_add_module`` function. It will take care of all the | |
| details needed to build a Python extension module on any platform. | |
|  | |
| A working sample project, including a way to invoke CMake from :file:`setup.py` for | |
| PyPI integration, can be found in the [cmake_example]_  repository. | |
|  | |
| .. [cmake_example] https://github.com/pybind/cmake_example | |
|  | |
| pybind11_add_module | |
| ------------------- | |
|  | |
| To ease the creation of Python extension modules, pybind11 provides a CMake | |
| function with the following signature: | |
|  | |
| .. code-block:: cmake | |
| 
 | |
|     pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL] | |
|                         [NO_EXTRAS] [THIN_LTO] source1 [source2 ...]) | |
|  | |
| This function behaves very much like CMake's builtin ``add_library`` (in fact, | |
| it's a wrapper function around that command). It will add a library target | |
| called ``<name>`` to be built from the listed source files. In addition, it | |
| will take care of all the Python-specific compiler and linker flags as well | |
| as the OS- and Python-version-specific file extension. The produced target | |
| ``<name>`` can be further manipulated with regular CMake commands. | |
|  | |
| ``MODULE`` or ``SHARED`` may be given to specify the type of library. If no | |
| type is given, ``MODULE`` is used by default which ensures the creation of a | |
| Python-exclusive module. Specifying ``SHARED`` will create a more traditional | |
| dynamic library which can also be linked from elsewhere. ``EXCLUDE_FROM_ALL`` | |
| removes this target from the default build (see CMake docs for details). | |
|  | |
| Since pybind11 is a template library, ``pybind11_add_module`` adds compiler | |
| flags to ensure high quality code generation without bloat arising from long | |
| symbol names and duplication of code in different translation units. The | |
| additional flags enable LTO (Link Time Optimization), set default visibility | |
| to *hidden* and strip unneeded symbols. See the :ref:`FAQ entry <faq:symhidden>` | |
| for a more detailed explanation. These optimizations are never applied in | |
| ``Debug`` mode. If ``NO_EXTRAS`` is given, they will always be disabled, even | |
| in ``Release`` mode. However, this will result in code bloat and is generally | |
| not recommended. | |
|  | |
| As stated above, LTO is enabled by default. Some newer compilers also support | |
| different flavors of LTO such as `ThinLTO`_. Setting ``THIN_LTO`` will cause | |
| the function to prefer this flavor if available. The function falls back to | |
| regular LTO if ``-flto=thin`` is not available. | |
|  | |
| .. _ThinLTO: http://clang.llvm.org/docs/ThinLTO.html | |
|  | |
| Configuration variables | |
| ----------------------- | |
|  | |
| By default, pybind11 will compile modules with the C++14 standard, if available | |
| on the target compiler, falling back to C++11 if C++14 support is not | |
| available.  Note, however, that this default is subject to change: future | |
| pybind11 releases are expected to migrate to newer C++ standards as they become | |
| available.  To override this, the standard flag can be given explicitly in | |
| ``PYBIND11_CPP_STANDARD``: | |
|  | |
| .. code-block:: cmake | |
| 
 | |
|     # Use just one of these: | |
|     # GCC/clang: | |
|     set(PYBIND11_CPP_STANDARD -std=c++11) | |
|     set(PYBIND11_CPP_STANDARD -std=c++14) | |
|     set(PYBIND11_CPP_STANDARD -std=c++1z) # Experimental C++17 support | |
|     # MSVC: | |
|     set(PYBIND11_CPP_STANDARD /std:c++14) | |
|     set(PYBIND11_CPP_STANDARD /std:c++latest) # Enables some MSVC C++17 features | |
|  | |
|     add_subdirectory(pybind11)  # or find_package(pybind11) | |
|  | |
| Note that this and all other configuration variables must be set **before** the | |
| call to ``add_subdirectory`` or ``find_package``. The variables can also be set | |
| when calling CMake from the command line using the ``-D<variable>=<value>`` flag. | |
|  | |
| The target Python version can be selected by setting ``PYBIND11_PYTHON_VERSION`` | |
| or an exact Python installation can be specified with ``PYTHON_EXECUTABLE``. | |
| For example: | |
|  | |
| .. code-block:: bash | |
| 
 | |
|     cmake -DPYBIND11_PYTHON_VERSION=3.6 .. | |
|     # or | |
|     cmake -DPYTHON_EXECUTABLE=path/to/python .. | |
| 
 | |
| find_package vs. add_subdirectory | |
| --------------------------------- | |
|  | |
| For CMake-based projects that don't include the pybind11 repository internally, | |
| an external installation can be detected through ``find_package(pybind11)``. | |
| See the `Config file`_ docstring for details of relevant CMake variables. | |
|  | |
| .. code-block:: cmake | |
| 
 | |
|     cmake_minimum_required(VERSION 2.8.12) | |
|     project(example) | |
|  | |
|     find_package(pybind11 REQUIRED) | |
|     pybind11_add_module(example example.cpp) | |
|  | |
| Once detected, the aforementioned ``pybind11_add_module`` can be employed as | |
| before. The function usage and configuration variables are identical no matter | |
| if pybind11 is added as a subdirectory or found as an installed package. You | |
| can refer to the same [cmake_example]_ repository for a full sample project | |
| -- just swap out ``add_subdirectory`` for ``find_package``. | |
|  | |
| .. _Config file: https://github.com/pybind/pybind11/blob/master/tools/pybind11Config.cmake.in | |
|  | |
| Advanced: interface library target | |
| ---------------------------------- | |
|  | |
| When using a version of CMake greater than 3.0, pybind11 can additionally | |
| be used as a special *interface library* . The target ``pybind11::module`` | |
| is available with pybind11 headers, Python headers and libraries as needed, | |
| and C++ compile definitions attached. This target is suitable for linking | |
| to an independently constructed (through ``add_library``, not | |
| ``pybind11_add_module``) target in the consuming project. | |
|  | |
| .. code-block:: cmake | |
| 
 | |
|     cmake_minimum_required(VERSION 3.0) | |
|     project(example) | |
|  | |
|     find_package(pybind11 REQUIRED)  # or add_subdirectory(pybind11) | |
|  | |
|     add_library(example MODULE main.cpp) | |
|     target_link_libraries(example PRIVATE pybind11::module) | |
|     set_target_properties(example PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}" | |
|                                              SUFFIX "${PYTHON_MODULE_EXTENSION}") | |
|  | |
| .. warning:: | |
|  | |
|     Since pybind11 is a metatemplate library, it is crucial that certain | |
|     compiler flags are provided to ensure high quality code generation. In | |
|     contrast to the ``pybind11_add_module()`` command, the CMake interface | |
|     library only provides the *minimal* set of parameters to ensure that the | |
|     code using pybind11 compiles, but it does **not** pass these extra compiler | |
|     flags (i.e. this is up to you). | |
|  | |
|     These include Link Time Optimization (``-flto`` on GCC/Clang/ICPC, ``/GL`` | |
|     and ``/LTCG`` on Visual Studio). Default-hidden symbols on GCC/Clang/ICPC | |
|     (``-fvisibility=hidden``) and .OBJ files with many sections on Visual Studio | |
|     (``/bigobj``). The :ref:`FAQ <faq:symhidden>` contains an | |
|     explanation on why these are needed. | |
|  | |
| Embedding the Python interpreter | |
| -------------------------------- | |
|  | |
| In addition to extension modules, pybind11 also supports embedding Python into | |
| a C++ executable or library. In CMake, simply link with the ``pybind11::embed`` | |
| target. It provides everything needed to get the interpreter running. The Python | |
| headers and libraries are attached to the target. Unlike ``pybind11::module``, | |
| there is no need to manually set any additional properties here. For more | |
| information about usage in C++, see :doc:`/advanced/embedding`. | |
|  | |
| .. code-block:: cmake | |
| 
 | |
|     cmake_minimum_required(VERSION 3.0) | |
|     project(example) | |
|  | |
|     find_package(pybind11 REQUIRED)  # or add_subdirectory(pybind11) | |
|  | |
|     add_executable(example main.cpp) | |
|     target_link_libraries(example PRIVATE pybind11::embed) | |
|  | |
|  | |
| Generating binding code automatically | |
| ===================================== | |
|  | |
| The ``Binder`` project is a tool for automatic generation of pybind11 binding | |
| code by introspecting existing C++ codebases using LLVM/Clang. See the | |
| [binder]_ documentation for details. | |
|  | |
| .. [binder] http://cppbinder.readthedocs.io/en/latest/about.html
 |