forked from python/cpython
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsetup.py
More file actions
138 lines (117 loc) · 4.02 KB
/
setup.py
File metadata and controls
138 lines (117 loc) · 4.02 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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# 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
from setuptools import setup, Extension
SOURCE = 'extension.c'
if not support.MS_WINDOWS:
# C compiler flags for GCC and clang
BASE_CFLAGS = [
# The purpose of test_cext extension is to check that building a C
# extension using the Python C API does not emit C compiler warnings.
'-Werror',
]
# C compiler flags for GCC and clang
PUBLIC_CFLAGS = [
*BASE_CFLAGS,
# gh-120593: Check the 'const' qualifier
'-Wcast-qual',
# Ask for strict(er) compliance with the standard
'-pedantic-errors',
]
if not support.Py_GIL_DISABLED:
PUBLIC_CFLAGS.append(
# gh-116869: The Python C API must be compatible with building
# with the -Werror=declaration-after-statement compiler flag.
'-Werror=declaration-after-statement',
)
INTERNAL_CFLAGS = [*BASE_CFLAGS]
else:
# MSVC compiler flags
BASE_CFLAGS = [
# Treat all compiler warnings as compiler errors
'/WX',
]
PUBLIC_CFLAGS = [
*BASE_CFLAGS,
# Display warnings level 1 to 4
'/W4',
]
INTERNAL_CFLAGS = [
*BASE_CFLAGS,
# Display warnings level 1 to 3
'/W3',
]
def main():
std = os.environ.get("CPYTHON_TEST_STD", "")
module_name = os.environ["CPYTHON_TEST_EXT_NAME"]
limited = bool(os.environ.get("CPYTHON_TEST_LIMITED", ""))
abi3t = bool(os.environ.get("CPYTHON_TEST_ABI3T", ""))
internal = bool(int(os.environ.get("TEST_INTERNAL_C_API", "0")))
sources = [SOURCE]
if not internal:
cflags = list(PUBLIC_CFLAGS)
else:
cflags = list(INTERNAL_CFLAGS)
cflags.append(f'-DMODULE_NAME={module_name}')
# Add -std=STD or /std:STD (MSVC) compiler flag
if std:
if support.MS_WINDOWS:
cflags.append(f'/std:{std}')
else:
cflags.append(f'-std={std}')
# Remove existing -std or /std options from CC command line.
# Python adds -std=c11 option.
cmd = (sysconfig.get_config_var('CC') or '')
if cmd is not None:
if support.MS_WINDOWS:
std_prefix = '/std'
else:
std_prefix = '-std'
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
# Define opt-in macros
if limited:
cflags.append(f'-DPy_LIMITED_API={sys.hexversion:#x}')
if abi3t:
cflags.append(f'-DPy_TARGET_ABI3T={sys.hexversion:#x}')
if internal:
cflags.append('-DTEST_INTERNAL_C_API=1')
# 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: {cflags!r}")
ext = Extension(
module_name,
sources=sources,
extra_compile_args=cflags,
include_dirs=include_dirs,
library_dirs=library_dirs)
setup(name=f'internal_{module_name}',
version='0.0',
ext_modules=[ext])
if __name__ == "__main__":
main()