| 
									
										
										
										
											2019-10-15 08:26:12 +01:00
										 |  |  | #ifndef Py_EXPORTS_H
 | 
					
						
							|  |  |  | #define Py_EXPORTS_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-04 01:04:05 +02:00
										 |  |  | /* Declarations for symbol visibility.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   PyAPI_FUNC(type): Declares a public Python API function and return type | 
					
						
							|  |  |  |   PyAPI_DATA(type): Declares public Python data and its type | 
					
						
							|  |  |  |   PyMODINIT_FUNC:   A Python module init function.  If these functions are | 
					
						
							|  |  |  |                     inside the Python core, they are private to the core. | 
					
						
							|  |  |  |                     If in an extension module, it may be declared with | 
					
						
							|  |  |  |                     external linkage depending on the platform. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   As a number of platforms support/require "__declspec(dllimport/dllexport)", | 
					
						
							|  |  |  |   we support a HAVE_DECLSPEC_DLL macro to save duplication. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |   All windows ports, except cygwin, are handled in PC/pyconfig.h. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Cygwin is the only other autoconf platform requiring special | 
					
						
							|  |  |  |   linkage handling and it uses __declspec(). | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | #if defined(__CYGWIN__)
 | 
					
						
							|  |  |  | #       define HAVE_DECLSPEC_DLL
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-15 08:26:12 +01:00
										 |  |  | #if defined(_WIN32) || defined(__CYGWIN__)
 | 
					
						
							| 
									
										
										
										
											2022-12-09 12:16:15 +01:00
										 |  |  |     #if defined(Py_ENABLE_SHARED)
 | 
					
						
							|  |  |  |         #define Py_IMPORTED_SYMBOL __declspec(dllimport)
 | 
					
						
							|  |  |  |         #define Py_EXPORTED_SYMBOL __declspec(dllexport)
 | 
					
						
							|  |  |  |         #define Py_LOCAL_SYMBOL
 | 
					
						
							|  |  |  |     #else
 | 
					
						
							|  |  |  |         #define Py_IMPORTED_SYMBOL
 | 
					
						
							|  |  |  |         #define Py_EXPORTED_SYMBOL
 | 
					
						
							|  |  |  |         #define Py_LOCAL_SYMBOL
 | 
					
						
							|  |  |  |     #endif
 | 
					
						
							| 
									
										
										
										
											2019-10-15 08:26:12 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * If we only ever used gcc >= 5, we could use __has_attribute(visibility) | 
					
						
							|  |  |  |  * as a cross-platform way to determine if visibility is supported. However, | 
					
						
							|  |  |  |  * we may still need to support gcc >= 4, as some Ubuntu LTS and Centos versions | 
					
						
							|  |  |  |  * have 4 < gcc < 5. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  |     #if (defined(__GNUC__) && (__GNUC__ >= 4)) ||\
 | 
					
						
							| 
									
										
										
										
											2024-06-27 11:58:44 +02:00
										 |  |  |         (defined(__clang__) && _Py__has_attribute(visibility)) | 
					
						
							| 
									
										
										
										
											2019-10-15 08:26:12 +01:00
										 |  |  |         #define Py_IMPORTED_SYMBOL __attribute__ ((visibility ("default")))
 | 
					
						
							|  |  |  |         #define Py_EXPORTED_SYMBOL __attribute__ ((visibility ("default")))
 | 
					
						
							|  |  |  |         #define Py_LOCAL_SYMBOL  __attribute__ ((visibility ("hidden")))
 | 
					
						
							|  |  |  |     #else
 | 
					
						
							|  |  |  |         #define Py_IMPORTED_SYMBOL
 | 
					
						
							|  |  |  |         #define Py_EXPORTED_SYMBOL
 | 
					
						
							|  |  |  |         #define Py_LOCAL_SYMBOL
 | 
					
						
							|  |  |  |     #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-04 01:04:05 +02:00
										 |  |  | /* only get special linkage if built as shared or platform is Cygwin */ | 
					
						
							|  |  |  | #if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__)
 | 
					
						
							|  |  |  | #       if defined(HAVE_DECLSPEC_DLL)
 | 
					
						
							|  |  |  | #               if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
 | 
					
						
							|  |  |  | #                       define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE
 | 
					
						
							|  |  |  | #                       define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE
 | 
					
						
							|  |  |  |         /* module init functions inside the core need no external linkage */ | 
					
						
							|  |  |  |         /* except for Cygwin to handle embedding */ | 
					
						
							|  |  |  | #                       if defined(__CYGWIN__)
 | 
					
						
							|  |  |  | #                               define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
 | 
					
						
							|  |  |  | #                       else /* __CYGWIN__ */
 | 
					
						
							|  |  |  | #                               define PyMODINIT_FUNC PyObject*
 | 
					
						
							|  |  |  | #                       endif /* __CYGWIN__ */
 | 
					
						
							|  |  |  | #               else /* Py_BUILD_CORE */
 | 
					
						
							|  |  |  |         /* Building an extension module, or an embedded situation */ | 
					
						
							|  |  |  |         /* public Python functions and data are imported */ | 
					
						
							|  |  |  |         /* Under Cygwin, auto-import functions to prevent compilation */ | 
					
						
							|  |  |  |         /* failures similar to those described at the bottom of 4.1: */ | 
					
						
							|  |  |  |         /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ | 
					
						
							|  |  |  | #                       if !defined(__CYGWIN__)
 | 
					
						
							|  |  |  | #                               define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE
 | 
					
						
							|  |  |  | #                       endif /* !__CYGWIN__ */
 | 
					
						
							|  |  |  | #                       define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE
 | 
					
						
							|  |  |  |         /* module init functions outside the core must be exported */ | 
					
						
							|  |  |  | #                       if defined(__cplusplus)
 | 
					
						
							|  |  |  | #                               define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject*
 | 
					
						
							|  |  |  | #                       else /* __cplusplus */
 | 
					
						
							|  |  |  | #                               define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
 | 
					
						
							|  |  |  | #                       endif /* __cplusplus */
 | 
					
						
							|  |  |  | #               endif /* Py_BUILD_CORE */
 | 
					
						
							|  |  |  | #       endif /* HAVE_DECLSPEC_DLL */
 | 
					
						
							|  |  |  | #endif /* Py_ENABLE_SHARED */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* If no external linkage macros defined by now, create defaults */ | 
					
						
							|  |  |  | #ifndef PyAPI_FUNC
 | 
					
						
							|  |  |  | #       define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef PyAPI_DATA
 | 
					
						
							|  |  |  | #       define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef PyMODINIT_FUNC
 | 
					
						
							|  |  |  | #       if defined(__cplusplus)
 | 
					
						
							|  |  |  | #               define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject*
 | 
					
						
							|  |  |  | #       else /* __cplusplus */
 | 
					
						
							|  |  |  | #               define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
 | 
					
						
							|  |  |  | #       endif /* __cplusplus */
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-15 08:26:12 +01:00
										 |  |  | #endif /* Py_EXPORTS_H */
 |