Update years in copyright notice; nfc.
[bpt/emacs.git] / src / s / gnu-linux.h
index c0bb3a3..4ef3db9 100644 (file)
@@ -1,6 +1,6 @@
-/* This file is the configuration file for the Linux operating system.
-   Copyright (C) 1985, 1986, 1992 Free Software Foundation, Inc.
-   Some changes copyright (C) 1993 Michael K. Johnson and Rik Faith.
+/* This file is the configuration file for Linux-based GNU systems
+   Copyright (C) 1985, 1986, 1992, 1994, 1996, 1999, 2002, 2003, 2004,
+                 2005, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -16,7 +16,10 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
+
+/* This file was put together by Michael K. Johnson and Rik Faith.  */
 
 
 /*
@@ -27,72 +30,86 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 /* #define UNIPLUS */
 /* #define USG5 */
 #define USG
-#define BSD
+/* #define BSD_SYSTEM */
 #define LINUX
+#define GNU_LINUX
 
 /* SYSTEM_TYPE should indicate the kind of system you are using.
  It sets the Lisp variable system-type.  */
 
-#define SYSTEM_TYPE "linux"            /* All the best software is free. */
-
-/* Emacs can read input using SIGIO and buffering characters itself,
-   or using CBREAK mode and making C-g cause SIGINT.
-   The choice is controlled by the variable interrupt_input.
-   Define INTERRUPT_INPUT to make interrupt_input = 1 the default (use SIGIO)
-
-   SIGIO can be used only on systems that implement it (4.2 and 4.3).
-   CBREAK mode has two disadvatages
-     1) At least in 4.2, it is impossible to handle the Meta key properly.
-        I hear that in system V this problem does not exist.
-     2) Control-G causes output to be discarded.
-        I do not know whether this can be fixed in system V.
-
-   Another method of doing input is planned but not implemented.
-   It would have Emacs fork off a separate process
-   to read the input and send it to the true Emacs process
-   through a pipe.
-*/
+#define SYSTEM_TYPE "gnu/linux"                /* All the best software is free. */
 
-/* There have been suggestions made to add SIGIO to Linux.  If this
-   is done, you may, at your discretion, uncomment the line below.
-*/
-
-/* #define INTERRUPT_INPUT */
+/* Check the version number of Linux--if it is at least 1.2.0,
+   it is safe to use SIGIO.  */
+#ifndef NOT_C_CODE
+#ifdef emacs
+#ifdef HAVE_LINUX_VERSION_H
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE > 0x10200
+#define LINUX_SIGIO_DOES_WORK
+#endif /* LINUX_VERSION_CODE > 0x10200 */
+#if LINUX_VERSION_CODE >= 0x20000
+#define LINUX_MAP_SHARED_DOES_WORK
+#endif /* LINUX_VERSION_CODE >= 0x20000 */
+#endif /* HAVE_LINUX_VERSION_H */
+#endif /* emacs */
+#endif /* NOT_C_CODE */
+
+#if defined HAVE_GRANTPT
+#define UNIX98_PTYS
+
+/* Run only once.  We need a `for'-loop because the code uses
+   `continue'.  */
+
+#define PTY_ITERATION  for (i = 0; i < 1; i++)
+
+#ifdef HAVE_GETPT
+#define PTY_NAME_SPRINTF
+#define PTY_OPEN fd = getpt ()
+#else /* not HAVE_GETPT */
+#define PTY_NAME_SPRINTF strcpy (pty_name, "/dev/ptmx");
+#endif /* not HAVE_GETPT */
+
+/* Note that grantpt and unlockpt may fork.  We must block SIGCHLD to
+   prevent sigchld_handler from intercepting the child's death.  */
+
+#define PTY_TTY_NAME_SPRINTF                           \
+  {                                                    \
+    char *ptyname;                                     \
+                                                       \
+    sigblock (sigmask (SIGCHLD));                      \
+    if (grantpt (fd) == -1 || unlockpt (fd) == -1      \
+        || !(ptyname = ptsname(fd)))                   \
+      {                                                        \
+       sigunblock (sigmask (SIGCHLD));                 \
+       close (fd);                                     \
+       return -1;                                      \
+      }                                                        \
+    strncpy (pty_name, ptyname, sizeof (pty_name));    \
+    pty_name[sizeof (pty_name) - 1] = 0;               \
+    sigunblock (sigmask (SIGCHLD));                    \
+  }
+
+#else /* not HAVE_GRANTPT */
 
 /* Letter to use in finding device name of first pty,
-  if system supports pty's.  'p' means it is /dev/ptyp0  */
+   if system supports pty's.  'p' means it is /dev/ptyp0  */
 
 #define FIRST_PTY_LETTER 'p'
 
