Browse Source

py_panda: avoid duplicate symbol issues with LINK_ALL_STATIC

Fixes #478
rdb 7 years ago
parent
commit
0a43008313

+ 9 - 1
dtool/src/interrogatedb/py_compat.h

@@ -31,6 +31,14 @@
 
 
 #include <Python.h>
 #include <Python.h>
 
 
+#ifndef LINK_ALL_STATIC
+#  define EXPCL_PYPANDA
+#elif defined(__GNUC__)
+#  define EXPCL_PYPANDA __attribute__((weak))
+#else
+#  define EXPCL_PYPANDA extern inline
+#endif
+
 /* Python 2.4 */
 /* Python 2.4 */
 
 
 // 2.4 macros which aren't available in 2.3
 // 2.4 macros which aren't available in 2.3
@@ -99,7 +107,7 @@ typedef int Py_ssize_t;
 // PyInt_FromSize_t automatically picks the right type.
 // PyInt_FromSize_t automatically picks the right type.
 #  define PyLongOrInt_AS_LONG PyInt_AsLong
 #  define PyLongOrInt_AS_LONG PyInt_AsLong
 
 
-size_t PyLongOrInt_AsSize_t(PyObject *);
+EXPCL_PYPANDA size_t PyLongOrInt_AsSize_t(PyObject *);
 #endif
 #endif
 
 
 // Which character to use in PyArg_ParseTuple et al for a byte string.
 // Which character to use in PyArg_ParseTuple et al for a byte string.

+ 2 - 1
dtool/src/interrogatedb/py_panda.cxx

@@ -665,7 +665,8 @@ PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args) {
 
 
 // We do expose a dictionay for dtool classes .. this should be removed at
 // We do expose a dictionay for dtool classes .. this should be removed at
 // some point..
 // some point..
-PyObject *Dtool_AddToDictionary(PyObject *self1, PyObject *args) {
+EXPCL_PYPANDA PyObject *
+Dtool_AddToDictionary(PyObject *self1, PyObject *args) {
   PyObject *self;
   PyObject *self;
   PyObject *subject;
   PyObject *subject;
   PyObject *key;
   PyObject *key;

+ 34 - 34
dtool/src/interrogatedb/py_panda.h

@@ -179,19 +179,19 @@ static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\
 
 
 typedef std::map<std::string, Dtool_PyTypedObject *> Dtool_TypeMap;
 typedef std::map<std::string, Dtool_PyTypedObject *> Dtool_TypeMap;
 
 
-Dtool_TypeMap *Dtool_GetGlobalTypeMap();
+EXPCL_PYPANDA Dtool_TypeMap *Dtool_GetGlobalTypeMap();
 
 
 /**
 /**
 
 
  */
  */
-void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject *classdef, void **answer);
+EXPCL_PYPANDA void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject *classdef, void **answer);
 
 
-void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const std::string &function_name, bool const_ok, bool report_errors);
+EXPCL_PYPANDA void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const std::string &function_name, bool const_ok, bool report_errors);
 
 
-bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer);
+EXPCL_PYPANDA bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer);
 
 
-bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef,
-                                            void **answer, const char *method_name);
+EXPCL_PYPANDA bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef,
+                                                          void **answer, const char *method_name);
 
 
 template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into);
 template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into);
 template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into, Dtool_PyTypedObject &classdef);
 template<class T> INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into, Dtool_PyTypedObject &classdef);
@@ -201,7 +201,7 @@ INLINE int DtoolInstance_ComparePointers(PyObject *v1, PyObject *v2);
 INLINE PyObject *DtoolInstance_RichComparePointers(PyObject *v1, PyObject *v2, int op);
 INLINE PyObject *DtoolInstance_RichComparePointers(PyObject *v1, PyObject *v2, int op);
 
 
 // Functions related to error reporting.
 // Functions related to error reporting.
-bool _Dtool_CheckErrorOccurred();
+EXPCL_PYPANDA bool _Dtool_CheckErrorOccurred();
 
 
 #ifdef NDEBUG
 #ifdef NDEBUG
 #define Dtool_CheckErrorOccurred() (UNLIKELY(_PyErr_OCCURRED() != nullptr))
 #define Dtool_CheckErrorOccurred() (UNLIKELY(_PyErr_OCCURRED() != nullptr))
