blob: 29885ae998ceb9497fae7024d2635c3339564b14 [file] [log] [blame]
Lori A. Burns545b4db2016-12-13 10:59:21 -05001# 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 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
Lori A. Burns545b4db2016-12-13 10:59:21 -050015# Add a CMake parameter for choosing a desired Python version
Dean Moldovan5b5e3de2017-01-06 23:38:00 +010016if(NOT PYBIND11_PYTHON_VERSION)
Henry Schreiner94db5c52020-07-30 16:20:10 -040017 set(PYBIND11_PYTHON_VERSION
18 ""
19 CACHE STRING "Python version to use for compiling modules")
Dean Moldovan5b5e3de2017-01-06 23:38:00 +010020endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050021
Henry Schreiner6ec17752020-07-28 00:43:12 -040022# A user can set versions manually too
Henry Schreiner94db5c52020-07-30 16:20:10 -040023set(Python_ADDITIONAL_VERSIONS
24 "3.9;3.8;3.7;3.6;3.5;3.4"
25 CACHE INTERNAL "")
Henry Schreinerdf115972020-07-31 22:45:19 -040026
27list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
Henry Schreiner1729aae2020-08-19 12:26:26 -040028find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} MODULE REQUIRED ${_pybind11_quiet})
Henry Schreinerdf115972020-07-31 22:45:19 -040029list(REMOVE_AT CMAKE_MODULE_PATH -1)
Lori A. Burns545b4db2016-12-13 10:59:21 -050030
Henry Schreiner1729aae2020-08-19 12:26:26 -040031# Cache variables so pybind11_add_module can be used in parent projects
32set(PYTHON_INCLUDE_DIRS
33 ${PYTHON_INCLUDE_DIRS}
34 CACHE INTERNAL "")
35set(PYTHON_LIBRARIES
36 ${PYTHON_LIBRARIES}
37 CACHE INTERNAL "")
38set(PYTHON_MODULE_PREFIX
39 ${PYTHON_MODULE_PREFIX}
40 CACHE INTERNAL "")
41set(PYTHON_MODULE_EXTENSION
42 ${PYTHON_MODULE_EXTENSION}
43 CACHE INTERNAL "")
44set(PYTHON_VERSION_MAJOR
45 ${PYTHON_VERSION_MAJOR}
46 CACHE INTERNAL "")
47set(PYTHON_VERSION_MINOR
48 ${PYTHON_VERSION_MINOR}
49 CACHE INTERNAL "")
50set(PYTHON_VERSION
51 ${PYTHON_VERSION}
52 CACHE INTERNAL "")
53set(PYTHON_IS_DEBUG
54 "${PYTHON_IS_DEBUG}"
55 CACHE INTERNAL "")
Lori A. Burns545b4db2016-12-13 10:59:21 -050056
Henry Schreiner1729aae2020-08-19 12:26:26 -040057if(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 Schreiner227170d2020-08-03 11:44:16 -040067 endif()
Henry Schreiner1729aae2020-08-19 12:26:26 -040068 message(STATUS "PYPY ${PYPY_VERSION} (Py ${PYTHON_VERSION})")
Henry Schreiner227170d2020-08-03 11:44:16 -040069 else()
Henry Schreiner1729aae2020-08-19 12:26:26 -040070 message(STATUS "PYTHON ${PYTHON_VERSION}")
Henry Schreiner94db5c52020-07-30 16:20:10 -040071 endif()
Chuck Atkinsd730fbc2018-06-12 13:18:48 -040072endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050073
Henry Schreiner1729aae2020-08-19 12:26:26 -040074# Only add Python for build - must be added during the import for config since it has to be re-discovered.
75set_property(
76 TARGET pybind11::pybind11
77 APPEND
78 PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}>)
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010079
Henry Schreiner1729aae2020-08-19 12:26:26 -040080# 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
83if(PYTHON_IS_DEBUG)
84 set_property(
85 TARGET pybind::pybind11
86 APPEND
87 PROPERTY INTERFACE_COMPILE_DEFINITIONS Py_DEBUG)
88endif()
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -050089
Henry Schreiner1729aae2020-08-19 12:26:26 -040090set_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 Rhinelanderc137c0a2017-02-09 21:27:29 -050096
Henry Schreiner1729aae2020-08-19 12:26:26 -040097if(PYTHON_VERSION VERSION_LESS 3)
98 set_property(
99 TARGET pybind11::pybind11
100 APPEND
101 PROPERTY INTERFACE_LINK_LIBRARIES pybind11::python2_no_register)
102endif()
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -0500103
Henry Schreiner1729aae2020-08-19 12:26:26 -0400104set_property(
105 TARGET pybind11::embed
106 APPEND
107 PROPERTY INTERFACE_LINK_LIBRARIES pybind11::pybind11 $<BUILD_INTERFACE:${PYTHON_LIBRARIES}>)
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500108
Henry Schreiner1729aae2020-08-19 12:26:26 -0400109function(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 Rhinelander1bee6e72017-01-17 02:13:11 -0500113endfunction()
114
Lori A. Burns545b4db2016-12-13 10:59:21 -0500115# Build a Python extension module:
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100116# pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL]
Henry Schreiner6ec17752020-07-28 00:43:12 -0400117# [NO_EXTRAS] [THIN_LTO] source1 [source2 ...])
Lori A. Burns545b4db2016-12-13 10:59:21 -0500118#
119function(pybind11_add_module target_name)
Axel Huebl435dbdd2018-08-29 13:20:11 +0200120 set(options MODULE SHARED EXCLUDE_FROM_ALL NO_EXTRAS SYSTEM THIN_LTO)
Henry Schreiner1729aae2020-08-19 12:26:26 -0400121 cmake_parse_arguments(ARG "${options}" "" "" ${ARGN})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500122
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100123 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. Burns545b4db2016-12-13 10:59:21 -0500130
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100131 if(ARG_EXCLUDE_FROM_ALL)
132 set(exclude_from_all EXCLUDE_FROM_ALL)
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200133 else()
134 set(exclude_from_all "")
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100135 endif()
136
137 add_library(${target_name} ${lib_type} ${exclude_from_all} ${ARG_UNPARSED_ARGUMENTS})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500138
Henry Schreiner6ec17752020-07-28 00:43:12 -0400139 target_link_libraries(${target_name} PRIVATE pybind11::module)
140
Axel Huebl435dbdd2018-08-29 13:20:11 +0200141 if(ARG_SYSTEM)
Henry Schreiner94db5c52020-07-30 16:20:10 -0400142 message(
143 STATUS
144 "Warning: this does not have an effect - use NO_SYSTEM_FROM_IMPORTED if using imported targets"
145 )
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200146 endif()
147
Henry Schreiner1729aae2020-08-19 12:26:26 -0400148 pybind11_extension(${target_name})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500149
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400150 # -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 Schreiner1729aae2020-08-19 12:26:26 -0400155 set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden"
156 CUDA_VISIBILITY_PRESET "hidden")
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400157
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100158 if(ARG_NO_EXTRAS)
Henry Schreiner94db5c52020-07-30 16:20:10 -0400159 return()
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100160 endif()
161
Henry Schreiner1729aae2020-08-19 12:26:26 -0400162 if(NOT DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION)
163 if(ARG_THIN_LTO)
164 target_link_libraries(${target_name} PRIVATE pybind11::thin_lto)
Henry Schreinerdf115972020-07-31 22:45:19 -0400165 else()
Henry Schreiner1729aae2020-08-19 12:26:26 -0400166 target_link_libraries(${target_name} PRIVATE pybind11::lto)
Henry Schreiner94db5c52020-07-30 16:20:10 -0400167 endif()
Henry Schreiner6ec17752020-07-28 00:43:12 -0400168 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500169
Henry Schreiner94db5c52020-07-30 16:20:10 -0400170 if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
Henry Schreiner1729aae2020-08-19 12:26:26 -0400171 pybind11_strip(${target_name})
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500172 endif()
173
174 if(MSVC)
Henry Schreiner1729aae2020-08-19 12:26:26 -0400175 target_link_libraries(${target_name} PRIVATE pybind11::windows_extras)
Lori A. Burns545b4db2016-12-13 10:59:21 -0500176 endif()
Henry Schreiner1729aae2020-08-19 12:26:26 -0400177
Lori A. Burns545b4db2016-12-13 10:59:21 -0500178endfunction()