Skip to content

Commit

Permalink
Fix ODR violations in our Eigen Tensor tests (#4412)
Browse files Browse the repository at this point in the history
* First

* Fix centos 7 again :(

* Fix minor nits
  • Loading branch information
EthanSteinberg authored Dec 20, 2022
1 parent a97c4d2 commit ee4b9f5
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 26 deletions.
15 changes: 5 additions & 10 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ set(PYBIND11_TEST_FILES
test_docstring_options
test_eigen_matrix
test_eigen_tensor
test_eigen_tensor_avoid_stl_array.cpp
test_enum
test_eval
test_exceptions
Expand Down Expand Up @@ -293,6 +292,11 @@ if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
set(EIGEN3_VERSION ${EIGEN3_VERSION_STRING})
endif()
message(STATUS "Building tests with Eigen v${EIGEN3_VERSION}")

if(NOT (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0))
tests_extra_targets("test_eigen_tensor.py" "eigen_tensor_avoid_stl_array")
endif()

else()
list(FIND PYBIND11_TEST_FILES test_eigen_matrix.cpp PYBIND11_TEST_FILES_EIGEN_I)
if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
Expand All @@ -303,11 +307,6 @@ if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
list(REMOVE_AT PYBIND11_TEST_FILES ${PYBIND11_TEST_FILES_EIGEN_I})
endif()
list(FIND PYBIND11_TEST_FILES test_eigen_tensor_avoid_stl_array.cpp
PYBIND11_TEST_FILES_EIGEN_I)
if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
list(REMOVE_AT PYBIND11_TEST_FILES ${PYBIND11_TEST_FILES_EIGEN_I})
endif()
message(
STATUS "Building tests WITHOUT Eigen, use -DDOWNLOAD_EIGEN=ON on CMake 3.11+ to download")
endif()
Expand All @@ -319,10 +318,6 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_L
if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
list(REMOVE_AT PYBIND11_TEST_FILES ${PYBIND11_TEST_FILES_EIGEN_I})
endif()
list(FIND PYBIND11_TEST_FILES test_eigen_tensor_avoid_stl_array.cpp PYBIND11_TEST_FILES_EIGEN_I)
if(PYBIND11_TEST_FILES_EIGEN_I GREATER -1)
list(REMOVE_AT PYBIND11_TEST_FILES ${PYBIND11_TEST_FILES_EIGEN_I})
endif()
endif()

# Optional dependency for some tests (boost::variant is only supported with version >= 1.56)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@
BSD-style license that can be found in the LICENSE file.
*/

constexpr const char *test_eigen_tensor_module_name = "eigen_tensor_avoid_stl_array";

#ifndef EIGEN_AVOID_STL_ARRAY
# define EIGEN_AVOID_STL_ARRAY
#endif

#define PYBIND11_TEST_EIGEN_TENSOR_NAMESPACE eigen_tensor_avoid_stl_array

#include "test_eigen_tensor.inl"

PYBIND11_MODULE(eigen_tensor_avoid_stl_array, m) { eigen_tensor_test::test_module(m); }
6 changes: 4 additions & 2 deletions tests/test_eigen_tensor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
BSD-style license that can be found in the LICENSE file.
*/

constexpr const char *test_eigen_tensor_module_name = "eigen_tensor";

#define PYBIND11_TEST_EIGEN_TENSOR_NAMESPACE eigen_tensor

#ifdef EIGEN_AVOID_STL_ARRAY
# undef EIGEN_AVOID_STL_ARRAY
#endif

#include "test_eigen_tensor.inl"

#include "pybind11_tests.h"

test_initializer egien_tensor("eigen_tensor", eigen_tensor_test::test_module);
10 changes: 4 additions & 6 deletions tests/test_eigen_tensor.inl
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

#include <pybind11/eigen/tensor.h>

#include "pybind11_tests.h"
PYBIND11_NAMESPACE_BEGIN(eigen_tensor_test)

PYBIND11_NAMESPACE_BEGIN(PYBIND11_TEST_EIGEN_TENSOR_NAMESPACE)
namespace py = pybind11;

PYBIND11_WARNING_DISABLE_MSVC(4127)

Expand Down Expand Up @@ -108,7 +108,7 @@ void init_tensor_module(pybind11::module &m) {
return check_tensor(get_tensor<Options>()) && check_tensor(get_fixed_tensor<Options>());
});

py::class_<CustomExample<Options>>(m, "CustomExample")
py::class_<CustomExample<Options>>(m, "CustomExample", py::module_local())
.def(py::init<>())
.def_readonly(
"member", &CustomExample<Options>::member, py::return_value_policy::reference_internal)
Expand Down Expand Up @@ -322,8 +322,6 @@ void init_tensor_module(pybind11::module &m) {
py::return_value_policy::reference);
}

void test_module(py::module_ &);
test_initializer name(test_eigen_tensor_module_name, test_module);
void test_module(py::module_ &m) {
auto f_style = m.def_submodule("f_style");
auto c_style = m.def_submodule("c_style");
Expand All @@ -332,4 +330,4 @@ void test_module(py::module_ &m) {
init_tensor_module<Eigen::RowMajor>(c_style);
}

PYBIND11_NAMESPACE_END(PYBIND11_TEST_EIGEN_TENSOR_NAMESPACE)
PYBIND11_NAMESPACE_END(eigen_tensor_test)
8 changes: 4 additions & 4 deletions tests/test_eigen_tensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@
eigen_tensor = pytest.importorskip("pybind11_tests.eigen_tensor")
submodules = [eigen_tensor.c_style, eigen_tensor.f_style]
try:
from pybind11_tests import eigen_tensor_avoid_stl_array as avoid
import eigen_tensor_avoid_stl_array as avoid

submodules += [avoid.c_style, avoid.f_style]
except ImportError as e:
# Ensure config, build, toolchain, etc. issues are not masked here:
raise RuntimeError(
"import pybind11_tests.eigen_tensor_avoid_stl_array FAILED, while "
"import eigen_tensor_avoid_stl_array FAILED, while "
"import pybind11_tests.eigen_tensor succeeded. "
"Please ensure that "
"test_eigen_tensor.cpp & "
"test_eigen_tensor_avoid_stl_array.cpp "
"eigen_tensor_avoid_stl_array.cpp "
"are built together (or both are not built if Eigen is not available)."
) from e

Expand All @@ -42,7 +42,7 @@ def cleanup():


def test_import_avoid_stl_array():
pytest.importorskip("pybind11_tests.eigen_tensor_avoid_stl_array")
pytest.importorskip("eigen_tensor_avoid_stl_array")
assert len(submodules) == 4


Expand Down

0 comments on commit ee4b9f5

Please sign in to comment.