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..7cd9ca17885b34d --- /dev/null +++ b/Tools/build/check_capi_macros.py @@ -0,0 +1,171 @@ +""" +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*define\s+(.*)') +PYTHON_PREFIX = re.compile(r'(Py|PY|_Py|_PY)') +NAME_REGEX = re.compile(r'([A-Za-z_][A-Za-z0-9_]*)\b') +UNDEF_REGEX = re.compile(r'\s*#\s*undef\s+(.*)') + + +def parse_file(filename, names): + with open(filename, encoding='utf8') as fp: + for line in fp: + # Check for '#define MACRO' + match = DEFINE_REGEX.match(line) + if match: + undef = False + else: + # Check for '#undef MACRO' + match = UNDEF_REGEX.match(line) + if not match: + continue + undef = True + macro = match.group(1) + + 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.group(1) + names.append((name, filename, undef)) + + +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, undef: bool) + 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, undef 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, undef in sorted(names): + if name in ignored: + continue + define = "undefined" if undef else "defined" + print(f"- {name} {define} by {filename}") + 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