-/*
- *     Define HAVE_TERMIOS if the system provides POSIX-style
- *     functions and macros for terminal control.
- */
-
-#define HAVE_TERMIOS
-
-/*
- *     Define HAVE_TIMEVAL if the system supports the BSD style clock values.
- *     Look in <sys/time.h> for a timeval structure.
- */
-
-#define HAVE_TIMEVAL
+#endif  /* not HAVE_GRANDPT */
 
-/*
- *     Define HAVE_SELECT if the system supports the `select' system call.
- */
+/*  Define HAVE_TERMIOS if the system provides POSIX-style
+    functions and macros for terminal control.  */
 
-#define HAVE_SELECT
+#define HAVE_TERMIOS
 
-/*
- *     Define HAVE_PTYS if the system supports pty devices.
- */
+/* Define HAVE_PTYS if the system supports pty devices. */
 
 #define HAVE_PTYS
 
-/* Uncomment this later when other problems are dealt with -mkj */
-
-/* #define HAVE_SOCKETS */
+#define HAVE_SOCKETS
 
 /* Define this symbol if your system has the functions bcopy, etc. */
 
@@ -111,17 +128,27 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
    The alternative is that a lock file named
    /usr/spool/mail/$USER.lock.  */
 
-/* Both are used in Linux by different mail programs.  I assume that most
-   people are using newer mailers that have heard of flock.  Change this
-   if you need to. */
-
+/* On GNU/Linux systems, both methods are used by various mail
+   programs.  I assume that most people are using newer mailers that
+   have heard of flock.  Change this if you need to. */
+/* Debian contains a patch which says: ``On Debian/GNU/Linux systems,
+   configure gets the right answers, and that means *NOT* using flock.
+   Using flock is guaranteed to be the wrong thing. See Debian Policy
+   for details.'' and then uses `#ifdef DEBIAN'.  Unfortunately the
+   Debian maintainer hasn't provided a clean fix for Emacs.
+   movemail.c will use `maillock' when MAILDIR, HAVE_LIBMAIL and
+   HAVE_MAILLOCK_H are defined, so the following appears to be the
+   correct logic.  -- fx */
+
+#if !(defined (HAVE_LIBMAIL) && defined (HAVE_MAILLOCK_H))
 #define MAIL_USE_FLOCK
+#endif
 
 /* Define CLASH_DETECTION if you want lock files to be written
    so that Emacs can tell instantly when you try to modify
    a file that someone else has modified in his Emacs.  */
 
-/* #define CLASH_DETECTION */
+#define CLASH_DETECTION
 
 /* Here, on a separate page, add any special hacks needed
    to make Emacs work on this system.  For example,
@@ -130,59 +157,222 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
    your system and must be used only through an encapsulation
    (Which you should place, by convention, in sysdep.c).  */
 \f
-
 /* If you mount the proc file system somewhere other than /proc
    you will have to uncomment the following and make the proper
    changes */
 
 /* #define LINUX_LDAV_FILE "/proc/loadavg" */
 
-/* This is needed for disknew.c:update_frame() */
-
-#define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_pptr - (FILE)->_pbase)
+/* This is needed for dispnew.c:update_frame */
 
-/* Linux has crt0.o in a non-standard place */
+#ifdef emacs
+#include <stdio.h>  /* Get the definition of _IO_STDIO_H.  */
+#if defined(_IO_STDIO_H) || defined(_STDIO_USES_IOSTREAM)
+/* new C libio names */
+#define GNU_LIBRARY_PENDING_OUTPUT_COUNT(FILE) \
+  ((FILE)->_IO_write_ptr - (FILE)->_IO_write_base)
+#else /* !_IO_STDIO_H */
+/* old C++ iostream names */
+#define GNU_LIBRARY_PENDING_OUTPUT_COUNT(FILE) \
+  ((FILE)->_pptr - (FILE)->_pbase)
+#endif /* !_IO_STDIO_H */
+#endif /* emacs */
+
+/* Ask GCC where to find libgcc.a.  */
+#define LIB_GCC `$(CC) $(C_SWITCH_X_SITE) -print-libgcc-file-name`
+
+#ifndef __ELF__
+/* GNU/Linux usually has crt0.o in a non-standard place */
 #define START_FILES pre-crt0.o /usr/lib/crt0.o
+#else
+#define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o
+#endif
 
