| 
									
										
										
										
											2022-05-02 14:09:22 +02:00
										 |  |  | # 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. | 
					
						
							| 
									
										
										
										
											2022-05-13 00:20:13 +02:00
										 |  |  | import os.path | 
					
						
							| 
									
										
										
										
											2022-05-02 14:09:22 +02:00
										 |  |  | import sys | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2022-05-13 00:20:13 +02:00
										 |  |  | import subprocess | 
					
						
							| 
									
										
										
										
											2022-05-02 14:09:22 +02:00
										 |  |  | from test import support | 
					
						
							|  |  |  | from test.support import os_helper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MS_WINDOWS = (sys.platform == 'win32') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-13 00:20:13 +02:00
										 |  |  | SETUP_TESTCPPEXT = support.findfile('setup_testcppext.py') | 
					
						
							| 
									
										
										
										
											2022-05-02 14:09:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-06 00:08:43 +02:00
										 |  |  | @support.requires_subprocess() | 
					
						
							| 
									
										
										
										
											2022-05-02 14:09:22 +02:00
										 |  |  | class TestCPPExt(unittest.TestCase): | 
					
						
							|  |  |  |     # With MSVC, the linker fails with: cannot open file 'python311.lib' | 
					
						
							|  |  |  |     # https://github.com/python/cpython/pull/32175#issuecomment-1111175897 | 
					
						
							|  |  |  |     @unittest.skipIf(MS_WINDOWS, 'test fails on Windows') | 
					
						
							| 
									
										
										
										
											2022-05-16 13:54:45 +02:00
										 |  |  |     # the test uses venv+pip: skip if it's not available | 
					
						
							|  |  |  |     @support.requires_venv_with_pip() | 
					
						
							| 
									
										
										
										
											2022-05-02 14:09:22 +02:00
										 |  |  |     def test_build(self): | 
					
						
							|  |  |  |         # Build in a temporary directory | 
					
						
							|  |  |  |         with os_helper.temp_cwd(): | 
					
						
							| 
									
										
										
										
											2022-05-13 00:20:13 +02:00
										 |  |  |             self._test_build() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _test_build(self): | 
					
						
							|  |  |  |         venv_dir = 'env' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Create virtual environment to get setuptools | 
					
						
							|  |  |  |         cmd = [sys.executable, '-X', 'dev', '-m', 'venv', venv_dir] | 
					
						
							|  |  |  |         if support.verbose: | 
					
						
							|  |  |  |             print() | 
					
						
							|  |  |  |             print('Run:', ' '.join(cmd)) | 
					
						
							|  |  |  |         subprocess.run(cmd, check=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Get the Python executable of the venv | 
					
						
							|  |  |  |         python_exe = 'python' | 
					
						
							|  |  |  |         if sys.executable.endswith('.exe'): | 
					
						
							|  |  |  |             python_exe += '.exe' | 
					
						
							|  |  |  |         if MS_WINDOWS: | 
					
						
							|  |  |  |             python = os.path.join(venv_dir, 'Scripts', python_exe) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             python = os.path.join(venv_dir, 'bin', python_exe) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Build the C++ extension | 
					
						
							|  |  |  |         cmd = [python, '-X', 'dev', SETUP_TESTCPPEXT, 'build_ext', '--verbose'] | 
					
						
							|  |  |  |         if support.verbose: | 
					
						
							|  |  |  |             print('Run:', ' '.join(cmd)) | 
					
						
							|  |  |  |         proc = subprocess.run(cmd, | 
					
						
							|  |  |  |                               stdout=subprocess.PIPE, | 
					
						
							|  |  |  |                               stderr=subprocess.STDOUT, | 
					
						
							|  |  |  |                               text=True) | 
					
						
							|  |  |  |         if proc.returncode: | 
					
						
							|  |  |  |             print(proc.stdout, end='') | 
					
						
							|  |  |  |             self.fail(f"Build failed with exit code {proc.returncode}") | 
					
						
							| 
									
										
										
										
											2022-05-02 14:09:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main() |