bpo-34170: Add _PyCoreConfig._frozen parameter (GH-8591)

Modify frozenmain.c to use _Py_InitializeFromConfig().
This commit is contained in:
Victor Stinner 2018-08-01 02:13:04 +02:00 committed by GitHub
parent 8ed317f1ca
commit b75d7e2435
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 37 additions and 8 deletions

View File

@ -235,6 +235,12 @@ typedef struct {
See PEP 552 "Deterministic pycs" for more details. */ See PEP 552 "Deterministic pycs" for more details. */
const char *_check_hash_pycs_mode; const char *_check_hash_pycs_mode;
/* If greater than 0, suppress _PyPathConfig_Calculate() warnings.
If set to -1 (default), inherit Py_FrozenFlag value. */
int _frozen;
} _PyCoreConfig; } _PyCoreConfig;
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
@ -269,7 +275,8 @@ typedef struct {
.user_site_directory = -1, \ .user_site_directory = -1, \
.unbuffered_stdio = -1, \ .unbuffered_stdio = -1, \
_PyCoreConfig_WINDOWS_INIT \ _PyCoreConfig_WINDOWS_INIT \
._install_importlib = 1} ._install_importlib = 1, \
._frozen = -1}
/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
/* Placeholders while working on the new configuration API /* Placeholders while working on the new configuration API

View File

@ -289,6 +289,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
'_install_importlib': 1, '_install_importlib': 1,
'_check_hash_pycs_mode': 'default', '_check_hash_pycs_mode': 'default',
'_frozen': 0,
} }
def check_config(self, testname, expected): def check_config(self, testname, expected):
@ -330,6 +331,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
'unbuffered_stdio': 1, 'unbuffered_stdio': 1,
'utf8_mode': 1, 'utf8_mode': 1,
'user_site_directory': 0, 'user_site_directory': 0,
'_frozen': 1,
} }
self.check_config("init_global_config", config) self.check_config("init_global_config", config)
@ -362,7 +364,9 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
'unbuffered_stdio': 1, 'unbuffered_stdio': 1,
'user_site_directory': 0, 'user_site_directory': 0,
'faulthandler': 1, 'faulthandler': 1,
'_check_hash_pycs_mode': 'always', '_check_hash_pycs_mode': 'always',
'_frozen': 1,
} }
self.check_config("init_from_config", config) self.check_config("init_from_config", config)

View File

@ -372,7 +372,7 @@ calculate_prefix(const _PyCoreConfig *core_config,
{ {
calculate->prefix_found = search_for_prefix(core_config, calculate, prefix); calculate->prefix_found = search_for_prefix(core_config, calculate, prefix);
if (!calculate->prefix_found) { if (!calculate->prefix_found) {
if (!Py_FrozenFlag) { if (!core_config->_frozen) {
fprintf(stderr, fprintf(stderr,
"Could not find platform independent libraries <prefix>\n"); "Could not find platform independent libraries <prefix>\n");
} }
@ -495,7 +495,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
calculate, calculate,
exec_prefix); exec_prefix);
if (!calculate->exec_prefix_found) { if (!calculate->exec_prefix_found) {
if (!Py_FrozenFlag) { if (!core_config->_frozen) {
fprintf(stderr, fprintf(stderr,
"Could not find platform dependent libraries <exec_prefix>\n"); "Could not find platform dependent libraries <exec_prefix>\n");
} }
@ -915,7 +915,7 @@ calculate_path_impl(const _PyCoreConfig *core_config,
calculate_exec_prefix(core_config, calculate, exec_prefix); calculate_exec_prefix(core_config, calculate, exec_prefix);
if ((!calculate->prefix_found || !calculate->exec_prefix_found) && if ((!calculate->prefix_found || !calculate->exec_prefix_found) &&
!Py_FrozenFlag) !core_config->_frozen)
{ {
fprintf(stderr, fprintf(stderr,
"Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]\n"); "Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]\n");

View File

@ -573,6 +573,7 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag);
COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag);
#endif #endif
COPY_FLAG(_frozen, Py_FrozenFlag);
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
COPY_NOT_FLAG(site_import, Py_NoSiteFlag); COPY_NOT_FLAG(site_import, Py_NoSiteFlag);
@ -759,6 +760,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
COPY_ATTR(legacy_windows_stdio); COPY_ATTR(legacy_windows_stdio);
#endif #endif
COPY_ATTR(_check_hash_pycs_mode); COPY_ATTR(_check_hash_pycs_mode);
COPY_ATTR(_frozen);
#undef COPY_ATTR #undef COPY_ATTR
#undef COPY_STR_ATTR #undef COPY_STR_ATTR
@ -2281,6 +2283,9 @@ _PyCoreConfig_Read(_PyCoreConfig *config)
if (config->utf8_mode < 0) { if (config->utf8_mode < 0) {
config->utf8_mode = 0; config->utf8_mode = 0;
} }
if (config->_frozen < 0) {
config->_frozen = 0;
}
return _Py_INIT_OK(); return _Py_INIT_OK();
} }

View File

@ -82,8 +82,7 @@ main(int argc, char *argv[])
/* Don't install importlib, since it could execute outdated bytecode. */ /* Don't install importlib, since it could execute outdated bytecode. */
config._install_importlib = 0; config._install_importlib = 0;
config.install_signal_handlers = 1; config.install_signal_handlers = 1;
config._frozen = 1;
Py_FrozenFlag++;
_PyInitError err = _Py_InitializeFromConfig(&config); _PyInitError err = _Py_InitializeFromConfig(&config);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any /* No need to call _PyCoreConfig_Clear() since we didn't allocate any

View File

@ -368,6 +368,7 @@ dump_config(void)
printf("_install_importlib = %i\n", config->_install_importlib); printf("_install_importlib = %i\n", config->_install_importlib);
printf("_check_hash_pycs_mode = %s\n", config->_check_hash_pycs_mode); printf("_check_hash_pycs_mode = %s\n", config->_check_hash_pycs_mode);
printf("_frozen = %i\n", config->_frozen);
#undef ASSERT_EQUAL #undef ASSERT_EQUAL
#undef ASSERT_STR_EQUAL #undef ASSERT_STR_EQUAL
@ -420,6 +421,8 @@ static int test_init_global_config(void)
putenv("PYTHONUNBUFFERED="); putenv("PYTHONUNBUFFERED=");
Py_UnbufferedStdioFlag = 1; Py_UnbufferedStdioFlag = 1;
Py_FrozenFlag = 1;
/* FIXME: test Py_LegacyWindowsFSEncodingFlag */ /* FIXME: test Py_LegacyWindowsFSEncodingFlag */
/* FIXME: test Py_LegacyWindowsStdioFlag */ /* FIXME: test Py_LegacyWindowsStdioFlag */
@ -525,6 +528,9 @@ static int test_init_from_config(void)
config._check_hash_pycs_mode = "always"; config._check_hash_pycs_mode = "always";
Py_FrozenFlag = 0;
config._frozen = 1;
_PyInitError err = _Py_InitializeFromConfig(&config); _PyInitError err = _Py_InitializeFromConfig(&config);
/* Don't call _PyCoreConfig_Clear() since all strings are static */ /* Don't call _PyCoreConfig_Clear() since all strings are static */
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {

View File

@ -41,7 +41,8 @@ Py_FrozenMain(int argc, char **argv)
} }
} }
Py_FrozenFlag = 1; /* Suppress errors from getpath.c */ _PyCoreConfig config = _PyCoreConfig_INIT;
config._frozen = 1; /* Suppress errors from getpath.c */
if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
inspect = 1; inspect = 1;
@ -80,7 +81,14 @@ Py_FrozenMain(int argc, char **argv)
#endif /* MS_WINDOWS */ #endif /* MS_WINDOWS */
if (argc >= 1) if (argc >= 1)
Py_SetProgramName(argv_copy[0]); Py_SetProgramName(argv_copy[0]);
Py_Initialize();
err = _Py_InitializeFromConfig(&config);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
memory: program_name is a constant string. */
if (_Py_INIT_FAILED(err)) {
_Py_FatalInitError(err);
}
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
PyWinFreeze_ExeInit(); PyWinFreeze_ExeInit();
#endif #endif