blob: d64a05c180cd70039d9f987d8d36077af8db584a [file] [log] [blame]
Dean Moldovan8c6b0b82016-05-23 00:12:37 +02001include(CheckCXXCompilerFlag)
2
3# Set a default build configuration if none is specified. 'MinSizeRel' produces the smallest binaries
4if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
5 message(STATUS "Setting build type to 'MinSizeRel' as none was specified.")
6 set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING "Choose the type of build." FORCE)
7 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
8 "MinSizeRel" "RelWithDebInfo")
9endif()
10string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
11
12if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
13 # Enable link time optimization and set the default symbol
14 # visibility to hidden (very important to obtain small binaries)
15 if(NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
16 # Check for Link Time Optimization support
17 # (GCC/Clang)
18 CHECK_CXX_COMPILER_FLAG("-flto" HAS_LTO_FLAG)
19 if(HAS_LTO_FLAG)
20 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
21 endif()
22
23 # Intel equivalent to LTO is called IPO
24 if(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
25 CHECK_CXX_COMPILER_FLAG("-ipo" HAS_IPO_FLAG)
26 if(HAS_IPO_FLAG)
27 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ipo")
28 endif()
29 endif()
30 endif()
31endif()
32
33# Compile with compiler warnings turned on
34if(MSVC)
35 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
36 string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
37 else()
38 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
39 endif()
40elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
41 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
42endif()
43
44set(PYBIND11_EXAMPLES
45 example1.cpp
46 example2.cpp
47 example3.cpp
48 example4.cpp
49 example5.cpp
50 example6.cpp
51 example7.cpp
52 example8.cpp
53 example9.cpp
54 example10.cpp
55 example11.cpp
56 example12.cpp
57 example13.cpp
58 example14.cpp
59 example15.cpp
60 example16.cpp
61 example17.cpp
62 issues.cpp
63)
64
65# Check if Eigen is available
66find_package(Eigen3 QUIET)
67
68if(EIGEN3_FOUND)
69 list(APPEND PYBIND11_EXAMPLES eigen.cpp)
70 message(STATUS "Building Eigen testcase")
71else()
72 message(STATUS "NOT Building Eigen testcase")
73endif()
74
75# Create the binding library
76pybind11_add_module(example example.cpp ${PYBIND11_EXAMPLES})
77if(EIGEN3_FOUND)
78 target_include_directories(example PRIVATE ${EIGEN3_INCLUDE_DIR})
79 target_compile_definitions(example PRIVATE -DPYBIND11_TEST_EIGEN)
80endif()
81
82# Always write the output file directly into the 'example' directory (even on MSVC)
83set(CompilerFlags
84 LIBRARY_OUTPUT_DIRECTORY LIBRARY_OUTPUT_DIRECTORY_RELEASE LIBRARY_OUTPUT_DIRECTORY_DEBUG
85 LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO
86 RUNTIME_OUTPUT_DIRECTORY RUNTIME_OUTPUT_DIRECTORY_RELEASE RUNTIME_OUTPUT_DIRECTORY_DEBUG
87 RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO)
88
89foreach(CompilerFlag ${CompilerFlags})
90 set_target_properties(example PROPERTIES ${CompilerFlag} ${PROJECT_SOURCE_DIR}/example)
91endforeach()
92
93if(WIN32)
94 if(MSVC)
95 # /MP enables multithreaded builds (relevant when there are many files), /bigobj is
96 # needed for bigger binding projects due to the limit to 64k addressable sections
97 set_property(TARGET example APPEND PROPERTY COMPILE_OPTIONS /MP /bigobj)
98 # Enforce size-based optimization and link time code generation on MSVC
99 # (~30% smaller binaries in experiments); do nothing in debug mode.
100 set_property(TARGET example APPEND PROPERTY COMPILE_OPTIONS
101 "$<$<CONFIG:Release>:/Os>" "$<$<CONFIG:Release>:/GL>"
102 "$<$<CONFIG:MinSizeRel>:/Os>" "$<$<CONFIG:MinSizeRel>:/GL>"
103 "$<$<CONFIG:RelWithDebInfo>:/Os>" "$<$<CONFIG:RelWithDebInfo>:/GL>"
104 )
105 set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELEASE "/LTCG ")
106 set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_MINSIZEREL "/LTCG ")
107 set_property(TARGET example APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO "/LTCG ")
108 endif()
109elseif(UNIX)
110 # Optimize for a small binary size
111 if(NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
112 set_target_properties(example PROPERTIES COMPILE_FLAGS "-Os")
113 endif()
114
115 # Strip unnecessary sections of the binary on Linux/Mac OS
116 if(APPLE)
117 if(NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
118 add_custom_command(TARGET example POST_BUILD COMMAND strip -u -r $<TARGET_FILE:example>)
119 endif()
120 else()
121 if(NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG)
122 add_custom_command(TARGET example POST_BUILD COMMAND strip $<TARGET_FILE:example>)
123 endif()
124 endif()
125endif()
126
127set(RUN_TEST ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/run_test.py)
128if(MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
129 set(RUN_TEST ${RUN_TEST} --relaxed)
130endif()
131
132foreach(VALUE ${PYBIND11_EXAMPLES})
133 string(REGEX REPLACE "^(.+).cpp$" "\\1" EXAMPLE_NAME "${VALUE}")
134 add_test(NAME ${EXAMPLE_NAME} COMMAND ${RUN_TEST} ${EXAMPLE_NAME})
135endforeach()