]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-141671: PyMODINIT_FUNC: apply `__declspec(dllexport)` on Windows (GH-141672)
authorPetr Viktorin <encukou@gmail.com>
Wed, 7 Jan 2026 12:09:48 +0000 (13:09 +0100)
committerGitHub <noreply@github.com>
Wed, 7 Jan 2026 12:09:48 +0000 (13:09 +0100)
Include/exports.h
Misc/NEWS.d/next/C_API/2025-11-17-17-46-16.gh-issue-141671.cVXNW5.rst [new file with mode: 0644]

index 62feb09ed2b43363b516036a735898f5d2fdee31..97a674ec2403a4e231d278e90b08a3b618802753 100644 (file)
         #define Py_EXPORTED_SYMBOL
         #define Py_LOCAL_SYMBOL
     #endif
+    /* module init functions outside the core must be exported */
+    #if defined(Py_BUILD_CORE)
+        #define _PyINIT_EXPORTED_SYMBOL Py_EXPORTED_SYMBOL
+    #else
+        #define _PyINIT_EXPORTED_SYMBOL __declspec(dllexport)
+    #endif
 #else
 /*
  * If we only ever used gcc >= 5, we could use __has_attribute(visibility)
         #define Py_EXPORTED_SYMBOL
         #define Py_LOCAL_SYMBOL
     #endif
+    #define _PyINIT_EXPORTED_SYMBOL Py_EXPORTED_SYMBOL
 #endif
 
 /* 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 _PyINIT_FUNC_DECLSPEC Py_EXPORTED_SYMBOL
-#                       else /* __CYGWIN__ */
+#                       if !defined(__CYGWIN__)
 #                               define _PyINIT_FUNC_DECLSPEC
 #                       endif /* __CYGWIN__ */
 #               else /* Py_BUILD_CORE */
 #                               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 _PyINIT_FUNC_DECLSPEC extern "C" Py_EXPORTED_SYMBOL
-#                       else /* __cplusplus */
-#                               define _PyINIT_FUNC_DECLSPEC Py_EXPORTED_SYMBOL
-#                       endif /* __cplusplus */
 #               endif /* Py_BUILD_CORE */
 #       endif /* HAVE_DECLSPEC_DLL */
 #endif /* Py_ENABLE_SHARED */
 #endif
 #ifndef _PyINIT_FUNC_DECLSPEC
 #       if defined(__cplusplus)
-#               define _PyINIT_FUNC_DECLSPEC extern "C" Py_EXPORTED_SYMBOL
+#               define _PyINIT_FUNC_DECLSPEC extern "C" _PyINIT_EXPORTED_SYMBOL
 #       else /* __cplusplus */
-#               define _PyINIT_FUNC_DECLSPEC Py_EXPORTED_SYMBOL
+#               define _PyINIT_FUNC_DECLSPEC _PyINIT_EXPORTED_SYMBOL
 #       endif /* __cplusplus */
 #endif
 
-#define PyMODINIT_FUNC _PyINIT_FUNC_DECLSPEC PyObject*
-#define PyMODEXPORT_FUNC _PyINIT_FUNC_DECLSPEC PyModuleDef_Slot*
+#ifndef PyMODINIT_FUNC
+    #define PyMODINIT_FUNC _PyINIT_FUNC_DECLSPEC PyObject*
+#endif
+#ifndef PyMODEXPORT_FUNC
+    #define PyMODEXPORT_FUNC _PyINIT_FUNC_DECLSPEC PyModuleDef_Slot*
+#endif
 
 #endif /* Py_EXPORTS_H */
diff --git a/Misc/NEWS.d/next/C_API/2025-11-17-17-46-16.gh-issue-141671.cVXNW5.rst b/Misc/NEWS.d/next/C_API/2025-11-17-17-46-16.gh-issue-141671.cVXNW5.rst
new file mode 100644 (file)
index 0000000..304a6a5
--- /dev/null
@@ -0,0 +1,2 @@
+:c:macro:`PyMODINIT_FUNC` (and the new :c:macro:`PyMODEXPORT_FUNC`) now adds
+a linkage declaration (``__declspec(dllexport)``) on Windows.