Jason Rhinelander | 60d0e0d | 2017-02-24 17:07:53 -0500 | [diff] [blame] | 1 | # CMakeLists.txt -- Build system for the pybind11 test suite |
| 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 | |
| 8 | cmake_minimum_required(VERSION 2.8.12) |
| 9 | |
| 10 | option(PYBIND11_WERROR "Report all warnings as errors" OFF) |
| 11 | |
| 12 | if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) |
| 13 | # We're being loaded directly, i.e. not via add_subdirectory, so make this |
| 14 | # work as its own project and load the pybind11Config to get the tools we need |
| 15 | project(pybind11_tests) |
| 16 | |
| 17 | find_package(pybind11 REQUIRED CONFIG) |
| 18 | endif() |
| 19 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 20 | if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
| 21 | message(STATUS "Setting tests build type to MinSizeRel as none was specified") |
Wenzel Jakob | 7962f30 | 2016-09-17 12:58:18 +0200 | [diff] [blame] | 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") |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 25 | endif() |
| 26 | |
Jason Rhinelander | 920e0e3 | 2016-11-12 19:10:53 -0500 | [diff] [blame] | 27 | # Full set of test files (you can override these; see below) |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 28 | set(PYBIND11_TEST_FILES |
| 29 | test_buffers.cpp |
Dean Moldovan | 83e328f | 2017-06-09 00:44:49 +0200 | [diff] [blame] | 30 | test_builtin_casters.cpp |
Dean Moldovan | 1ac1903 | 2017-03-16 11:22:26 +0100 | [diff] [blame] | 31 | test_call_policies.cpp |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 32 | test_callbacks.cpp |
Trent Houliston | 352149e | 2016-08-25 23:08:04 +1000 | [diff] [blame] | 33 | test_chrono.cpp |
Dean Moldovan | 83e328f | 2017-06-09 00:44:49 +0200 | [diff] [blame] | 34 | test_class.cpp |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 35 | test_constants_and_functions.cpp |
Jason Rhinelander | 813d7e8 | 2017-05-14 15:57:26 -0400 | [diff] [blame] | 36 | test_copy_move.cpp |
Alexander Stukowski | 9a110e6 | 2016-11-15 12:38:05 +0100 | [diff] [blame] | 37 | test_docstring_options.cpp |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 38 | test_eigen.cpp |
Dean Moldovan | a9a37b4 | 2016-08-13 00:57:24 +0200 | [diff] [blame] | 39 | test_enum.cpp |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 40 | test_eval.cpp |
| 41 | test_exceptions.cpp |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 42 | test_kwargs_and_defaults.cpp |
| 43 | test_methods_and_attributes.cpp |
| 44 | test_modules.cpp |
Dean Moldovan | 568ec6b | 2016-09-20 11:52:25 +0200 | [diff] [blame] | 45 | test_multiple_inheritance.cpp |
Ivan Smirnov | 91b3d68 | 2016-08-29 02:41:05 +0100 | [diff] [blame] | 46 | test_numpy_array.cpp |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 47 | test_numpy_dtypes.cpp |
| 48 | test_numpy_vectorize.cpp |
| 49 | test_opaque_types.cpp |
| 50 | test_operator_overloading.cpp |
| 51 | test_pickling.cpp |
Dean Moldovan | 83e328f | 2017-06-09 00:44:49 +0200 | [diff] [blame] | 52 | test_pytypes.cpp |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 53 | test_sequences_and_iterators.cpp |
Dean Moldovan | 568ec6b | 2016-09-20 11:52:25 +0200 | [diff] [blame] | 54 | test_smart_ptr.cpp |
Dean Moldovan | 83e328f | 2017-06-09 00:44:49 +0200 | [diff] [blame] | 55 | test_stl.cpp |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 56 | test_stl_binders.cpp |
| 57 | test_virtual_functions.cpp |
| 58 | ) |
| 59 | |
Jason Rhinelander | 920e0e3 | 2016-11-12 19:10:53 -0500 | [diff] [blame] | 60 | # Invoking cmake with something like: |
Dean Moldovan | bdfb50f | 2017-06-07 16:52:50 +0200 | [diff] [blame] | 61 | # cmake -DPYBIND11_TEST_OVERRIDE="test_callbacks.cpp;test_picking.cpp" .. |
Jason Rhinelander | 920e0e3 | 2016-11-12 19:10:53 -0500 | [diff] [blame] | 62 | # lets you override the tests that get compiled and run. You can restore to all tests with: |
| 63 | # cmake -DPYBIND11_TEST_OVERRIDE= .. |
| 64 | if (PYBIND11_TEST_OVERRIDE) |
| 65 | set(PYBIND11_TEST_FILES ${PYBIND11_TEST_OVERRIDE}) |
| 66 | endif() |
| 67 | |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 68 | string(REPLACE ".cpp" ".py" PYBIND11_PYTEST_FILES "${PYBIND11_TEST_FILES}") |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 69 | |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 70 | # Check if Eigen is available; if not, remove from PYBIND11_TEST_FILES (but |
| 71 | # keep it in PYBIND11_PYTEST_FILES, so that we get the "eigen is not installed" |
| 72 | # skip message). |
| 73 | list(FIND PYBIND11_TEST_FILES test_eigen.cpp PYBIND11_TEST_FILES_EIGEN_I) |
| 74 | if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1) |
Jason Rhinelander | 60d0e0d | 2017-02-24 17:07:53 -0500 | [diff] [blame] | 75 | # Try loading via newer Eigen's Eigen3Config first (bypassing tools/FindEigen3.cmake). |
| 76 | # Eigen 3.3.1+ exports a cmake 3.0+ target for handling dependency requirements, but also |
| 77 | # produces a fatal error if loaded from a pre-3.0 cmake. |
| 78 | if (NOT CMAKE_VERSION VERSION_LESS 3.0) |
| 79 | find_package(Eigen3 QUIET CONFIG) |
| 80 | if (EIGEN3_FOUND) |
| 81 | if (EIGEN3_VERSION_STRING AND NOT EIGEN3_VERSION_STRING VERSION_LESS 3.3.1) |
| 82 | set(PYBIND11_EIGEN_VIA_TARGET 1) |
| 83 | endif() |
| 84 | endif() |
| 85 | endif() |
| 86 | if (NOT EIGEN3_FOUND) |
| 87 | # Couldn't load via target, so fall back to allowing module mode finding, which will pick up |
| 88 | # tools/FindEigen3.cmake |
| 89 | find_package(Eigen3 QUIET) |
| 90 | endif() |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 91 | |
| 92 | if(EIGEN3_FOUND) |
Jason Rhinelander | 60d0e0d | 2017-02-24 17:07:53 -0500 | [diff] [blame] | 93 | # Eigen 3.3.1+ cmake sets EIGEN3_VERSION_STRING (and hard codes the version when installed |
| 94 | # rather than looking it up in the cmake script); older versions, and the |
| 95 | # tools/FindEigen3.cmake, set EIGEN3_VERSION instead. |
| 96 | if(NOT EIGEN3_VERSION AND EIGEN3_VERSION_STRING) |
| 97 | set(EIGEN3_VERSION ${EIGEN3_VERSION_STRING}) |
| 98 | endif() |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 99 | message(STATUS "Building tests with Eigen v${EIGEN3_VERSION}") |
| 100 | else() |
| 101 | list(REMOVE_AT PYBIND11_TEST_FILES ${PYBIND11_TEST_FILES_EIGEN_I}) |
| 102 | message(STATUS "Building tests WITHOUT Eigen") |
| 103 | endif() |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 104 | endif() |
| 105 | |
Jason Rhinelander | 60d0e0d | 2017-02-24 17:07:53 -0500 | [diff] [blame] | 106 | # Compile with compiler warnings turned on |
| 107 | function(pybind11_enable_warnings target_name) |
| 108 | if(MSVC) |
| 109 | target_compile_options(${target_name} PRIVATE /W4) |
| 110 | else() |
| 111 | target_compile_options(${target_name} PRIVATE -Wall -Wextra -Wconversion -Wcast-qual) |
| 112 | endif() |
| 113 | |
| 114 | if(PYBIND11_WERROR) |
| 115 | if(MSVC) |
| 116 | target_compile_options(${target_name} PRIVATE /WX) |
| 117 | else() |
| 118 | target_compile_options(${target_name} PRIVATE -Werror) |
| 119 | endif() |
| 120 | endif() |
| 121 | endfunction() |
| 122 | |
| 123 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 124 | # Create the binding library |
Jason Rhinelander | 1bee6e7 | 2017-01-17 02:13:11 -0500 | [diff] [blame] | 125 | pybind11_add_module(pybind11_tests THIN_LTO pybind11_tests.cpp |
Wenzel Jakob | dac3858 | 2016-09-29 21:30:00 +0200 | [diff] [blame] | 126 | ${PYBIND11_TEST_FILES} ${PYBIND11_HEADERS}) |
| 127 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 128 | pybind11_enable_warnings(pybind11_tests) |
| 129 | |
Jason Rhinelander | 8dc63ba | 2017-05-25 01:05:49 -0400 | [diff] [blame] | 130 | if(MSVC) |
| 131 | target_compile_options(pybind11_tests PRIVATE /utf-8) |
| 132 | endif() |
| 133 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 134 | if(EIGEN3_FOUND) |
Jason Rhinelander | 60d0e0d | 2017-02-24 17:07:53 -0500 | [diff] [blame] | 135 | if (PYBIND11_EIGEN_VIA_TARGET) |
| 136 | target_link_libraries(pybind11_tests PRIVATE Eigen3::Eigen) |
| 137 | else() |
| 138 | target_include_directories(pybind11_tests PRIVATE ${EIGEN3_INCLUDE_DIR}) |
| 139 | endif() |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 140 | target_compile_definitions(pybind11_tests PRIVATE -DPYBIND11_TEST_EIGEN) |
| 141 | endif() |
| 142 | |
Jason Rhinelander | 60d0e0d | 2017-02-24 17:07:53 -0500 | [diff] [blame] | 143 | set(testdir ${CMAKE_CURRENT_SOURCE_DIR}) |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 144 | |
| 145 | # Always write the output file directly into the 'tests' directory (even on MSVC) |
| 146 | if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) |
| 147 | set_target_properties(pybind11_tests PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${testdir}) |
| 148 | foreach(config ${CMAKE_CONFIGURATION_TYPES}) |
| 149 | string(TOUPPER ${config} config) |
| 150 | set_target_properties(pybind11_tests PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${config} ${testdir}) |
| 151 | endforeach() |
| 152 | endif() |
| 153 | |
Jason Rhinelander | dd3d56a | 2016-08-26 17:11:40 -0400 | [diff] [blame] | 154 | # Make sure pytest is found or produce a fatal error |
Dean Moldovan | 18319d5 | 2016-08-13 02:44:56 +0200 | [diff] [blame] | 155 | if(NOT PYBIND11_PYTEST_FOUND) |
Dean Moldovan | d47febc | 2017-03-10 15:42:42 +0100 | [diff] [blame] | 156 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import pytest; print(pytest.__version__)" |
| 157 | RESULT_VARIABLE pytest_not_found OUTPUT_VARIABLE pytest_version ERROR_QUIET) |
| 158 | if(pytest_not_found) |
| 159 | message(FATAL_ERROR "Running the tests requires pytest. Please install it manually" |
| 160 | " (try: ${PYTHON_EXECUTABLE} -m pip install pytest)") |
| 161 | elseif(pytest_version VERSION_LESS 3.0) |
| 162 | message(FATAL_ERROR "Running the tests requires pytest >= 3.0. Found: ${pytest_version}" |
| 163 | "Please update it (try: ${PYTHON_EXECUTABLE} -m pip install -U pytest)") |
Dean Moldovan | 18319d5 | 2016-08-13 02:44:56 +0200 | [diff] [blame] | 164 | endif() |
Wenzel Jakob | b55a5c5 | 2016-10-09 13:51:05 +0200 | [diff] [blame] | 165 | set(PYBIND11_PYTEST_FOUND TRUE CACHE INTERNAL "") |
Dean Moldovan | 18319d5 | 2016-08-13 02:44:56 +0200 | [diff] [blame] | 166 | endif() |
| 167 | |
Wenzel Jakob | 7653a11 | 2017-04-28 22:43:14 +0200 | [diff] [blame] | 168 | if(CMAKE_VERSION VERSION_LESS 3.2) |
| 169 | set(PYBIND11_USES_TERMINAL "") |
| 170 | else() |
| 171 | set(PYBIND11_USES_TERMINAL "USES_TERMINAL") |
| 172 | endif() |
| 173 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 174 | # A single command to compile and run the tests |
Dean Moldovan | d47febc | 2017-03-10 15:42:42 +0100 | [diff] [blame] | 175 | add_custom_target(pytest COMMAND ${PYTHON_EXECUTABLE} -m pytest ${PYBIND11_PYTEST_FILES} |
Wenzel Jakob | 7653a11 | 2017-04-28 22:43:14 +0200 | [diff] [blame] | 176 | DEPENDS pybind11_tests WORKING_DIRECTORY ${testdir} ${PYBIND11_USES_TERMINAL}) |
Jason Rhinelander | dc0b4bd | 2016-11-04 09:47:41 -0400 | [diff] [blame] | 177 | |
Jason Rhinelander | 920e0e3 | 2016-11-12 19:10:53 -0500 | [diff] [blame] | 178 | if(PYBIND11_TEST_OVERRIDE) |
| 179 | add_custom_command(TARGET pytest POST_BUILD |
| 180 | COMMAND ${CMAKE_COMMAND} -E echo "Note: not all tests run: -DPYBIND11_TEST_OVERRIDE is in effect") |
| 181 | endif() |
| 182 | |
Jason Rhinelander | 60d0e0d | 2017-02-24 17:07:53 -0500 | [diff] [blame] | 183 | # Add a check target to run all the tests, starting with pytest (we add dependencies to this below) |
| 184 | add_custom_target(check DEPENDS pytest) |
| 185 | |
| 186 | # The remaining tests only apply when being built as part of the pybind11 project, but not if the |
| 187 | # tests are being built independently. |
| 188 | if (NOT PROJECT_NAME STREQUAL "pybind11") |
| 189 | return() |
| 190 | endif() |
| 191 | |
| 192 | # Add a post-build comment to show the .so size and, if a previous size, compare it: |
Jason Rhinelander | dc0b4bd | 2016-11-04 09:47:41 -0400 | [diff] [blame] | 193 | add_custom_command(TARGET pybind11_tests POST_BUILD |
Matthew Woehlke | 5e92b3e | 2017-02-08 17:43:23 -0500 | [diff] [blame] | 194 | COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/libsize.py |
Dean Moldovan | b0f3885 | 2016-12-14 01:43:39 +0100 | [diff] [blame] | 195 | $<TARGET_FILE:pybind11_tests> ${CMAKE_CURRENT_BINARY_DIR}/sosize-$<TARGET_FILE_NAME:pybind11_tests>.txt) |
| 196 | |
Dean Moldovan | 9693a5c | 2017-03-23 17:27:32 +0100 | [diff] [blame] | 197 | # Test embedding the interpreter. Provides the `cpptest` target. |
| 198 | add_subdirectory(test_embed) |
| 199 | |
Dean Moldovan | b0f3885 | 2016-12-14 01:43:39 +0100 | [diff] [blame] | 200 | # Test CMake build using functions and targets from subdirectory or installed location |
Dean Moldovan | c67033a | 2017-06-25 15:16:34 +0200 | [diff] [blame] | 201 | add_subdirectory(test_cmake_build) |