This is Info file INSTALL, produced by Makeinfo-1.47 from the input
file manual/maint.texinfo.


Library Maintenance
********************


How to Install the GNU C Library
=================================

   Installation of the GNU C library is relatively simple.

   You need the latest version of GNU `make'.  Modifying the GNU C
Library to work with other `make' programs would be so hard that we
recommend you port GNU `make' instead.  *Really.*

   To configure the GNU C library for your system, run the shell script
`configure' with `sh'.  Use an argument which is the conventional GNU
name for your system configuration--for example, `sparc-sun-sunos4.1',
for a Sun 4 running Sunos 4.1. *Note Installation:
(gcc.info)Installation, for a full description of standard GNU
configuration names.

   The GNU C Library currently supports configurations that match the
following patterns:

     sparc-sun-sunos4.N
     m68k-hp-bsd4.3
     m68k-sun-sunos4.N
     m68k-sony-bsd4.3
     mips-dec-ultrix4.N
     i386-bsd4.3
     i386-sysv
     i386-sysv4

   While no other configurations are supported, there are handy aliases
for these few.  (These aliases work in other GNU software as well.)

     sun4-sunos4.N
     hp320-bsd4.3
     sun3-sunos4.N
     news
     decstation-ultrix
     i386-svr4

   Here are some options that you should specify (if appropriate) when
you run `configure':

`--with-gnu-ld'
     Use this option if you plan to use GNU `ld' to link programs with
     the GNU C Library.  (We strongly recommend that you do.)

`--with-gnu-as'
     Use this option if you plan to use the GNU assembler, `gas', when
     building the GNU C Library.  On some systems, the library may not
     build properly if you do *not* use `gas'.

`--nfp'
     Use this option if your computer lacks hardware floating point
     support.

`--prefix=DIRECTORY'
     Install machine-independent data files in subdirectories of
     `DIRECTORY'.  (You can also set this in `configparms'; see below.)

`--exec_prefix=DIRECTORY'
     Install the library and other machine-dependent files in
     subdirectories of `DIRECTORY'.  (You can also set this in
     `configparms'; see below.)

   The simplest way to run `configure' is to do it in the directory
that contains the library sources.  This prepares to build the library
in that very directory.

   You can prepare to build the library in some other directory by going
to that other directory to run `configure'.  In order to run configure,
you will have to specify a directory for it, like this:

     mkdir ../hp320
     cd ../hp320
     ../src/configure hp320-bsd4.3

`configure' looks for the sources in whatever directory you specified
for finding `configure' itself.  It does not matter where in the file
system the source and build directories are--as long as you specify the
source directory when you run `configure', you will get the proper
results.

   This feature lets you keep sources and binaries in different
directories, and that makes it easy to build the library for several
different machines from the same set of sources.  Simply create a build
directory for each target machine, and run `configure' in that
directory specifying the target machine's configuration name.

   The library has a number of special-purpose configuration parameters.
These are defined in the file `Makeconfig'; see the comments in that
file for the details.

   But don't edit the file `Makeconfig' yourself--instead, create a
file `configparms' in the directory where you are building the library,
and define in that file the parameters you want to specify.
`configparms' should *not* be an edited copy of `Makeconfig'; specify
only the parameters that you want to override.

   Some of the machine-dependent code for some machines uses extensions
in the GNU C compiler, so you may need to compile the library with GCC.
(In fact, all of the existing complete ports require GCC.)

   To build the library and header files, type `make'.  This will
produce a lot of output, some of which looks like errors from `make'
(but isn't).  Look for error messages from `make' containing `***'. 
Those indicate that something is really wrong. Using the `-w' option to
`make' may make the output easier to understand (this option tells
`make' to print messages telling you what subdirectories it is working
on).

   To install the library and header files, type `make install', after
setting the installation directories in `configparms'.  This will build
things if necessary, before installing them.


Reporting Bugs
===============

   There are probably bugs in the GNU C library.  If you report them,
they will get fixed.  If you don't, no one will ever know about them
and they will remain unfixed for all eternity, if not longer.

   To report a bug, first you must find it.  Hopefully, this will be the