@@ -209,12 +209,12 @@ bool _Dtool_CheckErrorOccurred();
 #define Dtool_CheckErrorOccurred() (UNLIKELY(_Dtool_CheckErrorOccurred()))
 #define Dtool_CheckErrorOccurred() (UNLIKELY(_Dtool_CheckErrorOccurred()))
 #endif
 #endif
 
 
-PyObject *Dtool_Raise_AssertionError();
-PyObject *Dtool_Raise_TypeError(const char *message);
-PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name);
-PyObject *Dtool_Raise_AttributeError(PyObject *obj, const char *attribute);
+EXPCL_PYPANDA PyObject *Dtool_Raise_AssertionError();
+EXPCL_PYPANDA PyObject *Dtool_Raise_TypeError(const char *message);
+EXPCL_PYPANDA PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name);
+EXPCL_PYPANDA PyObject *Dtool_Raise_AttributeError(PyObject *obj, const char *attribute);
 
 
-PyObject *_Dtool_Raise_BadArgumentsError();
+EXPCL_PYPANDA PyObject *_Dtool_Raise_BadArgumentsError();
 #ifdef NDEBUG
 #ifdef NDEBUG
 // Define it to a function that just prints a generic message.
 // Define it to a function that just prints a generic message.
 #define Dtool_Raise_BadArgumentsError(x) _Dtool_Raise_BadArgumentsError()
 #define Dtool_Raise_BadArgumentsError(x) _Dtool_Raise_BadArgumentsError()
@@ -226,9 +226,9 @@ PyObject *_Dtool_Raise_BadArgumentsError();
 // These functions are similar to Dtool_WrapValue, except that they also
 // These functions are similar to Dtool_WrapValue, except that they also
 // contain code for checking assertions and exceptions when compiling with
 // contain code for checking assertions and exceptions when compiling with
 // NDEBUG mode on.
 // NDEBUG mode on.
-PyObject *_Dtool_Return_None();
-PyObject *Dtool_Return_Bool(bool value);
-PyObject *_Dtool_Return(PyObject *value);
+EXPCL_PYPANDA PyObject *_Dtool_Return_None();
+EXPCL_PYPANDA PyObject *Dtool_Return_Bool(bool value);
+EXPCL_PYPANDA PyObject *_Dtool_Return(PyObject *value);
 
 
 #ifdef NDEBUG
 #ifdef NDEBUG
 #define Dtool_Return_None() (LIKELY(_PyErr_OCCURRED() == nullptr) ? (Py_INCREF(Py_None), Py_None) : nullptr)
 #define Dtool_Return_None() (LIKELY(_PyErr_OCCURRED() == nullptr) ? (Py_INCREF(Py_None), Py_None) : nullptr)
@@ -241,19 +241,19 @@ PyObject *_Dtool_Return(PyObject *value);
 /**
 /**
  * Wrapper around Python 3.4's enum library, which does not have a C API.
  * Wrapper around Python 3.4's enum library, which does not have a C API.
  */
  */
-PyTypeObject *Dtool_EnumType_Create(const char *name, PyObject *names,
-                                                        const char *module = nullptr);
+EXPCL_PYPANDA PyTypeObject *Dtool_EnumType_Create(const char *name, PyObject *names,
+                                                  const char *module = nullptr);
 INLINE long Dtool_EnumValue_AsLong(PyObject *value);
 INLINE long Dtool_EnumValue_AsLong(PyObject *value);
 
 
 
 
 /**
 /**
 
 
  */
  */
-PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int RunTimeType);
+EXPCL_PYPANDA PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int RunTimeType);
 
 
 // DTool_CreatePyInstance .. wrapper function to finalize the existance of a
 // DTool_CreatePyInstance .. wrapper function to finalize the existance of a
 // general dtool py instance..
 // general dtool py instance..
-PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const);
+EXPCL_PYPANDA PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const);
 
 
 // These template methods allow use when the Dtool_PyTypedObject is not known.
 // These template methods allow use when the Dtool_PyTypedObject is not known.
 // They require a get_class_type() to be defined for the class.
 // They require a get_class_type() to be defined for the class.
@@ -320,26 +320,26 @@ struct LibraryDef {
 };
 };
 
 
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
-PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def);
+EXPCL_PYPANDA PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def);
 #else
 #else
-PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulename);
+EXPCL_PYPANDA PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulename);
 #endif
 #endif
 
 
 // HACK.... Be carefull Dtool_BorrowThisReference This function can be used to
 // HACK.... Be carefull Dtool_BorrowThisReference This function can be used to
 // grab the "THIS" pointer from an object and use it Required to support fom
 // grab the "THIS" pointer from an object and use it Required to support fom
 // historical inharatence in the for of "is this instance of"..
 // historical inharatence in the for of "is this instance of"..
-PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args);
+EXPCL_PYPANDA PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args);
 
 
 #define DTOOL_PyObject_HashPointer DtoolInstance_HashPointer
 #define DTOOL_PyObject_HashPointer DtoolInstance_HashPointer
 #define DTOOL_PyObject_ComparePointers DtoolInstance_ComparePointers
 #define DTOOL_PyObject_ComparePointers DtoolInstance_ComparePointers
 
 
-PyObject *
+EXPCL_PYPANDA PyObject *
 copy_from_make_copy(PyObject *self, PyObject *noargs);
 copy_from_make_copy(PyObject *self, PyObject *noargs);
 
 
-PyObject *
+EXPCL_PYPANDA PyObject *
 copy_from_copy_constructor(PyObject *self, PyObject *noargs);
 copy_from_copy_constructor(PyObject *self, PyObject *noargs);
 
 
-PyObject *
+EXPCL_PYPANDA PyObject *
 map_deepcopy_to_copy(PyObject *self, PyObject *args);
 map_deepcopy_to_copy(PyObject *self, PyObject *args);
 
 
 /**
 /**
@@ -348,14 +348,14 @@ map_deepcopy_to_copy(PyObject *self, PyObject *args);
  */
  */
 ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args);
 ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args);
 ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args, PyObject *kwds);
 ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args, PyObject *kwds);
-bool Dtool_ExtractArg(PyObject **result, PyObject *args,
-                                          PyObject *kwds, const char *keyword);
-bool Dtool_ExtractArg(PyObject **result, PyObject *args,
-                                          PyObject *kwds);
-bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args,
-                                                  PyObject *kwds, const char *keyword);
-bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args,
-                                                  PyObject *kwds);
+EXPCL_PYPANDA bool Dtool_ExtractArg(PyObject **result, PyObject *args,
+                                    PyObject *kwds, const char *keyword);
+EXPCL_PYPANDA bool Dtool_ExtractArg(PyObject **result, PyObject *args,
+                                    PyObject *kwds);
+EXPCL_PYPANDA bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args,
+                                            PyObject *kwds, const char *keyword);
+EXPCL_PYPANDA  bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args,
+                                             PyObject *kwds);
 
 
 /**
 /**
  * These functions convert a C++ value into the corresponding Python object.
  * These functions convert a C++ value into the corresponding Python object.
@@ -390,7 +390,7 @@ ALWAYS_INLINE PyObject *Dtool_WrapValue(Py_buffer *value);
 template<class T1, class T2>
 template<class T1, class T2>
 ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::pair<T1, T2> &value);
 ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::pair<T1, T2> &value);
 
 
-Dtool_PyTypedObject *Dtool_GetSuperBase();
+EXPCL_PYPANDA Dtool_PyTypedObject *Dtool_GetSuperBase();
 
 
 #include "py_panda.I"
 #include "py_panda.I"
 
 

+ 6 - 6
dtool/src/interrogatedb/py_wrappers.h

@@ -49,12 +49,12 @@ struct Dtool_GeneratorWrapper {
   iternextfunc _iternext_func;
   iternextfunc _iternext_func;
 };
 };
 
 
-Dtool_SequenceWrapper *Dtool_NewSequenceWrapper(PyObject *self, const char *name);
-Dtool_MutableSequenceWrapper *Dtool_NewMutableSequenceWrapper(PyObject *self, const char *name);
-Dtool_MappingWrapper *Dtool_NewMappingWrapper(PyObject *self, const char *name);
-Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char *name);
-PyObject *Dtool_NewGenerator(PyObject *self, iternextfunc func);
-PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset);
+EXPCL_PYPANDA Dtool_SequenceWrapper *Dtool_NewSequenceWrapper(PyObject *self, const char *name);
+EXPCL_PYPANDA Dtool_MutableSequenceWrapper *Dtool_NewMutableSequenceWrapper(PyObject *self, const char *name);
+EXPCL_PYPANDA Dtool_MappingWrapper *Dtool_NewMappingWrapper(PyObject *self, const char *name);
+EXPCL_PYPANDA Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char *name);
+EXPCL_PYPANDA PyObject *Dtool_NewGenerator(PyObject *self, iternextfunc func);
+EXPCL_PYPANDA PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset);
 
 
 #endif  // HAVE_PYTHON
 #endif  // HAVE_PYTHON