mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
1998-05-18 Ulrich Drepper <drepper@cygnus.com> * iconvdata/TESTS: ISO-2022-KR has not really ASCII as a subset (the designation sequence is disturbing).cvs/glibc-2-1-branch
5 changed files with 401 additions and 404 deletions
@ -1,404 +1,389 @@ |
|||
Library Maintenance |
|||
******************* |
|||
|
|||
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, |
|||
`math' has all the mathematical 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'. 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. |
|||
|
|||
`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'. Files listed in |
|||
`install-lib' are installed in the directory specified by `libdir' |
|||
in `configparms' or `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 |
|||
`configparms' or `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. |
|||
|
|||
`generated' |
|||
Files which are generated by `Makefile' in this subdirectory. |
|||
These files will be removed by `make clean', and they will never |
|||
go into a distribution. |
|||
|
|||
`extra-objs' |
|||
Extra object files which are built by `Makefile' in this |
|||
subdirectory. This should be a list of file names like `foo.o'; |
|||
the files will actually be found in whatever directory object |
|||
files are being built in. These files will be removed by |
|||
`make clean'. This variable is used for secondary object files |
|||
needed to build `others' or `tests'. |
|||
|
|||
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 unix/inet unix posix'. |
|||
|
|||
`sysdeps' has a "special" subdirectory called `generic'. It is |
|||
always implicitly appended to the list of subdirectories, so you |
|||
needn't put it in an `Implies' file, and you should not create any |
|||
subdirectories under it intended to be new specific categories. |
|||
`generic' serves two purposes. First, the makefiles do not bother to |
|||
look for a system-dependent version of a file that's not in `generic'. |
|||
This means that any system-dependent source file must have an analogue |
|||
in `generic', even if the routines defined by that file are not |
|||
implemented on other platforms. Second. the `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 `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 |
|||
"stub" function is a function which cannot be implemented on a |
|||
particular machine or operating system. Stub functions always return an |
|||
error, and set `errno' to `ENOSYS' (Function not implemented). *Note |
|||
Error Reporting::. If you define a stub function, you must place the |
|||
statement `stub_warning(FUNCTION)', where FUNCTION is the name of your |
|||
function, after its definition; also, you must include the file |
|||
`<stub-tag.h>' into your file. This causes the function to be listed |
|||
in the installed `<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 `generic' |
|||
directory), only in the system-dependent `Makefile' in the specific |
|||
system's subdirectory. |
|||
|
|||
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 completely new sets of functions 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 to 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. |
|||
|
|||
`configure' |
|||
This file is a shell script fragment to be run at configuration |
|||
time. The top-level `configure' script uses the shell `.' command |
|||
to read the `configure' file in each system-dependent directory |
|||
chosen, in order. The `configure' files are often generated from |
|||
`configure.in' files using Autoconf. |
|||
|
|||
A system-dependent `configure' script will usually add things to |
|||
the shell variables `DEFS' and `config_vars'; see the top-level |
|||
`configure' script for details. The script can check for |
|||
`--with-PACKAGE' options that were passed to the top-level |
|||
`configure'. For an option `--with-PACKAGE=VALUE' `configure' |
|||
sets the shell variable `with_PACKAGE' (with any dashes in PACKAGE |
|||
converted to underscores) to VALUE; if the option is just |
|||
`--with-PACKAGE' (no argument), then it sets `with_PACKAGE' to |
|||
`yes'. |
|||
|
|||
`configure.in' |
|||
This file is an Autoconf input fragment to be processed into the |
|||
file `configure' in this subdirectory. *Note Introduction: |
|||
(autoconf.info)Introduction, for a description of Autoconf. You |
|||
should write either `configure' or `configure.in', but not both. |
|||
The first line of `configure.in' should invoke the `m4' macro |
|||
`GLIBC_PROVIDES'. This macro does several `AC_PROVIDE' calls for |
|||
Autoconf macros which are used by the top-level `configure' |
|||
script; without this, those macros might be invoked again |
|||
unnecessarily by Autoconf. |
|||
|
|||
That is the general system for how system-dependencies are isolated. |
|||
|
|||
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 `Linux', the |
|||
base operating system is `unix/sysv'. 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 |
|||
`i686-linux-gnu' results in `unix/sysv/linux/i386/i686'. `configure' |
|||
then tries removing each element of the list in turn, so |
|||
`unix/sysv/linux' and `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 `irix6.2' and `irix6.3' directories, `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 `i686-linux-gnu' (with the `crypt' and |
|||
`linuxthreads' add-on): |
|||
|
|||
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 |
|||
|
|||
Different machine architectures are conventionally subdirectories 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' |
|||
As described above (*note Porting::.), this is the subdirectory |
|||
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'. |
|||
|
|||
`libm-ieee754' |
|||
This directory contains an implementation of a mathematical library |
|||
usable on platforms which use IEEE 754 conformant floating-point |
|||
arithmetic. |
|||
|
|||
`libm-i387' |
|||
This is a special case. Ideally the code should be in |
|||
`sysdeps/i386/fpu' but for various reasons it is kept aside. |
|||
|
|||
`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. *Note Porting to |
|||
Unix::. `unix' implies `posix'. There are some special-purpose |
|||
subdirectories of `unix': |
|||
|
|||
`unix/common' |
|||
This directory is for things common to both BSD and System V |
|||
release 4. Both `unix/bsd' and `unix/sysv/sysv4' imply |
|||
`unix/common'. |
|||
|
|||
`unix/inet' |
|||
This directory is for `socket' and related functions on Unix |
|||
systems. `unix/inet/Subdirs' enables the `inet' top-level |
|||
subdirectory. `unix/common' implies `unix/inet'. |
|||
|
|||
`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, which is generated automatically from |
|||
specifications in files named `syscalls.list'. There are several such |
|||
files, one in `sysdeps/unix' and others in its subdirectories. Some |
|||
special system calls are implemented in files that are named with a |
|||
suffix of `.S'; for example, `_exit.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). |
|||
Installing the GNU C Library |
|||
**************************** |
|||
|
|||
Installation of the GNU C library is relatively simple, but usually |
|||
requires several GNU tools to be installed already. |
|||
|
|||
Before you do anything else, you should read the file `FAQ' found 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. |
|||
|
|||
To configure the GNU C library for your system, run the shell script |
|||
`configure' with `sh'. You might use an argument which is the |
|||
conventional GNU name for your system configuration--for example, |
|||
`i486-pc-linux-gnu', for Linux running on i486. *Note Installation: |
|||
(gcc.info)Installation, for a full description of standard GNU |
|||
configuration names. If you omit the configuration name, `configure' |
|||
will try to guess one for you by inspecting the system it is running |
|||
on. It may or may not be able to come up with a guess, and the guess |
|||
might be wrong. `configure' will tell you the canonical name of the |
|||
chosen configuration before proceeding. |
|||
|
|||
Here are some options that you should specify (if appropriate) when |
|||
you run `configure': |
|||
|
|||
`--with-binutils=DIRECTORY' |
|||
Use the binutils (assembler and linker) in `DIRECTORY', not the |
|||
ones the C compiler would default to. You could use this option if |
|||
the default binutils on your system cannot deal with all the |
|||
constructs in the GNU C library. (`configure' will detect the |
|||
problem and suppress these constructs, so the library will still |
|||
be usable, but functionality may be lost--for example, you can not |
|||
build a shared libc with old binutils.) |
|||
|
|||
`--without-fp' |
|||
`--nfp' |
|||
Use this option if your computer lacks hardware floating-point |
|||
support and your operating system does not emulate an FPU. |
|||
|
|||
`--prefix=DIRECTORY' |
|||
Install machine-independent data files in subdirectories of |
|||
`DIRECTORY'. (You can also set this in `configparms'; see below.) |
|||
The default is to install in `/usr/local'. |
|||
|
|||
`--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 default is to use <prefix>/bin and |
|||
<prefix>/sbin. |
|||
|
|||
`--enable-shared' |
|||
`--disable-shared' |
|||
Enable or disable building of an ELF shared library on systems that |
|||
support it. The default is to build the shared library on systems |
|||
using ELF when the GNU `binutils' are available. |
|||
|
|||
`--enable-profile' |
|||
`--disable-profile' |
|||
Enable or disable building of the profiled C library, `-lc_p'. The |
|||
default is to build the profiled library. You may wish to disable |
|||
it if you don't plan to do profiling, because it doubles the build |
|||
time of compiling just the unprofiled static library. |
|||
|
|||
`--enable-omitfp' |
|||
Enable building a highly-optimized but possibly undebuggable C |
|||
library. This causes the normal static and shared (if enabled) C |
|||
libraries to be compiled with maximal optimization, including the |
|||
`-fomit-frame-pointer' switch that makes debugging impossible on |
|||
many machines, and without debugging information (which makes the |
|||
binaries substantially smaller). An additional static library is |
|||
compiled with no optimization and full debugging information, and |
|||
installed as `-lc_g'. |
|||
|
|||
`--enable-add-ons[=LIST]' |
|||
Certain components of the C library are distributed separately |
|||
from the rest of the sources. In particular, the `crypt' function |
|||
and its friends are separated due to US export control |
|||
regulations, and the threading support code for Linux is |
|||
maintained separately. You can get these "add-on" packages from |
|||
the same place you got the libc sources. To use them, unpack them |
|||
into your source tree, and give `configure' the `--enable-add-ons' |
|||
option. |
|||
|
|||
If you do not wish to use some add-on package that you have |
|||
present in your source tree, give this option a list of the |
|||
add-ons that you *do* want used, like this: |
|||
`--enable-add-ons=crypt,linuxthreads' |
|||
|
|||
`--with-headers=DIRECTORY' |
|||
Search only DIRECTORY and the C compiler's private directory for |
|||
header files not found in the libc sources. `/usr/include' will |
|||
not be searched if this option is given. On Linux, DIRECTORY |
|||
should be the kernel's private include directory (usually |
|||
`/usr/src/linux/include'). |
|||
|
|||
This option is primarily of use on a system where the headers in |
|||
`/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 `/usr/include'. |
|||
|
|||
You should not build the library in the same directory as the |
|||
sources, because there are bugs in `make clean'. Make a directory for |
|||
the build, and run `configure' from that directory, like this: |
|||
|
|||
mkdir linux |
|||
cd linux |
|||
../configure |
|||
|
|||
`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 `configparms'; see the comments in that |
|||
file for the details. To change them, copy `configparms' into your |
|||
build directory and modify it as appropriate for your system. |
|||
`configure' will not notice your modifications if you change the file |
|||
in the source directory. |
|||
|
|||
It is easy to configure the GNU C library for cross-compilation by |
|||
setting a few variables in `configparms'. Set `CC' to the |
|||
cross-compiler for the target you configured the library for; it is |
|||
important to use this same `CC' value when running `configure', like |
|||
this: `CC=TARGET-gcc configure TARGET'. Set `BUILD_CC' to the compiler |
|||
to use for for programs run on the build system as part of compiling |
|||
the library. You may need to set `AR' and `RANLIB' to cross-compiling |
|||
versions of `ar' and `ranlib' if the native tools are not configured to |
|||
work with object files for the target you configured for. |
|||
|
|||
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 related programs, type `make'. This will |
|||
produce a lot of output, some of which may look like errors from `make' |
|||
(but isn't). Look for error messages from `make' containing `***'. |
|||
Those indicate that something is really wrong. |
|||
|
|||
The compilation process takes several hours even on fast hardware; |
|||
expect at least two hours for the default configuration on i586 for |
|||
Linux. For Hurd times are much longer. All current releases of GCC |
|||
have a problem which causes them to take several minutes to compile |
|||
certain files in the iconvdata directory. Do not panic if the compiler |
|||
appears to hang. |
|||
|
|||
To build and run some test programs which exercise some of the |
|||
library facilities, type `make check'. This will produce several files |
|||
with names like `PROGRAM.out'. |
|||
|
|||
To format the `GNU C Library Reference Manual' for printing, type |
|||
`make dvi'. You need a working TeX installation to do this. |
|||
|
|||
To install the library and its header files, and the Info files of |
|||
the manual, type `make install'. This will build things if necessary, |
|||
before installing them. If you want to install the files in a different |
|||
place than the one specified at configuration time you can specify a |
|||
value for the Makefile variable `install_root' on the command line. |
|||
This is useful to create chroot'ed environment or to prepare binary |
|||
releases. |
|||
|
|||
For now (in this alpha version, and at least on RedHat Linux), if you |
|||
are trying to install this as your default libraries, a different |
|||
installation method is recommended. Move `/usr/include' out of the |
|||
way, create a new `/usr/include' directory (don't forget the symlinks |
|||
`/usr/include/asm' and `/usr/include/linux', that should point to |
|||
`/usr/src/linux/include/asm' and `/usr/src/linux/include/linux' -or |
|||
wherever you keep your kernel sources-respectively), build normally and |
|||
install into somewhere else via `install_root'. Then move your |
|||
`/usr/include' back, and copy the newly created stuff by hand over the |
|||
old. Remember to copy programs and shared libraries into `FILENAME.new' |
|||
and then move `FILENAME.new' to `FILENAME', as the files might be in |
|||
use. You will have to `ranlib' your copies of the static libraries |
|||
`/usr/lib/libNAME.a'. You will see that `libbsd-compat.a', `libieee.a', |
|||
and `libmcheck.a' are just object files, not archives. This is normal. |
|||
Copy the new header files over the old ones by something like |
|||
`cd /usr; (cd INSTALL_ROOT; tar cf - include) | tar xf -'. |
|||
|
|||
Recommended Tools to Install the GNU C Library |
|||
============================================== |
|||
|
|||
We recommend installing the following GNU tools before attempting to |
|||
build the GNU C library: |
|||
|
|||
* GNU `make' 3.75 |
|||
|
|||
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.* We recommend |
|||
version GNU `make' version 3.75. Versions 3.76 and 3.76.1 are |
|||
known to have bugs which only show up in big projects like GNU |
|||
`libc'. |
|||
|
|||
* GCC 2.8.1/EGCS 1.0.2 |
|||
|
|||
On most platforms, the GNU C library can only be compiled with the |
|||
GNU C compiler family. We recommend GCC version 2.8.1 and EGCS |
|||
version 1.0.2 or later versions of these two; earlier versions may |
|||
have problems. |
|||
|
|||
* GNU `binutils' 2.8.1.0.23 |
|||
|
|||
Using the GNU `binutils' (assembler, linker, and related tools) is |
|||
preferable when possible, and they are required to build an ELF |
|||
shared C library. Version 2.1 of the library uses ELF symbol |
|||
versioning extensively. Support for this feature is incomplete or |
|||
buggy before binutils 2.8.1.0.23, so you must use at least this |
|||
version. |
|||
|
|||
* GNU `texinfo' 3.11 |
|||
|
|||
To correctly translate and install the Texinfo documentation you |
|||
need this version of the `texinfo' package. Earlier versions do |
|||
not understand all the tags used in the document, and the |
|||
installation mechanisms for the info files is not present or works |
|||
differently. |
|||
|
|||
On some Debian Linux based systems the `install-info' program |
|||
supplied with the system works differently from the one we expect. |
|||
You must therefore run `make install' like this: |
|||
|
|||
make INSTALL_INFO=/path/to/GNU/install-info install |
|||
|
|||
* GNU `awk' 3.0 |
|||
|
|||
Several files used during the build are generated using features |
|||
of GNU `awk' that are not found in other implementations. |
|||
|
|||
If you change any of the `configure.in' files you will also need |
|||
|
|||
* GNU `autoconf' 2.12 |
|||
|
|||
and if you change any of the message translation files you will need |
|||
|
|||
* GNU `gettext' 0.10 or later |
|||
|
|||
You may also need these packages if you upgrade your source tree using |
|||
patches, although we try to avoid this. |
|||
|
|||
Supported Configurations |
|||
======================== |
|||
|
|||
The GNU C Library currently supports configurations that match the |
|||
following patterns: |
|||
|
|||
alpha-ANYTHING-linux |
|||
arm-ANYTHING-linuxaout |
|||
arm-ANYTHING-none |
|||
iX86-ANYTHING-gnu |
|||
iX86-ANYTHING-linux |
|||
m68k-ANYTHING-linux |
|||
powerpc-ANYTHING-linux |
|||
sparc-ANYTHING-linux |
|||
sparc64-ANYTHING-linux |
|||
|
|||
Former releases of this library (version 1.09.1 and perhaps earlier |
|||
versions) used to run on the following configurations: |
|||
|
|||
alpha-dec-osf1 |
|||
alpha-ANYTHING-linuxecoff |
|||
iX86-ANYTHING-bsd4.3 |
|||
iX86-ANYTHING-isc2.2 |
|||
iX86-ANYTHING-isc3.N |
|||
iX86-ANYTHING-sco3.2 |
|||
iX86-ANYTHING-sco3.2v4 |
|||
iX86-ANYTHING-sysv |
|||
iX86-ANYTHING-sysv4 |
|||
iX86-force_cpu386-none |
|||
iX86-sequent-bsd |
|||
i960-nindy960-none |
|||
m68k-hp-bsd4.3 |
|||
m68k-mvme135-none |
|||
m68k-mvme136-none |
|||
m68k-sony-newsos3 |
|||
m68k-sony-newsos4 |
|||
m68k-sun-sunos4.N |
|||
mips-dec-ultrix4.N |
|||
mips-sgi-irix4.N |
|||
sparc-sun-solaris2.N |
|||
sparc-sun-sunos4.N |
|||
|
|||
Since no one has volunteered to test and fix these configurations, |
|||
they are not supported at the moment. They probably don't compile; |
|||
they definitely don't work anymore. Porting the library is not hard. |
|||
If you are interested in doing a port, please contact the glibc |
|||
maintainers by sending electronic mail to <bug-glibc@gnu.org>. |
|||
|
|||
Each case of `iX86' can be `i386', `i486', `i586', or `i686'. All |
|||
of those configurations produce a library that can run on any of these |
|||
processors. The library will be optimized for the specified processor, |
|||
but will not use instructions not available on all of them. |
|||
|
|||
While no other configurations are supported, there are handy aliases |
|||
for these few. (These aliases work in other GNU software as well.) |
|||
|
|||
decstation |
|||
hp320-bsd4.3 hp300bsd |
|||
i486-gnu |
|||
i586-linux |
|||
i386-sco |
|||
i386-sco3.2v4 |
|||
i386-sequent-dynix |
|||
i386-svr4 |
|||
news |
|||
sun3-sunos4.N sun3 |
|||
sun4-solaris2.N sun4-sunos5.N |
|||
sun4-sunos4.N sun4 |
|||
|
|||
Useful hints for the installation |
|||
================================= |
|||
|
|||
There are a some more or less obvious methods one should know when |
|||
compiling GNU libc: |
|||
|
|||
* Better never compile in the source directory. Create a new |
|||
directory and run the `configure' from there. Everything should |
|||
happen automagically. |
|||
|
|||
* You can use the `-j' option of GNU make by changing the line |
|||
specifying `PARALLELMAKE' in the Makefile generated during the |
|||
configuration. |
|||
|
|||
It is not useful to start the `make' process using the `-j' option |
|||
since this option is not propagated down to the sub-`make's. |
|||
|
|||
* If you made some changes after a complete build and only want to |
|||
check these changes run `make' while specifying the list of |
|||
subdirs it has to visit. |
|||
|
|||
make subdirs="nss elf" |
|||
|
|||
The above build run will only visit the subdirectories `nss' and |
|||
`elf'. Beside this it updates the `libc' files itself. |
|||
|
|||
Reporting Bugs |
|||
============== |
|||
|
|||
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. |
|||
|
|||
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. Also include the files `config.status' |
|||
and `config.make' which are created by running `configure'; they will |
|||
be in whatever directory was current when you ran `configure'. |
|||
|
|||
If you think you have found some way in which the GNU C library does |
|||
not conform to the ISO and POSIX standards (*note Standards and |
|||
Portability::.), that is definitely a bug. Report it! |
|||
|
|||
Send bug reports to the Internet address <bug-glibc@gnu.org> using |
|||
the `glibcbug' script which is installed by the GNU C library. If you |
|||
have other problems with installation or use, please report those as |
|||
well. |
|||
|
|||
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 Internet |
|||
address <bug-glibc-manual@gnu.org>. If you refer to specific sections |
|||
when reporting on the manual, please include the section names for |
|||
easier identification. |
|||
|
|||
|
|||
Loading…
Reference in new issue