diff options
author | Victor Stinner <vstinner@python.org> | 2022-06-14 14:05:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-14 14:05:14 (GMT) |
commit | ef591cf8e3725e74489f4c19ca85b87cf6886852 (patch) | |
tree | 7e476e00cb4b866dc2e4ec0ccf69c779a506abbe /Lib/test/setup_testcppext.py | |
parent | 871b1dc469b3daccb7c3e7fcaddd245137edd719 (diff) | |
download | cpython-ef591cf8e3725e74489f4c19ca85b87cf6886852.zip cpython-ef591cf8e3725e74489f4c19ca85b87cf6886852.tar.gz cpython-ef591cf8e3725e74489f4c19ca85b87cf6886852.tar.bz2 |
gh-91321: Fix compatibility with C++ older than C++11 (#93784) (#93802)
* Fix the compatibility of the Python C API with C++ older than C++11.
* _Py_NULL is only defined as nullptr on C++11 and newer.
(cherry picked from commit 4caf5c2753f1aa28d6f4bc1aa377975fd2a62331)
* test_cppext now builds the C++ extension with setuptools.
* Add @test.support.requires_venv_with_pip.
(cherry picked from commit ca0cc9c433830e14714a5cc93fb4e7254da3dd76)
Diffstat (limited to 'Lib/test/setup_testcppext.py')
-rw-r--r-- | Lib/test/setup_testcppext.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Lib/test/setup_testcppext.py b/Lib/test/setup_testcppext.py new file mode 100644 index 0000000..a288dbd --- /dev/null +++ b/Lib/test/setup_testcppext.py @@ -0,0 +1,51 @@ +# 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 sys +from test import support + +from setuptools import setup, Extension + + +MS_WINDOWS = (sys.platform == 'win32') + + +SOURCE = support.findfile('_testcppext.cpp') +if not MS_WINDOWS: + # C++ compiler flags for GCC and clang + CPPFLAGS = [ + # gh-91321: The purpose of _testcppext extension is to check that building + # a C++ extension using the Python C API does not emit C++ compiler + # warnings + '-Werror', + # Warn on old-style cast (C cast) like: (PyObject*)op + '-Wold-style-cast', + # Warn when using NULL rather than _Py_NULL in static inline functions + '-Wzero-as-null-pointer-constant', + ] +else: + # Don't pass any compiler flag to MSVC + CPPFLAGS = [] + + +def main(): + cppflags = list(CPPFLAGS) + if '-std=c++03' in sys.argv: + sys.argv.remove('-std=c++03') + std = 'c++03' + name = '_testcpp03ext' + else: + # Python currently targets C++11 + std = 'c++11' + name = '_testcpp11ext' + + cppflags = [*CPPFLAGS, f'-std={std}'] + cpp_ext = Extension( + name, + sources=[SOURCE], + language='c++', + extra_compile_args=cppflags) + setup(name=name, ext_modules=[cpp_ext]) + + +if __name__ == "__main__": + main() |