forked from python/pythoncapi-compat
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup.py
More file actions
executable file
·109 lines (95 loc) · 3.11 KB
/
setup.py
File metadata and controls
executable file
·109 lines (95 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python3
import os.path
import shlex
import sys
try:
from setuptools import setup, Extension
except ImportError:
from distutils.core import setup, Extension
try:
from distutils import sysconfig
except ImportError:
import sysconfig
# C++ is only supported on Python 3.6 and newer
TEST_CPP = (sys.version_info >= (3, 6))
SRC_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
# Windows uses MSVC compiler
MSVC = (os.name == "nt")
# C compiler flags for GCC and clang
COMMON_FLAGS = [
# Treat warnings as error
'-Werror',
# Enable all warnings
'-Wall', '-Wextra',
# Extra warnings
'-Wconversion',
# /usr/lib64/pypy3.7/include/pyport.h:68:20: error: redefinition of typedef
# 'Py_hash_t' is a C11 feature
"-Wno-typedef-redefinition",
]
CFLAGS = COMMON_FLAGS + [
# Use C99 for pythoncapi_compat.c which initializes PyModuleDef with a
# mixture of designated and non-designated initializers
'-std=c99',
]
CPPFLAGS = list(COMMON_FLAGS)
# FIXME: _Py_CAST() emits C++ compilers on Python 3.12.
# See: https://github.com/python/cpython/issues/94731
if 0:
CPPFLAGS.extend((
'-Wold-style-cast',
'-Wzero-as-null-pointer-constant',
))
def main():
# 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:
cmd = shlex.split(cmd)
cmd = [arg for arg in cmd if not arg.startswith('-std=')]
if (sys.version_info >= (3, 8)):
cmd = shlex.join(cmd)
elif (sys.version_info >= (3, 3)):
cmd = ' '.join(shlex.quote(arg) for arg in cmd)
else:
# Python 2.7
import pipes
cmd = ' '.join(pipes.quote(arg) for arg in cmd)
# CC env var overrides sysconfig CC variable in setuptools
os.environ['CC'] = cmd
cflags = ['-I' + SRC_DIR]
cppflags = list(cflags)
if not MSVC:
cflags.extend(CFLAGS)
cppflags.extend(CPPFLAGS)
# C extension
c_ext = Extension(
'test_pythoncapi_compat_cext',
sources=['test_pythoncapi_compat_cext.c'],
extra_compile_args=cflags)
extensions = [c_ext]
if TEST_CPP:
# C++ extension
# MSVC has /std flag but doesn't support /std:c++11
if not MSVC:
versions = [
('test_pythoncapi_compat_cpp03ext', '-std=c++03'),
('test_pythoncapi_compat_cpp11ext', '-std=c++11'),
]
else:
versions = [('test_pythoncapi_compat_cppext', None)]
for name, flag in versions:
flags = list(cppflags)
if flag is not None:
flags.append(flag)
cpp_ext = Extension(
name,
sources=['test_pythoncapi_compat_cppext.cpp'],
extra_compile_args=flags,
language='c++')
extensions.append(cpp_ext)
setup(name="test_pythoncapi_compat",
ext_modules=extensions)
if __name__ == "__main__":
main()