| // _sysconfig provides data for the Python sysconfig module | |
| #ifndef Py_BUILD_CORE_BUILTIN | |
| # define Py_BUILD_CORE_MODULE 1 | |
| #endif | |
| #include "Python.h" | |
| #include "pycore_importdl.h" // _PyImport_DynLoadFiletab | |
| #include "pycore_long.h" // _PyLong_GetZero, _PyLong_GetOne | |
| /*[clinic input] | |
| module _sysconfig | |
| [clinic start generated code]*/ | |
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=0a7c02d3e212ac97]*/ | |
| #include "clinic/_sysconfig.c.h" | |
| #ifdef MS_WINDOWS | |
| static int | |
| add_string_value(PyObject *dict, const char *key, const char *str_value) | |
| { | |
| PyObject *value = PyUnicode_FromString(str_value); | |
| if (value == NULL) { | |
| return -1; | |
| } | |
| int err = PyDict_SetItemString(dict, key, value); | |
| Py_DECREF(value); | |
| return err; | |
| } | |
| #endif | |
| /*[clinic input] | |
| @permit_long_summary | |
| _sysconfig.config_vars | |
| Returns a dictionary containing build variables intended to be exposed by sysconfig. | |
| [clinic start generated code]*/ | |
| static PyObject * | |
| _sysconfig_config_vars_impl(PyObject *module) | |
| /*[clinic end generated code: output=9c41cdee63ea9487 input=fdda9cab12ca19fe]*/ | |
| { | |
| PyObject *config = PyDict_New(); | |
| if (config == NULL) { | |
| return NULL; | |
| } | |
| #ifdef MS_WINDOWS | |
| if (add_string_value(config, "EXT_SUFFIX", PYD_TAGGED_SUFFIX) < 0) { | |
| Py_DECREF(config); | |
| return NULL; | |
| } | |
| if (add_string_value(config, "SOABI", PYD_SOABI) < 0) { | |
| Py_DECREF(config); | |
| return NULL; | |
| } | |
| #endif | |
| #ifdef Py_GIL_DISABLED | |
| PyObject *py_gil_disabled = _PyLong_GetOne(); | |
| #else | |
| PyObject *py_gil_disabled = _PyLong_GetZero(); | |
| #endif | |
| if (PyDict_SetItemString(config, "Py_GIL_DISABLED", py_gil_disabled) < 0) { | |
| Py_DECREF(config); | |
| return NULL; | |
| } | |
| #ifdef Py_DEBUG | |
| PyObject *py_debug = _PyLong_GetOne(); | |
| #else | |
| PyObject *py_debug = _PyLong_GetZero(); | |
| #endif | |
| if (PyDict_SetItemString(config, "Py_DEBUG", py_debug) < 0) { | |
| Py_DECREF(config); | |
| return NULL; | |
| } | |
| return config; | |
| } | |
| #ifdef MS_WINDOWS | |
| /*[clinic input] | |
| _sysconfig.get_platform | |
| Return a string that identifies the current platform. | |
| [clinic start generated code]*/ | |
| static PyObject * | |
| _sysconfig_get_platform_impl(PyObject *module) | |
| /*[clinic end generated code: output=4ecbbe2b77633f3e input=c0b43abda44f9a01]*/ | |
| { | |
| #ifdef MS_WIN64 | |
| # if defined(_M_X64) || defined(_M_AMD64) | |
| # define SYSCONFIG_PLATFORM "win-amd64" | |
| # elif defined(_M_ARM64) | |
| # define SYSCONFIG_PLATFORM "win-arm64" | |
| # endif | |
| #endif | |
| #if defined(MS_WIN32) && !defined(MS_WIN64) | |
| # if defined(_M_IX86) | |
| # define SYSCONFIG_PLATFORM "win32" | |
| # elif defined(_M_ARM) | |
| # define SYSCONFIG_PLATFORM "win-arm32" | |
| # endif | |
| #endif | |
| #ifdef SYSCONFIG_PLATFORM | |
| return PyUnicode_FromString(SYSCONFIG_PLATFORM); | |
| #else | |
| Py_RETURN_NONE; | |
| #endif | |
| } | |
| #endif // MS_WINDOWS | |
| PyDoc_STRVAR(sysconfig__doc__, | |
| "A helper for the sysconfig module."); | |
| static struct PyMethodDef sysconfig_methods[] = { | |
| _SYSCONFIG_CONFIG_VARS_METHODDEF | |
| _SYSCONFIG_GET_PLATFORM_METHODDEF | |
| {NULL, NULL} | |
| }; | |
| static PyModuleDef_Slot sysconfig_slots[] = { | |
| _Py_ABI_SLOT, | |
| {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}, | |
| {Py_mod_gil, Py_MOD_GIL_NOT_USED}, | |
| {0, NULL} | |
| }; | |
| static PyModuleDef sysconfig_module = { | |
| .m_base = PyModuleDef_HEAD_INIT, | |
| .m_name = "_sysconfig", | |
| .m_doc = sysconfig__doc__, | |
| .m_methods = sysconfig_methods, | |
| .m_slots = sysconfig_slots, | |
| }; | |
| PyMODINIT_FUNC | |
| PyInit__sysconfig(void) | |
| { | |
| return PyModuleDef_Init(&sysconfig_module); | |
| } |