bpo-32030: Add _PyMainInterpreterConfig.pythonhome (#4513)

* Py_Main() now reads the PYTHONHOME environment variable
* Add _Py_GetPythonHomeWithConfig() private function
* Add _PyWarnings_InitWithConfig()
* init_filters() doesn't get the current core configuration from the
  current interpreter or Python thread anymore. Pass explicitly the
  configuration to _PyWarnings_InitWithConfig().
* _Py_InitializeCore() now fails on _PyWarnings_InitWithConfig()
  failure.
* Pass configuration as constant
diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h
index 5eaa74e..3b603c8 100644
--- a/Include/pylifecycle.h
+++ b/Include/pylifecycle.h
@@ -12,6 +12,10 @@
 
 PyAPI_FUNC(void) Py_SetPythonHome(wchar_t *);
 PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void);
+#ifdef Py_BUILD_CORE
+PyAPI_FUNC(wchar_t *) _Py_GetPythonHomeWithConfig(
+    const _PyMainInterpreterConfig *config);
+#endif
 
 #ifndef Py_LIMITED_API
 /* Only used by applications that embed the interpreter and need to
@@ -94,7 +98,8 @@
 PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void);
 PyAPI_FUNC(wchar_t *) Py_GetPath(void);
 #ifdef Py_BUILD_CORE
-PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(_PyMainInterpreterConfig *config);
+PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(
+    const _PyMainInterpreterConfig *config);
 #endif
 PyAPI_FUNC(void)      Py_SetPath(const wchar_t *);
 #ifdef MS_WINDOWS
diff --git a/Include/pystate.h b/Include/pystate.h
index b2739f1..ab6400c 100644
--- a/Include/pystate.h
+++ b/Include/pystate.h
@@ -61,12 +61,15 @@
 typedef struct {
     int install_signal_handlers;
     wchar_t *module_search_path_env; /* PYTHONPATH environment variable */
+    wchar_t *pythonhome;    /* PYTHONHOME environment variable,
+                               see also Py_SetPythonHome(). */
 } _PyMainInterpreterConfig;
 
 #define _PyMainInterpreterConfig_INIT \
     (_PyMainInterpreterConfig){\
      .install_signal_handlers = -1, \
-     .module_search_path_env = NULL}
+     .module_search_path_env = NULL, \
+     .pythonhome = NULL}
 
 typedef struct _is {
 
diff --git a/Include/warnings.h b/Include/warnings.h
index a3f83ff..25f715e 100644
--- a/Include/warnings.h
+++ b/Include/warnings.h
@@ -7,6 +7,9 @@
 #ifndef Py_LIMITED_API
 PyAPI_FUNC(PyObject*) _PyWarnings_Init(void);
 #endif
+#ifdef Py_BUILD_CORE
+PyAPI_FUNC(PyObject*) _PyWarnings_InitWithConfig(const _PyCoreConfig *config);
+#endif
 
 PyAPI_FUNC(int) PyErr_WarnEx(
     PyObject *category,