diff --git a/include/pybind11/detail/common.h b/include/pybind11/detail/common.h index aea1987bf5..39531114cb 100644 --- a/include/pybind11/detail/common.h +++ b/include/pybind11/detail/common.h @@ -25,8 +25,10 @@ // on the main `pybind11` namespace. #if !defined(PYBIND11_NAMESPACE) # ifdef __GNUG__ -# define PYBIND11_NAMESPACE pybind11 __attribute__((visibility("hidden"))) +# define PYBIND11_NS_VISIBILITY(...) __VA_ARGS__ __attribute__((visibility("hidden"))) +# define PYBIND11_NAMESPACE PYBIND11_NS_VISIBILITY(pybind11) # else +# define PYBIND11_NS_VISIBILITY(...) __VA_ARGS__ # define PYBIND11_NAMESPACE pybind11 # endif #endif diff --git a/pybind11/setup_helpers.py b/pybind11/setup_helpers.py index 1fd04b9154..1172406b4b 100644 --- a/pybind11/setup_helpers.py +++ b/pybind11/setup_helpers.py @@ -149,7 +149,6 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: if WIN: cflags += ["/EHsc", "/bigobj"] else: - cflags += ["-fvisibility=hidden"] env_cflags = os.environ.get("CFLAGS", "") env_cppflags = os.environ.get("CPPFLAGS", "") c_cpp_flags = shlex.split(env_cflags) + shlex.split(env_cppflags) diff --git a/tests/pybind11_cross_module_tests.cpp b/tests/pybind11_cross_module_tests.cpp index 9379f3f259..92182a646a 100644 --- a/tests/pybind11_cross_module_tests.cpp +++ b/tests/pybind11_cross_module_tests.cpp @@ -48,7 +48,7 @@ PYBIND11_MODULE(pybind11_cross_module_tests, m) { if (p) { std::rethrow_exception(p); } - } catch (const shared_exception &e) { + } catch (const pybind11_tests::shared_exception &e) { PyErr_SetString(PyExc_KeyError, e.what()); } }); diff --git a/tests/test_class_sh_trampoline_basic.cpp b/tests/test_class_sh_trampoline_basic.cpp index e31bcf7198..4cda66090b 100644 --- a/tests/test_class_sh_trampoline_basic.cpp +++ b/tests/test_class_sh_trampoline_basic.cpp @@ -4,7 +4,7 @@ #include -namespace pybind11_tests { +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) namespace class_sh_trampoline_basic { template // Using int as a trick to easily generate a series of types. @@ -74,7 +74,7 @@ void wrap(py::module_ m, const char *py_class_name) { } } // namespace class_sh_trampoline_basic -} // namespace pybind11_tests +PYBIND11_NAMESPACE_END(pybind11_tests) PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::class_sh_trampoline_basic::Abase<0>) PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::class_sh_trampoline_basic::Abase<1>) diff --git a/tests/test_class_sh_trampoline_self_life_support.cpp b/tests/test_class_sh_trampoline_self_life_support.cpp index c1eb035435..7630dcbfec 100644 --- a/tests/test_class_sh_trampoline_self_life_support.cpp +++ b/tests/test_class_sh_trampoline_self_life_support.cpp @@ -10,6 +10,7 @@ #include #include +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) namespace { struct Big5 { // Also known as "rule of five". @@ -42,10 +43,13 @@ struct Big5Trampoline : Big5, py::trampoline_self_life_support { }; } // namespace +PYBIND11_NAMESPACE_END(pybind11_tests) -PYBIND11_SMART_HOLDER_TYPE_CASTERS(Big5) +PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::Big5) TEST_SUBMODULE(class_sh_trampoline_self_life_support, m) { + using namespace pybind11_tests; + py::classh(m, "Big5") .def(py::init()) .def_readonly("history", &Big5::history); diff --git a/tests/test_class_sh_trampoline_shared_from_this.cpp b/tests/test_class_sh_trampoline_shared_from_this.cpp index ae9f274659..fc3fb98cc9 100644 --- a/tests/test_class_sh_trampoline_shared_from_this.cpp +++ b/tests/test_class_sh_trampoline_shared_from_this.cpp @@ -8,6 +8,7 @@ #include #include +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) namespace { struct Sft : std::enable_shared_from_this { @@ -99,11 +100,14 @@ std::shared_ptr make_pure_cpp_sft_shd_ptr(const std::string &history_seed) std::shared_ptr pass_through_shd_ptr(const std::shared_ptr &obj) { return obj; } } // namespace +PYBIND11_NAMESPACE_END(pybind11_tests) -PYBIND11_SMART_HOLDER_TYPE_CASTERS(Sft) -PYBIND11_SMART_HOLDER_TYPE_CASTERS(SftSharedPtrStash) +PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::Sft) +PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::SftSharedPtrStash) TEST_SUBMODULE(class_sh_trampoline_shared_from_this, m) { + using namespace pybind11_tests; + py::classh(m, "Sft") .def(py::init()) .def(py::init([](const std::string &history, int) { diff --git a/tests/test_class_sh_trampoline_unique_ptr.cpp b/tests/test_class_sh_trampoline_unique_ptr.cpp index 141a6e8b57..12b2df93f3 100644 --- a/tests/test_class_sh_trampoline_unique_ptr.cpp +++ b/tests/test_class_sh_trampoline_unique_ptr.cpp @@ -8,6 +8,7 @@ #include +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) namespace { class Class { @@ -31,9 +32,11 @@ class Class { }; } // namespace +PYBIND11_NAMESPACE_END(pybind11_tests) -PYBIND11_SMART_HOLDER_TYPE_CASTERS(Class) +PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::Class) +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) namespace { class PyClass : public Class, public py::trampoline_self_life_support { @@ -46,8 +49,11 @@ class PyClass : public Class, public py::trampoline_self_life_support { }; } // namespace +PYBIND11_NAMESPACE_END(pybind11_tests) TEST_SUBMODULE(class_sh_trampoline_unique_ptr, m) { + using namespace pybind11_tests; + py::classh(m, "Class") .def(py::init<>()) .def("set_val", &Class::setVal) diff --git a/tests/test_class_sh_virtual_py_cpp_mix.cpp b/tests/test_class_sh_virtual_py_cpp_mix.cpp index 2fa9990a22..d486a5682e 100644 --- a/tests/test_class_sh_virtual_py_cpp_mix.cpp +++ b/tests/test_class_sh_virtual_py_cpp_mix.cpp @@ -4,7 +4,7 @@ #include -namespace pybind11_tests { +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) namespace class_sh_virtual_py_cpp_mix { class Base { @@ -44,7 +44,7 @@ struct CppDerivedVirtualOverrider : CppDerived, py::trampoline_self_life_support }; } // namespace class_sh_virtual_py_cpp_mix -} // namespace pybind11_tests +PYBIND11_NAMESPACE_END(pybind11_tests) PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::class_sh_virtual_py_cpp_mix::Base) PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::class_sh_virtual_py_cpp_mix::CppDerivedPlain) diff --git a/tests/test_custom_type_setup.cpp b/tests/test_custom_type_setup.cpp index 42fae05d5d..057f4ad1f1 100644 --- a/tests/test_custom_type_setup.cpp +++ b/tests/test_custom_type_setup.cpp @@ -13,14 +13,19 @@ namespace py = pybind11; +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) namespace { struct OwnsPythonObjects { py::object value = py::none(); }; + } // namespace +PYBIND11_NAMESPACE_END(pybind11_tests) TEST_SUBMODULE(custom_type_setup, m) { + using namespace pybind11_tests; + py::class_ cls( m, "OwnsPythonObjects", py::custom_type_setup([](PyHeapTypeObject *heap_type) { auto *type = &heap_type->ht_type; diff --git a/tests/test_exceptions.cpp b/tests/test_exceptions.cpp index 3ec999d1dc..25f48f7802 100644 --- a/tests/test_exceptions.cpp +++ b/tests/test_exceptions.cpp @@ -15,6 +15,8 @@ #include #include +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) + // A type that should be raised as an exception in Python class MyException : public std::exception { public: @@ -110,7 +112,11 @@ std::string error_already_set_what(const py::object &exc_type, const py::object return py::error_already_set().what(); } +PYBIND11_NAMESPACE_END(pybind11_tests) + TEST_SUBMODULE(exceptions, m) { + using namespace pybind11_tests; + m.def("throw_std_exception", []() { throw std::runtime_error("This exception was intentionally thrown."); }); diff --git a/tests/test_exceptions.h b/tests/test_exceptions.h index 03684b89fa..adad7c6c4e 100644 --- a/tests/test_exceptions.h +++ b/tests/test_exceptions.h @@ -5,9 +5,13 @@ // shared exceptions for cross_module_tests +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) + class PYBIND11_EXPORT_EXCEPTION shared_exception : public pybind11::builtin_exception { public: using builtin_exception::builtin_exception; explicit shared_exception() : shared_exception("") {} void set_error() const override { PyErr_SetString(PyExc_RuntimeError, what()); } }; + +PYBIND11_NAMESPACE_END(pybind11_tests) diff --git a/tests/test_numpy_array.cpp b/tests/test_numpy_array.cpp index 69ddbe1ef2..81639f06ec 100644 --- a/tests/test_numpy_array.cpp +++ b/tests/test_numpy_array.cpp @@ -15,6 +15,8 @@ #include #include +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(pybind11_tests)) + // Size / dtype checks. struct DtypeCheck { py::dtype numpy{}; @@ -159,7 +161,11 @@ py::handle auxiliaries(T &&r, T2 &&r2) { // note: declaration at local scope would create a dangling reference! static int data_i = 42; +PYBIND11_NAMESPACE_END(pybind11_tests) + TEST_SUBMODULE(numpy_array, sm) { + using namespace pybind11_tests; + try { py::module_::import("numpy"); } catch (const py::error_already_set &) { diff --git a/tests/test_pytypes.cpp b/tests/test_pytypes.cpp index cb81007c37..e2286240d2 100644 --- a/tests/test_pytypes.cpp +++ b/tests/test_pytypes.cpp @@ -11,7 +11,7 @@ #include -namespace external { +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NS_VISIBILITY(external)) namespace detail { bool check(PyObject *o) { return PyFloat_Check(o) != 0; } @@ -37,7 +37,7 @@ class float_ : public py::object { double get_value() const { return PyFloat_AsDouble(this->ptr()); } }; -} // namespace external +PYBIND11_NAMESPACE_END(external) TEST_SUBMODULE(pytypes, m) { // test_bool diff --git a/tools/pybind11NewTools.cmake b/tools/pybind11NewTools.cmake index abba0fe0e2..52306d0cfa 100644 --- a/tools/pybind11NewTools.cmake +++ b/tools/pybind11NewTools.cmake @@ -203,19 +203,6 @@ function(pybind11_add_module target_name) target_link_libraries(${target_name} PRIVATE pybind11::windows_extras) endif() - # -fvisibility=hidden is required to allow multiple modules compiled against - # different pybind versions to work properly, and for some features (e.g. - # py::module_local). We force it on everything inside the `pybind11` - # namespace; also turning it on for a pybind module compilation here avoids - # potential warnings or issues from having mixed hidden/non-hidden types. - if(NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) - set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden") - endif() - - if(NOT DEFINED CMAKE_CUDA_VISIBILITY_PRESET) - set_target_properties(${target_name} PROPERTIES CUDA_VISIBILITY_PRESET "hidden") - endif() - # If we don't pass a WITH_SOABI or WITHOUT_SOABI, use our own default handling of extensions if(NOT ARG_WITHOUT_SOABI AND NOT "WITH_SOABI" IN_LIST ARG_UNPARSED_ARGUMENTS) pybind11_extension(${target_name}) diff --git a/tools/pybind11Tools.cmake b/tools/pybind11Tools.cmake index 5535e872f3..542fd92d68 100644 --- a/tools/pybind11Tools.cmake +++ b/tools/pybind11Tools.cmake @@ -183,19 +183,6 @@ function(pybind11_add_module target_name) pybind11_extension(${target_name}) - # -fvisibility=hidden is required to allow multiple modules compiled against - # different pybind versions to work properly, and for some features (e.g. - # py::module_local). We force it on everything inside the `pybind11` - # namespace; also turning it on for a pybind module compilation here avoids - # potential warnings or issues from having mixed hidden/non-hidden types. - if(NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET) - set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden") - endif() - - if(NOT DEFINED CMAKE_CUDA_VISIBILITY_PRESET) - set_target_properties(${target_name} PROPERTIES CUDA_VISIBILITY_PRESET "hidden") - endif() - if(ARG_NO_EXTRAS) return() endif()