Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 1 | # tools/pybind11Tools.cmake -- Build system for the pybind11 modules |
| 2 | # |
| 3 | # Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch> |
| 4 | # |
| 5 | # All rights reserved. Use of this source code is governed by a |
| 6 | # BSD-style license that can be found in the LICENSE file. |
| 7 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 8 | # Built-in in CMake 3.5+ |
| 9 | include(CMakeParseArguments) |
| 10 | |
| 11 | if(pybind11_FIND_QUIETLY) |
| 12 | set(_pybind11_quiet QUIET) |
| 13 | endif() |
| 14 | |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 15 | # Add a CMake parameter for choosing a desired Python version |
Dean Moldovan | 5b5e3de | 2017-01-06 23:38:00 +0100 | [diff] [blame] | 16 | if(NOT PYBIND11_PYTHON_VERSION) |
Henry Schreiner | 94db5c5 | 2020-07-30 16:20:10 -0400 | [diff] [blame] | 17 | set(PYBIND11_PYTHON_VERSION |
| 18 | "" |
| 19 | CACHE STRING "Python version to use for compiling modules") |
Dean Moldovan | 5b5e3de | 2017-01-06 23:38:00 +0100 | [diff] [blame] | 20 | endif() |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 21 | |
Henry Schreiner | 6ec1775 | 2020-07-28 00:43:12 -0400 | [diff] [blame] | 22 | # A user can set versions manually too |
Henry Schreiner | 94db5c5 | 2020-07-30 16:20:10 -0400 | [diff] [blame] | 23 | set(Python_ADDITIONAL_VERSIONS |
| 24 | "3.9;3.8;3.7;3.6;3.5;3.4" |
| 25 | CACHE INTERNAL "") |
Henry Schreiner | df11597 | 2020-07-31 22:45:19 -0400 | [diff] [blame] | 26 | |
| 27 | list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 28 | find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} MODULE REQUIRED ${_pybind11_quiet}) |
Henry Schreiner | df11597 | 2020-07-31 22:45:19 -0400 | [diff] [blame] | 29 | list(REMOVE_AT CMAKE_MODULE_PATH -1) |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 30 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 31 | # Cache variables so pybind11_add_module can be used in parent projects |
| 32 | set(PYTHON_INCLUDE_DIRS |
| 33 | ${PYTHON_INCLUDE_DIRS} |
| 34 | CACHE INTERNAL "") |
| 35 | set(PYTHON_LIBRARIES |
| 36 | ${PYTHON_LIBRARIES} |
| 37 | CACHE INTERNAL "") |
| 38 | set(PYTHON_MODULE_PREFIX |
| 39 | ${PYTHON_MODULE_PREFIX} |
| 40 | CACHE INTERNAL "") |
| 41 | set(PYTHON_MODULE_EXTENSION |
| 42 | ${PYTHON_MODULE_EXTENSION} |
| 43 | CACHE INTERNAL "") |
| 44 | set(PYTHON_VERSION_MAJOR |
| 45 | ${PYTHON_VERSION_MAJOR} |
| 46 | CACHE INTERNAL "") |
| 47 | set(PYTHON_VERSION_MINOR |
| 48 | ${PYTHON_VERSION_MINOR} |
| 49 | CACHE INTERNAL "") |
| 50 | set(PYTHON_VERSION |
| 51 | ${PYTHON_VERSION} |
| 52 | CACHE INTERNAL "") |
| 53 | set(PYTHON_IS_DEBUG |
| 54 | "${PYTHON_IS_DEBUG}" |
| 55 | CACHE INTERNAL "") |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 56 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 57 | if(PYBIND11_MASTER_PROJECT) |
| 58 | if(PYTHON_MODULE_EXTENSION MATCHES "pypy") |
| 59 | if(NOT DEFINED PYPY_VERSION) |
| 60 | execute_process( |
| 61 | COMMAND ${PYTHON_EXECUTABLE} -c |
| 62 | [=[import sys; print(".".join(map(str, sys.pypy_version_info[:3])))]=] |
| 63 | OUTPUT_VARIABLE pypy_version) |
| 64 | set(PYPY_VERSION |
| 65 | ${pypy_version} |
| 66 | CACHE INTERNAL "") |
Henry Schreiner | 227170d | 2020-08-03 11:44:16 -0400 | [diff] [blame] | 67 | endif() |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 68 | message(STATUS "PYPY ${PYPY_VERSION} (Py ${PYTHON_VERSION})") |
Henry Schreiner | 227170d | 2020-08-03 11:44:16 -0400 | [diff] [blame] | 69 | else() |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 70 | message(STATUS "PYTHON ${PYTHON_VERSION}") |
Henry Schreiner | 94db5c5 | 2020-07-30 16:20:10 -0400 | [diff] [blame] | 71 | endif() |
Chuck Atkins | d730fbc | 2018-06-12 13:18:48 -0400 | [diff] [blame] | 72 | endif() |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 73 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 74 | # Only add Python for build - must be added during the import for config since it has to be re-discovered. |
| 75 | set_property( |
| 76 | TARGET pybind11::pybind11 |
| 77 | APPEND |
| 78 | PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>) |
Dean Moldovan | 0cbec5c | 2016-12-16 22:58:37 +0100 | [diff] [blame] | 79 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 80 | # Python debug libraries expose slightly different objects before 3.8 |
| 81 | # https://docs.python.org/3.6/c-api/intro.html#debugging-builds |
| 82 | # https://stackoverflow.com/questions/39161202/how-to-work-around-missing-pymodule-create2-in-amd64-win-python35-d-lib |
| 83 | if(PYTHON_IS_DEBUG) |
| 84 | set_property( |
Bjorn | d4d7ef5 | 2020-08-21 20:52:38 +0200 | [diff] [blame^] | 85 | TARGET pybind11::pybind11 |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 86 | APPEND |
| 87 | PROPERTY INTERFACE_COMPILE_DEFINITIONS Py_DEBUG) |
| 88 | endif() |
Jason Rhinelander | c137c0a | 2017-02-09 21:27:29 -0500 | [diff] [blame] | 89 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 90 | set_property( |
| 91 | TARGET pybind11::module |
| 92 | APPEND |
| 93 | PROPERTY |
| 94 | INTERFACE_LINK_LIBRARIES pybind11::python_link_helper |
| 95 | "$<$<OR:$<PLATFORM_ID:Windows>,$<PLATFORM_ID:Cygwin>>:$<BUILD_INTERFACE:${PYTHON_LIBRARIES}>>") |
Jason Rhinelander | c137c0a | 2017-02-09 21:27:29 -0500 | [diff] [blame] | 96 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 97 | if(PYTHON_VERSION VERSION_LESS 3) |
| 98 | set_property( |
| 99 | TARGET pybind11::pybind11 |
| 100 | APPEND |
| 101 | PROPERTY INTERFACE_LINK_LIBRARIES pybind11::python2_no_register) |
| 102 | endif() |
Jason Rhinelander | c137c0a | 2017-02-09 21:27:29 -0500 | [diff] [blame] | 103 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 104 | set_property( |
| 105 | TARGET pybind11::embed |
| 106 | APPEND |
| 107 | PROPERTY INTERFACE_LINK_LIBRARIES pybind11::pybind11 $<BUILD_INTERFACE:${PYTHON_LIBRARIES}>) |
Jason Rhinelander | 1bee6e7 | 2017-01-17 02:13:11 -0500 | [diff] [blame] | 108 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 109 | function(pybind11_extension name) |
| 110 | # The prefix and extension are provided by FindPythonLibsNew.cmake |
| 111 | set_target_properties(${name} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}" |
| 112 | SUFFIX "${PYTHON_MODULE_EXTENSION}") |
Jason Rhinelander | 1bee6e7 | 2017-01-17 02:13:11 -0500 | [diff] [blame] | 113 | endfunction() |
| 114 | |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 115 | # Build a Python extension module: |
Dean Moldovan | 0cbec5c | 2016-12-16 22:58:37 +0100 | [diff] [blame] | 116 | # pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL] |
Henry Schreiner | 6ec1775 | 2020-07-28 00:43:12 -0400 | [diff] [blame] | 117 | # [NO_EXTRAS] [THIN_LTO] source1 [source2 ...]) |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 118 | # |
| 119 | function(pybind11_add_module target_name) |
Axel Huebl | 435dbdd | 2018-08-29 13:20:11 +0200 | [diff] [blame] | 120 | set(options MODULE SHARED EXCLUDE_FROM_ALL NO_EXTRAS SYSTEM THIN_LTO) |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 121 | cmake_parse_arguments(ARG "${options}" "" "" ${ARGN}) |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 122 | |
Dean Moldovan | 0cbec5c | 2016-12-16 22:58:37 +0100 | [diff] [blame] | 123 | if(ARG_MODULE AND ARG_SHARED) |
| 124 | message(FATAL_ERROR "Can't be both MODULE and SHARED") |
| 125 | elseif(ARG_SHARED) |
| 126 | set(lib_type SHARED) |
| 127 | else() |
| 128 | set(lib_type MODULE) |
| 129 | endif() |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 130 | |
Dean Moldovan | 0cbec5c | 2016-12-16 22:58:37 +0100 | [diff] [blame] | 131 | if(ARG_EXCLUDE_FROM_ALL) |
| 132 | set(exclude_from_all EXCLUDE_FROM_ALL) |
Nils Leif Fischer | 141e8cc | 2020-06-26 12:15:10 +0200 | [diff] [blame] | 133 | else() |
| 134 | set(exclude_from_all "") |
Dean Moldovan | 0cbec5c | 2016-12-16 22:58:37 +0100 | [diff] [blame] | 135 | endif() |
| 136 | |
| 137 | add_library(${target_name} ${lib_type} ${exclude_from_all} ${ARG_UNPARSED_ARGUMENTS}) |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 138 | |
Henry Schreiner | 6ec1775 | 2020-07-28 00:43:12 -0400 | [diff] [blame] | 139 | target_link_libraries(${target_name} PRIVATE pybind11::module) |
| 140 | |
Axel Huebl | 435dbdd | 2018-08-29 13:20:11 +0200 | [diff] [blame] | 141 | if(ARG_SYSTEM) |
Henry Schreiner | 94db5c5 | 2020-07-30 16:20:10 -0400 | [diff] [blame] | 142 | message( |
| 143 | STATUS |
| 144 | "Warning: this does not have an effect - use NO_SYSTEM_FROM_IMPORTED if using imported targets" |
| 145 | ) |
Nils Leif Fischer | 141e8cc | 2020-06-26 12:15:10 +0200 | [diff] [blame] | 146 | endif() |
| 147 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 148 | pybind11_extension(${target_name}) |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 149 | |
Jason Rhinelander | 97aa54f | 2017-08-10 12:08:42 -0400 | [diff] [blame] | 150 | # -fvisibility=hidden is required to allow multiple modules compiled against |
| 151 | # different pybind versions to work properly, and for some features (e.g. |
| 152 | # py::module_local). We force it on everything inside the `pybind11` |
| 153 | # namespace; also turning it on for a pybind module compilation here avoids |
| 154 | # potential warnings or issues from having mixed hidden/non-hidden types. |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 155 | set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden" |
| 156 | CUDA_VISIBILITY_PRESET "hidden") |
Jason Rhinelander | 97aa54f | 2017-08-10 12:08:42 -0400 | [diff] [blame] | 157 | |
Dean Moldovan | 0cbec5c | 2016-12-16 22:58:37 +0100 | [diff] [blame] | 158 | if(ARG_NO_EXTRAS) |
Henry Schreiner | 94db5c5 | 2020-07-30 16:20:10 -0400 | [diff] [blame] | 159 | return() |
Dean Moldovan | 0cbec5c | 2016-12-16 22:58:37 +0100 | [diff] [blame] | 160 | endif() |
| 161 | |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 162 | if(NOT DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION) |
| 163 | if(ARG_THIN_LTO) |
| 164 | target_link_libraries(${target_name} PRIVATE pybind11::thin_lto) |
Henry Schreiner | df11597 | 2020-07-31 22:45:19 -0400 | [diff] [blame] | 165 | else() |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 166 | target_link_libraries(${target_name} PRIVATE pybind11::lto) |
Henry Schreiner | 94db5c5 | 2020-07-30 16:20:10 -0400 | [diff] [blame] | 167 | endif() |
Henry Schreiner | 6ec1775 | 2020-07-28 00:43:12 -0400 | [diff] [blame] | 168 | endif() |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 169 | |
Henry Schreiner | 94db5c5 | 2020-07-30 16:20:10 -0400 | [diff] [blame] | 170 | if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo) |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 171 | pybind11_strip(${target_name}) |
Jason Rhinelander | 1bee6e7 | 2017-01-17 02:13:11 -0500 | [diff] [blame] | 172 | endif() |
| 173 | |
| 174 | if(MSVC) |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 175 | target_link_libraries(${target_name} PRIVATE pybind11::windows_extras) |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 176 | endif() |
Henry Schreiner | 1729aae | 2020-08-19 12:26:26 -0400 | [diff] [blame] | 177 | |
Lori A. Burns | 545b4db | 2016-12-13 10:59:21 -0500 | [diff] [blame] | 178 | endfunction() |