blob: 8d85dd4ebbebfa8eb53797fabdc25dcc06782622 [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
Chuck Atkinsd730fbc2018-06-12 13:18:48 -040036# Fall back to heuristics
37if(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)
145 endif()
146
147 add_library(${target_name} ${lib_type} ${exclude_from_all} ${ARG_UNPARSED_ARGUMENTS})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500148
Axel Huebl435dbdd2018-08-29 13:20:11 +0200149 if(ARG_SYSTEM)
150 set(inc_isystem SYSTEM)
151 endif()
152
153 target_include_directories(${target_name} ${inc_isystem}
Lori A. Burns545b4db2016-12-13 10:59:21 -0500154 PRIVATE ${PYBIND11_INCLUDE_DIR} # from project CMakeLists.txt
155 PRIVATE ${pybind11_INCLUDE_DIR} # from pybind11Config
156 PRIVATE ${PYTHON_INCLUDE_DIRS})
157
Axel Huebl3a945612018-08-29 13:18:43 +0200158 # Python debug libraries expose slightly different objects
159 # https://docs.python.org/3.6/c-api/intro.html#debugging-builds
160 # https://stackoverflow.com/questions/39161202/how-to-work-around-missing-pymodule-create2-in-amd64-win-python35-d-lib
161 if(PYTHON_IS_DEBUG)
162 target_compile_definitions(${target_name} PRIVATE Py_DEBUG)
163 endif()
164
Lori A. Burns545b4db2016-12-13 10:59:21 -0500165 # The prefix and extension are provided by FindPythonLibsNew.cmake
166 set_target_properties(${target_name} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}")
167 set_target_properties(${target_name} PROPERTIES SUFFIX "${PYTHON_MODULE_EXTENSION}")
168
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400169 # -fvisibility=hidden is required to allow multiple modules compiled against
170 # different pybind versions to work properly, and for some features (e.g.
171 # py::module_local). We force it on everything inside the `pybind11`
172 # namespace; also turning it on for a pybind module compilation here avoids
173 # potential warnings or issues from having mixed hidden/non-hidden types.
174 set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden")
Davis E. King9343e682018-09-14 08:28:54 -0400175 set_target_properties(${target_name} PROPERTIES CUDA_VISIBILITY_PRESET "hidden")
Jason Rhinelander97aa54f2017-08-10 12:08:42 -0400176
Lori A. Burns545b4db2016-12-13 10:59:21 -0500177 if(WIN32 OR CYGWIN)
178 # Link against the Python shared library on Windows
179 target_link_libraries(${target_name} PRIVATE ${PYTHON_LIBRARIES})
180 elseif(APPLE)
181 # It's quite common to have multiple copies of the same Python version
182 # installed on one's system. E.g.: one copy from the OS and another copy
183 # that's statically linked into an application like Blender or Maya.
184 # If we link our plugin library against the OS Python here and import it
185 # into Blender or Maya later on, this will cause segfaults when multiple
186 # conflicting Python instances are active at the same time (even when they
187 # are of the same version).
188
189 # Windows is not affected by this issue since it handles DLL imports
190 # differently. The solution for Linux and Mac OS is simple: we just don't
191 # link against the Python library. The resulting shared library will have
192 # missing symbols, but that's perfectly fine -- they will be resolved at
193 # import time.
194
195 target_link_libraries(${target_name} PRIVATE "-undefined dynamic_lookup")
Dean Moldovanb0f38852016-12-14 01:43:39 +0100196
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100197 if(ARG_SHARED)
Dean Moldovanb0f38852016-12-14 01:43:39 +0100198 # Suppress CMake >= 3.0 warning for shared libraries
199 set_target_properties(${target_name} PROPERTIES MACOSX_RPATH ON)
200 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500201 endif()
202
Jason Rhinelander77710ff2017-05-09 14:37:48 -0400203 # Make sure C++11/14 are enabled
Lori A. Burns868d94f2019-06-11 16:05:00 -0400204 if(CMAKE_VERSION VERSION_LESS 3.3)
205 target_compile_options(${target_name} PUBLIC ${PYBIND11_CPP_STANDARD})
206 else()
207 target_compile_options(${target_name} PUBLIC $<$<COMPILE_LANGUAGE:CXX>:${PYBIND11_CPP_STANDARD}>)
208 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500209
Dean Moldovan0cbec5c2016-12-16 22:58:37 +0100210 if(ARG_NO_EXTRAS)
211 return()
212 endif()
213
Jason Rhinelanderc137c0a2017-02-09 21:27:29 -0500214 _pybind11_add_lto_flags(${target_name} ${ARG_THIN_LTO})
Lori A. Burns545b4db2016-12-13 10:59:21 -0500215
Dmitry8f5a8ab2019-08-23 17:18:05 +0300216 if (NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo)
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500217 # Strip unnecessary sections of the binary on Linux/Mac OS
218 if(CMAKE_STRIP)
219 if(APPLE)
220 add_custom_command(TARGET ${target_name} POST_BUILD
221 COMMAND ${CMAKE_STRIP} -x $<TARGET_FILE:${target_name}>)
222 else()
223 add_custom_command(TARGET ${target_name} POST_BUILD
224 COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${target_name}>)
Lori A. Burns545b4db2016-12-13 10:59:21 -0500225 endif()
226 endif()
Jason Rhinelander1bee6e72017-01-17 02:13:11 -0500227 endif()
228
229 if(MSVC)
Lori A. Burns545b4db2016-12-13 10:59:21 -0500230 # /MP enables multithreaded builds (relevant when there are many files), /bigobj is
231 # needed for bigger binding projects due to the limit to 64k addressable sections
Rune Paamand06d021b2018-10-25 01:35:33 +0200232 target_compile_options(${target_name} PRIVATE /bigobj)
Davis E. King9343e682018-09-14 08:28:54 -0400233 if(CMAKE_VERSION VERSION_LESS 3.11)
Rune Paamand06d021b2018-10-25 01:35:33 +0200234 target_compile_options(${target_name} PRIVATE $<$<NOT:$<CONFIG:Debug>>:/MP>)
Davis E. King9343e682018-09-14 08:28:54 -0400235 else()
236 # Only set these options for C++ files. This is important so that, for
237 # instance, projects that include other types of source files like CUDA
238 # .cu files don't get these options propagated to nvcc since that would
239 # cause the build to fail.
Rune Paamand06d021b2018-10-25 01:35:33 +0200240 target_compile_options(${target_name} PRIVATE $<$<NOT:$<CONFIG:Debug>>:$<$<COMPILE_LANGUAGE:CXX>:/MP>>)
Davis E. King9343e682018-09-14 08:28:54 -0400241 endif()
Lori A. Burns545b4db2016-12-13 10:59:21 -0500242 endif()
243endfunction()