// _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); }