aboutsummaryrefslogtreecommitdiff
path: root/Programs
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2021-12-03 17:01:11 +0200
committerGitHub <noreply@github.com>2021-12-03 16:01:11 +0100
commit84ca1232b0f1e4be368e89550a9ceb46f64a0eff (patch)
tree917838767e45e47c72931d4d2b370c4f0b2eaf0e /Programs
parentccb73a0d50dd03bc8455fe210cb83e41a6dc91d8 (diff)
downloadcpython3-84ca1232b0f1e4be368e89550a9ceb46f64a0eff.tar.gz
bpo-45950: Introduce Bootstrap Python again (#29859)
The build system now uses a :program:`_bootstrap_python` interpreter for freezing and deepfreezing again. To speed up build process the build tools :program:`_bootstrap_python` and :program:`_freeze_module` are no longer build with LTO. Cross building depends on a build Python interpreter, which must have same version and bytecode as target host Python.
Diffstat (limited to 'Programs')
-rw-r--r--Programs/_bootstrap_python.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/Programs/_bootstrap_python.c b/Programs/_bootstrap_python.c
new file mode 100644
index 0000000000..f2103fd5aa
--- /dev/null
+++ b/Programs/_bootstrap_python.c
@@ -0,0 +1,105 @@
+
+/* Frozen modules bootstrap
+ *
+ * Limited and restricted Python interpreter to run
+ * "Tools/scripts/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"
+/* End includes */
+
+/* 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)},
+ {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;
+
+#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);
+}