aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_cppext/setup.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_cppext/setup.py')
-rw-r--r--Lib/test/test_cppext/setup.py76
1 files changed, 55 insertions, 21 deletions
diff --git a/Lib/test/test_cppext/setup.py b/Lib/test/test_cppext/setup.py
index c7ba1efb4dd..77e47bcd0cb 100644
--- a/Lib/test/test_cppext/setup.py
+++ b/Lib/test/test_cppext/setup.py
@@ -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 @@ else:
def main():
cppflags = list(CPPFLAGS)
- std = os.environ["CPYTHON_TEST_CPP_STD"]
- name = os.environ["CPYTHON_TEST_EXT_NAME"]
-
- cppflags = [*CPPFLAGS, f'-std={std}']
-
- # 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
-
- cpp_ext = Extension(
- name,
+ std = os.environ.get("CPYTHON_TEST_CPP_STD", "")
+ module_name = os.environ["CPYTHON_TEST_EXT_NAME"]
+
+ cppflags = list(CPPFLAGS)
+ cppflags.append(f'-DMODULE_NAME={module_name}')
+
+ # 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'
+
+ # 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__":