https://github.com/python/cpython/commit/643013f58f703b39771fa35bbdba0ac762dd840a
commit: 643013f58f703b39771fa35bbdba0ac762dd840a
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-09-21T16:23:12Z
summary:

gh-157695: Check that C API macros start with "Py" (#157696)

Add Tools/build/check_capi_macros.py. Ignore existing macros which
don't start with "Py", only prevent adding new names which don't
respect this convention.

Run check_capi_macros.py in pre-commit.

Co-authored-by: Peter Bierma <[email protected]>
Co-authored-by: Hugo van Kemenade <[email protected]>
Co-authored-by: Petr Viktorin <[email protected]>

files:
A Tools/build/check_capi_macros.py
A Tools/build/check_capi_macros_ignored.txt
M .pre-commit-config.yaml

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 615ba587c6a4005..45528d9f32d6c94 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -143,6 +143,15 @@ repos:
         entry: Space found in path, move to Misc/NEWS.d/next/Core_and_Builtins/
         files: Misc/NEWS.d/next/Core and Builtins/20.*.rst
 
+  - repo: local
+    hooks:
+      - id: check-capi-macros
+        name: Check C API macros start with Py
+        language: python
+        entry: python Tools/build/check_capi_macros.py
+        pass_filenames: false
+        files: 
^(Include/(cpython/)?[^/]+\.h|pyconfig\.h\.in|Tools/build/check_capi_macros)
+
   - repo: meta
     hooks:
       - id: check-hooks-apply
diff --git a/Tools/build/check_capi_macros.py b/Tools/build/check_capi_macros.py
new file mode 100644
index 000000000000000..e62218f2e86a1d2
--- /dev/null
+++ b/Tools/build/check_capi_macros.py
@@ -0,0 +1,170 @@
+"""
+Check that all macros defined by the Python C API have a name starting with
+"Py". Ignore names listed by check_capi_macros_ignored.txt: macros with an
+invalid name, added before this script was created.
+
+Python C API:
+
+* Include/*.h
+* Include/cpython/*.h
+* pyconfig.h.in
+"""
+
+import difflib
+import glob
+import os.path
+import re
+import sys
+
+EXCLUDE_HEADERS = {
+    # Header files not included by Python.h and ignored by this script
+    'dynamic_annotations.h',
+    'errcode.h',
+    'opcode.h',
+    'opcode_ids.h',
+    'osdefs.h',
+    'pyexpat.h',
+    'structmember.h',
+
+    # Header files not included by Python.h but parsed by this script:
+    # - datetime.h
+    # - frameobject.h
+    # - marshal.h
+    # - py_curses.h
+    # - pydtrace.h
+}
+
+TOOLS_BUILD_DIR = os.path.abspath(os.path.dirname(__file__))
+SRC_DIR = os.path.dirname(os.path.dirname(TOOLS_BUILD_DIR))
+IGNORED_FILENAME = os.path.join(TOOLS_BUILD_DIR, 
'check_capi_macros_ignored.txt')
+
+DEFINE_REGEX = 
re.compile(r'\s*#\s*(?P<directive>define|undef)\s+(?P<macro>.*)')
+PYTHON_PREFIX = re.compile(r'(Py|PY|_Py|_PY)')
+NAME_REGEX = re.compile(r'([A-Za-z_][A-Za-z0-9_]*)\b')
+
+CAUSES_BY_DIRECTIVE = {
+    "define": "defined",
+    "undef": "undefined",
+}
+
+
+def parse_file(filename, names):
+    with open(filename, encoding='utf8') as fp:
+        for lineno, line in enumerate(fp, start=1):
+            # Check for '#define MACRO'
+            match = DEFINE_REGEX.match(line)
+            if not match:
+                continue
+            macro = match['macro']
+            directive = match['directive']
+            cause = CAUSES_BY_DIRECTIVE.get(directive, directive)
+
+            if PYTHON_PREFIX.match(macro):
+                continue
+
+            match = NAME_REGEX.match(macro)
+            if not match:
+                print(f"ERROR: {filename}: Unable to parse {line!r}")
+                sys.exit(1)
+            name = match[1]
+            names.append((name, filename, lineno, cause))
+
+
+def get_ignored_names():
+    ignored = []
+    with open(IGNORED_FILENAME, encoding='utf8') as fp:
+        for line in fp:
+            name = line.strip()
+            if name.startswith('#'):
+                # Ignore comment
+                continue
+            if name:
+                ignored.append(name)
+    return ignored
+
+
+def main():
+    failure = False
+
+    # Parse header files
+    include_dir = os.path.join(SRC_DIR, 'Include')
+    files = glob.glob(os.path.join(include_dir, '*.h'))
+    files = [filename for filename in files
+             if os.path.basename(filename) not in EXCLUDE_HEADERS]
+    files.extend(glob.glob(os.path.join(include_dir, 'cpython', '*.h')))
+    files.append(os.path.join(SRC_DIR, 'pyconfig.h.in'))
+    names = []  # list of (name: str, filename: str, lineno: int, cause: str)
+    for filename in files:
+        parse_file(filename, names)
+
+    # Parse ignore list
+    ignored = get_ignored_names()
+
+    # Check if the sorted list has duplicated entries
+    if len(set(ignored)) != len(ignored):
+        print(f"ERROR: {IGNORED_FILENAME} list contains duplicated entries:")
+        print()
+        seen = set()
+        for name in ignored:
+            if name not in seen:
+                seen.add(name)
+                continue
+            print(f"- {name}")
+        print()
+        failure = True
+
+    # Check if the sorted list is sorted
+    ignored_sorted = sorted(ignored)
+    if ignored_sorted != ignored:
+        print(f"ERROR: {IGNORED_FILENAME} list is not sorted")
+        print()
+        diff = difflib.unified_diff(ignored, ignored_sorted,
+                                    fromfile=IGNORED_FILENAME,
+                                    tofile=IGNORED_FILENAME,
+                                    lineterm='')
+        for line in diff:
+            print(line)
+        print()
+        failure = True
+
+    # Check for outdated ignore list
+    names_set = {name for name, filename, lineno, cause in names}
+    ignored = set(ignored)
+    outdated = ignored - names_set
+    if outdated:
+        print(f"ERROR: {IGNORED_FILENAME} is outdated, "
+              "the following macros can be removed:")
+        print()
+        for name in sorted(outdated):
+            print(f"- {name}")
+        print()
+        print(f"Total: {len(outdated)} macros")
+        print()
+        failure = True
+
+    # Check for new macros
+    new_macros = names_set - ignored
+    if new_macros:
+        print('ERROR: the Python C API defines the following new macros:')
+        print()
+        count = 0
+        for name, filename, lineno, cause in sorted(names):
+            if name in ignored:
+                continue
+            print(f"- {name} {cause} at {filename}:{lineno}")
+            count += 1
+        print()
+        print(f"Total: {count} macros")
+        failure = True
+
+    if not failure:
+        print("OK: the ignore list is up to date and sorted")
+        print("OK: the Python C API only defines macros with names "
+              f"starting with Py (ignoring {len(ignored)} macros)")
+        sys.exit(0)
+
+    sys.exit(1)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/Tools/build/check_capi_macros_ignored.txt 
b/Tools/build/check_capi_macros_ignored.txt
new file mode 100644
index 000000000000000..406535e54664e82
--- /dev/null
+++ b/Tools/build/check_capi_macros_ignored.txt
@@ -0,0 +1,812 @@
+# Old C API macros with a name which doesn't start with "Py". If a macro
+# is removed from the C API, it should be removed from this list as well.
+#
+# Adding a new macro to this ignore list requires the approval of the C API
+# Working Group. Open an issue at:
+# https://github.com/capi-workgroup/decisions/issues/
+
+AC_APPLE_UNIVERSAL_BUILD
+AIX_BUILDDATE
+AIX_GENUINE_CPLUSPLUS
+ALIGNOF_LONG
+ALIGNOF_MAX_ALIGN_T
+ALIGNOF_SIZE_T
+ALT_SOABI
+ANDROID_API_LEVEL
+CODESET
+CO_ASYNC_GENERATOR
+CO_COROUTINE
+CO_FUTURE_ABSOLUTE_IMPORT
+CO_FUTURE_ANNOTATIONS
+CO_FUTURE_BARRY_AS_BDFL
+CO_FUTURE_DIVISION
+CO_FUTURE_GENERATOR_STOP
+CO_FUTURE_PRINT_FUNCTION
+CO_FUTURE_UNICODE_LITERALS
+CO_FUTURE_WITH_STATEMENT
+CO_GENERATOR
+CO_HAS_DOCSTRING
+CO_ITERABLE_COROUTINE
+CO_MAXBLOCKS
+CO_METHOD
+CO_NESTED
+CO_NEWLOCALS
+CO_NO_MONITORING_EVENTS
+CO_OPTIMIZED
+CO_VARARGS
+CO_VARKEYWORDS
+CURSES_ERROR_FORMAT
+CURSES_ERROR_MUST_CALL_FORMAT
+CURSES_ERROR_VERBOSE_FORMAT
+DOUBLE_IS_BIG_ENDIAN_IEEE754
+DOUBLE_IS_LITTLE_ENDIAN_IEEE754
+ENABLE_IPV6
+EVAL_CALL_API
+EVAL_CALL_BUILD_CLASS
+EVAL_CALL_FUNCTION_EX
+EVAL_CALL_FUNCTION_VECTORCALL
+EVAL_CALL_GENERATOR
+EVAL_CALL_KINDS
+EVAL_CALL_LEGACY
+EVAL_CALL_METHOD
+EVAL_CALL_SLOT
+EVAL_CALL_TOTAL
+EVAL_CALL_VECTOR
+FUTURE_ABSOLUTE_IMPORT
+FUTURE_ANNOTATIONS
+FUTURE_BARRY_AS_BDFL
+FUTURE_DIVISION
+FUTURE_GENERATORS
+FUTURE_GENERATOR_STOP
+FUTURE_NESTED_SCOPES
+FUTURE_PRINT_FUNCTION
+FUTURE_UNICODE_LITERALS
+FUTURE_WITH_STATEMENT
+FVC_ASCII
+FVC_MASK
+FVC_NONE
+FVC_REPR
+FVC_STR
+FVS_HAVE_SPEC
+FVS_MASK
+GETPGRP_HAVE_ARG
+HAVE_ACCEPT
+HAVE_ACCEPT4
+HAVE_ACOSH
+HAVE_ACOSPI
+HAVE_ADDRINFO
+HAVE_ALARM
+HAVE_ALIGNED_REQUIRED
+HAVE_ALLOCA_H
+HAVE_ALTZONE
+HAVE_ASINH
+HAVE_ASINPI
+HAVE_ASM_TYPES_H
+HAVE_ATAN2PI
+HAVE_ATANH
+HAVE_ATANPI
+HAVE_BACKTRACE
+HAVE_BIND
+HAVE_BIND_TEXTDOMAIN_CODESET
+HAVE_BLUETOOTH_BLUETOOTH_H
+HAVE_BLUETOOTH_H
+HAVE_BROKEN_MBSTOWCS
+HAVE_BROKEN_NICE
+HAVE_BROKEN_PIPE_BUF
+HAVE_BROKEN_POLL
+HAVE_BROKEN_POSIX_SEMAPHORES
+HAVE_BROKEN_PTHREAD_SIGMASK
+HAVE_BROKEN_SEM_GETVALUE
+HAVE_BROKEN_UNSETENV
+HAVE_BUILTIN_ATOMIC
+HAVE_BZLIB_H
+HAVE_CHFLAGS
+HAVE_CHMOD
+HAVE_CHOWN
+HAVE_CHROOT
+HAVE_CLEARENV
+HAVE_CLOCK
+HAVE_CLOCK_GETRES
+HAVE_CLOCK_GETTIME
+HAVE_CLOCK_NANOSLEEP
+HAVE_CLOCK_SETTIME
+HAVE_CLOCK_T
+HAVE_CLOSEFROM
+HAVE_CLOSE_RANGE
+HAVE_COMPUTED_GOTOS
+HAVE_CONFSTR
+HAVE_CONIO_H
+HAVE_CONNECT
+HAVE_COPY_FILE_RANGE
+HAVE_COSPI
+HAVE_CTERMID
+HAVE_CTERMID_R
+HAVE_CURSES_DEFINE_KEY
+HAVE_CURSES_ESCDELAY
+HAVE_CURSES_FILTER
+HAVE_CURSES_GETMOUSE
+HAVE_CURSES_H
+HAVE_CURSES_HAS_KEY
+HAVE_CURSES_HAS_MOUSE
+HAVE_CURSES_IMMEDOK
+HAVE_CURSES_IS_KEYPAD
+HAVE_CURSES_IS_LEAVEOK
+HAVE_CURSES_IS_PAD
+HAVE_CURSES_IS_TERM_RESIZED
+HAVE_CURSES_KEYOK
+HAVE_CURSES_KEY_DEFINED
+HAVE_CURSES_NEW_PRESCR
+HAVE_CURSES_NOFILTER
+HAVE_CURSES_RESIZETERM
+HAVE_CURSES_RESIZE_TERM
+HAVE_CURSES_SCR_DUMP
+HAVE_CURSES_SCR_SET
+HAVE_CURSES_SET_ESCDELAY
+HAVE_CURSES_SET_TABSIZE
+HAVE_CURSES_SLK_ATTR_OFF
+HAVE_CURSES_SLK_ATTR_ON
+HAVE_CURSES_SLK_ATTR_SET
+HAVE_CURSES_SLK_COLOR
+HAVE_CURSES_SYNCOK
+HAVE_CURSES_TABSIZE
+HAVE_CURSES_TERM_ATTRS
+HAVE_CURSES_TYPEAHEAD
+HAVE_CURSES_USE_ENV
+HAVE_CURSES_USE_SCREEN
+HAVE_CURSES_USE_WINDOW
+HAVE_CURSES_WATTR_GET
+HAVE_CURSES_WATTR_OFF
+HAVE_CURSES_WATTR_ON
+HAVE_CURSES_WATTR_SET
+HAVE_CURSES_WCHGAT
+HAVE_CURSES_WCOLOR_SET
+HAVE_DB_H
+HAVE_DECLSPEC_DLL
+HAVE_DECL_PR_SET_VMA_ANON_NAME
+HAVE_DECL_RTLD_DEEPBIND
+HAVE_DECL_RTLD_GLOBAL
+HAVE_DECL_RTLD_LAZY
+HAVE_DECL_RTLD_LOCAL
+HAVE_DECL_RTLD_MEMBER
+HAVE_DECL_RTLD_NODELETE
+HAVE_DECL_RTLD_NOLOAD
+HAVE_DECL_RTLD_NOW
+HAVE_DECL_TZNAME
+HAVE_DECL_UT_NAMESIZE
+HAVE_DEVICE_MACROS
+HAVE_DEV_PTC
+HAVE_DEV_PTMX
+HAVE_DIRECT_H
+HAVE_DIRENT_D_TYPE
+HAVE_DIRENT_H
+HAVE_DIRFD
+HAVE_DLADDR
+HAVE_DLADDR1
+HAVE_DLFCN_H
+HAVE_DLOPEN
+HAVE_DL_ITERATE_PHDR
+HAVE_DUP
+HAVE_DUP2
+HAVE_DUP3
+HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH
+HAVE_DYNAMIC_LOADING
+HAVE_EDITLINE_READLINE_H
+HAVE_ENDIAN_H
+HAVE_EPOLL
+HAVE_EPOLL_CREATE1
+HAVE_ERF
+HAVE_ERFC
+HAVE_ERRNO_H
+HAVE_EVENTFD
+HAVE_EXECINFO_H
+HAVE_EXECV
+HAVE_EXPLICIT_BZERO
+HAVE_EXPLICIT_MEMSET
+HAVE_EXPM1
+HAVE_FACCESSAT
+HAVE_FCHDIR
+HAVE_FCHMOD
+HAVE_FCHMODAT
+HAVE_FCHOWN
+HAVE_FCHOWNAT
+HAVE_FCNTL_H
+HAVE_FDATASYNC
+HAVE_FDOPENDIR
+HAVE_FDWALK
+HAVE_FEXECVE
+HAVE_FFI_CLOSURE_ALLOC
+HAVE_FFI_PREP_CIF_VAR
+HAVE_FFI_PREP_CLOSURE_LOC
+HAVE_FLOCK
+HAVE_FORK
+HAVE_FORK1
+HAVE_FORKPTY
+HAVE_FPATHCONF
+HAVE_FSEEK64
+HAVE_FSEEKO
+HAVE_FSTATAT
+HAVE_FSTATVFS
+HAVE_FSYNC
+HAVE_FTELL64
+HAVE_FTELLO
+HAVE_FTIME
+HAVE_FTRUNCATE
+HAVE_FUTIMENS
+HAVE_FUTIMES
+HAVE_FUTIMESAT
+HAVE_GAI_STRERROR
+HAVE_GCC_ASM_FOR_MC68881
+HAVE_GCC_ASM_FOR_X64
+HAVE_GCC_ASM_FOR_X87
+HAVE_GCC_UINT128_T
+HAVE_GDBM_DASH_NDBM_H
+HAVE_GDBM_H
+HAVE_GDBM_NDBM_H
+HAVE_GETADDRINFO
+HAVE_GETC_UNLOCKED
+HAVE_GETDENTS64
+HAVE_GETEGID
+HAVE_GETENTROPY
+HAVE_GETEUID
+HAVE_GETGID
+HAVE_GETGRENT
+HAVE_GETGRGID
+HAVE_GETGRGID_R
+HAVE_GETGRNAM_R
+HAVE_GETGROUPLIST
+HAVE_GETGROUPS
+HAVE_GETHOSTBYADDR
+HAVE_GETHOSTBYNAME
+HAVE_GETHOSTBYNAME_R
+HAVE_GETHOSTBYNAME_R_3_ARG
+HAVE_GETHOSTBYNAME_R_5_ARG
+HAVE_GETHOSTBYNAME_R_6_ARG
+HAVE_GETHOSTNAME
+HAVE_GETITIMER
+HAVE_GETLOADAVG
+HAVE_GETLOGIN
+HAVE_GETLOGIN_R
+HAVE_GETNAMEINFO
+HAVE_GETPAGESIZE
+HAVE_GETPEERNAME
+HAVE_GETPGID
+HAVE_GETPGRP
+HAVE_GETPID
+HAVE_GETPPID
+HAVE_GETPRIORITY
+HAVE_GETPROTOBYNAME
+HAVE_GETPWENT
+HAVE_GETPWNAM_R
+HAVE_GETPWUID
+HAVE_GETPWUID_R
+HAVE_GETRANDOM
+HAVE_GETRANDOM_SYSCALL
+HAVE_GETRESGID
+HAVE_GETRESUID
+HAVE_GETRUSAGE
+HAVE_GETSERVBYNAME
+HAVE_GETSERVBYPORT
+HAVE_GETSID
+HAVE_GETSOCKNAME
+HAVE_GETSPENT
+HAVE_GETSPNAM
+HAVE_GETTID
+HAVE_GETUID
+HAVE_GETWD
+HAVE_GLIBC_MEMMOVE_BUG
+HAVE_GRANTPT
+HAVE_GRP_H
+HAVE_HSTRERROR
+HAVE_HTOLE64
+HAVE_ICONV
+HAVE_ICONV_H
+HAVE_IF_INDEXTONAME
+HAVE_IF_NAMEINDEX
+HAVE_IF_NAMETOINDEX
+HAVE_INET_ATON
+HAVE_INET_NTOA
+HAVE_INET_PTON
+HAVE_INITGROUPS
+HAVE_INTTYPES_H
+HAVE_IO_H
+HAVE_IPA_PURE_CONST_BUG
+HAVE_KILL
+HAVE_KILLPG
+HAVE_KQUEUE
+HAVE_LANGINFO_H
+HAVE_LARGEFILE_SUPPORT
+HAVE_LCHFLAGS
+HAVE_LCHMOD
+HAVE_LCHOWN
+HAVE_LIBDB
+HAVE_LIBDL
+HAVE_LIBDLD
+HAVE_LIBIEEE
+HAVE_LIBINTL_H
+HAVE_LIBSENDFILE
+HAVE_LIBSQLITE3
+HAVE_LIBUTIL_H
+HAVE_LINK
+HAVE_LINKAT
+HAVE_LINK_H
+HAVE_LINUX_AUXVEC_H
+HAVE_LINUX_CAN_BCM_H
+HAVE_LINUX_CAN_H
+HAVE_LINUX_CAN_ISOTP_H
+HAVE_LINUX_CAN_J1939_H
+HAVE_LINUX_CAN_RAW_FD_FRAMES
+HAVE_LINUX_CAN_RAW_H
+HAVE_LINUX_CAN_RAW_JOIN_FILTERS
+HAVE_LINUX_FS_H
+HAVE_LINUX_LIMITS_H
+HAVE_LINUX_MEMFD_H
+HAVE_LINUX_NETFILTER_IPV4_H
+HAVE_LINUX_NETLINK_H
+HAVE_LINUX_QRTR_H
+HAVE_LINUX_RANDOM_H
+HAVE_LINUX_SCHED_H
+HAVE_LINUX_SOUNDCARD_H
+HAVE_LINUX_TIPC_H
+HAVE_LINUX_VM_SOCKETS_H
+HAVE_LINUX_WAIT_H
+HAVE_LISTEN
+HAVE_LOCKF
+HAVE_LOG1P
+HAVE_LOG2
+HAVE_LOGIN_TTY
+HAVE_LONG_DOUBLE
+HAVE_LONG_LONG
+HAVE_LSTAT
+HAVE_LUTIMES
+HAVE_LZMA_H
+HAVE_MADVISE
+HAVE_MAKEDEV
+HAVE_MAXLOGNAME
+HAVE_MBRTOWC
+HAVE_MEMFD_CREATE
+HAVE_MEMRCHR
+HAVE_MINIX_CONFIG_H
+HAVE_MKDIRAT
+HAVE_MKFIFO
+HAVE_MKFIFOAT
+HAVE_MKNOD
+HAVE_MKNODAT
+HAVE_MKTIME
+HAVE_MMAP
+HAVE_MREMAP
+HAVE_NANOSLEEP
+HAVE_NCURSES
+HAVE_NCURSESW
+HAVE_NCURSESW_CURSES_H
+HAVE_NCURSESW_NCURSES_H
+HAVE_NCURSESW_PANEL_H
+HAVE_NCURSES_CURSES_H
+HAVE_NCURSES_H
+HAVE_NCURSES_NCURSES_H
+HAVE_NCURSES_PANEL_H
+HAVE_NDBM_H
+HAVE_NDIR_H
+HAVE_NETCAN_CAN_H
+HAVE_NETDB_H
+HAVE_NETINET_IN_H
+HAVE_NETLINK_NETLINK_H
+HAVE_NETPACKET_PACKET_H
+HAVE_NET_ETHERNET_H
+HAVE_NET_IF_H
+HAVE_NICE
+HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION
+HAVE_OPENAT
+HAVE_OPENDIR
+HAVE_OPENPTY
+HAVE_PANEL
+HAVE_PANELW
+HAVE_PANEL_H
+HAVE_PATHCONF
+HAVE_PAUSE
+HAVE_PIDFD_GETFD
+HAVE_PIDFD_OPEN
+HAVE_PIDFD_SEND_SIGNAL
+HAVE_PIPE
+HAVE_PIPE2
+HAVE_PLOCK
+HAVE_POLL
+HAVE_POLL_H
+HAVE_POSIX_FADVISE
+HAVE_POSIX_FALLOCATE
+HAVE_POSIX_OPENPT
+HAVE_POSIX_SPAWN
+HAVE_POSIX_SPAWNP
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSEFROM_NP
+HAVE_PPOLL
+HAVE_PREAD
+HAVE_PREADV
+HAVE_PREADV2
+HAVE_PRLIMIT
+HAVE_PROCESS_H
+HAVE_PROCESS_VM_READV
+HAVE_PROTOTYPES
+HAVE_PTHREAD_CONDATTR_SETCLOCK
+HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP
+HAVE_PTHREAD_DESTRUCTOR
+HAVE_PTHREAD_GETATTR_NP
+HAVE_PTHREAD_GETCPUCLOCKID
+HAVE_PTHREAD_GETNAME_NP
+HAVE_PTHREAD_GET_NAME_NP
+HAVE_PTHREAD_H
+HAVE_PTHREAD_INIT
+HAVE_PTHREAD_KILL
+HAVE_PTHREAD_SETNAME_NP
+HAVE_PTHREAD_SET_NAME_NP
+HAVE_PTHREAD_SIGMASK
+HAVE_PTHREAD_STUBS
+HAVE_PTSNAME
+HAVE_PTSNAME_R
+HAVE_PTY_H
+HAVE_PWRITE
+HAVE_PWRITEV
+HAVE_PWRITEV2
+HAVE_READLINE_READLINE_H
+HAVE_READLINK
+HAVE_READLINKAT
+HAVE_READV
+HAVE_REALPATH
+HAVE_RECVFROM
+HAVE_RENAMEAT
+HAVE_RL_APPEND_HISTORY
+HAVE_RL_CATCH_SIGNAL
+HAVE_RL_CHANGE_ENVIRONMENT
+HAVE_RL_COMPDISP_FUNC_T
+HAVE_RL_COMPLETION_APPEND_CHARACTER
+HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK
+HAVE_RL_COMPLETION_MATCHES
+HAVE_RL_COMPLETION_SUPPRESS_APPEND
+HAVE_RL_PRE_INPUT_HOOK
+HAVE_RL_RESIZE_TERMINAL
+HAVE_RTPSPAWN
+HAVE_SCHED_GET_PRIORITY_MAX
+HAVE_SCHED_H
+HAVE_SCHED_RR_GET_INTERVAL
+HAVE_SCHED_SETAFFINITY
+HAVE_SCHED_SETPARAM
+HAVE_SCHED_SETSCHEDULER
+HAVE_SEM_CLOCKWAIT
+HAVE_SEM_GETVALUE
+HAVE_SEM_OPEN
+HAVE_SEM_TIMEDWAIT
+HAVE_SEM_UNLINK
+HAVE_SENDFILE
+HAVE_SENDTO
+HAVE_SETEGID
+HAVE_SETEUID
+HAVE_SETGID
+HAVE_SETGROUPS
+HAVE_SETHOSTNAME
+HAVE_SETITIMER
+HAVE_SETJMP_H
+HAVE_SETLOCALE
+HAVE_SETNS
+HAVE_SETPGID
+HAVE_SETPGRP
+HAVE_SETPRIORITY
+HAVE_SETREGID
+HAVE_SETRESGID
+HAVE_SETRESUID
+HAVE_SETREUID
+HAVE_SETSID
+HAVE_SETSOCKOPT
+HAVE_SETUID
+HAVE_SETVBUF
+HAVE_SHADOW_H
+HAVE_SHM_OPEN
+HAVE_SHM_UNLINK
+HAVE_SHUTDOWN
+HAVE_SIGACTION
+HAVE_SIGALTSTACK
+HAVE_SIGFILLSET
+HAVE_SIGINFO_T_SI_BAND
+HAVE_SIGINTERRUPT
+HAVE_SIGNAL_H
+HAVE_SIGPENDING
+HAVE_SIGRELSE
+HAVE_SIGTIMEDWAIT
+HAVE_SIGWAIT
+HAVE_SIGWAITINFO
+HAVE_SINPI
+HAVE_SNPRINTF
+HAVE_SOCKADDR_ALG
+HAVE_SOCKADDR_SA_LEN
+HAVE_SOCKADDR_STORAGE
+HAVE_SOCKET
+HAVE_SOCKETPAIR
+HAVE_SOCKLEN_T
+HAVE_SPAWN_H
+HAVE_SPLICE
+HAVE_SSIZE_T
+HAVE_STATVFS
+HAVE_STATX
+HAVE_STAT_TV_NSEC
+HAVE_STAT_TV_NSEC2
+HAVE_STDINT_H
+HAVE_STDIO_H
+HAVE_STDLIB_H
+HAVE_STD_ATOMIC
+HAVE_STRFTIME
+HAVE_STRINGS_H
+HAVE_STRING_H
+HAVE_STRLCPY
+HAVE_STROPTS_H
+HAVE_STRSIGNAL
+HAVE_STRUCT_PASSWD_PW_GECOS
+HAVE_STRUCT_PASSWD_PW_PASSWD
+HAVE_STRUCT_STATX_STX_ATOMIC_WRITE_UNIT_MAX_OPT
+HAVE_STRUCT_STATX_STX_ATOMIC_WRITE_UNIT_MIN
+HAVE_STRUCT_STATX_STX_DIO_MEM_ALIGN
+HAVE_STRUCT_STATX_STX_DIO_READ_OFFSET_ALIGN
+HAVE_STRUCT_STATX_STX_MNT_ID
+HAVE_STRUCT_STATX_STX_SUBVOL
+HAVE_STRUCT_STAT_ST_BIRTHTIME
+HAVE_STRUCT_STAT_ST_BLKSIZE
+HAVE_STRUCT_STAT_ST_BLOCKS
+HAVE_STRUCT_STAT_ST_FLAGS
+HAVE_STRUCT_STAT_ST_GEN
+HAVE_STRUCT_STAT_ST_RDEV
+HAVE_STRUCT_TM_TM_ZONE
+HAVE_SYMLINK
+HAVE_SYMLINKAT
+HAVE_SYNC
+HAVE_SYSCONF
+HAVE_SYSCTLBYNAME
+HAVE_SYSEXITS_H
+HAVE_SYSLOG_H
+HAVE_SYSTEM
+HAVE_SYS_AUDIOIO_H
+HAVE_SYS_AUXV_H
+HAVE_SYS_BSDTTY_H
+HAVE_SYS_DEVPOLL_H
+HAVE_SYS_DIR_H
+HAVE_SYS_ENDIAN_H
+HAVE_SYS_EPOLL_H
+HAVE_SYS_EVENTFD_H
+HAVE_SYS_EVENT_H
+HAVE_SYS_FILE_H
+HAVE_SYS_IOCTL_H
+HAVE_SYS_KERN_CONTROL_H
+HAVE_SYS_LOADAVG_H
+HAVE_SYS_LOCK_H
+HAVE_SYS_MEMFD_H
+HAVE_SYS_MKDEV_H
+HAVE_SYS_MMAN_H
+HAVE_SYS_MODEM_H
+HAVE_SYS_NDIR_H
+HAVE_SYS_PARAM_H
+HAVE_SYS_PIDFD_H
+HAVE_SYS_POLL_H
+HAVE_SYS_RANDOM_H
+HAVE_SYS_RESOURCE_H
+HAVE_SYS_SELECT_H
+HAVE_SYS_SENDFILE_H
+HAVE_SYS_SOCKET_H
+HAVE_SYS_SOUNDCARD_H
+HAVE_SYS_STATVFS_H
+HAVE_SYS_STAT_H
+HAVE_SYS_SYSCALL_H
+HAVE_SYS_SYSCTL_H
+HAVE_SYS_SYSMACROS_H
+HAVE_SYS_SYS_DOMAIN_H
+HAVE_SYS_TERMIO_H
+HAVE_SYS_TIMERFD_H
+HAVE_SYS_TIMES_H
+HAVE_SYS_TIME_H
+HAVE_SYS_TYPES_H
+HAVE_SYS_UIO_H
+HAVE_SYS_UN_H
+HAVE_SYS_UTSNAME_H
+HAVE_SYS_WAIT_H
+HAVE_SYS_XATTR_H
+HAVE_TANPI
+HAVE_TCGETPGRP
+HAVE_TCSETPGRP
+HAVE_TEMPNAM
+HAVE_TERMIOS_H
+HAVE_TERM_H
+HAVE_THREAD_LOCAL
+HAVE_TIMEGM
+HAVE_TIMERFD_CREATE
+HAVE_TIMES
+HAVE_TMPFILE
+HAVE_TMPNAM
+HAVE_TMPNAM_R
+HAVE_TM_ZONE
+HAVE_TRUNCATE
+HAVE_TTYNAME_R
+HAVE_TZNAME
+HAVE_UMASK
+HAVE_UNAME
+HAVE_UNISTD_H
+HAVE_UNLINKAT
+HAVE_UNLOCKPT
+HAVE_UNSHARE
+HAVE_USABLE_WCHAR_T
+HAVE_UTIL_H
+HAVE_UTIMENSAT
+HAVE_UTIMES
+HAVE_UTIME_H
+HAVE_UTMP_H
+HAVE_UT_NAMESIZE
+HAVE_UUID_CREATE
+HAVE_UUID_ENC_BE
+HAVE_UUID_GENERATE_TIME_SAFE
+HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC
+HAVE_UUID_H
+HAVE_UUID_UUID_H
+HAVE_VFORK
+HAVE_WAIT
+HAVE_WAIT3
+HAVE_WAIT4
+HAVE_WAITID
+HAVE_WAITPID
+HAVE_WCHAR_H
+HAVE_WCSCOLL
+HAVE_WCSFTIME
+HAVE_WCSXFRM
+HAVE_WMEMCMP
+HAVE_WORKING_TZSET
+HAVE_WRITEV
+HAVE_ZDICT_H
+HAVE_ZLIB_COPY
+HAVE_ZLIB_H
+HAVE_ZSTD_H
+HAVE__GETPTY
+HAVE___UINT128_T
+INT_MAX
+LONG_BIT
+LONG_MAX
+LONG_MIN
+MAJOR_IN_MKDEV
+MAJOR_IN_SYSMACROS
+MAX_CO_EXTRA_USERS
+METH_CLASS
+METH_COEXIST
+METH_FASTCALL
+METH_KEYWORDS
+METH_METHOD
+METH_NOARGS
+METH_O
+METH_STACKLESS
+METH_STATIC
+METH_VARARGS
+MVWDELCH_IS_EXPRESSION
+NATIVE_TSS_KEY_T
+NCURSES_OPAQUE
+NOWAIT_LOCK
+PACKAGE_BUGREPORT
+PACKAGE_NAME
+PACKAGE_STRING
+PACKAGE_TARNAME
+PACKAGE_URL
+PACKAGE_VERSION
+PDC_NCMOUSE
+POSIX_SEMAPHORES_NOT_ENABLED
+PTHREAD_KEYS_MAX
+PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
+PTHREAD_SYSTEM_SCHED_SUPPORTED
+RETSIGTYPE
+SETPGRP_HAVE_ARG
+SIGNED_RIGHT_SHIFT_ZERO_FILLS
+SIZEOF_DOUBLE
+SIZEOF_FLOAT
+SIZEOF_FPOS_T
+SIZEOF_INT
+SIZEOF_LONG
+SIZEOF_LONG_DOUBLE
+SIZEOF_LONG_LONG
+SIZEOF_OFF_T
+SIZEOF_PID_T
+SIZEOF_PTHREAD_KEY_T
+SIZEOF_PTHREAD_T
+SIZEOF_PY_HASH_T
+SIZEOF_PY_UHASH_T
+SIZEOF_SHORT
+SIZEOF_SIZE_T
+SIZEOF_TIME_T
+SIZEOF_UINTPTR_T
+SIZEOF_VOID_P
+SIZEOF_WCHAR_T
+SIZEOF__BOOL
+SOABI_PLATFORM
+SPECIALIZATION_FAILURE_KINDS
+SSTATE_INTERNED_IMMORTAL
+SSTATE_INTERNED_IMMORTAL_STATIC
+SSTATE_INTERNED_MORTAL
+SSTATE_NOT_INTERNED
+STDC_HEADERS
+STRICT_SYSV_CURSES
+SYS_SELECT_WITH_SYS_TIME
+S_IFLNK
+S_IFMT
+S_ISCHR
+S_ISDIR
+S_ISLNK
+S_ISREG
+THREAD_STACK_SIZE
+TIMEMODULE_LIB
+TM_IN_SYS_TIME
+USE_COMPUTED_GOTOS
+USE_STACKCHECK
+VA_LIST_IS_ARRAY
+WAIT_LOCK
+WINDOW_HAS_FLAGS
+WITH_DECIMAL_CONTEXTVAR
+WITH_DOC_STRINGS
+WITH_DTRACE
+WITH_DYLD
+WITH_EDITLINE
+WITH_LIBINTL
+WITH_MIMALLOC
+WITH_NEXT_FRAMEWORK
+WITH_PYMALLOC
+WITH_THREAD
+WITH_VALGRIND
+WORDS_BIGENDIAN
+X87_DOUBLE_ROUNDING
+_ALL_SOURCE
+_Atomic
+_BOOL
+_BSD_SOURCE
+_DARWIN_C_SOURCE
+_FILE_OFFSET_BITS
+_GNU_SOURCE
+_HPUX_ALT_XOPEN_SOCKET_API
+_INCLUDE__STDC_A1_SOURCE
+_ISOC23_SOURCE
+_LARGEFILE_SOURCE
+_LARGE_FILES
+_MINIX
+_NETBSD_SOURCE
+_OPENBSD_SOURCE
+_POSIX_1_SOURCE
+_POSIX_C_SOURCE
+_POSIX_PTHREAD_SEMANTICS
+_POSIX_SOURCE
+_POSIX_THREADS
+_REENTRANT
+_SGI_MP_SOURCE
+_TANDEM_SOURCE
+_WASI_EMULATED_GETPID
+_WASI_EMULATED_PROCESS_CLOCKS
+_WASI_EMULATED_SIGNAL
+_WCHAR_T
+_XOPEN_SOURCE
+_XOPEN_SOURCE_EXTENDED
+__BSD_VISIBLE
+__EXTENSIONS__
+__NEED_pthread_attr_t
+__NEED_pthread_cond_t
+__NEED_pthread_condattr_t
+__NEED_pthread_key_t
+__NEED_pthread_mutex_t
+__NEED_pthread_mutexattr_t
+__NEED_pthread_t
+__STDC_WANT_IEC_60559_ATTRIBS_EXT__
+__STDC_WANT_IEC_60559_BFP_EXT__
+__STDC_WANT_IEC_60559_DFP_EXT__
+__STDC_WANT_IEC_60559_EXT__
+__STDC_WANT_IEC_60559_FUNCS_EXT__
+__STDC_WANT_IEC_60559_TYPES_EXT__
+__STDC_WANT_LIB_EXT2__
+__STDC_WANT_MATH_SPEC_FUNCS__
+__bool__
+__wchar_t
+__wint_t
+clock_t
+const
+gid_t
+import_curses
+mode_t
+off_t
+pid_t
+signed
+size_t
+socklen_t
+static_assert
+uid_t

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to