blob: 3a45bef87477f83f42d926c238bded6f5eec2302 [file] [log] [blame]
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001# CMakeLists.txt -- Build system for the pybind11 examples
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)
9
Wenzel Jakob8f4eb002015-10-15 18:13:33 +020010project(pybind11)
Wenzel Jakob38bd7112015-07-05 20:05:44 +020011
Wenzel Jakob3350b5e2015-11-24 21:33:18 +010012option(PYBIND11_INSTALL "Install pybind11 header files?" ON)
13
Wenzel Jakobbcd31822015-10-12 23:57:20 +020014# Add a CMake parameter for choosing a desired Python version
Wenzel Jakobb1b71402015-10-18 16:48:30 +020015set(PYBIND11_PYTHON_VERSION "" CACHE STRING "Python version to use for compiling the example application")
Wenzel Jakobbcd31822015-10-12 23:57:20 +020016
Wenzel Jakobcaa9d442016-01-17 22:36:34 +010017include(CheckCXXCompilerFlag)
18
Wenzel Jakobbcd31822015-10-12 23:57:20 +020019# Set a default build configuration if none is specified. 'MinSizeRel' produces the smallest binaries
Wenzel Jakob38bd7112015-07-05 20:05:44 +020020if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
21 message(STATUS "Setting build type to 'MinSizeRel' as none was specified.")
22 set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING "Choose the type of build." FORCE)
23 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
24 "MinSizeRel" "RelWithDebInfo")
25endif()
Wenzel Jakobbcd31822015-10-12 23:57:20 +020026string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
Wenzel Jakob3b806d42015-10-11 16:29:35 +020027
Dean Moldovan928fff62016-05-22 19:48:47 +020028list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/tools")
Wenzel Jakobcaa9d442016-01-17 22:36:34 +010029set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7)
Dean Moldovan928fff62016-05-22 19:48:47 +020030find_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED)
Wenzel Jakobfaaee1c2015-11-30 10:17:01 +010031
Ben Pritchard70ee47d2016-02-18 13:06:43 -050032if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
Wenzel Jakob66c9a402016-01-17 22:36:36 +010033 CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG)
34 CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CPP11_FLAG)
35
36 if (HAS_CPP14_FLAG)
37 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
38 elseif (HAS_CPP11_FLAG)
39 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
40 else()
41 message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!")
42 endif()
Wenzel Jakobbcd31822015-10-12 23:57:20 +020043
44 # Enable link time optimization and set the default symbol
45 # visibility to hidden (very important to obtain small binaries)
Wenzel Jakob38bd7112015-07-05 20:05:44 +020046 if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
Wenzel Jakobfaaee1c2015-11-30 10:17:01 +010047 # Default symbol visibility
48 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
49
50 # Check for Link Time Optimization support
Ben Pritchard70ee47d2016-02-18 13:06:43 -050051 # (GCC/Clang)
Wenzel Jakobfaaee1c2015-11-30 10:17:01 +010052 CHECK_CXX_COMPILER_FLAG("-flto" HAS_LTO_FLAG)
53 if (HAS_LTO_FLAG)
54 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
55 endif()
Ben Pritchard70ee47d2016-02-18 13:06:43 -050056
57 # Intel equivalent to LTO is called IPO
Wenzel Jakobe2bb4eb2016-02-19 13:27:20 +010058 if (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
59 CHECK_CXX_COMPILER_FLAG("-ipo" HAS_IPO_FLAG)
60 if (HAS_IPO_FLAG)
61 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ipo")
62 endif()
Ben Pritchard70ee47d2016-02-18 13:06:43 -050063 endif()
Wenzel Jakob38bd7112015-07-05 20:05:44 +020064 endif()
65endif()
66
67# Compile with compiler warnings turned on
68if(MSVC)
69 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
70 string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
71 else()
72 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
73 endif()
Wenzel Jakobf2331662015-11-28 14:24:44 +010074elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
Wenzel Jakob38bd7112015-07-05 20:05:44 +020075 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
76endif()
77
Wenzel Jakob9e0a0562016-05-05 20:33:54 +020078
79# Check if Eigen is available
Wenzel Jakob9e0a0562016-05-05 20:33:54 +020080find_package(Eigen3 QUIET)
81
Wenzel Jakobbcd31822015-10-12 23:57:20 +020082# Include path for pybind11 header files
83include_directories(include)
84
Wenzel Jakobe44e56f2016-04-30 22:59:58 +020085# Include path for Python header files
Dean Moldovan928fff62016-05-22 19:48:47 +020086include_directories(${PYTHON_INCLUDE_DIRS})
Wenzel Jakobe44e56f2016-04-30 22:59:58 +020087
Luka Čehovin19af3572015-11-24 21:20:56 +010088set(PYBIND11_HEADERS
Wenzel Jakob48548ea2016-01-17 22:36:44 +010089 include/pybind11/attr.h
Wenzel Jakob8f4eb002015-10-15 18:13:33 +020090 include/pybind11/cast.h
91 include/pybind11/common.h
Wenzel Jakob66c9a402016-01-17 22:36:36 +010092 include/pybind11/complex.h
93 include/pybind11/descr.h
Wenzel Jakob9e0a0562016-05-05 20:33:54 +020094 include/pybind11/eigen.h
Wenzel Jakob66c9a402016-01-17 22:36:36 +010095 include/pybind11/functional.h
96 include/pybind11/numpy.h
Wenzel Jakob8f4eb002015-10-15 18:13:33 +020097 include/pybind11/operators.h
98 include/pybind11/pybind11.h
99 include/pybind11/pytypes.h
Wenzel Jakobe52cf8a2015-12-15 11:32:29 +0100100 include/pybind11/stl.h
Wenzel Jakob25c03ce2016-05-15 20:50:38 +0200101 include/pybind11/stl_bind.h
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100102 include/pybind11/typeid.h
Luka Čehovin19af3572015-11-24 21:20:56 +0100103)
104
Axel Huebl6c37f212016-01-20 09:24:25 +0100105set(PYBIND11_EXAMPLES
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200106 example/example1.cpp
107 example/example2.cpp
108 example/example3.cpp
109 example/example4.cpp
110 example/example5.cpp
111 example/example6.cpp
112 example/example7.cpp
113 example/example8.cpp
114 example/example9.cpp
Wenzel Jakobd4258ba2015-07-26 16:33:49 +0200115 example/example10.cpp
Wenzel Jakoba576e6a2015-07-29 17:51:54 +0200116 example/example11.cpp
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +0200117 example/example12.cpp
Wenzel Jakob5f218b32016-01-17 22:36:39 +0100118 example/example13.cpp
Wenzel Jakobeda978e2016-03-15 15:05:40 +0100119 example/example14.cpp
Wenzel Jakob1c329aa2016-04-13 02:37:36 +0200120 example/example15.cpp
Wenzel Jakobd7efa4f2016-04-13 13:45:09 +0200121 example/example16.cpp
Sergey Lyskoveae77442016-05-07 00:26:19 -0400122 example/example17.cpp
Wenzel Jakob17cdb062016-03-10 13:24:10 +0100123 example/issues.cpp
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200124)
Axel Huebl6c37f212016-01-20 09:24:25 +0100125
Wenzel Jakob9e0a0562016-05-05 20:33:54 +0200126if (EIGEN3_FOUND)
127 include_directories(${EIGEN3_INCLUDE_DIR})
128 list(APPEND PYBIND11_EXAMPLES example/eigen.cpp)
129 add_definitions(-DPYBIND11_TEST_EIGEN)
130 message(STATUS "Building Eigen testcase")
131else()
132 message(STATUS "NOT Building Eigen testcase")
133endif()
134
Axel Huebl6c37f212016-01-20 09:24:25 +0100135# Create the binding library
136add_library(example SHARED
137 ${PYBIND11_HEADERS}
138 example/example.cpp
139 ${PYBIND11_EXAMPLES}
140)
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200141
Wenzel Jakobbcd31822015-10-12 23:57:20 +0200142# Don't add a 'lib' prefix to the shared library
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200143set_target_properties(example PROPERTIES PREFIX "")
Wenzel Jakobbcd31822015-10-12 23:57:20 +0200144
Wenzel Jakob607654f2015-10-13 23:58:10 +0200145# Always write the output file directly into the 'example' directory (even on MSVC)
146set(CompilerFlags
147 LIBRARY_OUTPUT_DIRECTORY LIBRARY_OUTPUT_DIRECTORY_RELEASE LIBRARY_OUTPUT_DIRECTORY_DEBUG
148 LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO
149 RUNTIME_OUTPUT_DIRECTORY RUNTIME_OUTPUT_DIRECTORY_RELEASE RUNTIME_OUTPUT_DIRECTORY_DEBUG
150 RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO)
151
152foreach(CompilerFlag ${CompilerFlags})
153 set_target_properties(example PROPERTIES ${CompilerFlag} ${PROJECT_SOURCE_DIR}/example)
154endforeach()
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200155
156if (WIN32)
157 if (MSVC)
Wenzel Jakobbdd11032016-05-01 12:56:09 +0200158 # /MP enables multithreaded builds (relevant when there are many files), /bigobj is
159 # needed for bigger binding projects due to the limit to 64k addressable sections
160 set_property(TARGET example APPEND PROPERTY COMPILE_OPTIONS /MP /bigobj)
161 # Enforce size-based optimization and link time code generation on MSVC
162 # (~30% smaller binaries in experiments); do nothing in debug mode.
163 set_property(TARGET example APPEND PROPERTY COMPILE_OPTIONS
164 "$<$<CONFIG:Release>:/Os>" "$<$<CONFIG:Release>:/GL>"
165 "$<$<CONFIG:MinSizeRel>:/Os>" "$<$<CONFIG:MinSizeRel>:/GL>"
166 "$<$<CONFIG:RelWithDebInfo>:/Os>" "$<$<CONFIG:RelWithDebInfo>:/GL>"
167 )
168 set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELEASE "/LTCG ")
169 set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_MINSIZEREL "/LTCG ")
170 set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO "/LTCG ")
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200171 endif()
172
173 # .PYD file extension on Windows
174 set_target_properties(example PROPERTIES SUFFIX ".pyd")
175
176 # Link against the Python shared library
Dean Moldovan928fff62016-05-22 19:48:47 +0200177 target_link_libraries(example ${PYTHON_LIBRARIES})
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200178elseif (UNIX)
179 # It's quite common to have multiple copies of the same Python version
180 # installed on one's system. E.g.: one copy from the OS and another copy
181 # that's statically linked into an application like Blender or Maya.
182 # If we link our plugin library against the OS Python here and import it
183 # into Blender or Maya later on, this will cause segfaults when multiple
Wenzel Jakob6eb11da2016-01-17 22:36:36 +0100184 # conflicting Python instances are active at the same time (even when they
185 # are of the same version).
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200186
Wenzel Jakob518cf722016-01-21 19:17:58 +0100187 # Windows is not affected by this issue since it handles DLL imports
Wenzel Jakobbcd31822015-10-12 23:57:20 +0200188 # differently. The solution for Linux and Mac OS is simple: we just don't
189 # link against the Python library. The resulting shared library will have
190 # missing symbols, but that's perfectly fine -- they will be resolved at
191 # import time.
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200192
193 # .SO file extension on Linux/Mac OS
194 set_target_properties(example PROPERTIES SUFFIX ".so")
195
Wenzel Jakob867ae372015-10-15 22:41:25 +0200196 # Optimize for a small binary size
197 if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
198 set_target_properties(example PROPERTIES COMPILE_FLAGS "-Os")
199 endif()
200
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200201 # Strip unnecessary sections of the binary on Linux/Mac OS
202 if(APPLE)
203 set_target_properties(example PROPERTIES MACOSX_RPATH ".")
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100204 set_target_properties(example PROPERTIES LINK_FLAGS "-undefined dynamic_lookup ")
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200205 if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
206 add_custom_command(TARGET example POST_BUILD COMMAND strip -u -r ${PROJECT_SOURCE_DIR}/example/example.so)
207 endif()
208 else()
209 if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
210 add_custom_command(TARGET example POST_BUILD COMMAND strip ${PROJECT_SOURCE_DIR}/example/example.so)
211 endif()
212 endif()
213endif()
214
215enable_testing()
Wenzel Jakob80c24512016-02-20 20:53:10 +0100216
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200217set(RUN_TEST ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example/run_test.py)
Wenzel Jakob80c24512016-02-20 20:53:10 +0100218if (MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
219 set(RUN_TEST ${RUN_TEST} --relaxed)
220endif()
221
Wenzel Jakob17cdb062016-03-10 13:24:10 +0100222foreach(VALUE ${PYBIND11_EXAMPLES})
223 string(REGEX REPLACE "^example/(.+).cpp$" "\\1" EXAMPLE_NAME "${VALUE}")
224 add_test(NAME ${EXAMPLE_NAME} COMMAND ${RUN_TEST} ${EXAMPLE_NAME})
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200225endforeach()
Luka Čehovin19af3572015-11-24 21:20:56 +0100226
Wenzel Jakob3350b5e2015-11-24 21:33:18 +0100227if (PYBIND11_INSTALL)
Luka Čehovin19af3572015-11-24 21:20:56 +0100228 install(FILES ${PYBIND11_HEADERS} DESTINATION include/pybind11)
229endif()