mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-92906: Enable test_cext and test_cppext on Windows (#117000)
On Windows in release mode, the test_cext and test_cppext can now build C and C++ extensions. * test_cext now also builds the C extension without options. * test_cppext now also builds the C++ extension without options. * Add C++14 test to test_cppext; C++11 is not supported by MSVC. * Make setup_venv_with_pip_setuptools_wheel() quiet when support.verbose is false. Only show stdout and stderr on failure.
This commit is contained in:
		
							parent
							
								
									27cf3ed00c
								
							
						
					
					
						commit
						a114d08a89
					
				
					 7 changed files with 145 additions and 60 deletions
				
			
		|  | @ -1,8 +1,8 @@ | |||
| # gh-91321: Build a basic C++ test extension to check that the Python C API is | ||||
| # compatible with C++ and does not emit C++ compiler warnings. | ||||
| import os | ||||
| import platform | ||||
| import shlex | ||||
| import sys | ||||
| import sysconfig | ||||
| from test import support | ||||
| 
 | ||||
|  | @ -25,28 +25,62 @@ | |||
| 
 | ||||
| def main(): | ||||
|     cppflags = list(CPPFLAGS) | ||||
|     std = os.environ["CPYTHON_TEST_CPP_STD"] | ||||
|     name = os.environ["CPYTHON_TEST_EXT_NAME"] | ||||
|     std = os.environ.get("CPYTHON_TEST_CPP_STD", "") | ||||
|     module_name = os.environ["CPYTHON_TEST_EXT_NAME"] | ||||
| 
 | ||||
|     cppflags = [*CPPFLAGS, f'-std={std}'] | ||||
|     cppflags = list(CPPFLAGS) | ||||
|     cppflags.append(f'-DMODULE_NAME={module_name}') | ||||
| 
 | ||||
|     # gh-105776: When "gcc -std=11" is used as the C++ compiler, -std=c11 | ||||
|     # option emits a C++ compiler warning. Remove "-std11" option from the | ||||
|     # CC command. | ||||
|     cmd = (sysconfig.get_config_var('CC') or '') | ||||
|     if cmd is not None: | ||||
|         cmd = shlex.split(cmd) | ||||
|         cmd = [arg for arg in cmd if not arg.startswith('-std=')] | ||||
|         cmd = shlex.join(cmd) | ||||
|         # CC env var overrides sysconfig CC variable in setuptools | ||||
|         os.environ['CC'] = cmd | ||||
|     # Add -std=STD or /std:STD (MSVC) compiler flag | ||||
|     if std: | ||||
|         if support.MS_WINDOWS: | ||||
|             cppflags.append(f'/std:{std}') | ||||
|             std_prefix = '/std' | ||||
|         else: | ||||
|             cppflags.append(f'-std={std}') | ||||
|             std_prefix = '-std' | ||||
| 
 | ||||
|     cpp_ext = Extension( | ||||
|         name, | ||||
|         # Remove existing -std options to only test ours | ||||
|         cmd = (sysconfig.get_config_var('CC') or '') | ||||
|         if cmd is not None: | ||||
|             cmd = shlex.split(cmd) | ||||
|             cmd = [arg for arg in cmd if not arg.startswith(std_prefix)] | ||||
|             cmd = shlex.join(cmd) | ||||
|             # CC env var overrides sysconfig CC variable in setuptools | ||||
|             os.environ['CC'] = cmd | ||||
| 
 | ||||
|     # On Windows, add PCbuild\amd64\ to include and library directories | ||||
|     include_dirs = [] | ||||
|     library_dirs = [] | ||||
|     if support.MS_WINDOWS: | ||||
|         srcdir = sysconfig.get_config_var('srcdir') | ||||
|         machine = platform.uname().machine | ||||
|         pcbuild = os.path.join(srcdir, 'PCbuild', machine) | ||||
|         if os.path.exists(pcbuild): | ||||
|             # pyconfig.h is generated in PCbuild\amd64\ | ||||
|             include_dirs.append(pcbuild) | ||||
|             # python313.lib is generated in PCbuild\amd64\ | ||||
|             library_dirs.append(pcbuild) | ||||
|             print(f"Add PCbuild directory: {pcbuild}") | ||||
| 
 | ||||
|     # Display information to help debugging | ||||
|     for env_name in ('CC', 'CFLAGS', 'CPPFLAGS'): | ||||
|         if env_name in os.environ: | ||||
|             print(f"{env_name} env var: {os.environ[env_name]!r}") | ||||
|         else: | ||||
|             print(f"{env_name} env var: <missing>") | ||||
|     print(f"extra_compile_args: {cppflags!r}") | ||||
| 
 | ||||
|     ext = Extension( | ||||
|         module_name, | ||||
|         sources=[SOURCE], | ||||
|         language='c++', | ||||
|         extra_compile_args=cppflags) | ||||
|     setup(name='internal' + name, version='0.0', ext_modules=[cpp_ext]) | ||||
|         extra_compile_args=cppflags, | ||||
|         include_dirs=include_dirs, | ||||
|         library_dirs=library_dirs) | ||||
|     setup(name=f'internal_{module_name}', | ||||
|           version='0.0', | ||||
|           ext_modules=[ext]) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner