Dean Moldovan | 8c6b0b8 | 2016-05-23 00:12:37 +0200 | [diff] [blame^] | 1 | include(CheckCXXCompilerFlag) |
| 2 | |
| 3 | # Set a default build configuration if none is specified. 'MinSizeRel' produces the smallest binaries |
| 4 | if(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") |
| 9 | endif() |
| 10 | string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE) |
| 11 | |
| 12 | if(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() |
| 31 | endif() |
| 32 | |
| 33 | # Compile with compiler warnings turned on |
| 34 | if(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() |
| 40 | elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") |
| 41 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") |
| 42 | endif() |
| 43 | |
| 44 | set(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 |
| 66 | find_package(Eigen3 QUIET) |
| 67 | |
| 68 | if(EIGEN3_FOUND) |
| 69 | list(APPEND PYBIND11_EXAMPLES eigen.cpp) |
| 70 | message(STATUS "Building Eigen testcase") |
| 71 | else() |
| 72 | message(STATUS "NOT Building Eigen testcase") |
| 73 | endif() |
| 74 | |
| 75 | # Create the binding library |
| 76 | pybind11_add_module(example example.cpp ${PYBIND11_EXAMPLES}) |
| 77 | if(EIGEN3_FOUND) |
| 78 | target_include_directories(example PRIVATE ${EIGEN3_INCLUDE_DIR}) |
| 79 | target_compile_definitions(example PRIVATE -DPYBIND11_TEST_EIGEN) |
| 80 | endif() |
| 81 | |
| 82 | # Always write the output file directly into the 'example' directory (even on MSVC) |
| 83 | set(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 | |
| 89 | foreach(CompilerFlag ${CompilerFlags}) |
| 90 | set_target_properties(example PROPERTIES ${CompilerFlag} ${PROJECT_SOURCE_DIR}/example) |
| 91 | endforeach() |
| 92 | |
| 93 | if(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() |
| 109 | elseif(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() |
| 125 | endif() |
| 126 | |
| 127 | set(RUN_TEST ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/run_test.py) |
| 128 | if(MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Intel") |
| 129 | set(RUN_TEST ${RUN_TEST} --relaxed) |
| 130 | endif() |
| 131 | |
| 132 | foreach(VALUE ${PYBIND11_EXAMPLES}) |
| 133 | string(REGEX REPLACE "^(.+).cpp$" "\\1" EXAMPLE_NAME "${VALUE}") |
| 134 | add_test(NAME ${EXAMPLE_NAME} COMMAND ${RUN_TEST} ${EXAMPLE_NAME}) |
| 135 | endforeach() |