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 ** 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_X_WINDOWS Compile support for X Window system (It looks like, nowadays, if HAVE_X11 is set, HAVE_X_WINDOWS must be, and vice versa. At least, this is true for configure, and msdos; not sure about nt.) HAVE_X11R6 HAVE_X11R6_XIM HAVE_X11XTR6 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. ** 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_FIONREAD 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_MARK_STACK GC_SETJMP_WORKS GNU_MALLOC HAVE_AIX_SMT_EXP HAVE_ALARM HAVE_ALLOCA HAVE_ALLOCA_H HAVE_ALSA HAVE_BDFFONT HAVE_BOXES HAVE_C99_STRTOLD 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_GETENV HAVE_DECL_LOCALTIME_R HAVE_DECL_STRMODE HAVE_DECL_STRTOIMAX HAVE_DECL_STRTOLL HAVE_DECL_STRTOULL HAVE_DECL_STRTOUMAX HAVE_DECL_SYS_SIGLIST HAVE_DECL_TZNAME HAVE_DECL___SYS_SIGLIST HAVE_DIALOGS HAVE_DIFFTIME HAVE_DUP2 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_GETDELIM HAVE_GETGRENT HAVE_GETHOSTNAME HAVE_GETIFADDRS HAVE_GETLINE 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_ADJUSTMENT_GET_PAGE_SIZE HAVE_GTK_DIALOG_GET_ACTION_AREA HAVE_GTK_FILE_SELECTION_NEW HAVE_GTK_MAIN HAVE_GTK_MULTIDISPLAY HAVE_GTK_ORIENTABLE_SET_ORIENTATION HAVE_GTK_WIDGET_GET_MAPPED HAVE_GTK_WIDGET_GET_SENSITIVE HAVE_GTK_WIDGET_GET_WINDOW HAVE_GTK_WIDGET_SET_HAS_WINDOW HAVE_GTK_WINDOW_SET_HAS_RESIZE_GRIP HAVE_G_TYPE_INIT 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_LIBPNG_PNG_H HAVE_LIBSELINUX HAVE_LIBXML2 HAVE_LIBXMU HAVE_LOCALTIME_R HAVE_LOCAL_SOCKETS HAVE_LONG_LONG_INT 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_MATHERR HAVE_MBSTATE_T HAVE_MEMCMP HAVE_MEMMOVE HAVE_MEMORY_H HAVE_MEMSET HAVE_MENUS HAVE_MKSTEMP HAVE_MMAP HAVE_MULTILINGUAL_MENU HAVE_NANOTIME 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_PNG_H 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_STLIB_H_1 HAVE_STRINGS_H HAVE_STRING_H HAVE_STRNCASECMP HAVE_STRSIGNAL HAVE_STRTOIMAX HAVE_STRTOLL HAVE_STRTOULL HAVE_STRTOUMAX 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_TIMEZONE HAVE_STRUCT_TM_TM_ZONE HAVE_STRUCT_UTIMBUF 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_TIMEB_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_TCATTR HAVE_TERM_H HAVE_TIFF HAVE_TIMEVAL HAVE_TM_GMTOFF HAVE_TM_ZONE HAVE_TOUCHLOCK HAVE_TZNAME HAVE_TZSET HAVE_UNSIGNED_LONG_LONG_INT HAVE_UTIL_H HAVE_UTIMENSAT HAVE_UTIMES HAVE_UTIME_H HAVE_UTMP_H HAVE_VFORK HAVE_VFORK_H 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_MENU HAVE_X_SM HAVE_X_WINDOWS HAVE__BOOL HAVE__FTIME HAVE___BUILTIN_UNWIND_INIT HAVE___EXECUTABLE_START HAVE___FPENDING INTERNAL_TERMINAL IS_ANY_SEP IS_DIRECTORY_SEP MAIL_USE_FLOCK MAIL_USE_LOCKF MAIL_USE_POP MAIL_USE_SYSTEM_LOCK MAXPATHLEN NLIST_STRUCT NO_EDITRES 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 TIME_WITH_SYS_TIME 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