Here are some of the cpp macros used, together with some short explanation of their use. Feel free to add more macros and more categories. Most of these are from config.in, so it's probably better to put the explanations in that file. Ideally, everything would be defined and documented in config.in, and this file would not be necessary. ** Distinguishing OSes ** AIX _AIX CYGWIN Compiling the Cygwin port. __CYGWIN__ Ditto GNU_LINUX HPUX MSDOS Compiling the MS-DOS port. __MSDOS__ Ditto. __DJGPP_MINOR__ Minor version number of the DJGPP library; used only in msdos.c and dosfns.c. DOS_NT Compiling for either the MS-DOS or native MS-Windows port. WINDOWSNT Compiling the native MS-Windows (W32) port. __MINGW32__ Compiling the W32 port with the MinGW or MinGW-w64 ports of GCC. MINGW_W64 Compiling the W32 port with the MinGW-w64 port of GCC. DARWIN_OS Compiling on macOS or pure Darwin (and using s/darwin.h). SOLARIS2 USG USG5_4 HAIKU Compiling on Haiku. __ANDROID__ Compiling for the Android operating system. __ANDROID_API__ A numerical "API level" indicating the version of Android being compiled for; see http://apilevels.com. ** Distinguishing GUIs ** HAVE_NTGUI Use the native W32 GUI for windows, frames, menus&scrollbars. HAVE_NS Use the NeXT/OpenStep/Cocoa UI under macOS or GNUstep. NS_IMPL_GNUSTEP Compile support for GNUstep implementation of NS GUI API. NS_IMPL_COCOA Compile support for Cocoa (Apple) implementation of NS GUI API. HAVE_X11 Compile support for the X11 GUI. HAVE_PGTK Compile support for using GTK itself without directly using X Windows APIs. HAVE_HAIKU Compile support for the Haiku window system. HAVE_X_WINDOWS Compile support for X Window system. Equivalent to HAVE_X11. HAVE_ANDROID Compiling the Android GUI interface. Enough of this code is compiled for the build machine cross-compiling the Android port to produce an Emacs binary that can run Lisp code in batch mode, for the purpose of running the byte-compiler. ANDROID_STUBIFY The Android GUI interface is being compiled for the build machine, as above. ** X Windows features ** HAVE_X11R6 Whether or not the system has X11R6. (Always defined.) HAVE_X11R6_XIM Whether or not the system supports XIM features introduced in R6. HAVE_X11XTR6 Whether or not the Xt is from X11R6 or newer. USE_LUCID Use the Lucid toolkit for menus&scrollbars. Requires HAVE_X11. USE_MOTIF Use the Motif toolkit for menus&scrollbars. Requires HAVE_X11. USE_GTK Use the Gtk toolkit for menus&scrollbars. Requires HAVE_X11 or HAVE_PGTK. HAVE_GTK3 Use GTK version 3 or later. Requires HAVE_X11. HAVE_XCB_SHAPE Whether or not XCB supports the Nonrectangular Window Shape extension. HAVE_XCOMPOSITE Whether or not the XCOMPOSITE extension library is present. HAVE_XDBE Whether or not to use the Xdbe extension for double buffering. HAVE_XFIXES Whether or not the Xfixes extension library is present. HAVE_XINERAMA Whether or not the Xinerama extension library is present. HAVE_XINPUT2 Whether or not to use version 2 of the X Input Extension for input. HAVE_XINPUT2_1 Whether or not version 2.1 of the X Input Extension is supported. HAVE_XINPUT2_2 Whether or not version 2.2 of the X Input Extension is supported. HAVE_XINPUT2_3 Whether or not version 2.3 of the X Input Extension is supported. HAVE_XINPUT2_4 Whether or not version 2.4 of the X Input Extension is supported. HAVE_XKB Whether or not the XKB extension library is present. HAVE_XRANDR Whether or not the RandR extension library is present. HAVE_XSHAPE Whether or not the Nonrectangular Window Shape extension library is present. HAVE_XSYNC Whether or not the X Synchronization Extension library is present. USE_XCB Whether or not the XCB library is used to optimize some X requests. ** Frame types ** FRAME_TERMCAP_P A tty (character terminal) frame. FRAME_X_P A frame on X Window system. FRAME_MSDOS_P An MS-DOS frame (used only by the DOS port). FRAME_W32_P A frame using native MS-Windows GUI. FRAME_WINDOW_P A GUI frame (like X, w32, etc.) ** Support for accessing other processes on the system ** HAVE_PROCFS The /proc filesystem is supported. ** Compile-time options ** REL_ALLOC Compile in the relocatable memory allocator ralloc.c. SYSTEM_MALLOC Use the system library's malloc. subprocesses System can use subprocesses (for M-x shell for example). Defined by default, only MSDOS undefines it. DEBUG_LISP_OBJECT_TYPE Define it in lisp.h enable compile time checks on Lisp_Object use. ** System specific macros FIRST_PTY_LETTER HAVE_PTYS INTERRUPT_INPUT NARROWPROTO SEPCHAR SYSTEM_TYPE ** Misc macros USER_FULL_NAME If defined, overrides the default pw->pw_gecos for getting at the full user name. Only MSDOS overrides the default. ** Miscellaneous defines. Some of these might not be used in the code anymore, so they can be removed. AMPERSAND_FULL_NAME BROKEN_DATAGRAM_SOCKETS BROKEN_GET_CURRENT_DIR_NAME BROKEN_PTY_READ_AFTER_EAGAIN DEFAULT_SOUND_DEVICE DEVICE_SEP DIRECTORY_SEP DONT_REOPEN_PTY DOUG_LEA_MALLOC EMACS_CONFIGURATION EMACS_CONFIG_OPTIONS EMACS_INT EMACS_UINT GC_MARK_SECONDARY_STACK GC_SETJMP_WORKS GNU_MALLOC HAVE_ALLOCA HAVE_ALLOCA_H HAVE_ALSA HAVE_BDFFONT HAVE_CFMAKERAW HAVE_CFSETSPEED HAVE_CLOCK_GETTIME HAVE_CLOCK_SETTIME HAVE_COFF_H HAVE_COM_ERR_H HAVE_DBUS HAVE_DBUS_TYPE_IS_VALID HAVE_DBUS_VALIDATE_BUS_NAME HAVE_DBUS_VALIDATE_INTERFACE HAVE_DBUS_VALIDATE_MEMBER HAVE_DBUS_VALIDATE_PATH HAVE_DBUS_WATCH_GET_UNIX_FD HAVE_DECL_LOCALTIME_R HAVE_DECL_STRMODE HAVE_DECL_STRTOIMAX HAVE_DECL_STRTOLL HAVE_DECL_STRTOULL HAVE_DECL_STRTOUMAX HAVE_DECL_TZNAME HAVE_DIALOGS HAVE_ENDGRENT HAVE_ENDPWENT HAVE_ENVIRON_DECL HAVE_EUIDACCESS HAVE_FORK HAVE_FREEIFADDRS HAVE_FREETYPE HAVE_FSEEKO HAVE_FUTIMENS HAVE_FUTIMES HAVE_FUTIMESAT HAVE_GAI_STRERROR HAVE_GCONF HAVE_GETGRENT HAVE_GETHOSTNAME HAVE_GETIFADDRS HAVE_GETLOADAVG HAVE_GETOPT_H HAVE_GETOPT_LONG_ONLY HAVE_GETPAGESIZE HAVE_GETPT HAVE_GETPWENT HAVE_GETRLIMIT HAVE_GETRUSAGE HAVE_GETSOCKNAME HAVE_GETTIMEOFDAY HAVE_GET_CURRENT_DIR_NAME HAVE_GHOSTSCRIPT HAVE_GIF HAVE_GNUTLS HAVE_GPM HAVE_GRANTPT HAVE_GSETTINGS HAVE_GTK3 HAVE_GTK_FILE_SELECTION_NEW HAVE_GTK_WINDOW_SET_HAS_RESIZE_GRIP HAVE_IFADDRS_H HAVE_IMAGEMAGICK HAVE_INTTYPES_H HAVE_JPEG HAVE_KERBEROSIV_KRB_H HAVE_KERBEROS_KRB_H HAVE_KRB5_ERROR_E_TEXT HAVE_KRB5_ERROR_TEXT HAVE_KRB5_H HAVE_KRB_H HAVE_LANGINFO_CODESET HAVE_LIBDGC HAVE_LIBKSTAT HAVE_LIBLOCKFILE HAVE_LIBMAIL HAVE_LIBOTF HAVE_LIBPERFSTAT HAVE_LIBSELINUX HAVE_LIBXML2 HAVE_LOCALTIME_R HAVE_LOCAL_SOCKETS HAVE_LRAND48 HAVE_LSTAT HAVE_LUTIMES HAVE_M17N_FLT HAVE_MACHINE_SOUNDCARD_H HAVE_MACH_MACH_H HAVE_MAGICKEXPORTIMAGEPIXELS HAVE_MAGICKMERGEIMAGELAYERS HAVE_MAILLOCK_H HAVE_MALLOC_MALLOC_H HAVE_MBSTATE_T HAVE_MEMORY_H HAVE_MEMSET HAVE_MKSTEMP HAVE_MMAP HAVE_MULTILINGUAL_MENU HAVE_NET_IF_DL_H HAVE_NET_IF_H HAVE_NLIST_H HAVE_OTF_GET_VARIATION_GLYPHS HAVE_PERSONALITY_ADDR_NO_RANDOMIZE HAVE_PNG HAVE_POSIX_MEMALIGN HAVE_PROCFS HAVE_PSELECT HAVE_PSTAT_GETDYNAMIC HAVE_PTHREAD HAVE_PTHREAD_H HAVE_PTHREAD_SIGMASK HAVE_PTYS HAVE_PTY_H HAVE_PWD_H HAVE_RANDOM HAVE_READLINK HAVE_READLINKAT HAVE_RECVFROM HAVE_RINT HAVE_RSVG HAVE_SELECT HAVE_SENDTO HAVE_SEQPACKET HAVE_SETITIMER HAVE_SETLOCALE HAVE_SETRLIMIT HAVE_SHARED_GAME_DIR HAVE_SHUTDOWN HAVE_SIGNED_${GLTYPE} HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T HAVE_SIGSET_T HAVE_SNPRINTF HAVE_SOCKETS HAVE_SOUND HAVE_SOUNDCARD_H HAVE_STDINT_H HAVE_STDIO_EXT_H HAVE_STDLIB_H HAVE_STRINGS_H HAVE_STRING_H HAVE_STRSIGNAL HAVE_STRTOIMAX HAVE_STRTOLL HAVE_STRTOULL HAVE_STRUCT_ERA_ENTRY HAVE_STRUCT_IFREQ_IFR_ADDR HAVE_STRUCT_IFREQ_IFR_ADDR_SA_LEN HAVE_STRUCT_IFREQ_IFR_BROADADDR HAVE_STRUCT_IFREQ_IFR_FLAGS HAVE_STRUCT_IFREQ_IFR_HWADDR HAVE_STRUCT_IFREQ_IFR_NETMASK HAVE_STRUCT_NLIST_N_UN_N_NAME HAVE_STRUCT_STAT_ST_ATIMENSEC HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC HAVE_STRUCT_TM_TM_ZONE HAVE_ST_DM_MODE HAVE_SYMLINK HAVE_SYNC HAVE_SYS_BITYPES_H HAVE_SYS_INTTYPES_H HAVE_SYS_LOADAVG_H HAVE_SYS_PARAM_H HAVE_SYS_RESOURCE_H HAVE_SYS_SELECT_H HAVE_SYS_SOCKET_H HAVE_SYS_SOUNDCARD_H HAVE_SYS_STAT_H HAVE_SYS_SYSTEMINFO_H HAVE_SYS_TIME_H HAVE_SYS_TYPES_H HAVE_SYS_UN_H HAVE_SYS_UTSNAME_H HAVE_SYS_VLIMIT_H HAVE_SYS_WAIT_H HAVE_TERM_H HAVE_TIFF HAVE_TM_GMTOFF HAVE_TM_ZONE HAVE_TOUCHLOCK HAVE_TZNAME HAVE_UTIL_H HAVE_UTIMENSAT HAVE_UTMP_H HAVE_VFORK HAVE_VFORK_H HAVE_WEBP HAVE_SQLITE3 HAVE_WCHAR_H HAVE_WCHAR_T HAVE_WINDOW_SYSTEM HAVE_WINSOCK2_H HAVE_WORKING_FORK HAVE_WORKING_UTIMES HAVE_WORKING_VFORK HAVE_WS2TCPIP_H HAVE_XAW3D HAVE_XFT HAVE_XIM HAVE_XPM HAVE_XRMSETDATABASE HAVE_XSCREENNUMBEROFSCREEN HAVE_XSCREENRESOURCESTRING HAVE_X_I18N HAVE_X_SM HAVE_X_WINDOWS HAVE___BUILTIN_UNWIND_INIT HAVE___EXECUTABLE_START INTERNAL_TERMINAL IS_ANY_SEP IS_DIRECTORY_SEP MAIL_USE_FLOCK MAIL_USE_LOCKF MAIL_USE_POP MAIL_USE_SYSTEM_LOCK MAXPATHLEN NLIST_STRUCT NSIG NSIG_MINIMUM NULL_DEVICE PAGESIZE PTY_ITERATION PTY_NAME_SPRINTF PTY_OPEN PTY_TTY_NAME_SPRINTF PURESIZE RUN_TIME_REMAP SETUP_SLAVE_PTY SIGNALS_VIA_CHARACTERS STDC_HEADERS SYSTEM_PURESIZE_EXTRA SYSTEM_MALLOC TAB3 TABDLY TERM TIOCSIGSEND TM_IN_SYS_TIME UNIX98_PTYS USE_TOOLKIT_SCROLL_BARS USG_SUBTTY_WORKS VALBITS XOS_NEEDS_TIME_H _FILE_OFFSET_BITS _LP64 _longjmp _setjmp abort alloca close emacs free gmtime localtime malloc random read realloc select umask vfork src/sysdep.c: write src/syssignal.h: signal sigmask sigsetmask lib/dup2.c: dup2 lib/signal.h: signal lib/stdio.h: fdopen fopen fwrite popen rename lib/stdlib.h: calloc srandom (conf_post.h may undo) lib/strftime.c: tzname tzset lib/sys/stat.h: mkdir lib/unistd.h: chown dup dup2 ftruncate isatty link lseek pipe rmdir sleep unlink MS DOS stuff: _NAIVE_DOS_REGS MS stuff: USE_CRT_DLL ms-w32.h: DebPrint EMACSDEBUG MUST_UNDEF__STDC__ _VARARGS_ _WINSOCKAPI_ _WINSOCK_H access calloc chdir chmod chown creat ctime dup dup2 execlp execvp (also emacsclient.c [WINDOWSNT]) fdopen fileno fopen fsync ftruncate getdefdir getdisk getpid isatty kill link lseek mkdir mktemp open pclose pipe popen rename rmdir signal sleep spawnve strdup stricmp strnicmp strupr sys_nerr tzname tzset umask unlink utimbuf utime wait (also movemail.c [WINDOWSNT]) write lib-src/ntlib: access chdir chmod creat dup dup2 execlp execvp fdopen fileno fopen getpid index isatty lseek mkdir mktemp open pclose pipe popen rmdir rindex sleep umask unlink utime