-/* Linux has SIGIO defined, but not implemented, as of version 0.99.8
- * What an ugly kludge!  This will not be necessary if the
- * INTERRUPT_INPUT define gets fully implemented.
- */
+#ifdef __ELF__
+/* Here is how to find X Windows.  LD_SWITCH_X_SITE_AUX gives an -R option
+   says where to find X windows at run time.  */
+
+#ifdef __mips__
+#define LD_SWITCH_SYSTEM -G 0 LD_SWITCH_X_SITE_AUX
+#else
+#define LD_SWITCH_SYSTEM LD_SWITCH_X_SITE_AUX
+#endif /* __mips__ */
+
+/* Link temacs with -z nocombreloc so that unexec works right, whether or
+   not -z combreloc is the default.  GNU ld ignores unknown -z KEYWORD
+   switches, so this also works with older versions that don't implement
+   -z combreloc.  */
+#define LD_SWITCH_SYSTEM_TEMACS -z nocombreloc
+#endif /* __ELF__ */
+
+/* As of version 1.1.51, Linux did not actually implement SIGIO.
+   But it works in newer versions.  */
 #ifdef emacs
-#include <signal.h>
-#undef SIGIO
+#ifdef LINUX_SIGIO_DOES_WORK
+#define INTERRUPT_INPUT
+#else
+#define BROKEN_SIGIO
+/* Some versions of Linux define SIGURG and SIGPOLL as aliases for SIGIO.
+   This prevents lossage in process.c.  */
+#define BROKEN_SIGURG
+#define BROKEN_SIGPOLL
+#endif
 #endif
 
 /* This is needed for sysdep.c */
 
-#define HAVE_RENAME
-#define HAVE_UNISTD_H        /* for getpagesize.h */
-#define HAVE_ALLOCA_H        /* for getdate.y */
 #define NO_SIOCTL_H           /* don't have sioctl.h */
 
-#define HAVE_DUP2             /* is builtin */
-#define HAVE_RANDOM           /* is builtin */
-#define HAVE_CLOSEDIR
-#define HAVE_GETPAGESIZE
-#define HAVE_VFORK
-#define HAVE_SYS_SIGLIST
-#define HAVE_GETWD            /* cure conflict with getcwd? */
+#define HAVE_WAIT_HEADER
 
-#define USE_UTIME             /* don't have utimes */
 #define SYSV_SYSTEM_DIR       /* use dirent.h */
-#define USG_SYS_TIME          /* use sys/time.h, not time.h */
 
-#define POSIX                 /* affects only getpagesize.h */
+#define POSIX                 /* affects getpagesize.h and systty.h */
 #define POSIX_SIGNALS
 
-/* libc-linux/sysdeps/linux/i386/ulimit.c says that due to shared library, */
-/* we cannot get the maximum address for brk */
-#define ULIMIT_BREAK_VALUE (32*1024*1024)
-
 /* Best not to include -lg, unless it is last on the command line */
 #define LIBS_DEBUG
-#define LIBS_TERMCAP -ltermcap -lcurses /* save some space with shared libs*/
+#ifndef __ELF__
 #define LIB_STANDARD -lc /* avoid -lPW */
-#ifdef HAVE_X11
-#define LD_SWITCH_SYSTEM -L/usr/X386/lib
+#else
+#undef LIB_GCC
+#define LIB_GCC
+#define LIB_STANDARD -lgcc -lc -lgcc /usr/lib/crtn.o
+#endif
+
+/* Don't use -g in test compiles in configure.
+   This is so we will use the same shared libs for that linking
+   that are used when linking temacs.  */
+#ifdef THIS_IS_CONFIGURE
+#define C_DEBUG_SWITCH
 #endif
