@@ -8,7 +8,9 @@
88"""
991010importos
11+importshlex
1112importsys
13+importsysconfig
1214importtest.support
13151416@@ -19,15 +21,37 @@ def is_multiprocess_flag(arg):
1921defis_resource_use_flag(arg):
2022returnarg.startswith('-u') orarg.startswith('--use')
212324+defis_python_flag(arg):
25+returnarg.startswith('-p') orarg.startswith('--python')
26+22272328defmain(regrtest_args):
2429args= [sys.executable,
2530'-u', # Unbuffered stdout and stderr
2631'-W', 'default', # Warnings set to 'default'
2732'-bb', # Warnings about bytes/bytearray
28-'-E', # Ignore environment variables
2933 ]
303435+cross_compile='_PYTHON_HOST_PLATFORM'inos.environ
36+if (hostrunner:=os.environ.get("_PYTHON_HOSTRUNNER")) isNone:
37+hostrunner=sysconfig.get_config_var("HOSTRUNNER")
38+ifcross_compile:
39+# emulate -E, but keep PYTHONPATH + cross compile env vars, so
40+# test executable can load correct sysconfigdata file.
41+keep= {
42+'_PYTHON_PROJECT_BASE',
43+'_PYTHON_HOST_PLATFORM',
44+'_PYTHON_SYSCONFIGDATA_NAME',
45+'PYTHONPATH'
46+ }
47+environ= {
48+name: valueforname, valueinos.environ.items()
49+ifnotname.startswith(('PYTHON', '_PYTHON')) ornameinkeep
50+ }
51+else:
52+environ=os.environ.copy()
53+args.append("-E")
54+3155# Allow user-specified interpreter options to override our defaults.
3256args.extend(test.support.args_from_interpreter_flags())
3357@@ -38,16 +62,30 @@ def main(regrtest_args):
3862ifsys.platform=='win32':
3963args.append('-n') # Silence alerts under Windows
4064ifnotany(is_multiprocess_flag(arg) forarginregrtest_args):
41-args.extend(['-j', '0']) # Use all CPU cores
65+ifcross_compileandhostrunner:
66+# For now use only one core for cross-compiled builds;
67+# hostrunner can be expensive.
68+args.extend(['-j', '1'])
69+else:
70+args.extend(['-j', '0']) # Use all CPU cores
4271ifnotany(is_resource_use_flag(arg) forarginregrtest_args):
4372args.extend(['-u', 'all,-largefile,-audio,-gui'])
73+74+ifcross_compileandhostrunner:
75+# If HOSTRUNNER is set and -p/--python option is not given, then
76+# use hostrunner to execute python binary for tests.
77+ifnotany(is_python_flag(arg) forarginregrtest_args):
78+buildpython=sysconfig.get_config_var("BUILDPYTHON")
79+args.extend(["--python", f"{hostrunner}{buildpython}"])
80+4481args.extend(regrtest_args)
45-print(' '.join(args))
82+83+print(shlex.join(args))
4684ifsys.platform=='win32':
4785fromsubprocessimportcall
4886sys.exit(call(args))
4987else:
50-os.execv(sys.executable, args)
88+os.execve(sys.executable, args, environ)
518952905391if__name__=='__main__':