The config_*.h
and config_*.bzl
files were generated by running ./configure
on the relevant platform and invoking the following script:
"""A script for parsing data from `configure` outputs of `sed`.""" import json import platform import re import shutil from pathlib import Path # Note that some values may be missing for platforms not currently tested. KNOWN_VALUES = { "GNULIB__EXIT", "GNULIB_ACCESS", "GNULIB_ALIGNED_ALLOC", "GNULIB_ATOLL", "GNULIB_BTOWC", "GNULIB_CALLOC_GNU", "GNULIB_CALLOC_POSIX", "GNULIB_CANONICALIZE_FILE_NAME", "GNULIB_CHDIR", "GNULIB_CHMOD", "GNULIB_CHOWN", "GNULIB_CLOSE", "GNULIB_COPY_FILE_RANGE", "GNULIB_CREAT", "GNULIB_CTIME", "GNULIB_DPRINTF", "GNULIB_DUP", "GNULIB_DUP2", "GNULIB_DUP3", "GNULIB_DUPLOCALE", "GNULIB_ENVIRON", "GNULIB_EUIDACCESS", "GNULIB_EXECL", "GNULIB_EXECLE", "GNULIB_EXECLP", "GNULIB_EXECV", "GNULIB_EXECVE", "GNULIB_EXECVP", "GNULIB_EXECVPE", "GNULIB_EXPLICIT_BZERO", "GNULIB_FACCESSAT", "GNULIB_FCHDIR", "GNULIB_FCHMODAT", "GNULIB_FCHOWNAT", "GNULIB_FCLOSE", "GNULIB_FCNTL", "GNULIB_FDATASYNC", "GNULIB_FDOPEN", "GNULIB_FFLUSH", "GNULIB_FFSL", "GNULIB_FFSLL", "GNULIB_FGETC", "GNULIB_FGETS", "GNULIB_FOPEN", "GNULIB_FPRINTF_POSIX", "GNULIB_FPRINTF", "GNULIB_FPURGE", "GNULIB_FPUTC", "GNULIB_FPUTS", "GNULIB_FREAD", "GNULIB_FREE_POSIX", "GNULIB_FREOPEN", "GNULIB_FSCANF", "GNULIB_FSEEK", "GNULIB_FSEEKO", "GNULIB_FSTAT", "GNULIB_FSTATAT", "GNULIB_FSYNC", "GNULIB_FTELL", "GNULIB_FTELLO", "GNULIB_FTRUNCATE", "GNULIB_FUTIMENS", "GNULIB_FWRITE", "GNULIB_GETC", "GNULIB_GETCHAR", "GNULIB_GETCWD", "GNULIB_GETDELIM", "GNULIB_GETDOMAINNAME", "GNULIB_GETDTABLESIZE", "GNULIB_GETENTROPY", "GNULIB_GETGROUPS", "GNULIB_GETHOSTNAME", "GNULIB_GETLINE", "GNULIB_GETLOADAVG", "GNULIB_GETLOGIN_R", "GNULIB_GETLOGIN", "GNULIB_GETOPT_POSIX", "GNULIB_GETPAGESIZE", "GNULIB_GETPASS", "GNULIB_GETRANDOM", "GNULIB_GETSUBOPT", "GNULIB_GETUMASK", "GNULIB_GETUSERSHELL", "GNULIB_GRANTPT", "GNULIB_GROUP_MEMBER", "GNULIB_ISATTY", "GNULIB_ISBLANK", "GNULIB_ISWBLANK", "GNULIB_ISWCTYPE", "GNULIB_ISWDIGIT", "GNULIB_ISWXDIGIT", "GNULIB_LCHMOD", "GNULIB_LCHOWN", "GNULIB_LINK", "GNULIB_LINKAT", "GNULIB_LOCALECONV", "GNULIB_LOCALENAME", "GNULIB_LOCALTIME", "GNULIB_LSEEK", "GNULIB_LSTAT", "GNULIB_MALLOC_GNU", "GNULIB_MALLOC_POSIX", "GNULIB_MBRLEN", "GNULIB_MBRTOWC", "GNULIB_MBSCASECMP", "GNULIB_MBSCASESTR", "GNULIB_MBSCHR", "GNULIB_MBSCSPN", "GNULIB_MBSINIT", "GNULIB_MBSLEN", "GNULIB_MBSNCASECMP", "GNULIB_MBSNLEN", "GNULIB_MBSNRTOWCS", "GNULIB_MBSPBRK", "GNULIB_MBSPCASECMP", "GNULIB_MBSRCHR", "GNULIB_MBSRTOWCS", "GNULIB_MBSSEP", "GNULIB_MBSSPN", "GNULIB_MBSSTR", "GNULIB_MBSTOK_R", "GNULIB_MBTOWC", "GNULIB_MDA_ACCESS", "GNULIB_MDA_CHDIR", "GNULIB_MDA_CHMOD", "GNULIB_MDA_CLOSE", "GNULIB_MDA_CREAT", "GNULIB_MDA_DUP", "GNULIB_MDA_ECVT", "GNULIB_MDA_EXECL", "GNULIB_MDA_EXECLE", "GNULIB_MDA_EXECLP", "GNULIB_MDA_EXECV", "GNULIB_MDA_EXECVE", "GNULIB_MDA_EXECVP", "GNULIB_MDA_EXECVPE", "GNULIB_MDA_FCLOSEALL", "GNULIB_MDA_FCVT", "GNULIB_MDA_FDOPEN", "GNULIB_MDA_FILENO", "GNULIB_MDA_GCVT", "GNULIB_MDA_GETCWD", "GNULIB_MDA_GETPID", "GNULIB_MDA_GETW", "GNULIB_MDA_ISATTY", "GNULIB_MDA_LSEEK", "GNULIB_MDA_MEMCCPY", "GNULIB_MDA_MKDIR", "GNULIB_MDA_MKTEMP", "GNULIB_MDA_PUTENV", "GNULIB_MDA_PUTW", "GNULIB_MDA_READ", "GNULIB_MDA_RMDIR", "GNULIB_MDA_STRDUP", "GNULIB_MDA_SWAB", "GNULIB_MDA_TEMPNAM", "GNULIB_MDA_TZSET", "GNULIB_MDA_UMASK", "GNULIB_MDA_UNLINK", "GNULIB_MDA_WCSDUP", "GNULIB_MDA_WRITE", "GNULIB_MEMCHR", "GNULIB_MEMMEM", "GNULIB_MEMPCPY", "GNULIB_MEMRCHR", "GNULIB_MKDIR", "GNULIB_MKDIRAT", "GNULIB_MKDTEMP", "GNULIB_MKFIFO", "GNULIB_MKFIFOAT", "GNULIB_MKNOD", "GNULIB_MKNODAT", "GNULIB_MKOSTEMP", "GNULIB_MKOSTEMPS", "GNULIB_MKSTEMP", "GNULIB_MKSTEMPS", "GNULIB_MKTIME", "GNULIB_NANOSLEEP", "GNULIB_NL_LANGINFO", "GNULIB_NONBLOCKING", "GNULIB_OBSTACK_PRINTF_POSIX", "GNULIB_OBSTACK_PRINTF", "GNULIB_OPEN", "GNULIB_OPENAT", "GNULIB_OVERRIDES_STRUCT_STAT", "GNULIB_PCLOSE", "GNULIB_PERROR", "GNULIB_PIPE", "GNULIB_PIPE2", "GNULIB_POPEN", "GNULIB_POSIX_MEMALIGN", "GNULIB_POSIX_OPENPT", "GNULIB_PREAD", "GNULIB_PRINTF_POSIX", "GNULIB_PRINTF", "GNULIB_PTSNAME_R", "GNULIB_PTSNAME", "GNULIB_PUTC", "GNULIB_PUTCHAR", "GNULIB_PUTENV", "GNULIB_PUTS", "GNULIB_PWRITE", "GNULIB_QSORT_R", "GNULIB_RANDOM_R", "GNULIB_RANDOM", "GNULIB_RAWMEMCHR", "GNULIB_READ", "GNULIB_READLINK", "GNULIB_READLINKAT", "GNULIB_REALLOC_GNU", "GNULIB_REALLOC_POSIX", "GNULIB_REALLOCARRAY", "GNULIB_REALPATH", "GNULIB_REMOVE", "GNULIB_RENAME", "GNULIB_RENAMEAT", "GNULIB_RMDIR", "GNULIB_RPMATCH", "GNULIB_SCANF", "GNULIB_SECURE_GETENV", "GNULIB_SETENV", "GNULIB_SETHOSTNAME", "GNULIB_SETLOCALE_NULL", "GNULIB_SETLOCALE", "GNULIB_SIGABBREV_NP", "GNULIB_SIGDESCR_NP", "GNULIB_SLEEP", "GNULIB_SNPRINTF", "GNULIB_SPRINTF_POSIX", "GNULIB_STAT", "GNULIB_STDIO_H_NONBLOCKING", "GNULIB_STDIO_H_SIGPIPE", "GNULIB_STPCPY", "GNULIB_STPNCPY", "GNULIB_STRCASESTR", "GNULIB_STRCHRNUL", "GNULIB_STRDUP", "GNULIB_STRERROR_R", "GNULIB_STRERROR", "GNULIB_STRERRORNAME_NP", "GNULIB_STRFTIME", "GNULIB_STRNCAT", "GNULIB_STRNDUP", "GNULIB_STRNLEN", "GNULIB_STRPBRK", "GNULIB_STRPTIME", "GNULIB_STRSEP", "GNULIB_STRSIGNAL", "GNULIB_STRSTR", "GNULIB_STRTOD", "GNULIB_STRTOK_R", "GNULIB_STRTOL", "GNULIB_STRTOLD", "GNULIB_STRTOLL", "GNULIB_STRTOUL", "GNULIB_STRTOULL", "GNULIB_STRVERSCMP", "GNULIB_SYMLINK", "GNULIB_SYMLINKAT", "GNULIB_SYSTEM_POSIX", "GNULIB_TIME_R", "GNULIB_TIME_RZ", "GNULIB_TIMEGM", "GNULIB_TIMESPEC_GET", "GNULIB_TIMESPEC_GETRES", "GNULIB_TMPFILE", "GNULIB_TOWCTRANS", "GNULIB_TRUNCATE", "GNULIB_TTYNAME_R", "GNULIB_TZSET", "GNULIB_UNISTD_H_GETOPT", "GNULIB_UNLINK", "GNULIB_UNLINKAT", "GNULIB_UNLOCKPT", "GNULIB_UNSETENV", "GNULIB_USLEEP", "GNULIB_UTIMENSAT", "GNULIB_VASPRINTF", "GNULIB_VDPRINTF", "GNULIB_VFPRINTF_POSIX", "GNULIB_VFPRINTF", "GNULIB_VFSCANF", "GNULIB_VPRINTF_POSIX", "GNULIB_VPRINTF", "GNULIB_VSCANF", "GNULIB_VSNPRINTF", "GNULIB_VSPRINTF_POSIX", "GNULIB_WCPCPY", "GNULIB_WCPNCPY", "GNULIB_WCRTOMB", "GNULIB_WCSCASECMP", "GNULIB_WCSCAT", "GNULIB_WCSCHR", "GNULIB_WCSCMP", "GNULIB_WCSCOLL", "GNULIB_WCSCPY", "GNULIB_WCSCSPN", "GNULIB_WCSDUP", "GNULIB_WCSFTIME", "GNULIB_WCSLEN", "GNULIB_WCSNCASECMP", "GNULIB_WCSNCAT", "GNULIB_WCSNCMP", "GNULIB_WCSNCPY", "GNULIB_WCSNLEN", "GNULIB_WCSNRTOMBS", "GNULIB_WCSPBRK", "GNULIB_WCSRCHR", "GNULIB_WCSRTOMBS", "GNULIB_WCSSPN", "GNULIB_WCSSTR", "GNULIB_WCSTOK", "GNULIB_WCSWIDTH", "GNULIB_WCSXFRM", "GNULIB_WCTOB", "GNULIB_WCTOMB", "GNULIB_WCTRANS", "GNULIB_WCTYPE", "GNULIB_WCWIDTH", "GNULIB_WMEMCHR", "GNULIB_WMEMCMP", "GNULIB_WMEMCPY", "GNULIB_WMEMMOVE", "GNULIB_WMEMPCPY", "GNULIB_WMEMSET", "GNULIB_WRITE", "GNULIBHEADERS_OVERRIDE_WINT_T", "GUARD_PREFIX", "HAVE_ALLOCA_H", "HAVE_BTOWC", "HAVE_C99_STDINT_H", "HAVE_CANONICALIZE_FILE_NAME", "HAVE_DECL_ECVT", "HAVE_DECL_EXECVPE", "HAVE_DECL_FCLOSEALL", "HAVE_DECL_FCVT", "HAVE_DECL_GCVT", "HAVE_DECL_GETDELIM", "HAVE_DECL_MEMRCHR", "HAVE_DECL_UNSETENV", "HAVE_DECL_WCSDUP", "HAVE_DECL_WCTOB", "HAVE_DUPLOCALE", "HAVE_EXECVPE", "HAVE_FCNTL", "HAVE_FEATURES_H", "HAVE_FREELOCALE", "HAVE_GETDTABLESIZE", "HAVE_GETRANDOM", "HAVE_ISWBLANK", "HAVE_ISWCNTRL", "HAVE_LANGINFO_ALTMON", "HAVE_LANGINFO_CODESET", "HAVE_LANGINFO_ERA", "HAVE_LANGINFO_H", "HAVE_LANGINFO_T_FMT_AMPM", "HAVE_LANGINFO_YESEXPR", "HAVE_LSTAT", "HAVE_MBRLEN", "HAVE_MBRTOWC", "HAVE_MBSINIT", "HAVE_MBTOWC", "HAVE_MEMPCPY", "HAVE_MKOSTEMP", "HAVE_NEWLOCALE", "HAVE_NL_LANGINFO", "HAVE_RAWMEMCHR", "HAVE_READLINK", "HAVE_REALLOCARRAY", "HAVE_REALPATH", "HAVE_STDINT_H", "HAVE_STRVERSCMP", "HAVE_SYS_LOADAVG_H", "HAVE_SYS_RANDOM_H", "HAVE_TIMEZONE_T", "HAVE_UNISTD_H", "HAVE_WCHAR_H", "HAVE_WCRTOMB", "HAVE_WCTRANS_T", "HAVE_WCTYPE_H", "HAVE_WCTYPE_T", "HAVE_WINT_T", "HAVE_XLOCALE_H", "INCLUDE_NEXT", "LOCALENAME_ENHANCE_LOCALE_FUNCS", "NEXT_ASSERT_H", "NEXT_CTYPE_H", "NEXT_FCNTL_H", "NEXT_LANGINFO_H", "NEXT_LIMITS_H", "NEXT_LOCALE_H", "NEXT_STDINT_H", "NEXT_STDIO_H", "NEXT_STDLIB_H", "NEXT_STRING_H", "NEXT_SYS_RANDOM_H", "NEXT_SYS_STAT_H", "NEXT_SYS_TYPES_H", "NEXT_TIME_H", "NEXT_UNISTD_H", "NEXT_WCHAR_H", "NEXT_WCTYPE_H", "PRAGMA_COLUMNS", "PRAGMA_SYSTEM_HEADER", "REPLACE_BTOWC", "REPLACE_CALLOC_FOR_CALLOC_GNU", "REPLACE_CALLOC_FOR_CALLOC_POSIX", "REPLACE_CANONICALIZE_FILE_NAME", "REPLACE_CLOSE", "REPLACE_DUP2", "REPLACE_FCNTL", "REPLACE_FPRINTF", "REPLACE_FREE", "REPLACE_FSTAT", "REPLACE_GETDELIM", "REPLACE_GETDTABLESIZE", "REPLACE_GETRANDOM", "REPLACE_GMTIME", "REPLACE_ISWBLANK", "REPLACE_ISWCNTRL", "REPLACE_LOCALECONV", "REPLACE_LOCALTIME", "REPLACE_LSTAT", "REPLACE_MALLOC_FOR_MALLOC_GNU", "REPLACE_MALLOC_FOR_MALLOC_POSIX", "REPLACE_MBRLEN", "REPLACE_MBRTOWC", "REPLACE_MBSINIT", "REPLACE_MBSTATE_T", "REPLACE_MBTOWC", "REPLACE_MEMCHR", "REPLACE_MKDIR", "REPLACE_NL_LANGINFO", "REPLACE_OPEN", "REPLACE_PRINTF", "REPLACE_READLINK", "REPLACE_REALLOC_FOR_REALLOC_GNU", "REPLACE_REALLOC_FOR_REALLOC_POSIX", "REPLACE_REALLOCARRAY", "REPLACE_REALPATH", "REPLACE_RENAME", "REPLACE_RMDIR", "REPLACE_STAT", "REPLACE_STDIO_READ_FUNCS", "REPLACE_STDIO_WRITE_FUNCS", "REPLACE_STRERROR", "REPLACE_STRUCT_LCONV", "REPLACE_TOWLOWER", "REPLACE_VFPRINTF", "REPLACE_VPRINTF", "REPLACE_WCRTOMB", "REPLACE_WCTOB", "REPLACE_WCTOMB", "TIME_H_DEFINES_STRUCT_TIMESPEC", "TIME_H_DEFINES_TIME_UTC", "UNISTD_H_HAVE_SYS_RANDOM_H", "UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS", "UNISTD_H_HAVE_WINSOCK2_H", "WINDOWS_64_BIT_OFF_T", "WINDOWS_64_BIT_ST_SIZE", "WINDOWS_STAT_INODES", } def load_stat_variables(config_status: Path) -> dict[str, str]: results = {} pattern = re.compile(r'S\["([\w_]+)"\]="(.*)"') for line in config_status.read_text(encoding="utf-8").splitlines(): matches = pattern.match(line) if matches: results[matches.group(1)] = matches.group(2) return results _TEMPLATE = """\ \"\"\"Platform specific configuration values\"\"\" CONFIGURATION = {} """ def main() -> None: config_h = Path("config.h") config_status = Path("config.status") variables = load_stat_variables(config_status) # insert known missing variables variables["GUARD_PREFIX"] = "GL" filtered = {} for value in KNOWN_VALUES: if value in variables: filtered[f"@{value}@"] = variables[value] elif f"GL_{value}" in variables: filtered[f"@{value}@"] = variables[f"GL_{value}"] else: print("MISSING:", value) plat_name = "linux" if platform.system() == "Windows": plat_name = "windows" if platform.system() == "Darwin": plat_name = "macos" shutil.copy2(config_h, config_h.parent / config_h.name.replace(".h", f"_{plat_name}.h")) Path(f"config_{plat_name}.bzl").write_text( _TEMPLATE.format(json.dumps(filtered, indent=4, sort_keys=True)), encoding="utf-8", ) print("Done") if __name__ == "__main__": main()