summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Programs/_bootstrap_python.c
diff options
context:
space:
mode:
authormaxim-yurchuk <[email protected]>2024-10-09 12:29:46 +0300
committermaxim-yurchuk <[email protected]>2024-10-09 13:14:22 +0300
commit9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch)
treea8fb3181d5947c0d78cf402aa56e686130179049 /contrib/tools/python3/Programs/_bootstrap_python.c
parenta44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff)
publishFullContrib: true for ydb
<HIDDEN_URL> commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/tools/python3/Programs/_bootstrap_python.c')
-rw-r--r--contrib/tools/python3/Programs/_bootstrap_python.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/contrib/tools/python3/Programs/_bootstrap_python.c b/contrib/tools/python3/Programs/_bootstrap_python.c
new file mode 100644
index 00000000000..6c388fc7033
--- /dev/null
+++ b/contrib/tools/python3/Programs/_bootstrap_python.c
@@ -0,0 +1,122 @@
+
+/* Frozen modules bootstrap
+ *
+ * Limited and restricted Python interpreter to run
+ * "Tools/build/deepfreeze.py" on systems with no or older Python
+ * interpreter.
+ */
+
+#include "Python.h"
+#include "pycore_import.h"
+
+/* Includes for frozen modules: */
+#include "Python/frozen_modules/importlib._bootstrap.h"
+#include "Python/frozen_modules/importlib._bootstrap_external.h"
+#include "Python/frozen_modules/zipimport.h"
+/* End includes */
+
+uint32_t _Py_next_func_version = 1;
+
+/* Empty initializer for deepfrozen modules */
+int _Py_Deepfreeze_Init(void)
+{
+ return 0;
+}
+/* Empty finalizer for deepfrozen modules */
+void
+_Py_Deepfreeze_Fini(void)
+{
+}
+
+/* Note that a negative size indicates a package. */
+
+static const struct _frozen bootstrap_modules[] = {
+ {"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap)},
+ {"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external)},
+ {"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport)},
+ {0, 0, 0} /* bootstrap sentinel */
+};
+static const struct _frozen stdlib_modules[] = {
+ {0, 0, 0} /* stdlib sentinel */
+};
+static const struct _frozen test_modules[] = {
+ {0, 0, 0} /* test sentinel */
+};
+const struct _frozen *_PyImport_FrozenBootstrap = bootstrap_modules;
+const struct _frozen *_PyImport_FrozenStdlib = stdlib_modules;
+const struct _frozen *_PyImport_FrozenTest = test_modules;
+
+static const struct _module_alias aliases[] = {
+ {"_frozen_importlib", "importlib._bootstrap"},
+ {"_frozen_importlib_external", "importlib._bootstrap_external"},
+ {0, 0} /* aliases sentinel */
+};
+const struct _module_alias *_PyImport_FrozenAliases = aliases;
+
+/* Embedding apps may change this pointer to point to their favorite
+ collection of frozen modules: */
+
+const struct _frozen *PyImport_FrozenModules = NULL;
+
+int
+#ifdef MS_WINDOWS
+wmain(int argc, wchar_t **argv)
+#else
+main(int argc, char **argv)
+#endif
+{
+ PyStatus status;
+
+ PyConfig config;
+ PyConfig_InitIsolatedConfig(&config);
+ // don't warn, pybuilddir.txt does not exist yet
+ config.pathconfig_warnings = 0;
+ // parse arguments
+ config.parse_argv = 1;
+ // add current script dir to sys.path
+ config.isolated = 0;
+ config.safe_path = 0;
+
+#ifdef MS_WINDOWS
+ status = PyConfig_SetArgv(&config, argc, argv);
+#else
+ status = PyConfig_SetBytesArgv(&config, argc, argv);
+#endif
+ if (PyStatus_Exception(status)) {
+ goto error;
+ }
+
+ status = PyConfig_Read(&config);
+ if (config.run_filename == NULL) {
+ status = PyStatus_Error("Run filename expected");
+ goto error;
+ }
+
+#define CLEAR(ATTR) \
+ do { \
+ PyMem_RawFree(ATTR); \
+ ATTR = NULL; \
+ } while (0)
+
+ // isolate from system Python
+ CLEAR(config.base_prefix);
+ CLEAR(config.prefix);
+ CLEAR(config.base_exec_prefix);
+ CLEAR(config.exec_prefix);
+
+ status = Py_InitializeFromConfig(&config);
+ if (PyStatus_Exception(status)) {
+ goto error;
+ }
+ PyConfig_Clear(&config);
+
+ return Py_RunMain();
+
+error:
+ PyConfig_Clear(&config);
+ if (PyStatus_IsExit(status)) {
+ return status.exitcode;
+ }
+ Py_ExitStatusException(status);
+}
+