CMakeLists.txt revision 11986
111986Sandreas.sandberg@arm.comif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 211986Sandreas.sandberg@arm.com message(STATUS "Setting tests build type to MinSizeRel as none was specified") 311986Sandreas.sandberg@arm.com set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING "Choose the type of build." FORCE) 411986Sandreas.sandberg@arm.com set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" 511986Sandreas.sandberg@arm.com "MinSizeRel" "RelWithDebInfo") 611986Sandreas.sandberg@arm.comendif() 711986Sandreas.sandberg@arm.com 811986Sandreas.sandberg@arm.com# Full set of test files (you can override these; see below) 911986Sandreas.sandberg@arm.comset(PYBIND11_TEST_FILES 1011986Sandreas.sandberg@arm.com test_alias_initialization.cpp 1111986Sandreas.sandberg@arm.com test_buffers.cpp 1211986Sandreas.sandberg@arm.com test_callbacks.cpp 1311986Sandreas.sandberg@arm.com test_chrono.cpp 1411986Sandreas.sandberg@arm.com test_class_args.cpp 1511986Sandreas.sandberg@arm.com test_constants_and_functions.cpp 1611986Sandreas.sandberg@arm.com test_copy_move_policies.cpp 1711986Sandreas.sandberg@arm.com test_docstring_options.cpp 1811986Sandreas.sandberg@arm.com test_eigen.cpp 1911986Sandreas.sandberg@arm.com test_enum.cpp 2011986Sandreas.sandberg@arm.com test_eval.cpp 2111986Sandreas.sandberg@arm.com test_exceptions.cpp 2211986Sandreas.sandberg@arm.com test_inheritance.cpp 2311986Sandreas.sandberg@arm.com test_issues.cpp 2411986Sandreas.sandberg@arm.com test_keep_alive.cpp 2511986Sandreas.sandberg@arm.com test_kwargs_and_defaults.cpp 2611986Sandreas.sandberg@arm.com test_methods_and_attributes.cpp 2711986Sandreas.sandberg@arm.com test_modules.cpp 2811986Sandreas.sandberg@arm.com test_multiple_inheritance.cpp 2911986Sandreas.sandberg@arm.com test_numpy_array.cpp 3011986Sandreas.sandberg@arm.com test_numpy_dtypes.cpp 3111986Sandreas.sandberg@arm.com test_numpy_vectorize.cpp 3211986Sandreas.sandberg@arm.com test_opaque_types.cpp 3311986Sandreas.sandberg@arm.com test_operator_overloading.cpp 3411986Sandreas.sandberg@arm.com test_pickling.cpp 3511986Sandreas.sandberg@arm.com test_python_types.cpp 3611986Sandreas.sandberg@arm.com test_sequences_and_iterators.cpp 3711986Sandreas.sandberg@arm.com test_smart_ptr.cpp 3811986Sandreas.sandberg@arm.com test_stl_binders.cpp 3911986Sandreas.sandberg@arm.com test_virtual_functions.cpp 4011986Sandreas.sandberg@arm.com) 4111986Sandreas.sandberg@arm.com 4211986Sandreas.sandberg@arm.com# Invoking cmake with something like: 4311986Sandreas.sandberg@arm.com# cmake -DPYBIND11_TEST_OVERRIDE="test_issues.cpp;test_picking.cpp" .. 4411986Sandreas.sandberg@arm.com# lets you override the tests that get compiled and run. You can restore to all tests with: 4511986Sandreas.sandberg@arm.com# cmake -DPYBIND11_TEST_OVERRIDE= .. 4611986Sandreas.sandberg@arm.comif (PYBIND11_TEST_OVERRIDE) 4711986Sandreas.sandberg@arm.com set(PYBIND11_TEST_FILES ${PYBIND11_TEST_OVERRIDE}) 4811986Sandreas.sandberg@arm.comendif() 4911986Sandreas.sandberg@arm.com 5011986Sandreas.sandberg@arm.comstring(REPLACE ".cpp" ".py" PYBIND11_PYTEST_FILES "${PYBIND11_TEST_FILES}") 5111986Sandreas.sandberg@arm.com 5211986Sandreas.sandberg@arm.com# Check if Eigen is available; if not, remove from PYBIND11_TEST_FILES (but 5311986Sandreas.sandberg@arm.com# keep it in PYBIND11_PYTEST_FILES, so that we get the "eigen is not installed" 5411986Sandreas.sandberg@arm.com# skip message). 5511986Sandreas.sandberg@arm.comlist(FIND PYBIND11_TEST_FILES test_eigen.cpp PYBIND11_TEST_FILES_EIGEN_I) 5611986Sandreas.sandberg@arm.comif(PYBIND11_TEST_FILES_EIGEN_I GREATER -1) 5711986Sandreas.sandberg@arm.com find_package(Eigen3 QUIET) 5811986Sandreas.sandberg@arm.com 5911986Sandreas.sandberg@arm.com if(EIGEN3_FOUND) 6011986Sandreas.sandberg@arm.com message(STATUS "Building tests with Eigen v${EIGEN3_VERSION}") 6111986Sandreas.sandberg@arm.com else() 6211986Sandreas.sandberg@arm.com list(REMOVE_AT PYBIND11_TEST_FILES ${PYBIND11_TEST_FILES_EIGEN_I}) 6311986Sandreas.sandberg@arm.com message(STATUS "Building tests WITHOUT Eigen") 6411986Sandreas.sandberg@arm.com endif() 6511986Sandreas.sandberg@arm.comendif() 6611986Sandreas.sandberg@arm.com 6711986Sandreas.sandberg@arm.com# Create the binding library 6811986Sandreas.sandberg@arm.compybind11_add_module(pybind11_tests pybind11_tests.cpp 6911986Sandreas.sandberg@arm.com ${PYBIND11_TEST_FILES} ${PYBIND11_HEADERS}) 7011986Sandreas.sandberg@arm.com 7111986Sandreas.sandberg@arm.compybind11_enable_warnings(pybind11_tests) 7211986Sandreas.sandberg@arm.com 7311986Sandreas.sandberg@arm.comif(EIGEN3_FOUND) 7411986Sandreas.sandberg@arm.com target_include_directories(pybind11_tests PRIVATE ${EIGEN3_INCLUDE_DIR}) 7511986Sandreas.sandberg@arm.com target_compile_definitions(pybind11_tests PRIVATE -DPYBIND11_TEST_EIGEN) 7611986Sandreas.sandberg@arm.comendif() 7711986Sandreas.sandberg@arm.com 7811986Sandreas.sandberg@arm.comset(testdir ${PROJECT_SOURCE_DIR}/tests) 7911986Sandreas.sandberg@arm.com 8011986Sandreas.sandberg@arm.com# Always write the output file directly into the 'tests' directory (even on MSVC) 8111986Sandreas.sandberg@arm.comif(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) 8211986Sandreas.sandberg@arm.com set_target_properties(pybind11_tests PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${testdir}) 8311986Sandreas.sandberg@arm.com foreach(config ${CMAKE_CONFIGURATION_TYPES}) 8411986Sandreas.sandberg@arm.com string(TOUPPER ${config} config) 8511986Sandreas.sandberg@arm.com set_target_properties(pybind11_tests PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${config} ${testdir}) 8611986Sandreas.sandberg@arm.com endforeach() 8711986Sandreas.sandberg@arm.comendif() 8811986Sandreas.sandberg@arm.com 8911986Sandreas.sandberg@arm.com# Make sure pytest is found or produce a fatal error 9011986Sandreas.sandberg@arm.comif(NOT PYBIND11_PYTEST_FOUND) 9111986Sandreas.sandberg@arm.com execute_process(COMMAND ${PYTHON_EXECUTABLE} -m pytest --version --noconftest OUTPUT_QUIET ERROR_QUIET 9211986Sandreas.sandberg@arm.com RESULT_VARIABLE PYBIND11_EXEC_PYTHON_ERR) 9311986Sandreas.sandberg@arm.com if(PYBIND11_EXEC_PYTHON_ERR) 9411986Sandreas.sandberg@arm.com message(FATAL_ERROR "Running the tests requires pytest. Please install it manually (try: ${PYTHON_EXECUTABLE} -m pip install pytest)") 9511986Sandreas.sandberg@arm.com endif() 9611986Sandreas.sandberg@arm.com set(PYBIND11_PYTEST_FOUND TRUE CACHE INTERNAL "") 9711986Sandreas.sandberg@arm.comendif() 9811986Sandreas.sandberg@arm.com 9911986Sandreas.sandberg@arm.com# A single command to compile and run the tests 10011986Sandreas.sandberg@arm.comadd_custom_target(pytest COMMAND ${PYTHON_EXECUTABLE} -m pytest -rws ${PYBIND11_PYTEST_FILES} 10111986Sandreas.sandberg@arm.com DEPENDS pybind11_tests WORKING_DIRECTORY ${testdir}) 10211986Sandreas.sandberg@arm.com 10311986Sandreas.sandberg@arm.comif(PYBIND11_TEST_OVERRIDE) 10411986Sandreas.sandberg@arm.com add_custom_command(TARGET pytest POST_BUILD 10511986Sandreas.sandberg@arm.com COMMAND ${CMAKE_COMMAND} -E echo "Note: not all tests run: -DPYBIND11_TEST_OVERRIDE is in effect") 10611986Sandreas.sandberg@arm.comendif() 10711986Sandreas.sandberg@arm.com 10811986Sandreas.sandberg@arm.com# test use of installation 10911986Sandreas.sandberg@arm.comif(PYBIND11_INSTALL) 11011986Sandreas.sandberg@arm.com # 2.8.12 needed for test_installed_module 11111986Sandreas.sandberg@arm.com # 3.0 needed for interface library for test_installed_target 11211986Sandreas.sandberg@arm.com # 3.1 needed for cmake -E env for testing 11311986Sandreas.sandberg@arm.com if(NOT CMAKE_VERSION VERSION_LESS 3.1) 11411986Sandreas.sandberg@arm.com add_custom_target(test_installed_target 11511986Sandreas.sandberg@arm.com COMMAND ${CMAKE_COMMAND} 11611986Sandreas.sandberg@arm.com "-DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/test_install" 11711986Sandreas.sandberg@arm.com -P "${PROJECT_BINARY_DIR}/cmake_install.cmake" 11811986Sandreas.sandberg@arm.com COMMAND ${CMAKE_CTEST_COMMAND} 11911986Sandreas.sandberg@arm.com --build-and-test "${CMAKE_CURRENT_SOURCE_DIR}/test_installed_target" 12011986Sandreas.sandberg@arm.com "${CMAKE_CURRENT_BINARY_DIR}/test_installed_target" 12111986Sandreas.sandberg@arm.com --build-noclean 12211986Sandreas.sandberg@arm.com --build-generator ${CMAKE_GENERATOR} 12311986Sandreas.sandberg@arm.com $<$<BOOL:${CMAKE_GENERATOR_PLATFORM}>:--build-generator-platform> ${CMAKE_GENERATOR_PLATFORM} 12411986Sandreas.sandberg@arm.com --build-makeprogram ${CMAKE_MAKE_PROGRAM} 12511986Sandreas.sandberg@arm.com --build-target check 12611986Sandreas.sandberg@arm.com --build-options "-DCMAKE_PREFIX_PATH=${PROJECT_BINARY_DIR}/test_install" 12711986Sandreas.sandberg@arm.com "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" 12811986Sandreas.sandberg@arm.com "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}" 12911986Sandreas.sandberg@arm.com "-DPYBIND11_CPP_STANDARD=${PYBIND11_CPP_STANDARD}" 13011986Sandreas.sandberg@arm.com ) 13111986Sandreas.sandberg@arm.com add_custom_target(test_installed_module 13211986Sandreas.sandberg@arm.com COMMAND ${CMAKE_COMMAND} 13311986Sandreas.sandberg@arm.com "-DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/test_install" 13411986Sandreas.sandberg@arm.com -P "${PROJECT_BINARY_DIR}/cmake_install.cmake" 13511986Sandreas.sandberg@arm.com COMMAND ${CMAKE_CTEST_COMMAND} 13611986Sandreas.sandberg@arm.com --build-and-test "${CMAKE_CURRENT_SOURCE_DIR}/test_installed_module" 13711986Sandreas.sandberg@arm.com "${CMAKE_CURRENT_BINARY_DIR}/test_installed_module" 13811986Sandreas.sandberg@arm.com --build-noclean 13911986Sandreas.sandberg@arm.com --build-generator ${CMAKE_GENERATOR} 14011986Sandreas.sandberg@arm.com $<$<BOOL:${CMAKE_GENERATOR_PLATFORM}>:--build-generator-platform> ${CMAKE_GENERATOR_PLATFORM} 14111986Sandreas.sandberg@arm.com --build-makeprogram ${CMAKE_MAKE_PROGRAM} 14211986Sandreas.sandberg@arm.com --build-target check 14311986Sandreas.sandberg@arm.com --build-options "-DCMAKE_PREFIX_PATH=${PROJECT_BINARY_DIR}/test_install" 14411986Sandreas.sandberg@arm.com "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" 14511986Sandreas.sandberg@arm.com "-DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}" 14611986Sandreas.sandberg@arm.com "-DPYBIND11_CPP_STANDARD=${PYBIND11_CPP_STANDARD}" 14711986Sandreas.sandberg@arm.com ) 14811986Sandreas.sandberg@arm.com else() 14911986Sandreas.sandberg@arm.com add_custom_target(test_installed_target) 15011986Sandreas.sandberg@arm.com add_custom_target(test_installed_module) 15111986Sandreas.sandberg@arm.com endif() 15211986Sandreas.sandberg@arm.com add_custom_target(test_install) 15311986Sandreas.sandberg@arm.com add_dependencies(test_install test_installed_target test_installed_module) 15411986Sandreas.sandberg@arm.comendif() 15511986Sandreas.sandberg@arm.com 15611986Sandreas.sandberg@arm.com# And another to show the .so size and, if a previous size, compare it: 15711986Sandreas.sandberg@arm.comadd_custom_command(TARGET pybind11_tests POST_BUILD 15811986Sandreas.sandberg@arm.com COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/libsize.py 15911986Sandreas.sandberg@arm.com $<TARGET_FILE:pybind11_tests> ${CMAKE_CURRENT_BINARY_DIR}/sosize-$<TARGET_FILE_NAME:pybind11_tests>.txt) 160