Force hidden visibility on pybind code

This adds a PYBIND11_NAMESPACE macro that expands to the `pybind11`
namespace with hidden visibility under gcc-type compilers, and otherwise
to the plain `pybind11`.  This then forces hidden visibility on
everything in pybind, solving the visibility issues discussed at end
end of #949.
This commit is contained in:
Jason Rhinelander 2017-08-10 12:03:29 -04:00
parent 8d3cedbe2b
commit a859dd67a2
20 changed files with 51 additions and 40 deletions

View File

@ -12,7 +12,7 @@
#include "cast.h" #include "cast.h"
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
/// \addtogroup annotations /// \addtogroup annotations
/// @{ /// @{
@ -478,4 +478,4 @@ constexpr bool expected_num_args(size_t nargs, bool has_args, bool has_kwargs) {
} }
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -11,7 +11,7 @@
#include "common.h" #include "common.h"
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
/// Information record describing a Python buffer object /// Information record describing a Python buffer object
struct buffer_info { struct buffer_info {
@ -105,4 +105,4 @@ template <typename T> struct compare_buffer_info<T, detail::enable_if_t<std::is_
}; };
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -30,7 +30,7 @@
#include <string_view> #include <string_view>
#endif #endif
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
// Forward declarations: // Forward declarations:
inline PyTypeObject *make_static_property_type(); inline PyTypeObject *make_static_property_type();
@ -2084,4 +2084,4 @@ NAMESPACE_END(detail)
template<> class type_caster<Type> : public type_caster_base<Type> { }; \ template<> class type_caster<Type> : public type_caster_base<Type> { }; \
}} }}
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -27,7 +27,7 @@
#define PyDateTime_DELTA_GET_MICROSECONDS(o) (((PyDateTime_Delta*)o)->microseconds) #define PyDateTime_DELTA_GET_MICROSECONDS(o) (((PyDateTime_Delta*)o)->microseconds)
#endif #endif
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
template <typename type> class duration_caster { template <typename type> class duration_caster {
@ -159,4 +159,4 @@ template <typename Rep, typename Period> class type_caster<std::chrono::duration
}; };
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -11,7 +11,7 @@
#include "attr.h" #include "attr.h"
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
inline PyTypeObject *type_incref(PyTypeObject *type) { inline PyTypeObject *type_incref(PyTypeObject *type) {
@ -599,4 +599,4 @@ inline PyObject* make_new_python_type(const type_record &rec) {
} }
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -16,6 +16,17 @@
# define NAMESPACE_END(name) } # define NAMESPACE_END(name) }
#endif #endif
// Robust support for some features and loading modules compiled against different pybind versions
// requires forcing hidden visibility on pybind code, so we enforce this by setting the attribute on
// the main `pybind11` namespace.
#if !defined(PYBIND11_NAMESPACE)
# ifdef __GNUG__
# define PYBIND11_NAMESPACE pybind11 __attribute__((visibility("hidden")))
# else
# define PYBIND11_NAMESPACE pybind11
# endif
#endif
#if !defined(_MSC_VER) && !defined(__INTEL_COMPILER) #if !defined(_MSC_VER) && !defined(__INTEL_COMPILER)
# if __cplusplus >= 201402L # if __cplusplus >= 201402L
# define PYBIND11_CPP14 # define PYBIND11_CPP14
@ -297,7 +308,7 @@ extern "C" {
void pybind11_init_##name(pybind11::module &variable) void pybind11_init_##name(pybind11::module &variable)
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
using ssize_t = Py_ssize_t; using ssize_t = Py_ssize_t;
using size_t = std::size_t; using size_t = std::size_t;
@ -877,4 +888,4 @@ NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -17,7 +17,7 @@
# undef I # undef I
#endif #endif
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
template <typename T> struct format_descriptor<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> { template <typename T> struct format_descriptor<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> {
static constexpr const char c = format_descriptor<T>::c; static constexpr const char c = format_descriptor<T>::c;
@ -58,4 +58,4 @@ public:
PYBIND11_TYPE_CASTER(std::complex<T>, _("complex")); PYBIND11_TYPE_CASTER(std::complex<T>, _("complex"));
}; };
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -12,7 +12,7 @@
#include "common.h" #include "common.h"
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
/* Concatenate type signatures at compile time using C++14 */ /* Concatenate type signatures at compile time using C++14 */
@ -182,4 +182,4 @@ PYBIND11_NOINLINE inline descr type_descr(descr&& d) { return _("{") + std::move
#endif #endif
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -35,7 +35,7 @@
// of matrices seems highly undesirable. // of matrices seems highly undesirable.
static_assert(EIGEN_VERSION_AT_LEAST(3,2,7), "Eigen support in pybind11 requires Eigen >= 3.2.7"); static_assert(EIGEN_VERSION_AT_LEAST(3,2,7), "Eigen support in pybind11 requires Eigen >= 3.2.7");
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
// Provide a convenience alias for easier pass-by-ref usage with fully dynamic strides: // Provide a convenience alias for easier pass-by-ref usage with fully dynamic strides:
using EigenDStride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>; using EigenDStride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
@ -601,7 +601,7 @@ struct type_caster<Type, enable_if_t<is_eigen_sparse<Type>::value>> {
}; };
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)
#if defined(__GNUG__) || defined(__clang__) #if defined(__GNUG__) || defined(__clang__)
# pragma GCC diagnostic pop # pragma GCC diagnostic pop

View File

@ -63,7 +63,7 @@
void pybind11_init_##name(pybind11::module &variable) void pybind11_init_##name(pybind11::module &variable)
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
/// Python 2.7/3.x compatible version of `PyImport_AppendInittab` and error checks. /// Python 2.7/3.x compatible version of `PyImport_AppendInittab` and error checks.
@ -190,4 +190,4 @@ private:
bool is_valid = true; bool is_valid = true;
}; };
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -13,7 +13,7 @@
#include "pybind11.h" #include "pybind11.h"
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
enum eval_mode { enum eval_mode {
/// Evaluate a string containing an isolated expression /// Evaluate a string containing an isolated expression
@ -114,4 +114,4 @@ object eval_file(str fname, object global = globals(), object local = object())
return reinterpret_steal<object>(result); return reinterpret_steal<object>(result);
} }
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -12,7 +12,7 @@
#include "pybind11.h" #include "pybind11.h"
#include <functional> #include <functional>
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
template <typename Return, typename... Args> template <typename Return, typename... Args>
@ -82,4 +82,4 @@ public:
}; };
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -34,7 +34,7 @@
upon the library user. */ upon the library user. */
static_assert(sizeof(ssize_t) == sizeof(Py_intptr_t), "ssize_t != Py_intptr_t"); static_assert(sizeof(ssize_t) == sizeof(Py_intptr_t), "ssize_t != Py_intptr_t");
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
class array; // Forward declaration class array; // Forward declaration
@ -1591,7 +1591,7 @@ Helper vectorize(Return (Class::*f)(Args...) const) {
return Helper(std::mem_fn(f)); return Helper(std::mem_fn(f));
} }
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(pop) #pragma warning(pop)