hard part.  Once you've found a bug, make sure it's really a bug.  A
good way to do this is to see if the GNU C library behaves the same way
some other C library does.  If so, probably you are wrong and the
libraries are right (but not necessarily).  If not, one of the libraries
is probably wrong.

   Once you're sure you've found a bug, try to narrow it down to the
smallest test case that reproduces the problem.  In the case of a C
library, you really only need to narrow it down to one library function
call, if possible.  This should not be too difficult.

   The final step when you have a simple test case is to report the
bug.  When reporting a bug, send your test case, the results you got,
the results you expected, what you think the problem might be (if
you've thought of anything), your system type, and the version of the
GNU C library which you are using.

   If you think you have found some way in which the GNU C library does
not conform to the ANSI and POSIX standards (*note Standards and
Portability::.), that is definitely a bug.  Report it!

   Send bug reports to the Internet address `bug-glibc@prep.ai.mit.edu'
or the UUCP path `mit-eddie!prep.ai.mit.edu!bug-glibc'.  If you have
other problems with installation, use, or the documentation, please
report those as well.


Adding New Functions
=====================

   The process of building the library is driven by the makefiles, which
make heavy use of special features of GNU `make'.  The makefiles are
very complex, and you probably don't want to try to understand them.
But what they do is fairly straightforward, and only requires that you
define a few variables in the right places.

   The library sources are divided into subdirectories, grouped by
topic. The `string' subdirectory has all the string-manipulation
functions, `stdio' has all the standard I/O functions, etc.

   Each subdirectory contains a simple makefile, called `Makefile',
which defines a few `make' variables and then includes the global
makefile `Rules' with a line like:

     include ../Rules

The basic variables that a subdirectory makefile defines are:

`subdir'
     The name of the subdirectory, for example `stdio'. This variable
     *must* be defined.

`headers'
     The names of the header files in this section of the library, such
     as `stdio.h'.

`routines'
`aux'
     The names of the modules (source files) in this section of the
     library. These should be simple names, such as `strlen' (rather
     than complete file names, such as `strlen.c').  Use `routines' for
     modules that define functions in the library, and `aux' for
     auxiliary modules containing things like data definitions.  But the
     values of `routines' and `aux' are just concatenated, so there
     really is no practical difference.

`tests'
     The names of test programs for this section of the library.  These
     should be simple names, such as `tester' (rather than complete file
     names, such as `tester.c').  `make tests' will build and run all
     the test programs.  If a test program needs input, put the test
     data in a file called `TEST-PROGRAM.input'; it will be given to
     the test program on its standard input.  If a test program wants
     to be run with arguments, put the arguments (all on a single line)
     in a file called `TEST-PROGRAM.args'.

`others'
     The names of "other" programs associated with this section of the
     library.  These are programs which are not tests per se, but are
     other small programs included with the library.  They are built by
     `make others'.

`install-lib'
`install-data'
`install'
     Files to be installed by `make install'.  Things listed in
     `install-lib' are installed in the directory specified by `libdir'
     in `Makeconfig' (*note Installation::.).  Files listed in
     `install-data' are installed in the directory specified by
     `datadir' in `configparms' or `Makeconfig'.  Files listed in
     `install' are installed in the directory specified by `bindir' in
     `Makeconfig'.

`distribute'
     Other files from this subdirectory which should be put into a
     distribution tar file.  You need not list here the makefile itself
     or the source and header files listed in the other standard
     variables. Only define `distribute' if there are files used in an
     unusual way that should go into the distribution.


Porting the GNU C Library
==========================

   The GNU C library is written to be easily portable to a variety of
machines and operating systems.  Machine- and operating system-dependent
functions are well separated to make it easy to add implementations for
new machines or operating systems.  This section describes the layout of
the library source tree and explains the mechanisms used to select
machine-dependent code to use.

   All the machine-dependent and operating system-dependent files in the
library are in the subdirectory `sysdeps' under the top-level library
source directory.  This directory contains a hierarchy of
subdirectories (*note Hierarchy Conventions::.).

   Each subdirectory of `sysdeps' contains source files for a
particular machine or operating system, or for a class of machine or
operating system (for example, systems by a particular vendor, or all
machines that use IEEE 754 floating-point format).  A configuration
specifies an ordered list of these subdirectories.  Each subdirectory
implicitly appends its parent directory to the list.  For example,
specifying the list `unix/bsd/vax' is equivalent to specifying the list
`unix/bsd/vax unix/bsd unix'.  A subdirectory can also specify that it
implies other subdirectories which are not directly above it in the
directory hierarchy.  If the file `Implies' exists in a subdirectory,
it lists other subdirectories of `sysdeps' which are appended to the
list, appearing after the subdirectory containing the `Implies' file. 
Lines in an `Implies' file that begin with a `#' character are ignored
as comments.  For example, `unix/bsd/Implies' contains:
     # BSD has Internet-related things.
     unix/inet

and `unix/Implies' contains:
     posix

So the final list is `unix/bsd/vax unix/bsd vax unix/inet unix posix'.

   `sysdeps' has two "special" subdirectories, called `generic' and
`stub'.  These two are always implicitly appended to the list of
subdirectories (in that order), so you needn't put them in an `Implies'
file, and you should not create any subdirectories under them. 
`generic' is for things that can be implemented in machine-independent
C, using only other machine-independent functions in the C library. 
`stub' is for "stub" versions of functions which cannot be implemented
on a particular machine or operating system. The stub functions always
return an error, and set `errno' to `ENOSYS' (Function not
implemented).  *Note Error Reporting::.

   A source file is known to be system-dependent by its having a
