@node Maintenance, Contributors, Installation, Top
@c %MENU% How to enhance and port the GNU C Library
@appendix Library Maintenance

@menu
* Source Layout::         How to add new functions or header files
                             to the GNU C library.
* Porting::               How to port the GNU C library to
                             a new machine or operating system.
@end menu

@node Source Layout
@appendixsec Adding New Functions

The process of building the library is driven by the makefiles, which
make heavy use of special features of GNU @code{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 @file{string} subdirectory has all the string-manipulation
functions, @file{math} has all the mathematical functions, etc.

Each subdirectory contains a simple makefile, called @file{Makefile},
which defines a few @code{make} variables and then includes the global
makefile @file{Rules} with a line like:

@smallexample
include ../Rules
@end smallexample

@noindent
The basic variables that a subdirectory makefile defines are:

@table @code
@item subdir
The name of the subdirectory, for example @file{stdio}.
This variable @strong{must} be defined.

@item headers
The names of the header files in this section of the library,
such as @file{stdio.h}.

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

@item tests
The names of test programs for this section of the library.  These
should be simple names, such as @samp{tester} (rather than complete file
names, such as @file{tester.c}).  @w{@samp{make tests}} will build and
run all the test programs.  If a test program needs input, put the test
data in a file called @file{@var{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 @file{@var{test-program}.args}.  Test programs should exit with
zero status when the test passes, and nonzero status when the test
indicates a bug in the library or error in building.

@item 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
@w{@samp{make others}}.@refill

@item install-lib
@itemx install-data
@itemx install
Files to be installed by @w{@samp{make install}}.  Files listed in
@samp{install-lib} are installed in the directory specified by
@samp{libdir} in @file{configparms} or @file{Makeconfig}
(@pxref{Installation}).  Files listed in @code{install-data} are
installed in the directory specified by @samp{datadir} in
@file{configparms} or @file{Makeconfig}.  Files listed in @code{install}
are installed in the directory specified by @samp{bindir} in
@file{configparms} or @file{Makeconfig}.@refill

@item 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 @code{distribute} if there are files used in an unusual way
that should go into the distribution.

@item generated
Files which are generated by @file{Makefile} in this subdirectory.
These files will be removed by @w{@samp{make clean}}, and they will
never go into a distribution.

@item extra-objs
Extra object files which are built by @file{Makefile} in this
subdirectory.  This should be a list of file names like @file{foo.o};
the files will actually be found in whatever directory object files are
being built in.  These files will be removed by @w{@samp{make clean}}.
This variable is used for secondary object files needed to build
@code{others} or @code{tests}.
@end table

@node Porting
@appendixsec 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 @file{sysdeps} under the top-level
library source directory.  This directory contains a hierarchy of
subdirectories (@pxref{Hierarchy Conventions}).

Each subdirectory of @file{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 @file{unix/bsd/vax} is equivalent to specifying the
list @file{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 @file{Implies} exists in a
subdirectory, it lists other subdirectories of @file{sysdeps} which are
appended to the list, appearing after the subdirectory containing the
@file{Implies} file.  Lines in an @file{Implies} file that begin with a
@samp{#} character are ignored as comments.  For example,
@file{unix/bsd/Implies} contains:@refill
@smallexample
# BSD has Internet-related things.
unix/inet
@end smallexample
@noindent
and @file{unix/Implies} contains:
@need 300
@smallexample
posix
@end smallexample

@noindent
So the final list is @file{unix/bsd/vax unix/bsd unix/inet unix posix}.

@file{sysdeps} has a ``special'' subdirectory called @file{generic}.  It
is always implicitly appended to the list of subdirectories, so you
needn't put it in an @file{Implies} file, and you should not create any
subdirectories under it intended to be new specific categories.
@file{generic} serves two purposes.  First, the makefiles do not bother
to look for a system-dependent version of a file that's not in
@file{generic}.  This means that any system-dependent source file must
have an analogue in @file{generic}, even if the routines defined by that
file are not implemented on other platforms.  Second, the @file{generic}
version of a system-dependent file is used if the makefiles do not find
a version specific to the system you're compiling for.

If it is possible to implement the routines in a @file{generic} file in
machine-independent C, using only other machine-independent functions in
the C library, then you should do so.  Otherwise, make them stubs.  A
@dfn{stub} function is a function which cannot be implemented on a
particular machine or operating system.  Stub functions always return an
error, and set @code{errno} to @code{ENOSYS} (Function not implemented).
@xref{Error Reporting}.  If you define a stub function, you must place
the statement @code{stub_warning(@var{function})}, where @var{function}
is the name of your function, after its definition; also, you must
include the file @code{<stub-tag.h>} into your file.  This causes the
function to be listed in the installed @code{<gnu/stubs.h>}, and
makes GNU ld warn when the function is used.

Some rare functions are only useful on specific systems and aren't
defined at all on others; these do not appear anywhere in the
system-independent source code or makefiles (including the
@file{generic} directory), only in the system-dependent @file{Makefile}
in the specific system's subdirectory.

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

There are a few special files that may exist in each subdirectory of
@file{sysdeps}:

@comment Blank lines after items make the table look better.
@table @file
@item Makefile

A makefile for this machine or operating system, or class of machine or
operating system.  This file is included by the library makefile
@file{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 @code{make}
conditional directives based on the variable @samp{subdir} (see above) to
select different sets of variables and rules for different sections of
the library.  It can also set the @code{make} variable
@samp{sysdep-routines}, to specify extra modules to be included in the
library.  You should use @samp{sysdep-routines} rather than adding
modules to @samp{routines} because the latter is used in determining
what to distribute for each subdirectory of the main source tree.@refill

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 @samp{sysdep-routines}
rather than simply setting it:

@smallexample
sysdep-routines := $(sysdep-routines) foo bar
@end smallexample

@need 1000
@item 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 @file{stdio} and
@file{math}.

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

@item configure

This file is a shell script fragment to be run at configuration time.
The top-level @file{configure} script uses the shell @code{.} command to
read the @file{configure} file in each system-dependent directory
chosen, in order.  The @file{configure} files are often generated from
@file{configure.in} files using Autoconf.

A system-dependent @file{configure} script will usually add things to
the shell variables @samp{DEFS} and @samp{config_vars}; see the
top-level @file{configure} script for details.  The script can check for
@w{@samp{--with-@var{package}}} options that were passed to the
top-level @file{configure}.  For an option
@w{@samp{--with-@var{package}=@var{value}}} @file{configure} sets the
shell variable @w{@samp{with_@var{package}}} (with any dashes in
@var{package} converted to underscores) to @var{value}; if the option is
just @w{@samp{--with-@var{package}}} (no argument), then it sets
@w{@samp{with_@var{package}}} to @samp{yes}.

@item configure.in

This file is an Autoconf input fragment to be processed into the file
@file{configure} in this subdirectory.  @xref{Introduction,,,
autoconf.info, Autoconf: Generating Automatic Configuration Scripts},
for a description of Autoconf.  You should write either @file{configure}
or @file{configure.in}, but not both.  The first line of
@file{configure.in} should invoke the @code{m4} macro
@samp{GLIBC_PROVIDES}.  This macro does several @code{AC_PROVIDE} calls
for Autoconf macros which are used by the top-level @file{configure}
script; without this, those macros might be invoked again unnecessarily
by Autoconf.
@end table

That is the general system for how system-dependencies are isolated.
@iftex
The next section explains how to decide what directories in
@file{sysdeps} to use.  @ref{Porting to Unix}, has some tips on porting
the library to Unix variants.
@end iftex

@menu
* Hierarchy Conventions::       The layout of the @file{sysdeps} hierarchy.
* Porting to Unix::             Porting the library to an average
                                   Unix-like system.
@end menu

@node Hierarchy Conventions
@appendixsubsec Layout of the @file{sysdeps} Directory Hierarchy

A GNU configuration name has three parts: the CPU type, the
manufacturer's name, and the operating system.  @file{configure} uses
these to pick the list of system-dependent directories to look for.  If
the @samp{--nfp} option is @emph{not} passed to @file{configure}, the
directory @file{@var{machine}/fpu} is also used.  The operating system
often has a @dfn{base operating system}; for example, if the operating
system is @samp{Linux}, the base operating system is @samp{unix/sysv}.
The algorithm used to pick the list of directories is simple:
@file{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 @w{@samp{i686-linux-gnu}}
results in @file{unix/sysv/linux/i386/i686}.  @file{configure} then
tries removing each element of the list in turn, so
@file{unix/sysv/linux} and @file{unix/sysv} 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 @file{irix6.2} and @file{irix6.3} directories,
@file{configure} tries successively less specific operating system names
by removing trailing suffixes starting with a period.

As an example, here is the complete list of directories that would be
tried for the configuration @w{@samp{i686-linux-gnu}} (with the
@file{crypt} and @file{linuxthreads} add-on):

@smallexample
sysdeps/i386/elf
crypt/sysdeps/unix
linuxthreads/sysdeps/unix/sysv/linux
linuxthreads/sysdeps/pthread
linuxthreads/sysdeps/unix/sysv
linuxthreads/sysdeps/unix
linuxthreads/sysdeps/i386/i686
linuxthreads/sysdeps/i386
linuxthreads/sysdeps/pthread/no-cmpxchg
sysdeps/unix/sysv/linux/i386
sysdeps/unix/sysv/linux
sysdeps/gnu
sysdeps/unix/common
sysdeps/unix/mman
sysdeps/unix/inet
sysdeps/unix/sysv/i386/i686
sysdeps/unix/sysv/i386
sysdeps/unix/sysv
sysdeps/unix/i386
sysdeps/unix
sysdeps/posix
sysdeps/i386/i686
sysdeps/i386/i486
sysdeps/libm-i387/i686
sysdeps/i386/fpu
sysdeps/libm-i387
sysdeps/i386
sysdeps/wordsize-32
sysdeps/ieee754
sysdeps/libm-ieee754
sysdeps/generic
@end smallexample

Different machine architectures are conventionally subdirectories at the
top level of the @file{sysdeps} directory tree.  For example,
@w{@file{sysdeps/sparc}} and @w{@file{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
@w{@file{sysdeps/m68k/68020}}. Code which is specific to the
floating-point coprocessor used with a particular machine should go in
@w{@file{sysdeps/@var{machine}/fpu}}.

There are a few directories at the top level of the @file{sysdeps}
hierarchy that are not for particular machine architectures.

@table @file
@item generic
As described above (@pxref{Porting}), this is the subdirectory
that every configuration implicitly uses after all others.

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

@item libm-ieee754
This directory contains an implementation of a mathematical library
usable on platforms which use @w{IEEE 754} conformant floating-point
arithmetic.

@item libm-i387
This is a special case.  Ideally the code should be in
@file{sysdeps/i386/fpu} but for various reasons it is kept aside.

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

@item unix
This is the directory for Unix-like things.  @xref{Porting to Unix}.
@file{unix} implies @file{posix}.  There are some special-purpose
subdirectories of @file{unix}:

@table @file
@item unix/common
This directory is for things common to both BSD and System V release 4.
Both @file{unix/bsd} and @file{unix/sysv/sysv4} imply @file{unix/common}.

@item unix/inet
This directory is for @code{socket} and related functions on Unix systems.
@file{unix/inet/Subdirs} enables the @file{inet} top-level subdirectory.
@file{unix/common} implies @file{unix/inet}.
@end table

@item 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 @file{sysdeps} hierarchy, parallel to @file{unix} and @file{mach}.
@end table

@node Porting to Unix
@appendixsubsec 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 @file{unix}, at the top
level of the @file{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, which is generated automatically from
specifications in files named @file{syscalls.list}.  There are several
such files, one in @file{sysdeps/unix} and others in its subdirectories.
Some special system calls are implemented in files that are named with a
suffix of @samp{.S}; for example, @file{_exit.S}.  Files ending in
@samp{.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
@file{sysdep.h}.  The @file{sysdep.h} file in @file{sysdeps/unix}
partially defines them; a @file{sysdep.h} file in another directory must
finish defining them for the particular machine and operating system
variant.  See @file{sysdeps/unix/sysdep.h} and the machine-specific
@file{sysdep.h} implementations to see what these macros are and what
they should do.@refill

The system-specific makefile for the @file{unix} directory
(@file{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 @emph{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 @file{ioctls.h}, @file{errnos.h}, @file{sys/param.h}, and
@file{errlist.c} (for the @file{stdio} section of the library).

@ignore
@c This section might be a good idea if it is finished,
@c but there's no point including it as it stands. --rms
@c @appendixsec Compatibility with Traditional C

@c ??? This section is really short now.  Want to keep it? --roland

@c It's not anymore true.  glibc 2.1 cannot be used with K&R compilers.
@c --drepper

Although the GNU C library implements the @w{ISO C} library facilities, you
@emph{can} use the GNU C library with traditional, ``pre-ISO'' C
compilers.  However, you need to be careful because the content and
organization of the GNU C library header files differs from that of
traditional C implementations.  This means you may need to make changes
to your program in order to get it to compile.
@end ignore