+
+/* Let's try this out, just in case.
+   Nah.  Rik Faith <faith@cs.unc.edu> says it doesn't work well.  */
+/* #define SIGNALS_VIA_CHARACTERS */
+
+/* Rob Malouf <malouf@csli.stanford.edu> says:
+   SYSV IPC is standard a standard part of Linux since version 0.99pl10,
+   and is a very common addition to previous versions.  */
+
+#ifdef TERM
+#define LIBS_SYSTEM -lclient
+#define C_SWITCH_SYSTEM -D_BSD_SOURCE -I/usr/src/term
+#else
+/* alane@wozzle.linet.org says that -lipc is not a separate library,
+   since libc-4.4.1.  So -lipc was deleted.  */
+#define LIBS_SYSTEM
+/* _BSD_SOURCE is redundant, at least in glibc2, since we define
+   _GNU_SOURCE.  Left in in case it's relevant to libc5 systems and
+   anyone's still using Emacs on those.  --fx 2002-12-14  */
+#define C_SWITCH_SYSTEM -D_BSD_SOURCE
+#endif
+
+/* Paul Abrahams <abrahams@equinox.shaysnet.com> says this is needed.  */
+#define LIB_MOTIF -lXm -lXpm
+
+#ifdef HAVE_LIBNCURSES
+#define TERMINFO
+#define LIBS_TERMCAP -lncurses
+#endif
+
+#define HAVE_SYSVIPC
+
+#ifdef __ELF__
+#define UNEXEC unexelf.o
+#ifndef LINUX_MAP_SHARED_DOES_WORK
+#define UNEXEC_USE_MAP_PRIVATE
+#endif
+#endif
+
+#ifdef LINUX_QMAGIC
+
+#define HAVE_TEXT_START
+#define UNEXEC unexsunos4.o
+#define N_PAGSIZ(x) PAGE_SIZE
+
+#else /* not LINUX_QMAGIC */
+
+#define A_TEXT_OFFSET(hdr) (N_MAGIC(hdr) == QMAGIC ? sizeof (struct exec) : 0)
+#define A_TEXT_SEEK(hdr) (N_TXTOFF(hdr) + A_TEXT_OFFSET(hdr))
+#define ADJUST_EXEC_HEADER \
+  unexec_text_start = N_TXTADDR(ohdr) + A_TEXT_OFFSET(ohdr)
+
+#endif /* not LINUX_QMAGIC */
+
+#if 0
+/* In 19.23 and 19.24, configure sometimes fails to define these.
+   It has to do with the fact that configure uses CFLAGS when linking
+   while Makefile.in.in (erroneously) fails to do so when linking temacs.  */
+#ifndef HAVE_GETTIMEOFDAY
+#define HAVE_GETTIMEOFDAY
+#endif
+#ifndef HAVE_MKDIR
+#define HAVE_MKDIR
+#endif
+#ifndef HAVE_RMDIR
+#define HAVE_RMDIR
+#endif
+#ifndef HAVE_XSCREENNUMBEROFSCREEN
+#define HAVE_XSCREENNUMBEROFSCREEN
+#endif
+#endif /* 0 */
+
+/* This is to work around mysterious gcc failures in some system versions.
+   It is unlikely that Emacs changes will work around this problem;
+   therefore, this should remain permanently.  */
+#ifndef HAVE_XRMSETDATABASE
+#define HAVE_XRMSETDATABASE
+#endif
+
+/* The regex.o routines are a part of the GNU C-library used with Linux.  */
+/* However, sometimes they disagree with the src/regex.h that comes with Emacs,
+   and that can make trouble in etags.c because it gets the regex.h from Emacs
+   and the function definitions in libc.  So turn this off.  */
+/* #define REGEXP_IN_LIBC */
+
+/* Use BSD process groups, but use setpgid() instead of setpgrp() to
+   actually set a process group. */
+
+#define BSD_PGRPS
+
+#define NARROWPROTO 1
+
+/* Use mmap directly for allocating larger buffers.  */
+#ifdef DOUG_LEA_MALLOC
+#undef REL_ALLOC
+#endif
+
+/* Tell that garbage collector that setjmp is known to save all
+   registers relevant for conservative garbage collection in the
+   jmp_buf.  */
+/* Not all the architectures are tested, but there are Debian packages
+   for SCM and/or Guile on them, so the technique must work.  See also
+   comments in alloc.c concerning setjmp and gcc.  Fixme:  it's
+   probably safe to make this conditional just on GCC, except for ia64
+   register window-flushing.  */
+/* Don't use #cpu here since in newest development versions of GCC,
+   we must call cpp with -traditional, and that disables #cpu.  */
+
+#if defined __i386__ || defined __sparc__ || defined __mc68000__ \
+    || defined __alpha__ || defined __mips__ || defined __s390__ \
+    || defined __arm__ || defined __powerpc__ || defined __amd64__ \
+    || defined __ia64__
+#define GC_SETJMP_WORKS 1
+#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
+#ifdef __mc68000__
+#define GC_LISP_OBJECT_ALIGNMENT 2
+#endif
+#ifdef __ia64__
+#define GC_MARK_SECONDARY_STACK()                              \
+  do {                                                         \
+    extern void *__libc_ia64_register_backing_store_base;      \
+    __builtin_ia64_flushrs ();                                 \
+    mark_memory (__libc_ia64_register_backing_store_base,      \
+                __builtin_ia64_bsp ());                        \
+  } while (0)
+#endif
+#endif
+
+/* arch-tag: 6244ea2a-abd0-44ec-abec-ff3dcc9afea9
+   (do not change this comment) */