@c This is for making the `INSTALL' file for the distribution.
@c Makeinfo ignores it when processing the file from the include.
@setfilename INSTALL

@node Installation, Maintenance, Library Summary, Top
@c %MENU% How to install the GNU C library
@appendix Installing the GNU C Library

Before you do anything else, you should read the file @file{FAQ} located
at the top level of the source tree.  This file answers common questions
and describes problems you may experience with compilation and
installation.  It is updated more frequently than this manual.

Features can be added to GNU Libc via @dfn{add-on} bundles.  These are
separate tar files, which you unpack into the top level of the source
tree.  Then you give @code{configure} the @samp{--enable-add-ons} option
to activate them, and they will be compiled into the library.

You will need recent versions of several GNU tools: definitely GCC and
GNU Make, and possibly others.  @xref{Tools for Compilation}, below.

@menu
* Configuring and compiling::   How to compile and test GNU libc.
* Running make install::        How to install it once you've got it
 compiled.
* Tools for Compilation::       You'll need these first.
* Linux::                       Specific advice for GNU/Linux systems.
* Reporting Bugs::              So they'll get fixed.
@end menu

@node Configuring and compiling
@appendixsec Configuring and compiling GNU Libc
@cindex configuring
@cindex compiling

GNU libc cannot be compiled in the source directory.  You must build
it in a separate build directory.  For example, if you have unpacked
the glibc sources in @file{/src/gnu/glibc-2.4}, create a directory
@file{/src/gnu/glibc-build} to put the object files in.  This allows
removing the whole build directory in case an error occurs, which is
the safest way to get a fresh start and should always be done.

From your object directory, run the shell script @file{configure} located
at the top level of the source tree.  In the scenario above, you'd type

@smallexample
$ ../glibc-2.4/configure @var{args@dots{}}
@end smallexample

Please note that even though you're building in a separate build
directory, the compilation needs to modify a few files in the source
directory, especially some files in the manual subdirectory.

@noindent
@code{configure} takes many options, but the only one that is usually
mandatory is @samp{--prefix}.  This option tells @code{configure}
where you want glibc installed.  This defaults to @file{/usr/local},
but the normal setting to install as the standard system library is
@samp{--prefix=/usr} for GNU/Linux systems and @samp{--prefix=} (an
empty prefix) for GNU/Hurd systems.

It may also be useful to set the @var{CC} and @var{CFLAGS} variables in
the environment when running @code{configure}.  @var{CC} selects the C
compiler that will be used, and @var{CFLAGS} sets optimization options
for the compiler.

The following list describes all of the available options for
 @code{configure}:

@table @samp
@item --prefix=@var{directory}
Install machine-independent data files in subdirectories of
@file{@var{directory}}.  The default is to install in @file{/usr/local}.

@item --exec-prefix=@var{directory}
Install the library and other machine-dependent files in subdirectories
of @file{@var{directory}}.  The default is to the @samp{--prefix}
directory if that option is specified, or @file{/usr/local} otherwise.

@item --with-headers=@var{directory}
Look for kernel header files in @var{directory}, not
@file{/usr/include}.  Glibc needs information from the kernel's private
header files.  Glibc will normally look in @file{/usr/include} for them,
but if you specify this option, it will look in @var{DIRECTORY} instead.

This option is primarily of use on a system where the headers in
@file{/usr/include} come from an older version of glibc.  Conflicts can
occasionally happen in this case.  Note that Linux libc5 qualifies as an
older version of glibc.  You can also use this option if you want to
compile glibc with a newer set of kernel headers than the ones found in
@file{/usr/include}.

@item --enable-add-ons[=@var{list}]
Specify add-on packages to include in the build.  If this option is
specified with no list, it enables all the add-on packages it finds in
the main source directory; this is the default behavior.  You may
specify an explicit list of add-ons to use in @var{list}, separated by
spaces or commas (if you use spaces, remember to quote them from the
shell).  Each add-on in @var{list} can be an absolute directory name
or can be a directory name relative to the main source directory, or
relative to the build directory (that is, the current working directory).
For example, @samp{--enable-add-ons=nptl,../glibc-libidn-2.4}.

@item --enable-kernel=@var{version}
This option is currently only useful on GNU/Linux systems.  The
@var{version} parameter should have the form X.Y.Z and describes the
smallest version of the Linux kernel the generated library is expected
to support.  The higher the @var{version} number is, the less
compatibility code is added, and the faster the code gets.

@item --with-binutils=@var{directory}
Use the binutils (assembler and linker) in @file{@var{directory}}, not
the ones the C compiler would default to.  You can use this option if
the default binutils on your system cannot deal with all the constructs
in the GNU C library.  In that case, @code{configure} will detect the
problem and suppress these constructs, so that the library will still be
usable, but functionality may be lost---for example, you can't build a
shared libc with old binutils.

@item --without-fp
Use this option if your computer lacks hardware floating-point support
and your operating system does not emulate an FPU.

@c disable static doesn't work currently
@c @item --disable-static
@c Don't build static libraries.  Static libraries aren't that useful
 these
@c days, but we recommend you build them in case you need them.

@item --disable-shared
Don't build shared libraries even if it is possible.  Not all systems
support shared libraries; you need ELF support and (currently) the GNU
linker.

@item --disable-profile
Don't build libraries with profiling information.  You may want to use
this option if you don't plan to do profiling.

@item --enable-omitfp
Use maximum optimization for the normal (static and shared)
libraries, and compile separate static libraries with debugging
information and no optimization.  We recommend not doing this.  The extra
optimization doesn't gain you much, it may provoke compiler bugs, and you
won't be able to trace bugs through the C library.

@item --disable-versioning
Don't compile the shared libraries with symbol version information.
Doing this will make the resulting library incompatible with old
binaries, so it's not recommended.

@item --enable-static-nss
Compile static versions of the NSS (Name Service Switch) libraries.
This is not recommended because it defeats the purpose of NSS; a program
linked statically with the NSS libraries cannot be dynamically
reconfigured to use a different name database.

@item --without-tls
By default the C library is built with support for thread-local storage
if the used tools support it.  By using @samp{--without-tls} this can be
prevented though there generally is no reason since it creates
compatibility problems.

@item --build=@var{build-system}
@itemx --host=@var{host-system}
These options are for cross-compiling.  If you specify both options and
@var{build-system} is different from @var{host-system}, @code{configure}
will prepare to cross-compile glibc from @var{build-system} to be used
on @var{host-system}.  You'll probably need the @samp{--with-headers}
option too, and you may have to override @var{configure}'s selection of
the compiler and/or binutils.

If you only specify @samp{--host}, @code{configure} will prepare for a
native compile but use what you specify instead of guessing what your
system is. This is most useful to change the CPU submodel.  For example,
if @code{configure} guesses your machine as @code{i586-pc-linux-gnu} but
you want to compile a library for 386es, give
@samp{--host=i386-pc-linux-gnu} or just @samp{--host=i386-linux} and add
the appropriate compiler flags (@samp{-mcpu=i386} will do the trick) to
@var{CFLAGS}.

If you specify just @samp{--build}, @code{configure} will get confused.
@end table

To build the library and related programs, type @code{make}.  This will
produce a lot of output, some of which may look like errors from
@code{make} but isn't.  Look for error messages from @code{make}
containing @samp{***}.  Those indicate that something is seriously wrong.

The compilation process can take a long time, depending on the
configuration and the speed of your machine.  Some complex modules may
take a very long time to compile, as much as several minutes on slower
machines.  Do not panic if the compiler appears to hang.

If you want to run a parallel make, simply pass the @samp{-j} option
with an appropriate numeric parameter to @code{make}.  You need a recent
GNU @code{make} version, though.

To build and run test programs which exercise some of the library
facilities, type @code{make check}.  If it does not complete
successfully, do not use the built library, and report a bug after
verifying that the problem is not already known.  @xref{Reporting Bugs},
for instructions on reporting bugs.  Note that some of the tests assume
they are not being run by @code{root}.  We recommend you compile and
test glibc as an unprivileged user.

Before reporting bugs make sure there is no problem with your system.
The tests (and later installation) use some pre-existing files of the
system such as @file{/etc/passwd}, @file{/etc/nsswitch.conf} and others.
These files must all contain correct and sensible content.

To format the @cite{GNU C Library Reference Manual} for printing, type
@w{@code{make dvi}}.  You need a working @TeX{} installation to do this.
The distribution already includes the on-line formatted version of the
manual, as Info files.  You can regenerate those with @w{@code{make
info}}, but it shouldn't be necessary.

The library has a number of special-purpose configuration parameters
which you can find in @file{Makeconfig}.  These can be overwritten with
the file @file{configparms}.  To change them, create a
@file{configparms} in your build directory and add values as appropriate
for your system.  The file is included and parsed by @code{make} and has
to follow the conventions for makefiles.

It is easy to configure the GNU C library for cross-compilation by
setting a few variables in @file{configparms}.  Set @code{CC} to the
cross-compiler for the target you configured the library for; it is
important to use this same @code{CC} value when running
@code{configure}, like this: @samp{CC=@var{target}-gcc configure
@var{target}}.  Set @code{BUILD_CC} to the compiler to use for programs
run on the build system as part of compiling the library.  You may need to
set @code{AR} and @code{RANLIB} to cross-compiling versions of @code{ar}
and @code{ranlib} if the native tools are not configured to work with
object files for the target you configured for.


@node Running make install
@appendixsec Installing the C Library
@cindex installing

To install the library and its header files, and the Info files of the
manual, type @code{env LANGUAGE=C LC_ALL=C make install}.  This will
build things, if necessary, before installing them; however, you should
still compile everything first.  If you are installing glibc as your
primary C library, we recommend that you shut the system down to
single-user mode first, and reboot afterward.  This minimizes the risk
of breaking things when the library changes out from underneath.

If you're upgrading from Linux libc5 or some other C library, you need to
replace the @file{/usr/include} with a fresh directory before installing
it.  The new @file{/usr/include} should contain the Linux headers, but
nothing else.

You must first build the library (@samp{make}), optionally check it
(@samp{make check}), switch the include directories and then install
(@samp{make install}).  The steps must be done in this order.  Not moving
the directory before install will result in an unusable mixture of header
files from both libraries, but configuring, building, and checking the
library requires the ability to compile and run programs against the old
library.

If you are upgrading from a previous installation of glibc 2.0 or 2.1,
@samp{make install} will do the entire job.  You do not need to remove
the old includes -- if you want to do so anyway you must then follow the
order given above.

You may also need to reconfigure GCC to work with the new library.  The
easiest way to do that is to figure out the compiler switches to make it
work again (@samp{-Wl,--dynamic-linker=/lib/ld-linux.so.2} should work on
GNU/Linux systems) and use them to recompile gcc.  You can also edit the specs
file (@file{/usr/lib/gcc-lib/@var{TARGET}/@var{VERSION}/specs}), but that
is a bit of a black art.

You can install glibc somewhere other than where you configured it to go
by setting the @code{install_root} variable on the command line for
@samp{make install}.  The value of this variable is prepended to all the
paths for installation.  This is useful when setting up a chroot
environment or preparing a binary distribution.  The directory should be
specified with an absolute file name.

Glibc 2.2 includes a daemon called @code{nscd}, which you
may or may not want to run.  @code{nscd} caches name service lookups; it
can dramatically improve performance with NIS+, and may help with DNS as
well.

One auxiliary program, @file{/usr/libexec/pt_chown}, is installed setuid
@code{root}.  This program is invoked by the @code{grantpt} function; it
sets the permissions on a pseudoterminal so it can be used by the
calling process.  This means programs like @code{xterm} and
@code{screen} do not have to be setuid to get a pty.  (There may be
other reasons why they need privileges.)  If you are using a 2.1 or
newer Linux kernel with the @code{devptsfs} or @code{devfs} filesystems
providing pty slaves, you don't need this program; otherwise you do.
The source for @file{pt_chown} is in @file{login/programs/pt_chown.c}.

After installation you might want to configure the timezone and locale
installation of your system.  The GNU C library comes with a locale
database which gets configured with @code{localedef}.  For example, to
set up a German locale with name @code{de_DE}, simply issue the command
@samp{localedef -i de_DE -f ISO-8859-1 de_DE}.  To configure all locales
that are supported by glibc, you can issue from your build directory the
command @samp{make localedata/install-locales}.

To configure the locally used timezone, set the @code{TZ} environment
variable.  The script @code{tzselect} helps you to select the right value.
As an example, for Germany, @code{tzselect} would tell you to use
@samp{TZ='Europe/Berlin'}.  For a system wide installation (the given
paths are for an installation with @samp{--prefix=/usr}), link the
timezone file which is in @file{/usr/share/zoneinfo} to the file
@file{/etc/localtime}.  For Germany, you might execute @samp{ln -s
/usr/share/zoneinfo/Europe/Berlin /etc/localtime}.

@node Tools for Compilation
@appendixsec Recommended Tools for Compilation
@cindex installation tools
@cindex tools, for installing library

We recommend installing the following GNU tools before attempting to
build the GNU C library:

@itemize @bullet
@item
GNU @code{make} 3.79 or newer

You need the latest version of GNU @code{make}.  Modifying the GNU C
Library to work with other @code{make} programs would be so difficult that
we recommend you port GNU @code{make} instead.  @strong{Really.}  We
recommend GNU @code{make} version 3.79.  All earlier versions have severe
bugs or lack features.

@item
GCC 3.4 or newer, GCC 4.1 recommended

For the 2.4 release or later, GCC 3.4 or higher is required; as of this
writing, GCC 4.4 is the compiler we advise to use for current versions.
On certain machines including @code{powerpc64}, compilers prior to GCC
4.0 have bugs that prevent them compiling the C library code in the
2.4 release.  On other machines, GCC 4.1 is required to build the C
library with support for the correct @code{long double} type format;
these include @code{powerpc} (32 bit), @code{s390} and @code{s390x}.  For
other architectures special compiler-provided headers are needed
(like @file{cpuid.h} on x86) which only come with later compiler versions.

You can use whatever compiler you like to compile programs that use GNU
libc, but be aware that both GCC 2.7 and 2.8 have bugs in their
floating-point support that may be triggered by the math library.

Check the FAQ for any special compiler issues on particular platforms.

@item
GNU @code{binutils} 2.15 or later

You must use GNU @code{binutils} (as and ld) to build the GNU C library.
No other assembler or linker has the necessary functionality at the
moment.

@item
GNU @code{texinfo} 3.12f

To correctly translate and install the Texinfo documentation you need
this version of the @code{texinfo} package.  Earlier versions do not
understand all the tags used in the document, and the installation
mechanism for the info files is not present or works differently.

@item
GNU @code{awk} 3.0, or higher

@code{Awk} is used in several places to generate files.
@code{gawk} 3.0 is known to work.

@item
Perl 5

Perl is not required, but it is used if present to test the
installation.  We may decide to use it elsewhere in the future.

@item
GNU @code{sed} 3.02 or newer

@code{Sed} is used in several places to generate files.  Most scripts work
with any version of @code{sed}.  The known exception is the script
@code{po2test.sed} in the @code{intl} subdirectory which is used to
generate @code{msgs.h} for the test suite.  This script works correctly
only with GNU @code{sed} 3.02.  If you like to run the test suite, you
should definitely upgrade @code{sed}.

@end itemize

@noindent
If you change any of the @file{configure.in} files you will also need

@itemize @bullet
@item
GNU @code{autoconf} 2.53 or higher
@end itemize

@noindent
and if you change any of the message translation files you will need

@itemize @bullet
@item
GNU @code{gettext} 0.10.36 or later
@end itemize

@noindent
You may also need these packages if you upgrade your source tree using
patches, although we try to avoid this.

@node Linux
@appendixsec Specific advice for GNU/Linux systems
@cindex upgrading from libc5
@cindex kernel header files

If you are installing GNU libc on a GNU/Linux system, you need to have the
header files from a 2.2 or newer kernel around for reference.  For some
architectures, like ia64, sh and hppa, you need at least headers from
kernel 2.3.99 (sh and hppa) or 2.4.0 (ia64).  You do not need to use
that kernel, just have its headers where glibc can access at them.  The
easiest way to do this is to unpack it in a directory such as
@file{/usr/src/linux-2.2.1}.  In that directory, run @samp{make config}
and accept all the defaults.  Then run @samp{make
include/linux/version.h}.  Finally, configure glibc with the option
@samp{--with-headers=/usr/src/linux-2.2.1/include}.  Use the most recent
kernel you can get your hands on.

An alternate tactic is to unpack the 2.2 kernel and run @samp{make
config} as above; then, rename or delete @file{/usr/include}, create a
new @file{/usr/include}, and make symbolic links of
@file{/usr/include/linux} and @file{/usr/include/asm} into the kernel
sources.  You can then configure glibc with no special options.  This
tactic is recommended if you are upgrading from libc5, since you need to
get rid of the old header files anyway.

After installing GNU libc, you may need to remove or rename
@file{/usr/include/linux} and @file{/usr/include/asm}, and replace them
with copies of @file{include/linux} and
@file{include/asm-$@var{ARCHITECTURE}} taken from the Linux source
package which supplied kernel headers for building the library.
@var{ARCHITECTURE} will be the machine architecture for which the
library was built, such as @samp{i386} or @samp{alpha}.  You do not need
to do this if you did not specify an alternate kernel header source
using @samp{--with-headers}.  The intent here is that these directories
should be copies of, @strong{not} symlinks to, the kernel headers used to
build the library.

Note that @file{/usr/include/net} and @file{/usr/include/scsi} should
@strong{not} be symlinks into the kernel sources.  GNU libc provides its
own versions of these files.

GNU/Linux expects some components of the libc installation to be in
@file{/lib} and some in @file{/usr/lib}.  This is handled automatically
if you configure glibc with @samp{--prefix=/usr}.  If you set some other
prefix or allow it to default to @file{/usr/local}, then all the
components are installed there.

If you are upgrading from libc5, you need to recompile every shared
library on your system against the new library for the sake of new code,
but keep the old libraries around for old binaries to use.  This is
complicated and difficult.  Consult the Glibc2 HOWTO at
@url{http://www.imaxx.net/~thrytis/glibc} for details.

You cannot use @code{nscd} with 2.0 kernels, due to bugs in the
kernel-side thread support.  @code{nscd} happens to hit these bugs
particularly hard, but you might have problems with any threaded
program.

@node Reporting Bugs
@appendixsec Reporting Bugs
@cindex reporting bugs
@cindex bugs, reporting

There are probably bugs in the GNU C library.  There are certainly
errors and omissions in this manual.  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.

It is a good idea to verify that the problem has not already been
reported.  Bugs are documented in two places: The file @file{BUGS}
describes a number of well known bugs and the bug tracking system has a
WWW interface at
@url{http://sources.redhat.com/bugzilla/}.  The WWW
interface gives you access to open and closed reports.  A closed report
normally includes a patch or a hint on solving the problem.

To report a bug, first you must find it.  With any luck, 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.  It might not be the GNU library.  Many historical
Unix C libraries permit things that we don't, such as closing a file
twice.

If you think you have found some way in which the GNU C library does not
conform to the ISO and POSIX standards (@pxref{Standards and
Portability}), that is definitely a bug.  Report it!

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.
Do this using the WWW interface to the bug database.

If you are not sure how a function should behave, and this manual
doesn't tell you, that's a bug in the manual.  Report that too!  If the
function's behavior disagrees with the manual, then either the library
or the manual has a bug, so report the disagreement.  If you find any
errors or omissions in this manual, please report them to the
bug database.  If you refer to specific
sections of the manual, please include the section names for easier
identification.
