blob: a0a3b60eb1375b4b76ac3407db72a83fc3e22840 [file] [log] [blame]
Lori A. Burns545b4db2016-12-13 10:59:21 -05001# tools/pybind11Tools.cmake -- Build system for the pybind11 modules
2#
Wenzel Jakob36c666f2020-09-04 23:31:05 +02003# Copyright (c) 2020 Wenzel Jakob <wenzel.jakob@epfl.ch>
Lori A. Burns545b4db2016-12-13 10:59:21 -05004#
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 Schreiner1729aae2020-08-19 12:26:26 -04008# Built-in in CMake 3.5+
9include(CMakeParseArguments)
10
11if(pybind11_FIND_QUIETLY)
12 set(_pybind11_quiet QUIET)
13endif()
14
Henry Schreiner9b8cb022020-08-26 09:07:30 -040015# If this is the first run, PYTHON_VERSION can stand in for PYBIND11_PYTHON_VERSION
16if(NOT DEFINED PYBIND11_PYTHON_VERSION AND DEFINED PYTHON_VERSION)
17 message(WARNING "Set PYBIND11_PYTHON_VERSION to search for a specific version, not "
18 "PYTHON_VERSION (which is an output). Assuming that is what you "
19 "meant to do and continuing anyway.")
Henry Schreiner94db5c52020-07-30 16:20:10 -040020 set(PYBIND11_PYTHON_VERSION
Henry Schreiner9b8cb022020-08-26 09:07:30 -040021 "${PYTHON_VERSION}"
22 CACHE STRING "Python version to use for compiling modules")
23 unset(PYTHON_VERSION)
24 unset(PYTHON_VERSION CACHE)
25else()
26 # If this is set as a normal variable, promote it, otherwise, make an empty cache variable.
27 set(PYBIND11_PYTHON_VERSION
28 "${PYBIND11_PYTHON_VERSION}"
Henry Schreiner94db5c52020-07-30 16:20:10 -040029 CACHE STRING "Python version to use for compiling modules")
Dean Moldovan5b5e3de2017-01-06 23:38:00 +010030endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050031
Henry Schreiner6ec17752020-07-28 00:43:12 -040032# A user can set versions manually too
Henry Schreiner94db5c52020-07-30 16:20:10 -040033set(Python_ADDITIONAL_VERSIONS
34 "3.9;3.8;3.7;3.6;3.5;3.4"
35 CACHE INTERNAL "")
Henry Schreinerdf115972020-07-31 22:45:19 -040036
37list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
Henry Schreiner1729aae2020-08-19 12:26:26 -040038find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} MODULE REQUIRED ${_pybind11_quiet})
Henry Schreinerdf115972020-07-31 22:45:19 -040039list(REMOVE_AT CMAKE_MODULE_PATH -1)
Lori A. Burns545b4db2016-12-13 10:59:21 -050040
Henry Schreiner1729aae2020-08-19 12:26:26 -040041# Cache variables so pybind11_add_module can be used in parent projects
42set(PYTHON_INCLUDE_DIRS
43 ${PYTHON_INCLUDE_DIRS}
44 CACHE INTERNAL "")
45set(PYTHON_LIBRARIES
46 ${PYTHON_LIBRARIES}
47 CACHE INTERNAL "")
48set(PYTHON_MODULE_PREFIX
49 ${PYTHON_MODULE_PREFIX}
50 CACHE INTERNAL "")
51set(PYTHON_MODULE_EXTENSION
52 ${PYTHON_MODULE_EXTENSION}
53 CACHE INTERNAL "")
54set(PYTHON_VERSION_MAJOR
55 ${PYTHON_VERSION_MAJOR}
56 CACHE INTERNAL "")
57set(PYTHON_VERSION_MINOR
58 ${PYTHON_VERSION_MINOR}
59 CACHE INTERNAL "")
60set(PYTHON_VERSION
61 ${PYTHON_VERSION}
62 CACHE INTERNAL "")
63set(PYTHON_IS_DEBUG
64 "${PYTHON_IS_DEBUG}"
65 CACHE INTERNAL "")
Lori A. Burns545b4db2016-12-13 10:59:21 -050066
Henry Schreiner1729aae2020-08-19 12:26:26 -040067if(PYBIND11_MASTER_PROJECT)
68 if(PYTHON_MODULE_EXTENSION MATCHES "pypy")
69 if(NOT DEFINED PYPY_VERSION)
70 execute_process(
71 COMMAND ${PYTHON_EXECUTABLE} -c
72 [=[import sys; print(".".join(map(str, sys.pypy_version_info[:3])))]=]
73 OUTPUT_VARIABLE pypy_version)
74 set(PYPY_VERSION
75 ${pypy_version}
76 CACHE INTERNAL "")
Henry Schreiner227170d2020-08-03 11:44:16 -040077 endif()
Henry Schreiner1729aae2020-08-19 12:26:26 -040078 message(STATUS "PYPY ${PYPY_VERSION} (Py ${PYTHON_VERSION})")
Henry Schreiner227170d2020-08-03 11:44:16 -040079 else()
Henry Schreiner1729aae2020-08-19 12:26:26 -040080 message(STATUS "PYTHON ${PYTHON_VERSION}")
Henry Schreiner94db5c52020-07-30 16:20:10 -040081 endif()
Chuck Atkinsd730fbc2018-06-12 13:18:48 -040082endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050083
Henry Schreiner1729aae2020-08-19 12:26:26 -040084# Only add Python for build - must be added during the import for config since it has to be re-discovered.
85set_property(
86 TARGET pybind11::pybind11
87 APPEND
88 PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>)
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010089
Henry Schreiner1729aae2020-08-19 12:26:26 -040090# Python debug libraries expose slightly different objects before 3.8
91# https://docs.python.org/3.6/c-api/intro.html#debugging-builds
92# https://stackoverflow.com/questions/39161202/how-to-work-around-missing-pymodule-create2-in-amd64-win-python35-d-lib
93if(PYTHON_IS_DEBUG)
94 set_property(
Bjornd4d7ef52020-08-21 20:52:38 +020095 TARGET pybind11::pybind11
Henry Schreiner1729aae2020-08-19 12:26:26 -040096 APPEND
97 PROPERTY INTERFACE_COMPILE_DEFINITIONS Py_DEBUG)
98endif()
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -050099
Henry Schreiner1729aae2020-08-19 12:26:26 -0400100set_property(
101 TARGET pybind11::module
102 APPEND
103 PROPERTY
104 INTERFACE_LINK_LIBRARIES pybind11::python_link_helper
105 "$<$<OR:$<PLATFORM_ID:Windows>,$<PLATFORM_ID:Cygwin>>:$<BUILD_INTERFACE:${PYTHON_LIBRARIES}>>")
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -0500106
Henry Schreiner1729aae2020-08-19 12:26:26 -0400107if(PYTHON_VERSION VERSION_LESS 3)
108 set_property(
109 TARGET pybind11::pybind11
110 APPEND
111 PROPERTY INTERFACE_LINK_LIBRARIES pybind11::python2_no_register)
112endif()
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -0500113
Henry Schreiner1729aae2020-08-19 12:26:26 -0400114set_property(
115 TARGET pybind11::embed
116 APPEND
117 PROPERTY INTERFACE_LINK_LIBRARIES pybind11::pybind11 $<BUILD_INTERFACE:${PYTHON_LIBRARIES}>)
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500118
Henry Schreiner1729aae2020-08-19 12:26:26 -0400119function(pybind11_extension name)
120 # The prefix and extension are provided by FindPythonLibsNew.cmake
121 set_target_properties(${name} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}"
122 SUFFIX "${PYTHON_MODULE_EXTENSION}")
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500123endfunction()
124
Lori A. Burns545b4db2016-12-13 10:59:21 -0500125# Build a Python extension module:
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100126# pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL]
Wenzel Jakob36c666f2020-09-04 23:31:05 +0200127# [NO_EXTRAS] [THIN_LTO] [OPT_SIZE] source1 [source2 ...])
Lori A. Burns545b4db2016-12-13 10:59:21 -0500128#
129function(pybind11_add_module target_name)
Wenzel Jakob36c666f2020-09-04 23:31:05 +0200130 set(options "MODULE;SHARED;EXCLUDE_FROM_ALL;NO_EXTRAS;SYSTEM;THIN_LTO;OPT_SIZE")
Henry Schreiner1729aae2020-08-19 12:26:26 -0400131 cmake_parse_arguments(ARG "${options}" "" "" ${ARGN})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500132
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100133 if(ARG_MODULE AND ARG_SHARED)
134 message(FATAL_ERROR "Can't be both MODULE and SHARED")
135 elseif(ARG_SHARED)
136 set(lib_type SHARED)
137 else()
138 set(lib_type MODULE)
139 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500140
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100141 if(ARG_EXCLUDE_FROM_ALL)
142 set(exclude_from_all EXCLUDE_FROM_ALL)
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200143 else()
144 set(exclude_from_all "")
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100145 endif()
146
147 add_library(${target_name} ${lib_type} ${exclude_from_all} ${ARG_UNPARSED_ARGUMENTS})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500148
Henry Schreiner6ec17752020-07-28 00:43:12 -0400149 target_link_libraries(${target_name} PRIVATE pybind11::module)
150
Axel Huebl435dbdd2018-08-29 13:20:11 +0200151 if(ARG_SYSTEM)
Henry Schreiner94db5c52020-07-30 16:20:10 -0400152 message(
153 STATUS
154 "Warning: this does not have an effect - use NO_SYSTEM_FROM_IMPORTED if using imported targets"
155 )
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200156 endif()
157
Henry Schreiner1729aae2020-08-19 12:26:26 -0400158 pybind11_extension(${target_name})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500159
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400160 # -fvisibility=hidden is required to allow multiple modules compiled against
161 # different pybind versions to work properly, and for some features (e.g.
162 # py::module_local). We force it on everything inside the `pybind11`
163 # namespace; also turning it on for a pybind module compilation here avoids
164 # potential warnings or issues from having mixed hidden/non-hidden types.
Henry Schreiner1729aae2020-08-19 12:26:26 -0400165 set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden"
166 CUDA_VISIBILITY_PRESET "hidden")
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400167
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100168 if(ARG_NO_EXTRAS)
Henry Schreiner94db5c52020-07-30 16:20:10 -0400169 return()
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100170 endif()
171
Henry Schreiner1729aae2020-08-19 12:26:26 -0400172 if(NOT DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION)
173 if(ARG_THIN_LTO)
174 target_link_libraries(${target_name} PRIVATE pybind11::thin_lto)
Henry Schreinerdf115972020-07-31 22:45:19 -0400175 else()
Henry Schreiner1729aae2020-08-19 12:26:26 -0400176 target_link_libraries(${target_name} PRIVATE pybind11::lto)
Henry Schreiner94db5c52020-07-30 16:20:10 -0400177 endif()
Henry Schreiner6ec17752020-07-28 00:43:12 -0400178 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500179
Henry Schreiner94db5c52020-07-30 16:20:10 -0400180 if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
Henry Schreiner1729aae2020-08-19 12:26:26 -0400181 pybind11_strip(${target_name})
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500182 endif()
183
184 if(MSVC)
Henry Schreiner1729aae2020-08-19 12:26:26 -0400185 target_link_libraries(${target_name} PRIVATE pybind11::windows_extras)
Lori A. Burns545b4db2016-12-13 10:59:21 -0500186 endif()
Henry Schreiner1729aae2020-08-19 12:26:26 -0400187
Wenzel Jakob36c666f2020-09-04 23:31:05 +0200188 if(ARG_OPT_SIZE)
189 target_link_libraries(${target_name} PRIVATE pybind11::opt_size)
190 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500191endfunction()