blob: a3603abe97e3c82dc7e3134fa9e9629a593f8f52 [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
8cmake_minimum_required(VERSION 2.8.12)
9
10# Add a CMake parameter for choosing a desired Python version
Dean Moldovan5b5e3de2017-01-06 23:38:00 +010011if(NOT PYBIND11_PYTHON_VERSION)
12 set(PYBIND11_PYTHON_VERSION "" CACHE STRING "Python version to use for compiling modules")
13endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050014
Wenzel Jakobbb9c91c2020-03-04 16:17:20 +010015set(Python_ADDITIONAL_VERSIONS 3.9 3.8 3.7 3.6 3.5 3.4)
Lori A. Burns545b4db2016-12-13 10:59:21 -050016find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED)
17
18include(CheckCXXCompilerFlag)
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010019include(CMakeParseArguments)
Lori A. Burns545b4db2016-12-13 10:59:21 -050020
Chuck Atkinsd730fbc2018-06-12 13:18:48 -040021# Use the language standards abstraction if CMake supports it with the current compiler
22if(NOT CMAKE_VERSION VERSION_LESS 3.1)
23 if(NOT CMAKE_CXX_STANDARD)
24 if(CMAKE_CXX14_STANDARD_COMPILE_OPTION)
25 set(CMAKE_CXX_STANDARD 14)
26 elseif(CMAKE_CXX11_STANDARD_COMPILE_OPTION)
27 set(CMAKE_CXX_STANDARD 11)
28 endif()
29 endif()
30 if(CMAKE_CXX_STANDARD)
31 set(CMAKE_CXX_EXTENSIONS OFF)
32 set(CMAKE_CXX_STANDARD_REQUIRED ON)
33 endif()
34endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050035
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +020036# Fall back to heuristics
Chuck Atkinsd730fbc2018-06-12 13:18:48 -040037if(NOT PYBIND11_CPP_STANDARD AND NOT CMAKE_CXX_STANDARD)
38 if(MSVC)
39 set(PYBIND11_CPP_STANDARD /std:c++14)
40 else()
41 check_cxx_compiler_flag("-std=c++14" HAS_CPP14_FLAG)
42 if(HAS_CPP14_FLAG)
Jason Rhinelanderfad5d332017-07-12 14:59:16 -040043 set(PYBIND11_CPP_STANDARD -std=c++14)
44 else()
45 check_cxx_compiler_flag("-std=c++11" HAS_CPP11_FLAG)
Chuck Atkinsd730fbc2018-06-12 13:18:48 -040046 if(HAS_CPP11_FLAG)
Jason Rhinelander77710ff2017-05-09 14:37:48 -040047 set(PYBIND11_CPP_STANDARD -std=c++11)
Jason Rhinelander77710ff2017-05-09 14:37:48 -040048 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050049 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050050 endif()
Jason Rhinelanderfad5d332017-07-12 14:59:16 -040051
Chuck Atkinsd730fbc2018-06-12 13:18:48 -040052 if(NOT PYBIND11_CPP_STANDARD)
53 message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!")
54 endif()
Jason Rhinelanderfad5d332017-07-12 14:59:16 -040055 set(PYBIND11_CPP_STANDARD ${PYBIND11_CPP_STANDARD} CACHE STRING
56 "C++ standard flag, e.g. -std=c++11, -std=c++14, /std:c++14. Defaults to C++14 mode." FORCE)
57endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -050058
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -050059# Checks whether the given CXX/linker flags can compile and link a cxx file. cxxflags and
60# linkerflags are lists of flags to use. The result variable is a unique variable name for each set
61# of flags: the compilation result will be cached base on the result variable. If the flags work,
62# sets them in cxxflags_out/linkerflags_out internal cache variables (in addition to ${result}).
63function(_pybind11_return_if_cxx_and_linker_flags_work result cxxflags linkerflags cxxflags_out linkerflags_out)
64 set(CMAKE_REQUIRED_LIBRARIES ${linkerflags})
65 check_cxx_compiler_flag("${cxxflags}" ${result})
66 if (${result})
67 set(${cxxflags_out} "${cxxflags}" CACHE INTERNAL "" FORCE)
68 set(${linkerflags_out} "${linkerflags}" CACHE INTERNAL "" FORCE)
69 endif()
Jason Rhinelander1bee6e72017-01-17 02:13:11 -050070endfunction()
Dean Moldovan0cbec5c2016-12-16 22:58:37 +010071
Jason Rhinelander1bee6e72017-01-17 02:13:11 -050072# Internal: find the appropriate link time optimization flags for this compiler
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -050073function(_pybind11_add_lto_flags target_name prefer_thin_lto)
74 if (NOT DEFINED PYBIND11_LTO_CXX_FLAGS)
75 set(PYBIND11_LTO_CXX_FLAGS "" CACHE INTERNAL "")
76 set(PYBIND11_LTO_LINKER_FLAGS "" CACHE INTERNAL "")
77
78 if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
79 set(cxx_append "")
80 set(linker_append "")
81 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT APPLE)
82 # Clang Gold plugin does not support -Os; append -O3 to MinSizeRel builds to override it
83 set(linker_append ";$<$<CONFIG:MinSizeRel>:-O3>")
84 elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
85 set(cxx_append ";-fno-fat-lto-objects")
86 endif()
87
88 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND prefer_thin_lto)
89 _pybind11_return_if_cxx_and_linker_flags_work(HAS_FLTO_THIN
90 "-flto=thin${cxx_append}" "-flto=thin${linker_append}"
91 PYBIND11_LTO_CXX_FLAGS PYBIND11_LTO_LINKER_FLAGS)
92 endif()
93
94 if (NOT HAS_FLTO_THIN)
95 _pybind11_return_if_cxx_and_linker_flags_work(HAS_FLTO
96 "-flto${cxx_append}" "-flto${linker_append}"
97 PYBIND11_LTO_CXX_FLAGS PYBIND11_LTO_LINKER_FLAGS)
98 endif()
99 elseif (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
100 # Intel equivalent to LTO is called IPO
101 _pybind11_return_if_cxx_and_linker_flags_work(HAS_INTEL_IPO
102 "-ipo" "-ipo" PYBIND11_LTO_CXX_FLAGS PYBIND11_LTO_LINKER_FLAGS)
103 elseif(MSVC)
104 # cmake only interprets libraries as linker flags when they start with a - (otherwise it
105 # converts /LTCG to \LTCG as if it was a Windows path). Luckily MSVC supports passing flags
106 # with - instead of /, even if it is a bit non-standard:
107 _pybind11_return_if_cxx_and_linker_flags_work(HAS_MSVC_GL_LTCG
108 "/GL" "-LTCG" PYBIND11_LTO_CXX_FLAGS PYBIND11_LTO_LINKER_FLAGS)
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500109 endif()
110
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -0500111 if (PYBIND11_LTO_CXX_FLAGS)
112 message(STATUS "LTO enabled")
113 else()
114 message(STATUS "LTO disabled (not supported by the compiler and/or linker)")
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500115 endif()
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500116 endif()
117
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -0500118 # Enable LTO flags if found, except for Debug builds
119 if (PYBIND11_LTO_CXX_FLAGS)
120 target_compile_options(${target_name} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:${PYBIND11_LTO_CXX_FLAGS}>")
121 endif()
122 if (PYBIND11_LTO_LINKER_FLAGS)
123 target_link_libraries(${target_name} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:${PYBIND11_LTO_LINKER_FLAGS}>")
124 endif()
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500125endfunction()
126
Lori A. Burns545b4db2016-12-13 10:59:21 -0500127# Build a Python extension module:
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100128# pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL]
Axel Huebl435dbdd2018-08-29 13:20:11 +0200129# [NO_EXTRAS] [SYSTEM] [THIN_LTO] source1 [source2 ...])
Lori A. Burns545b4db2016-12-13 10:59:21 -0500130#
131function(pybind11_add_module target_name)
Axel Huebl435dbdd2018-08-29 13:20:11 +0200132 set(options MODULE SHARED EXCLUDE_FROM_ALL NO_EXTRAS SYSTEM THIN_LTO)
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100133 cmake_parse_arguments(ARG "${options}" "" "" ${ARGN})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500134
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100135 if(ARG_MODULE AND ARG_SHARED)
136 message(FATAL_ERROR "Can't be both MODULE and SHARED")
137 elseif(ARG_SHARED)
138 set(lib_type SHARED)
139 else()
140 set(lib_type MODULE)
141 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500142
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100143 if(ARG_EXCLUDE_FROM_ALL)
144 set(exclude_from_all EXCLUDE_FROM_ALL)
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200145 else()
146 set(exclude_from_all "")
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100147 endif()
148
149 add_library(${target_name} ${lib_type} ${exclude_from_all} ${ARG_UNPARSED_ARGUMENTS})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500150
Axel Huebl435dbdd2018-08-29 13:20:11 +0200151 if(ARG_SYSTEM)
152 set(inc_isystem SYSTEM)
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200153 else()
154 set(inc_isystem "")
155 endif()
156
157 set(PYBIND11_INCLUDE_DIR_SELECTED "")
158 if(PYBIND11_INCLUDE_DIR)
159 # from project CMakeLists.txt
160 set(PYBIND11_INCLUDE_DIR_SELECTED ${PYBIND11_INCLUDE_DIR})
161 elseif(pybind11_INCLUDE_DIR)
162 # from pybind11Config
163 set(PYBIND11_INCLUDE_DIR_SELECTED ${pybind11_INCLUDE_DIR})
164 else()
165 message(FATAL "No pybind11_INCLUDE_DIR available. Use "
166 "find_package(pybind11) before calling pybind11_add_module.")
Axel Huebl435dbdd2018-08-29 13:20:11 +0200167 endif()
168
169 target_include_directories(${target_name} ${inc_isystem}
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200170 PRIVATE ${PYBIND11_INCLUDE_DIR_SELECTED}
Lori A. Burns545b4db2016-12-13 10:59:21 -0500171 PRIVATE ${PYTHON_INCLUDE_DIRS})
172
Axel Huebl3a945612018-08-29 13:18:43 +0200173 # Python debug libraries expose slightly different objects
174 # https://docs.python.org/3.6/c-api/intro.html#debugging-builds
175 # https://stackoverflow.com/questions/39161202/how-to-work-around-missing-pymodule-create2-in-amd64-win-python35-d-lib
176 if(PYTHON_IS_DEBUG)
177 target_compile_definitions(${target_name} PRIVATE Py_DEBUG)
178 endif()
179
Lori A. Burns545b4db2016-12-13 10:59:21 -0500180 # The prefix and extension are provided by FindPythonLibsNew.cmake
181 set_target_properties(${target_name} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}")
182 set_target_properties(${target_name} PROPERTIES SUFFIX "${PYTHON_MODULE_EXTENSION}")
183
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400184 # -fvisibility=hidden is required to allow multiple modules compiled against
185 # different pybind versions to work properly, and for some features (e.g.
186 # py::module_local). We force it on everything inside the `pybind11`
187 # namespace; also turning it on for a pybind module compilation here avoids
188 # potential warnings or issues from having mixed hidden/non-hidden types.
189 set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden")
Davis E. King9343e682018-09-14 08:28:54 -0400190 set_target_properties(${target_name} PROPERTIES CUDA_VISIBILITY_PRESET "hidden")
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400191
Lori A. Burns545b4db2016-12-13 10:59:21 -0500192 if(WIN32 OR CYGWIN)
193 # Link against the Python shared library on Windows
194 target_link_libraries(${target_name} PRIVATE ${PYTHON_LIBRARIES})
195 elseif(APPLE)
196 # It's quite common to have multiple copies of the same Python version
197 # installed on one's system. E.g.: one copy from the OS and another copy
198 # that's statically linked into an application like Blender or Maya.
199 # If we link our plugin library against the OS Python here and import it
200 # into Blender or Maya later on, this will cause segfaults when multiple
201 # conflicting Python instances are active at the same time (even when they
202 # are of the same version).
203
204 # Windows is not affected by this issue since it handles DLL imports
205 # differently. The solution for Linux and Mac OS is simple: we just don't
206 # link against the Python library. The resulting shared library will have
207 # missing symbols, but that's perfectly fine -- they will be resolved at
208 # import time.
209
210 target_link_libraries(${target_name} PRIVATE "-undefined dynamic_lookup")
Dean Moldovanb0f38852016-12-14 01:43:39 +0100211
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100212 if(ARG_SHARED)
Dean Moldovanb0f38852016-12-14 01:43:39 +0100213 # Suppress CMake >= 3.0 warning for shared libraries
214 set_target_properties(${target_name} PROPERTIES MACOSX_RPATH ON)
215 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500216 endif()
217
Jason Rhinelander77710ff2017-05-09 14:37:48 -0400218 # Make sure C++11/14 are enabled
Nils Leif Fischer141e8cc2020-06-26 12:15:10 +0200219 if(PYBIND11_CPP_STANDARD)
220 if(CMAKE_VERSION VERSION_LESS 3.3)
221 target_compile_options(${target_name} PUBLIC ${PYBIND11_CPP_STANDARD})
222 else()
223 target_compile_options(${target_name} PUBLIC $<$<COMPILE_LANGUAGE:CXX>:${PYBIND11_CPP_STANDARD}>)
224 endif()
Lori A. Burns868d94f2019-06-11 16:05:00 -0400225 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500226
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100227 if(ARG_NO_EXTRAS)
228 return()
229 endif()
230
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -0500231 _pybind11_add_lto_flags(${target_name} ${ARG_THIN_LTO})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500232
Dmitry8f5a8ab2019-08-23 17:18:05 +0300233 if (NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500234 # Strip unnecessary sections of the binary on Linux/Mac OS
235 if(CMAKE_STRIP)
236 if(APPLE)
237 add_custom_command(TARGET ${target_name} POST_BUILD
238 COMMAND ${CMAKE_STRIP} -x $<TARGET_FILE:${target_name}>)
239 else()
240 add_custom_command(TARGET ${target_name} POST_BUILD
241 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${target_name}>)
Lori A. Burns545b4db2016-12-13 10:59:21 -0500242 endif()
243 endif()
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500244 endif()
245
246 if(MSVC)
Lori A. Burns545b4db2016-12-13 10:59:21 -0500247 # /MP enables multithreaded builds (relevant when there are many files), /bigobj is
248 # needed for bigger binding projects due to the limit to 64k addressable sections
Rune Paamand06d021b2018-10-25 01:35:33 +0200249 target_compile_options(${target_name} PRIVATE /bigobj)
Davis E. King9343e682018-09-14 08:28:54 -0400250 if(CMAKE_VERSION VERSION_LESS 3.11)
Rune Paamand06d021b2018-10-25 01:35:33 +0200251 target_compile_options(${target_name} PRIVATE $<$<NOT:$<CONFIG:Debug>>:/MP>)
Davis E. King9343e682018-09-14 08:28:54 -0400252 else()
253 # Only set these options for C++ files. This is important so that, for
254 # instance, projects that include other types of source files like CUDA
255 # .cu files don't get these options propagated to nvcc since that would
256 # cause the build to fail.
Rune Paamand06d021b2018-10-25 01:35:33 +0200257 target_compile_options(${target_name} PRIVATE $<$<NOT:$<CONFIG:Debug>>:$<$<COMPILE_LANGUAGE:CXX>:/MP>>)
Davis E. King9343e682018-09-14 08:28:54 -0400258 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500259 endif()
260endfunction()