mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-11 08:03:55 +00:00
5fffe200e3
The current pybind11::class_<Type, Holder, Trampoline> fixed template ordering results in a requirement to repeat the Holder with its default value (std::unique_ptr<Type>) argument, which is a little bit annoying: it needs to be specified not because we want to override the default, but rather because we need to specify the third argument. This commit removes this limitation by making the class_ template take the type name plus a parameter pack of options. It then extracts the first valid holder type and the first subclass type for holder_type and trampoline type_alias, respectively. (If unfound, both fall back to their current defaults, `std::unique_ptr<type>` and `type`, respectively). If any unmatched template arguments are provided, a static assertion fails. What this means is that you can specify or omit the arguments in any order: py::class_<A, PyA> c1(m, "A"); py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B"); py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C"); It also allows future class attributes (such as base types in the next commit) to be passed as class template types rather than needing to use a py::base<> wrapper.
88 lines
3.0 KiB
CMake
88 lines
3.0 KiB
CMake
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
message(STATUS "Setting tests build type to MinSizeRel as none was specified")
|
|
set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING "Choose the type of build" FORCE)
|
|
endif()
|
|
|
|
set(PYBIND11_TEST_FILES
|
|
test_buffers.cpp
|
|
test_callbacks.cpp
|
|
test_class_args.cpp
|
|
test_constants_and_functions.cpp
|
|
test_eigen.cpp
|
|
test_enum.cpp
|
|
test_eval.cpp
|
|
test_exceptions.cpp
|
|
test_inheritance.cpp
|
|
test_issues.cpp
|
|
test_keep_alive.cpp
|
|
test_kwargs_and_defaults.cpp
|
|
test_methods_and_attributes.cpp
|
|
test_modules.cpp
|
|
test_numpy_dtypes.cpp
|
|
test_numpy_vectorize.cpp
|
|
test_opaque_types.cpp
|
|
test_operator_overloading.cpp
|
|
test_pickling.cpp
|
|
test_python_types.cpp
|
|
test_sequences_and_iterators.cpp
|
|
test_smart_ptr.cpp
|
|
test_stl_binders.cpp
|
|
test_virtual_functions.cpp
|
|
)
|
|
|
|
string(REPLACE ".cpp" ".py" PYBIND11_PYTEST_FILES "${PYBIND11_TEST_FILES}")
|
|
|
|
# Check if Eigen is available; if not, remove from PYBIND11_TEST_FILES (but
|
|
# keep it in PYBIND11_PYTEST_FILES, so that we get the "eigen is not installed"
|
|
# skip message).
|
|
list(FIND PYBIND11_TEST_FILES test_eigen.cpp PYBIND11_TEST_FILES_EIGEN_I)
|
|
if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
|
|
find_package(Eigen3 QUIET)
|
|
|
|
if(EIGEN3_FOUND)
|
|
message(STATUS "Building tests with Eigen v${EIGEN3_VERSION}")
|
|
else()
|
|
list(REMOVE_AT PYBIND11_TEST_FILES ${PYBIND11_TEST_FILES_EIGEN_I})
|
|
message(STATUS "Building tests WITHOUT Eigen")
|
|
endif()
|
|
endif()
|
|
|
|
# Create the binding library
|
|
pybind11_add_module(pybind11_tests pybind11_tests.cpp ${PYBIND11_TEST_FILES})
|
|
pybind11_enable_warnings(pybind11_tests)
|
|
|
|
if(EIGEN3_FOUND)
|
|
target_include_directories(pybind11_tests PRIVATE ${EIGEN3_INCLUDE_DIR})
|
|
target_compile_definitions(pybind11_tests PRIVATE -DPYBIND11_TEST_EIGEN)
|
|
endif()
|
|
|
|
set(testdir ${PROJECT_SOURCE_DIR}/tests)
|
|
|
|
# Always write the output file directly into the 'tests' directory (even on MSVC)
|
|
if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
|
|
set_target_properties(pybind11_tests PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${testdir})
|
|
foreach(config ${CMAKE_CONFIGURATION_TYPES})
|
|
string(TOUPPER ${config} config)
|
|
set_target_properties(pybind11_tests PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${config} ${testdir})
|
|
endforeach()
|
|
endif()
|
|
|
|
# Make sure pytest is found or produce a fatal error
|
|
macro(pybind11_execute_python)
|
|
execute_process(COMMAND ${PYTHON_EXECUTABLE} -m ${ARGN} OUTPUT_QUIET ERROR_QUIET
|
|
RESULT_VARIABLE pybind11_execute_python_error)
|
|
endmacro()
|
|
|
|
if(NOT PYBIND11_PYTEST_FOUND)
|
|
pybind11_execute_python(pytest --version --noconftest)
|
|
if(pybind11_execute_python_error)
|
|
message(FATAL_ERROR "Running the tests requires pytest. Please install it manually (try: ${PYTHON_EXECUTABLE} -m pip install pytest)")
|
|
endif()
|
|
|
|
set(PYBIND11_PYTEST_FOUND TRUE CACHE INTERAL "")
|
|
endif()
|
|
|
|
# A single command to compile and run the tests
|
|
add_custom_target(pytest COMMAND ${PYTHON_EXECUTABLE} -m pytest -rws ${PYBIND11_PYTEST_FILES}
|
|
DEPENDS pybind11_tests WORKING_DIRECTORY ${testdir})
|