-
-
Notifications
You must be signed in to change notification settings - Fork 34.4k
gh-146636: Improve ABI/feature selection, add new header for it #148302
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 6 commits
1116e1e
4581298
e1b7500
247bd46
7835449
2ad80d8
7c9d920
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,98 @@ | ||
| /* Macros that restrict available definitions and select implementations | ||
| * to match an ABI stability promise: | ||
| * | ||
| * - internal API/ABI (may change at any time) -- Py_BUILD_CORE* | ||
| * - general CPython API/ABI (may change in 3.x.0) -- default | ||
| * - Stable ABI: abi3, abi3t (long-term stable) -- Py_LIMITED_API, | ||
| * Py_TARGET_ABI3T, _Py_OPAQUE_PYOBJECT | ||
| * - Free-threading (incompatible with non-free-threading builds) | ||
| * -- Py_GIL_DISABLED | ||
| */ | ||
|
|
||
| #ifndef _Py_PYABI_H | ||
| #define _Py_PYABI_H | ||
|
|
||
| /* Defines to build Python and its standard library: | ||
| * | ||
| * - Py_BUILD_CORE: Build Python core. Gives access to Python internals; should | ||
| * not be used by third-party modules. | ||
| * - Py_BUILD_CORE_BUILTIN: Build a Python stdlib module as a built-in module. | ||
| * - Py_BUILD_CORE_MODULE: Build a Python stdlib module as a dynamic library. | ||
| * | ||
| * Py_BUILD_CORE_BUILTIN and Py_BUILD_CORE_MODULE imply Py_BUILD_CORE. | ||
| * | ||
| * On Windows, Py_BUILD_CORE_MODULE exports "PyInit_xxx" symbol, whereas | ||
| * Py_BUILD_CORE_BUILTIN does not. | ||
| */ | ||
| #if defined(Py_BUILD_CORE_BUILTIN) && !defined(Py_BUILD_CORE) | ||
| # define Py_BUILD_CORE | ||
| #endif | ||
| #if defined(Py_BUILD_CORE_MODULE) && !defined(Py_BUILD_CORE) | ||
| # define Py_BUILD_CORE | ||
| #endif | ||
|
|
||
| /* Stable ABI for free-threaded builds (abi3t, introduced in PEP 803) | ||
| * is enabled by one of: | ||
| * - Py_TARGET_ABI3T, or | ||
| * - Py_LIMITED_API and Py_GIL_DISABLED. | ||
| * | ||
| * These affect set the following, which Python.h should use internally: | ||
| * - Py_LIMITED_API (defines the subset of API we expose) | ||
| * - _Py_OPAQUE_PYOBJECT (additionally hides what's ABI-incompatible between | ||
| * free-threaded & GIL) | ||
| * | ||
| * (Don't use Py_TARGET_ABI3T directly. It's currently only used to set these | ||
| * 2 macros, and defined for users' convenience.) | ||
| */ | ||
| #if defined(Py_LIMITED_API) && defined(Py_GIL_DISABLED) \ | ||
| && !defined(Py_TARGET_ABI3T) | ||
| # define Py_TARGET_ABI3T Py_LIMITED_API | ||
| #endif | ||
| #if defined(Py_TARGET_ABI3T) | ||
| # define _Py_OPAQUE_PYOBJECT | ||
| # if !defined(Py_LIMITED_API) | ||
| # define Py_LIMITED_API Py_TARGET_ABI3T | ||
| # elif Py_LIMITED_API > Py_TARGET_ABI3T | ||
| // if both are defined, use the *lower* version, | ||
| // i.e. maximum compatibility | ||
| # undef Py_LIMITED_API | ||
| # define Py_LIMITED_API Py_TARGET_ABI3T | ||
| # endif | ||
| #endif | ||
|
|
||
| #if defined(Py_TARGET_ABI3T) | ||
| # if !defined(Py_GIL_DISABLED) | ||
| // Define Py_GIL_DISABLED for users' needs. Users check this macro to see | ||
| // whether they need extra synchronization. | ||
| # define Py_GIL_DISABLED | ||
| # endif | ||
| # if defined(_Py_IS_TESTCEXT) | ||
| // When compiling for abi3t, contents of Python.h should not depend | ||
encukou marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // on Py_GIL_DISABLED. | ||
| // We ask GCC to error if it sees the macro from this point on. | ||
| // Since users are free to the macro, and there's no way to undo the | ||
| // poisoning at the end of Python.h, we only do this in a test module. | ||
encukou marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| # ifdef __GNUC__ | ||
| # undef Py_GIL_DISABLED | ||
| # pragma GCC poison Py_GIL_DISABLED | ||
| # endif | ||
| # endif | ||
| #endif | ||
|
|
||
| /* The internal C API must not be used with the limited C API: make sure | ||
| * that Py_BUILD_CORE* macros are not defined in this case. | ||
| * But, keep the "original" values, under different names, for "exports.h" | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's surprising that _PyEXPORTS_CORE and _PyEXPORTS_CORE_MODULE are defined even if Py_LIMITED_API is defined. I tried to undefine Py_BUILD_CORE if Py_LIMITED_API is defined before _PyEXPORTS_CORE code, but I got linker errors on Windows. Examples:
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes; these select whether (This is currently done by including |
||
| */ | ||
| #ifdef Py_BUILD_CORE | ||
| # define _PyEXPORTS_CORE | ||
| #endif | ||
| #ifdef Py_BUILD_CORE_MODULE | ||
| # define _PyEXPORTS_CORE_MODULE | ||
| #endif | ||
| #ifdef Py_LIMITED_API | ||
| # undef Py_BUILD_CORE | ||
| # undef Py_BUILD_CORE_BUILTIN | ||
| # undef Py_BUILD_CORE_MODULE | ||
| #endif | ||
|
|
||
| #endif // _Py_PYABI_H | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| Using :c:macro:`Py_LIMITED_API` on a non-Windows free-threaded build no | ||
| longer needs an extra :c:macro:`Py_GIL_DISABLED`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You may move
#ifdef __GNUC__here:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This subtle style detail is intentional: I'm inviting
#elifs for other compilers.