]> git.ipfire.org Git - thirdparty/glibc.git/blame - manual/maint.texi
.
[thirdparty/glibc.git] / manual / maint.texi
CommitLineData
3c20b9b6 1@node Maintenance, Contributors, Installation, Top
7a68c94a 2@c %MENU% How to enhance and port the GNU C Library
28f540f4
RM
3@appendix Library Maintenance
4
5@menu
28f540f4
RM
6* Source Layout:: How to add new functions or header files
7 to the GNU C library.
8* Porting:: How to port the GNU C library to
9 a new machine or operating system.
7da3079b 10@end menu
28f540f4 11
28f540f4
RM
12@node Source Layout
13@appendixsec Adding New Functions
14
15The process of building the library is driven by the makefiles, which
16make heavy use of special features of GNU @code{make}. The makefiles
17are very complex, and you probably don't want to try to understand them.
18But what they do is fairly straightforward, and only requires that you
19define a few variables in the right places.
20
21The library sources are divided into subdirectories, grouped by topic.
41f27456 22
28f540f4 23The @file{string} subdirectory has all the string-manipulation
41f27456 24functions, @file{math} has all the mathematical functions, etc.
28f540f4
RM
25
26Each subdirectory contains a simple makefile, called @file{Makefile},
27which defines a few @code{make} variables and then includes the global
28makefile @file{Rules} with a line like:
29
30@smallexample
31include ../Rules
32@end smallexample
33
34@noindent
35The basic variables that a subdirectory makefile defines are:
36
37@table @code
38@item subdir
39The name of the subdirectory, for example @file{stdio}.
40This variable @strong{must} be defined.
41
42@item headers
43The names of the header files in this section of the library,
44such as @file{stdio.h}.
45
46@item routines
47@itemx aux
48The names of the modules (source files) in this section of the library.
49These should be simple names, such as @samp{strlen} (rather than
50complete file names, such as @file{strlen.c}). Use @code{routines} for
51modules that define functions in the library, and @code{aux} for
52auxiliary modules containing things like data definitions. But the
53values of @code{routines} and @code{aux} are just concatenated, so there
54really is no practical difference.@refill
55
56@item tests
57The names of test programs for this section of the library. These
58should be simple names, such as @samp{tester} (rather than complete file
59names, such as @file{tester.c}). @w{@samp{make tests}} will build and
60run all the test programs. If a test program needs input, put the test
61data in a file called @file{@var{test-program}.input}; it will be given to
62the test program on its standard input. If a test program wants to be
63run with arguments, put the arguments (all on a single line) in a file
41f27456
RM
64called @file{@var{test-program}.args}. Test programs should exit with
65zero status when the test passes, and nonzero status when the test
66indicates a bug in the library or error in building.
28f540f4
RM
67
68@item others
69The names of ``other'' programs associated with this section of the
70library. These are programs which are not tests per se, but are other
71small programs included with the library. They are built by
72@w{@samp{make others}}.@refill
73
74@item install-lib
75@itemx install-data
76@itemx install
77Files to be installed by @w{@samp{make install}}. Files listed in
78@samp{install-lib} are installed in the directory specified by
79@samp{libdir} in @file{configparms} or @file{Makeconfig}
80(@pxref{Installation}). Files listed in @code{install-data} are
81installed in the directory specified by @samp{datadir} in
82@file{configparms} or @file{Makeconfig}. Files listed in @code{install}
83are installed in the directory specified by @samp{bindir} in
84@file{configparms} or @file{Makeconfig}.@refill
85
86@item distribute
87Other files from this subdirectory which should be put into a
88distribution tar file. You need not list here the makefile itself or
89the source and header files listed in the other standard variables.
90Only define @code{distribute} if there are files used in an unusual way
91that should go into the distribution.
92
93@item generated
94Files which are generated by @file{Makefile} in this subdirectory.
95These files will be removed by @w{@samp{make clean}}, and they will
96never go into a distribution.
97
98@item extra-objs
99Extra object files which are built by @file{Makefile} in this
100subdirectory. This should be a list of file names like @file{foo.o};
101the files will actually be found in whatever directory object files are
102being built in. These files will be removed by @w{@samp{make clean}}.
103This variable is used for secondary object files needed to build
104@code{others} or @code{tests}.
105@end table
106
107@node Porting
108@appendixsec Porting the GNU C Library
109
110The GNU C library is written to be easily portable to a variety of
111machines and operating systems. Machine- and operating system-dependent
112functions are well separated to make it easy to add implementations for
113new machines or operating systems. This section describes the layout of
114the library source tree and explains the mechanisms used to select
115machine-dependent code to use.
116
117All the machine-dependent and operating system-dependent files in the
118library are in the subdirectory @file{sysdeps} under the top-level
119library source directory. This directory contains a hierarchy of
120subdirectories (@pxref{Hierarchy Conventions}).
121
122Each subdirectory of @file{sysdeps} contains source files for a
123particular machine or operating system, or for a class of machine or
124operating system (for example, systems by a particular vendor, or all
125machines that use IEEE 754 floating-point format). A configuration
126specifies an ordered list of these subdirectories. Each subdirectory
127implicitly appends its parent directory to the list. For example,
128specifying the list @file{unix/bsd/vax} is equivalent to specifying the
129list @file{unix/bsd/vax unix/bsd unix}. A subdirectory can also specify
130that it implies other subdirectories which are not directly above it in
131the directory hierarchy. If the file @file{Implies} exists in a
132subdirectory, it lists other subdirectories of @file{sysdeps} which are
133appended to the list, appearing after the subdirectory containing the
134@file{Implies} file. Lines in an @file{Implies} file that begin with a
135@samp{#} character are ignored as comments. For example,
136@file{unix/bsd/Implies} contains:@refill
137@smallexample
138# BSD has Internet-related things.
139unix/inet
140@end smallexample
141@noindent
142and @file{unix/Implies} contains:
143@need 300
144@smallexample
145posix
146@end smallexample
147
148@noindent
149So the final list is @file{unix/bsd/vax unix/bsd unix/inet unix posix}.
150
f2ea0f5b
UD
151@file{sysdeps} has a ``special'' subdirectory called @file{generic}. It
152is always implicitly appended to the list of subdirectories, so you
153needn't put it in an @file{Implies} file, and you should not create any
154subdirectories under it intended to be new specific categories.
155@file{generic} serves two purposes. First, the makefiles do not bother
156to look for a system-dependent version of a file that's not in
157@file{generic}. This means that any system-dependent source file must
158have an analogue in @file{generic}, even if the routines defined by that
32c075e1 159file are not implemented on other platforms. Second. the @file{generic}
f2ea0f5b
UD
160version of a system-dependent file is used if the makefiles do not find
161a version specific to the system you're compiling for.
162
163If it is possible to implement the routines in a @file{generic} file in
164machine-independent C, using only other machine-independent functions in
165the C library, then you should do so. Otherwise, make them stubs. A
166@dfn{stub} function is a function which cannot be implemented on a
167particular machine or operating system. Stub functions always return an
168error, and set @code{errno} to @code{ENOSYS} (Function not implemented).
169@xref{Error Reporting}. If you define a stub function, you must place
170the statement @code{stub_warning(@var{function})}, where @var{function}
171is the name of your function, after its definition; also, you must
172include the file @code{<stub-tag.h>} into your file. This causes the
173function to be listed in the installed @code{<gnu/stubs.h>}, and
174makes GNU ld warn when the function is used.
175
cc3fa755
UD
176Some rare functions are only useful on specific systems and aren't
177defined at all on others; these do not appear anywhere in the
178system-independent source code or makefiles (including the
179@file{generic} directory), only in the system-dependent @file{Makefile}
180in the specific system's subdirectory.
28f540f4
RM
181
182If you come across a file that is in one of the main source directories
183(@file{string}, @file{stdio}, etc.), and you want to write a machine- or
184operating system-dependent version of it, move the file into
185@file{sysdeps/generic} and write your new implementation in the
186appropriate system-specific subdirectory. Note that if a file is to be
187system-dependent, it @strong{must not} appear in one of the main source
188directories.@refill
189
190There are a few special files that may exist in each subdirectory of
191@file{sysdeps}:
192
193@comment Blank lines after items make the table look better.
194@table @file
195@item Makefile
196
197A makefile for this machine or operating system, or class of machine or
198operating system. This file is included by the library makefile
199@file{Makerules}, which is used by the top-level makefile and the
200subdirectory makefiles. It can change the variables set in the
201including makefile or add new rules. It can use GNU @code{make}
202conditional directives based on the variable @samp{subdir} (see above) to
203select different sets of variables and rules for different sections of
204the library. It can also set the @code{make} variable
205@samp{sysdep-routines}, to specify extra modules to be included in the
206library. You should use @samp{sysdep-routines} rather than adding
207modules to @samp{routines} because the latter is used in determining
208what to distribute for each subdirectory of the main source tree.@refill
209
210Each makefile in a subdirectory in the ordered list of subdirectories to
211be searched is included in order. Since several system-dependent
212makefiles may be included, each should append to @samp{sysdep-routines}
213rather than simply setting it:
214
215@smallexample
216sysdep-routines := $(sysdep-routines) foo bar
217@end smallexample
218
219@need 1000
220@item Subdirs
221
222This file contains the names of new whole subdirectories under the
223top-level library source tree that should be included for this system.
224These subdirectories are treated just like the system-independent
225subdirectories in the library source tree, such as @file{stdio} and
226@file{math}.
227
228Use this when there are completely new sets of functions and header
229files that should go into the library for the system this subdirectory
230of @file{sysdeps} implements. For example,
231@file{sysdeps/unix/inet/Subdirs} contains @file{inet}; the @file{inet}
232directory contains various network-oriented operations which only make
233sense to put in the library on systems that support the Internet.@refill
234
28f540f4
RM
235@item configure
236
237This file is a shell script fragment to be run at configuration time.
238The top-level @file{configure} script uses the shell @code{.} command to
239read the @file{configure} file in each system-dependent directory
240chosen, in order. The @file{configure} files are often generated from
241@file{configure.in} files using Autoconf.
242
243A system-dependent @file{configure} script will usually add things to
244the shell variables @samp{DEFS} and @samp{config_vars}; see the
245top-level @file{configure} script for details. The script can check for
246@w{@samp{--with-@var{package}}} options that were passed to the
247top-level @file{configure}. For an option
248@w{@samp{--with-@var{package}=@var{value}}} @file{configure} sets the
249shell variable @w{@samp{with_@var{package}}} (with any dashes in
250@var{package} converted to underscores) to @var{value}; if the option is
251just @w{@samp{--with-@var{package}}} (no argument), then it sets
252@w{@samp{with_@var{package}}} to @samp{yes}.
253
254@item configure.in
255
256This file is an Autoconf input fragment to be processed into the file
257@file{configure} in this subdirectory. @xref{Introduction,,,
258autoconf.info, Autoconf: Generating Automatic Configuration Scripts},
259for a description of Autoconf. You should write either @file{configure}
260or @file{configure.in}, but not both. The first line of
261@file{configure.in} should invoke the @code{m4} macro
262@samp{GLIBC_PROVIDES}. This macro does several @code{AC_PROVIDE} calls
263for Autoconf macros which are used by the top-level @file{configure}
264script; without this, those macros might be invoked again unnecessarily
265by Autoconf.
266@end table
267
268That is the general system for how system-dependencies are isolated.
269@iftex
270The next section explains how to decide what directories in
271@file{sysdeps} to use. @ref{Porting to Unix}, has some tips on porting
272the library to Unix variants.
273@end iftex
274
275@menu
276* Hierarchy Conventions:: The layout of the @file{sysdeps} hierarchy.
277* Porting to Unix:: Porting the library to an average
278 Unix-like system.
279@end menu
280
281@node Hierarchy Conventions
282@appendixsubsec Layout of the @file{sysdeps} Directory Hierarchy
283
284A GNU configuration name has three parts: the CPU type, the
285manufacturer's name, and the operating system. @file{configure} uses
286these to pick the list of system-dependent directories to look for. If
287the @samp{--nfp} option is @emph{not} passed to @file{configure}, the
288directory @file{@var{machine}/fpu} is also used. The operating system
289often has a @dfn{base operating system}; for example, if the operating
68b50604 290system is @samp{Linux}, the base operating system is @samp{unix/sysv}.
28f540f4
RM
291The algorithm used to pick the list of directories is simple:
292@file{configure} makes a list of the base operating system,
293manufacturer, CPU type, and operating system, in that order. It then
294concatenates all these together with slashes in between, to produce a
68b50604
UD
295directory name; for example, the configuration @w{@samp{i686-linux-gnu}}
296results in @file{unix/sysv/linux/i386/i686}. @file{configure} then
28f540f4 297tries removing each element of the list in turn, so
68b50604 298@file{unix/sysv/linux} and @file{unix/sysv} are also tried, among others.
28f540f4
RM
299Since the precise version number of the operating system is often not
300important, and it would be very inconvenient, for example, to have
68b50604 301identical @file{irix6.2} and @file{irix6.3} directories,
28f540f4
RM
302@file{configure} tries successively less specific operating system names
303by removing trailing suffixes starting with a period.
304
305As an example, here is the complete list of directories that would be
68b50604
UD
306tried for the configuration @w{@samp{i686-linux-gnu}} (with the
307@file{crypt} and @file{linuxthreads} add-on):
28f540f4
RM
308
309@smallexample
68b50604
UD
310sysdeps/i386/elf
311crypt/sysdeps/unix
312linuxthreads/sysdeps/unix/sysv/linux
313linuxthreads/sysdeps/pthread
314linuxthreads/sysdeps/unix/sysv
315linuxthreads/sysdeps/unix
316linuxthreads/sysdeps/i386/i686
317linuxthreads/sysdeps/i386
318linuxthreads/sysdeps/pthread/no-cmpxchg
319sysdeps/unix/sysv/linux/i386
320sysdeps/unix/sysv/linux
321sysdeps/gnu
322sysdeps/unix/common
323sysdeps/unix/mman
324sysdeps/unix/inet
325sysdeps/unix/sysv/i386/i686
326sysdeps/unix/sysv/i386
327sysdeps/unix/sysv
328sysdeps/unix/i386
329sysdeps/unix
330sysdeps/posix
331sysdeps/i386/i686
332sysdeps/i386/i486
333sysdeps/libm-i387/i686
334sysdeps/i386/fpu
335sysdeps/libm-i387
336sysdeps/i386
337sysdeps/wordsize-32
338sysdeps/ieee754
339sysdeps/libm-ieee754
340sysdeps/generic
28f540f4
RM
341@end smallexample
342
343Different machine architectures are conventionally subdirectories at the
344top level of the @file{sysdeps} directory tree. For example,
345@w{@file{sysdeps/sparc}} and @w{@file{sysdeps/m68k}}. These contain
346files specific to those machine architectures, but not specific to any
347particular operating system. There might be subdirectories for
348specializations of those architectures, such as
349@w{@file{sysdeps/m68k/68020}}. Code which is specific to the
350floating-point coprocessor used with a particular machine should go in
351@w{@file{sysdeps/@var{machine}/fpu}}.
352
353There are a few directories at the top level of the @file{sysdeps}
354hierarchy that are not for particular machine architectures.
355
356@table @file
357@item generic
f2ea0f5b 358As described above (@pxref{Porting}), this is the subdirectory
28f540f4
RM
359that every configuration implicitly uses after all others.
360
361@item ieee754
362This directory is for code using the IEEE 754 floating-point format,
363where the C type @code{float} is IEEE 754 single-precision format, and
364@code{double} is IEEE 754 double-precision format. Usually this
365directory is referred to in the @file{Implies} file in a machine
366architecture-specific directory, such as @file{m68k/Implies}.
367
68b50604
UD
368@item libm-ieee754
369This directory contains an implementation of a mathematical library
370usable on platforms which use @w{IEEE 754} conformant floating-point
371arithmetic.
372
373@item libm-i387
374This is a special case. Ideally the code should be in
375@file{sysdeps/i386/fpu} but for various reasons it is kept aside.
376
28f540f4
RM
377@item posix
378This directory contains implementations of things in the library in
379terms of @sc{POSIX.1} functions. This includes some of the @sc{POSIX.1}
380functions themselves. Of course, @sc{POSIX.1} cannot be completely
381implemented in terms of itself, so a configuration using just
382@file{posix} cannot be complete.
383
384@item unix
385This is the directory for Unix-like things. @xref{Porting to Unix}.
386@file{unix} implies @file{posix}. There are some special-purpose
387subdirectories of @file{unix}:
388
389@table @file
390@item unix/common
391This directory is for things common to both BSD and System V release 4.
392Both @file{unix/bsd} and @file{unix/sysv/sysv4} imply @file{unix/common}.
393
394@item unix/inet
395This directory is for @code{socket} and related functions on Unix systems.
3c20b9b6 396@file{unix/inet/Subdirs} enables the @file{inet} top-level subdirectory.
28f540f4
RM
397@file{unix/common} implies @file{unix/inet}.
398@end table
399
400@item mach
401This is the directory for things based on the Mach microkernel from CMU
402(including the GNU operating system). Other basic operating systems
403(VMS, for example) would have their own directories at the top level of
404the @file{sysdeps} hierarchy, parallel to @file{unix} and @file{mach}.
405@end table
406
407@node Porting to Unix
408@appendixsubsec Porting the GNU C Library to Unix Systems
409
410Most Unix systems are fundamentally very similar. There are variations
411between different machines, and variations in what facilities are
412provided by the kernel. But the interface to the operating system
413facilities is, for the most part, pretty uniform and simple.
414
415The code for Unix systems is in the directory @file{unix}, at the top
416level of the @file{sysdeps} hierarchy. This directory contains
417subdirectories (and subdirectory trees) for various Unix variants.
418
419The functions which are system calls in most Unix systems are
26b4d766 420implemented in assembly code, which is generated automatically from
3c20b9b6
UD
421specifications in files named @file{syscalls.list}. There are several
422such files, one in @file{sysdeps/unix} and others in its subdirectories.
423Some special system calls are implemented in files that are named with a
26b4d766
UD
424suffix of @samp{.S}; for example, @file{_exit.S}. Files ending in
425@samp{.S} are run through the C preprocessor before being fed to the
426assembler.
28f540f4
RM
427
428These files all use a set of macros that should be defined in
429@file{sysdep.h}. The @file{sysdep.h} file in @file{sysdeps/unix}
430partially defines them; a @file{sysdep.h} file in another directory must
431finish defining them for the particular machine and operating system
432variant. See @file{sysdeps/unix/sysdep.h} and the machine-specific
433@file{sysdep.h} implementations to see what these macros are and what
434they should do.@refill
435
3c20b9b6
UD
436The system-specific makefile for the @file{unix} directory
437(@file{sysdeps/unix/Makefile}) gives rules to generate several files
28f540f4
RM
438from the Unix system you are building the library on (which is assumed
439to be the target system you are building the library @emph{for}). All
440the generated files are put in the directory where the object files are
441kept; they should not affect the source tree itself. The files
442generated are @file{ioctls.h}, @file{errnos.h}, @file{sys/param.h}, and
443@file{errlist.c} (for the @file{stdio} section of the library).
444
445@ignore
446@c This section might be a good idea if it is finished,
447@c but there's no point including it as it stands. --rms
448@c @appendixsec Compatibility with Traditional C
449
450@c ??? This section is really short now. Want to keep it? --roland
451
68b50604
UD
452@c It's not anymore true. glibc 2.1 cannot be used with K&R compilers.
453@c --drepper
454
f65fd747
UD
455Although the GNU C library implements the @w{ISO C} library facilities, you
456@emph{can} use the GNU C library with traditional, ``pre-ISO'' C
28f540f4
RM
457compilers. However, you need to be careful because the content and
458organization of the GNU C library header files differs from that of
459traditional C implementations. This means you may need to make changes
460to your program in order to get it to compile.
461@end ignore