version in `generic' or `stub'; every system-dependent function should
have either a generic or stub implementation (there is no point in
having both).

   If you come across a file that is in one of the main source
directories (`string', `stdio', etc.), and you want to write a machine-
or operating system-dependent version of it, move the file into
`sysdeps/generic' and write your new implementation in the appropriate
system-specific subdirectory.  Note that if a file is to be
system-dependent, it *must not* appear in one of the main source
directories.

   There are a few special files that may exist in each subdirectory of
`sysdeps':

`Makefile'
     A makefile for this machine or operating system, or class of
     machine or operating system.  This file is included by the library
     makefile `Makerules', which is used by the top-level makefile and
     the subdirectory makefiles.  It can change the variables set in the
     including makefile or add new rules.  It can use GNU `make'
     conditional directives based on the variable `subdir' (see above)
     to select different sets of variables and rules for different
     sections of the library.  It can also set the `make' variable
     `sysdep-routines', to specify extra modules to be included in the
     library.  You should use `sysdep-routines' rather than adding
     modules to `routines' because the latter is used in determining
     what to distribute for each subdirectory of the main source tree.

     Each makefile in a subdirectory in the ordered list of
     subdirectories to be searched is included in order.  Since several
     system-dependent makefiles may be included, each should append to
     `sysdep-routines' rather than simply setting it:

          sysdep-routines := $(sysdep-routines) foo bar

`Subdirs'
     This file contains the names of new whole subdirectories under the
     top-level library source tree that should be included for this
     system. These subdirectories are treated just like the
     system-independent subdirectories in the library source tree, such
     as `stdio' and `math'.

     Use this when there are whole new sets of routines and header
     files that should go into the library for the system this
     subdirectory of `sysdeps' implements.  For example,
     `sysdeps/unix/inet/Subdirs' contains `inet'; the `inet' directory
     contains various network-oriented operations which only make sense
     to put in the library on systems that support the Internet.

`Dist'
     This file contains the names of files (relative the the
     subdirectory of `sysdeps' in which it appears) which should be
     included in the distribution.  List any new files used by rules in
     the `Makefile' in the same directory, or header files used by the
     source files in that directory.  You don't need to list files that
     are implementations (either C or assembly source) of routines
     whose names are given in the machine-independent makefiles in the
     main source tree.

   That is the general system for how system-dependencies are isolated.


The Layout of the `sysdeps' Directory Hierarchy
------------------------------------------------

   A GNU configuration name has three parts: the CPU type, the
manufacturer's name, and the operating system.  `configure' uses these
to pick the list of system-dependent directories to look for.  If the
`--nfp' option is *not* passed to `configure', the directory
`MACHINE/fpu' is also used.  The operating system often has a "base
operating system"; for example, if the operating system is `sunos4.1',
the base operating system is `unix/bsd'. The algorithm used to pick the
list of directories is simple: `configure' makes a list of the base
operating system, manufacturer, CPU type, and operating system, in that
order.  It then concatenates all these together with slashes in
between, to produce a directory name; for example, the configuration
`sparc-sun-sunos4.1' results in `unix/bsd/sun/sparc/sunos4.1'. 
`configure' then tries removing each element of the list in turn, so
`unix/bsd/sparc' and `sun/sparc' are also tried, among others. Since
the precise version number of the operating system is often not
important, and it would be very inconvenient, for example, to have
identical `sunos4.1.1' and `sunos4.1.2' directories, `configure' tries
successively less specific operating system names by removing trailing
suffixes starting with a period.

   Here is the complete list of directories that would be tried for the
configuration `sparc-sun-sunos4.1':

     sparc/fpu
     unix/bsd/sun/sunos4.1/sparc
     unix/bsd/sun/sunos4.1
     unix/bsd/sun/sunos4/sparc
     unix/bsd/sun/sunos4
     unix/bsd/sun/sparc
     unix/bsd/sun
     unix/bsd/sunos4.1/sparc
     unix/bsd/sunos4.1
     unix/bsd/sunos4/sparc
     unix/bsd/sunos4
     unix/bsd/sparc
     unix/bsd
     sun/sunos4.1/sparc
     sun/sunos4.1
     sun/sunos4/sparc
     sun/sunos4
     sun/sparc
     sun
     sunos4.1/sparc
     sunos4.1
     sunos4/sparc
     sunos4
     sparc

   Different machine architectures are generally at the top level of the
`sysdeps' directory tree.  For example, `sysdeps/sparc' and
`sysdeps/m68k'.  These contain files specific to those machine
architectures, but not specific to any particular operating system. 
There might be subdirectories for specializations of those
architectures, such as `sysdeps/m68k/68020'. Code which is specific to
the floating-point coprocessor used with a particular machine should go
in `sysdeps/MACHINE/fpu'.

   There are a few directories at the top level of the `sysdeps'
hierarchy that are not for particular machine architectures.

`generic'
`stub'
     As described above (*note Porting::.), these are the two
     subdirectories that every configuration implicitly uses after all
     others.

`ieee754'
     This directory is for code using the IEEE 754 floating-point
     format, where the C type `float' is IEEE 754 single-precision
     format, and `double' is IEEE 754 double-precision format.  Usually
     this directory is referred to in the `Implies' file in a machine
     architecture-specific directory, such as `m68k/Implies'.

`posix'
     This directory contains implementations of things in the library in
     terms of POSIX.1 functions.  This includes some of the POSIX.1
     functions themselves.  Of course, POSIX.1 cannot be completely
     implemented in terms of itself, so a configuration using just
     `posix' cannot be complete.

`unix'
     This is the directory for Unix-like things.  See *Note Porting to
     Unix::. `unix' implies `posix'.

`mach'
     This is the directory for things based on the Mach microkernel
     from CMU (including the GNU operating system).  Other basic
     operating systems (VMS, for example) would have their own
     directories at the top level of the `sysdeps' hierarchy, parallel
     to `unix' and `mach'.


Porting the GNU C Library to Unix Systems
------------------------------------------

   Most Unix systems are fundamentally very similar.  There are
variations between different machines, and variations in what
facilities are provided by the kernel.  But the interface to the
operating system facilities is, for the most part, pretty uniform and
simple.

   The code for Unix systems is in the directory `unix', at the top
level of the `sysdeps' hierarchy.  This directory contains
subdirectories (and subdirectory trees) for various Unix variants.

   The functions which are system calls in most Unix systems are
implemented in assembly code in files in `sysdeps/unix'.  These files
are named with a suffix of `.S'; for example, `__open.S'.  Files ending
in `.S' are run through the C preprocessor before being fed to the
assembler.

   These files all use a set of macros that should be defined in
`sysdep.h'.  The `sysdep.h' file in `sysdeps/unix' partially defines
them; a `sysdep.h' file in another directory must finish defining them
for the particular machine and operating system variant.  See
`sysdeps/unix/sysdep.h' and the machine-specific `sysdep.h'
implementations to see what these macros are and what they should do.

   The system-specific makefile for the `unix' directory,
`sysdeps/unix/Makefile', gives rules to generate several files from the
Unix system you are building the library on (which is assumed to be the
target system you are building the library *for*).  All the generated
files are put in the directory where the object files are kept; they
should not affect the source tree itself.  The files generated are
`ioctls.h', `errnos.h', `sys/param.h', and `errlist.c' (for the `stdio'
section of the library).


Contributors to the GNU C Library
==================================

   The GNU C library was written almost entirely by Roland McGrath.
Some parts of the library were contributed by other people.

   * The `getopt' function and related code were written by
     Richard Stallman, David J. MacKenzie, and Roland McGrath.

   * Most of the math functions are taken from 4.4 BSD; they have been
     modified only slightly to work with the GNU C library.  The
     Internet-related code (most of the `inet' subdirectory) and several
     other miscellaneous functions and header files have been included
     with little or no modification.

     All code incorporated from 4.4 BSD is under the following
     copyright:

               Copyright (C) 1991 Regents of the University of California.
               All rights reserved.

          Redistribution and use in source and binary forms, with or
          without modification, are permitted provided that the
          following conditions are met:

            1. Redistributions of source code must retain the above
               copyright notice, this list of conditions and the
               following disclaimer.

            2. Redistributions in binary form must reproduce the above
               copyright notice, this list of conditions and the
               following disclaimer in the documentation and/or other
               materials provided with the distribution.

            3. All advertising materials mentioning features or use of
               this software must display the following acknowledgement:
                    	This product includes software developed by the
                    University of 	California, Berkeley and its
                    contributors.

            4. Neither the name of the University nor the names of its
               contributors may be used to endorse or promote products
               derived from this software without specific prior
               written permission.

          THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS
          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
          LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
          FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT
          SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
          INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
          DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
          SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
          OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
          (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
          THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
          OF SUCH DAMAGE.

   * The random number generation functions `random', `srandom',
     `setstate' and `initstate', which are also the basis for the
     `rand' and `srand' functions, were written by Earl T. Cohen for
     the University of California at Berkeley and are copyrighted by the
     Regents of the University of California.  They have undergone minor
     changes to fit into the GNU C library and to fit the ANSI C
     standard, but the functional code is Berkeley's.

   * The merge sort function `qsort' was written by Michael J. Haertel.

   * The quick sort function used as a fallback by `qsort' was written
     by Douglas C. Schmidt.

   * The memory allocation functions `malloc', `realloc' and `free' and
     related code were written by Michael J. Haertel.

   * Fast implementations of many of the string functions (`memcpy',
     `strlen', etc.) were written by Torbjorn Granlund.

   * Some of the support code for Mach is taken from Mach 3.0 by CMU,
     and is under the following copyright terms:

               Mach Operating System
               Copyright (C) 1991,1990,1989 Carnegie Mellon University
               All Rights Reserved.

          Permission to use, copy, modify and distribute this software
          and its documentation is hereby granted, provided that both
          the copyright notice and this permission notice appear in all
          copies of the software, derivative works or modified
          versions, and any portions thereof, and that both notices
          appear in supporting documentation.

          CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS
          IS" CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF
          ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
          THIS SOFTWARE.

          Carnegie Mellon requests users of this software to return to

                Software Distribution Coordinator
                School of Computer Science
                Carnegie Mellon University
                Pittsburgh PA 15213-3890

          or `Software.Distribution@CS.CMU.EDU' any improvements or
          extensions that they make and grant Carnegie Mellon the
          rights to redistribute these changes.

   * The `tar.h' header file was written by David J. MacKenzie.

   * The port to the MIPS DECStation was contributed by Brendan Kehoe
     and Ian Lance Taylor.

   * The DES encryption function `crypt' and related functions were
     donated by Michael Glad.

   * The `ftw' function was contributed by Ian Lance Taylor.

   * The code to support SunOS shared libraries was contributed by Tom
     Quinn.