View File

@ -18,7 +18,7 @@
# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant # pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
#endif #endif
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
/// Enumeration with all supported operator types /// Enumeration with all supported operator types
@ -160,7 +160,7 @@ NAMESPACE_END(detail)
using detail::self; using detail::self;
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)
#if defined(_MSC_VER) #if defined(_MSC_VER)
# pragma warning(pop) # pragma warning(pop)

View File

@ -11,7 +11,7 @@
#include "common.h" #include "common.h"
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
class options { class options {
public: public:
@ -62,4 +62,4 @@ private:
state previous_state; state previous_state;
}; };
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -44,7 +44,7 @@
#include "options.h" #include "options.h"
#include "class_support.h" #include "class_support.h"
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object /// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
class cpp_function : public function { class cpp_function : public function {
@ -1862,7 +1862,7 @@ template <class T> function get_overload(const T *this_ptr, const char *name) {
#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \ #define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, #fn, fn, __VA_ARGS__) PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)
#if defined(_MSC_VER) #if defined(_MSC_VER)
# pragma warning(pop) # pragma warning(pop)

View File

@ -14,7 +14,7 @@
#include <utility> #include <utility>
#include <type_traits> #include <type_traits>
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
/* A few forward declarations */ /* A few forward declarations */
class handle; class object; class handle; class object;
@ -1320,4 +1320,4 @@ template <typename D>
handle object_api<D>::get_type() const { return (PyObject *) Py_TYPE(derived().ptr()); } handle object_api<D>::get_type() const { return (PyObject *) Py_TYPE(derived().ptr()); }
NAMESPACE_END(detail) NAMESPACE_END(detail)
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -46,7 +46,7 @@
# define PYBIND11_HAS_VARIANT 1 # define PYBIND11_HAS_VARIANT 1
#endif #endif
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
/// Extracts an const lvalue reference or rvalue reference for U based on the type of T (e.g. for /// Extracts an const lvalue reference or rvalue reference for U based on the type of T (e.g. for
@ -362,7 +362,7 @@ inline std::ostream &operator<<(std::ostream &os, const handle &obj) {
return os; return os;
} }
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(pop) #pragma warning(pop)

View File

@ -15,7 +15,7 @@
#include <algorithm> #include <algorithm>
#include <sstream> #include <sstream>
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
/* SFINAE helper class used by 'is_comparable */ /* SFINAE helper class used by 'is_comparable */
@ -598,4 +598,4 @@ class_<Map, holder_type> bind_map(handle scope, const std::string &name, Args&&.
return cl; return cl;
} }
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)

View File

@ -16,7 +16,7 @@
#include <cxxabi.h> #include <cxxabi.h>
#endif #endif
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
NAMESPACE_BEGIN(detail) NAMESPACE_BEGIN(detail)
/// Erase all occurrences of a substring /// Erase all occurrences of a substring
inline void erase_all(std::string &string, const std::string &search) { inline void erase_all(std::string &string, const std::string &search) {
@ -50,4 +50,4 @@ template <typename T> static std::string type_id() {
return name; return name;
} }
NAMESPACE_END(pybind11) NAMESPACE_END(PYBIND11_NAMESPACE)