fchmod-tests, fchmodat tests, lchmod tests: Add more tests.
[gnulib.git] / doc / gnulib-intro.texi
blob5890223fad591b6364baf26b879a2fc95a5489c9
1 @node Benefits
2 @section Benefits of using Gnulib
4 Gnulib is useful to enhance various aspects of a package:
6 @itemize @bullet
7 @item
8 Portability: With Gnulib, a package maintainer can program against the
9 POSIX and GNU libc APIs and nevertheless expect good portability to
10 platforms that don't implement POSIX.
12 @item
13 Maintainability: When a package uses modules from Gnulib instead of code
14 written specifically for that package, the maintainer has less code to
15 maintain.
17 @item
18 Security: Gnulib provides functions that are immune against vulnerabilities
19 that plague the uses of the corresponding commonplace functions. For
20 example, @code{asprintf}, @code{canonicalize_file_name} are not affected
21 by buffer sizing problems that affect @code{sprintf}, @code{realpath}.
22 @code{openat} does not have the race conditions that @code{open} has. Etc.
24 @item
25 Reliability: Gnulib provides functions that combine a call to a system
26 function with a check of the result. Examples are @code{xalloc},
27 @code{xprintf}, @code{xstrtod}, @code{xgetcwd}.
29 @item
30 Structure: Gnulib offers a way to structure code into modules, typically
31 one include file, one source code file, and one autoconf macro for each
32 functionality. Modularity helps maintainability.
33 @end itemize
35 @node Library vs Reusable Code
36 @section Library vs. Reusable Code
38 Classical libraries are installed as binary object code.  Gnulib is
39 different: It is used as a source code library.  Each package that uses
40 Gnulib thus ships with part of the Gnulib source code.  The used portion
41 of Gnulib is tailored to the package: A build tool, called
42 @code{gnulib-tool}, is provided that copies a tailored subset of Gnulib
43 into the package.
45 @node Portability and Application Code
46 @section Portability and Application Code
48 One of the goals of Gnulib is to make portable programming easy, on
49 the basis of the standards relevant for GNU (and Unix).  The objective
50 behind that is to avoid a fragmentation of the user community into
51 disjoint user communities according to the operating system, and
52 instead allow synergies between users on different operating systems.
54 Another goal of Gnulib is to provide application code that can be shared
55 between several applications.  Some people wonder: "What? glibc doesn't
56 have a function to copy a file?"  Indeed, the scope of a system's libc is
57 to implement the relevant standards (ISO C, POSIX) and to provide
58 access functions to the kernel's system calls, and little more.
60 There is no clear borderline between both areas.
62 For example, Gnulib has a facility for generating the name of backup
63 files.  While this task is entirely at the application level---no
64 standard specifies an API for it---the na@"{@dotless{i}}ve code has
65 some portability problems because on some platforms the length of file
66 name components is limited to 30 characters or so.  Gnulib handles
67 that.
69 Similarly, Gnulib has a facility for executing a command in a
70 subprocess.  It is at the same time a portability enhancement (it
71 works on GNU, Unix, and Windows, compared to the classical
72 @code{fork}/@code{exec} idiom which is not portable to Windows), as well
73 as an application aid: it takes care of redirecting stdin and/or
74 stdout if desired, and emits an error message if the subprocess
75 failed.
77 @node Target Platforms
78 @section Target Platforms
80 Gnulib supports a number of platforms that we call the ``reasonable
81 portability targets''.  This class consists of widespread operating systems,
82 for three years after their last availability, or---for proprietary
83 operating systems---as long as the vendor provides commercial support for
84 it.  Already existing Gnulib code for older operating systems is usually
85 left in place for longer than these three years.  So it comes that programs
86 that use Gnulib run pretty well also on these older operating systems.
88 Some operating systems are not very widespread, but are Free Software and
89 are actively developed.  Such platforms are also supported by Gnulib, if
90 that OS's developers community keeps in touch with the Gnulib developers,
91 by providing bug reports, analyses, or patches.  For such platforms, Gnulib
92 supports only the versions of the last year or the last few months,
93 depending on the maturity of said OS project, the number of its users, and
94 how often these users upgrade.
96 Niche operating systems are generally unsupported by Gnulib, unless some
97 of their developers or users contribute support to Gnulib.
99 The degree of support Gnulib guarantees for a platform depends on the
100 amount of testing it gets from volunteers.  Platforms on which Gnulib
101 is frequently tested are the best supported.  Then come platforms with
102 occasional testing, then platforms which are rarely tested.  Usually,
103 we fix bugs when they are reported.  Except that some rarely tested
104 platforms are also low priority; bug fixes for these platforms can
105 take longer.
107 @menu
108 * Supported Platforms::
109 * Formerly Supported Platforms::
110 * Unsupported Platforms::
111 @end menu
113 @node Supported Platforms
114 @subsection Supported Platforms
116 As of 2020, the list of supported platforms is the following:
118 @itemize
119 @item
120 glibc systems.  With glibc 2.19 or newer, they are frequently tested.
121 @c [Not very relevant in the long term.]
122 @c The distributions Ubuntu, Fedora, RHEL, Arch Linux are frequently tested.
123 @c CentOS is occasionally tested.
124 @c Debian, gNewSense, Trisquel, OpenSUSE are rarely tested.
125 About the kernels:
126 @itemize
127 @item
128 glibc on Linux is frequently tested.
129 @item
130 glibc on kFreeBSD is rarely tested.
131 @end itemize
132 @item
133 Mac OS X@.  In versions 10.13, it's occasionally tested.  In version
134 10.5, it's rarely tested.
135 @item
136 FreeBSD 11.0 or newer is occasionally tested.
137 @item
138 OpenBSD 6.1 or newer is occasionally tested.
139 @item
140 NetBSD 7.0 or newer is occasionally tested.
141 @item
142 AIX 7.1 is occasionally tested.
143 @item
144 Solaris 10 and 11 are occasionally tested.  Solaris 9 is rarely
145 tested and low priority.
146 @item
147 Cygwin 2.9 is occasionally tested.  Cygwin 1.7.x is rarely tested.
148 @item
149 mingw is occasionally tested.  But note that some modules are currently
150 unsupported on mingw: @code{mgetgroups}, @code{getugroups}, @code{idcache},
151 @code{userspec}, @code{openpty}, @code{login_tty}, @code{forkpty},
152 @code{pt_chown}, @code{grantpt}, @code{pty}, @code{savewd},
153 @code{mkancesdirs}, @code{mkdir-p}, @code{euidaccess}, @code{faccessat}.
154 The versions of Windows that are supported are Windows XP and newer.
155 Only the latest version of mingw is tested; older versions are not supported.
156 @item
157 GNU Hurd 0.7 is rarely tested.
158 @item
159 Native Windows, with MSVC as compiler, is rarely tested and low priority.
160 The versions of MSVC that are supported are MSVC 14 (Visual Studio 2015) or
161 newer.
162 @item
163 @c There is musl-gcc on Ubuntu, and Alpine Linux 3.3.3.
164 musl libc is rarely tested.
165 @item
166 Minix 3.3.0 is rarely tested.
167 @item
168 @c IRIX 6.5 cc has no option for C99 support. You would need to use gcc instead.
169 IRIX 6.5 is very rarely tested.
170 @item
171 Haiku is no longer tested.
172 @item
173 uClibc on Linux is no longer tested.
174 @item
175 QNX is no longer tested.
176 @end itemize
178 @node Formerly Supported Platforms
179 @subsection Formerly Supported Platforms
181 The following platforms were supported in the past, but are no longer
182 supported:
183 @itemize
184 @item
185 glibc versions 2.1.x and older.
186 @item
187 Mac OS X 10.4 and older.
188 @item
189 AIX 4 and older.
190 @item
191 HP-UX 11.31.
192 @item
193 IRIX 6.4 and older.
194 @item
195 OSF/1 5.1.
196 @item
197 Solaris 8 and older.
198 @item
199 Interix.
200 @item
201 BeOS.
202 @end itemize
204 Gnulib supports these operating systems only in an unvirtualized environment.
205 When you run an OS inside a virtual machine, you have to be aware that the
206 virtual machine can bring in bugs of its own.  For example, floating-point
207 operations on Solaris can behave slightly differently in QEMU than on real
208 hardware.  And Haiku's @command{bash} program misbehaves in VirtualBox 3,
209 whereas it behaves fine in VirtualBox 4.
211 Similarly, running native Windows binaries on GNU/Linux under WINE is
212 rarely tested and low priority: WINE has a set of behaviours and bugs that
213 is slightly different from native Windows.
215 @node Unsupported Platforms
216 @subsection Unsupported Platforms
218 @cindex integer arithmetic portability
219 @cindex portability, integer arithmetic
221 Some platforms with C compilers are not supported by Gnulib because
222 the platforms violate Gnulib's C portability assumptions.  @xref{Other
223 portability assumptions}.
225 These assumptions are not required by the C or POSIX standards but
226 hold on almost all practical porting targets.  If you need to port
227 Gnulib code to a platform where these assumptions are not true, we
228 would appreciate hearing of any fixes.  We need fixes that do not
229 increase runtime overhead on standard hosts and that are relatively
230 easy to maintain.
232 These platforms are listed below to illustrate problems that Gnulib
233 and Gnulib-using code would have if it were intended to be portable to
234 all practical POSIX or C platforms.
236 @itemize @bullet
237 @item
238 The IBM i's pointers are 128 bits wide and it lacks the two types
239 @code{intptr_t} and @code{uintptr_t}, which are optional in the C and
240 POSIX standards.  However, these two types are required for the XSI
241 extension to POSIX, and many Gnulib modules use them.  To work around
242 this compatibility problem, Gnulib-using applications can be run on
243 the IBM i's PASE emulation environment.  The IBM i's architecture
244 descends from the System/38 (1978).
246 @item
247 The Unisys ClearPath Dorado's machine word is 36 bits.  Its signed
248 integers use a ones'-complement representation.  On these machines,
249 @code{CHAR_BIT == 9} and @code{INT_MIN == -INT_MAX}.  By default
250 @code{UINT_MAX} is @math{2^{36} - 2}, which does not conform to the C
251 requirement that it be one less than a power of two.  Although
252 compiler options can raise @code{UINT_MAX} to be @math{2^{36} - 1},
253 this can break system code that uses @math{-0} as a flag value.
254 This platform's architecture descends from the UNIVAC 1107 (1962).
256 @item
257 The Unisys ClearPath Libra's machine word is 48 bits.  Its
258 @code{unsigned int} uses the low-order 40 bits of the word, and
259 @code{int} uses the low-order 41 bits of the word with a
260 signed-magnitude representation.  On these machines, @code{INT_MAX ==
261 UINT_MAX}, @code{INT_MIN == -INT_MAX}, and @code{sizeof (int) == 6}.
262 This platform's architecture descends from the Burroughs B5000 (1961).
263 @end itemize
265 The following platforms are not supported by Gnulib.  The cost of
266 supporting them would exceed the benefit because they are rarely used, or
267 poorly documented, or have been supplanted by other platforms, or diverge
268 too much from POSIX, or some combination of these and other factors.
269 Please don't bother sending us patches for them.
271 @itemize
272 @item
273 Windows 95/98/ME.
274 @item
275 DJGPP and EMX (the 32-bit operating systems running in DOS).
276 @item
277 MSDOS (the 16-bit operating system).
278 @item
279 Windows Mobile, Symbian OS, iOS.
280 @end itemize
282 @node Modules
283 @section Modules
285 Gnulib is divided into modules.  Every module implements a single
286 facility.  Modules can depend on other modules.
288 A module consists of a number of files and a module description.  The
289 files are copied by @code{gnulib-tool} into the package that will use it,
290 usually verbatim, without changes.  Source code files (.h, .c files)
291 reside in the @file{lib/} subdirectory.  Autoconf macro files reside in
292 the @file{m4/} subdirectory.  Build scripts reside in the
293 @file{build-aux/} subdirectory.
295 The module description contains the list of files; @code{gnulib-tool}
296 copies these files.  It contains the module's
297 dependencies; @code{gnulib-tool} installs them as well.  It also
298 contains the autoconf macro invocation (usually a single line or
299 nothing at all); @code{gnulib-tool} ensures this is invoked from the
300 package's @file{configure.ac} file.  And also a @file{Makefile.am}
301 snippet; @code{gnulib-tool} collects these into a @file{Makefile.am}
302 for the tailored Gnulib part.  The module description and include file
303 specification are for documentation purposes; they are combined into
304 @file{MODULES.html}.
306 The module system serves two purposes:
308 @enumerate
309 @item
310 It ensures consistency of the used autoconf macros and @file{Makefile.am}
311 rules with the source code.  For example, source code which uses the
312 @code{getopt_long} function---this is a common way to implement parsing
313 of command line options in a way that complies with the GNU standards---needs
314 the source code (@file{lib/getopt.c} and others), the autoconf macro
315 which detects whether the system's libc already has this function (in
316 @file{m4/getopt.m4}), and a few @file{Makefile.am} lines that create the
317 substitute @file{getopt.h} if not.  These three pieces belong together.
318 They cannot be used without each other.  The module description and
319 @code{gnulib-tool} ensure that they are copied altogether into the
320 destination package.
322 @item
323 It allows for scalability.  It is well-known since the inception of the
324 MODULA-2 language around 1978 that dissection into modules with
325 dependencies allows for building large sets of code in a maintainable way.
326 The maintainability comes from the facts that:
328 @itemize @bullet
329 @item
330 Every module has a single purpose; you don't worry about other parts of
331 the program while creating, reading or modifying the code of a module.
333 @item
334 The code you have to read in order to understand a module is limited to
335 the source of the module and the .h files of the modules listed as
336 dependencies.  It is for this reason also that we recommend to put the
337 comments describing the functions exported by a module into its .h file.
338 @end itemize
340 In other words, the module is the elementary unit of code in Gnulib,
341 comparable to a class in object-oriented languages like Java or C#.
342 @end enumerate
344 The module system is the basis of @code{gnulib-tool}.  When
345 @code{gnulib-tool} copies a part of Gnulib into a package, it first
346 compiles a module list, starting with the requested modules and adding all
347 the dependencies, and then collects the files, @file{configure.ac}
348 snippets and @file{Makefile.am} snippets.
350 @node Various Kinds of Modules
351 @section Various Kinds of Modules
353 There are modules of various kinds in Gnulib.  For a complete list of the
354 modules, see in @file{MODULES.html}.
356 @subsection Support for ISO C or POSIX functions.
358 When a function is not implemented by a system, the Gnulib module provides
359 an implementation under the same name.  Examples are the @samp{snprintf}
360 and @samp{readlink} modules.
362 Similarly, when a function is not correctly implemented by a system,
363 Gnulib provides a replacement.  For functions, we use the pattern
365 @smallexample
366 #if !HAVE_WORKING_FOO
367 # define foo rpl_foo
368 #endif
369 @end smallexample
371 @noindent
372 and implement the @code{foo} function under the name @code{rpl_foo}.  This
373 renaming is needed to avoid conflicts at compile time (in case the system
374 header files declare @code{foo}) and at link/run time (because the code
375 making use of @code{foo} could end up residing in a shared library, and
376 the executable program using this library could be defining @code{foo}
377 itself).
379 For header files, such as @code{stdbool.h} or @code{stdint.h}, we provide
380 the substitute only if the system doesn't provide a correct one.  The
381 template of this replacement is distributed in a slightly different name,
382 with @samp{.in} inserted before the @samp{.h} extension, so that on
383 systems which do provide a correct
384 header file the system's one is used.
386 The modules in this category are supported in C++ mode as well.  This
387 means, while the autoconfiguration uses the C compiler, the resulting
388 header files and function substitutes can be used with a matching C++
389 compiler as well.
391 @subsection Enhancements of ISO C or POSIX functions
393 These are sometimes POSIX functions with GNU extensions also found in
394 glibc---examples: @samp{getopt}, @samp{fnmatch}---and often new
395 APIs---for example, for all functions that allocate memory in one way
396 or the other, we have variants which also include the error checking
397 against the out-of-memory condition.
399 @subsection Portable general use facilities
401 Examples are a module for copying a file---the portability problems
402 relate to the copying of the file's modification time, access rights,
403 and extended attributes---or a module for extracting the tail
404 component of a file name---here the portability to native Windows
405 requires a different API than the classical POSIX @code{basename} function.
407 @subsection Reusable application code
409 Examples are an error reporting function, a module that allows output of
410 numbers with K/M/G suffixes, or cryptographic facilities.
412 @subsection Object oriented classes
414 Examples are data structures like @samp{list}, or abstract output stream
415 classes that work around the fact that an application cannot implement an
416 stdio @code{FILE} with its logic.  Here, while staying in C, we use
417 implementation techniques like tables of function pointers, known from the
418 C++ language or from the Linux kernel.
420 @subsection Interfaces to external libraries
422 Examples are the @samp{iconv} module, which interfaces to the
423 @code{iconv} facility, regardless whether it is contained in libc or in
424 an external @code{libiconv}.  Or the @samp{readline} module, which
425 interfaces to the GNU readline library.
427 @subsection Build / maintenance infrastructure
429 An example is the @samp{maintainer-makefile} module, which provides extra
430 Makefile tags for maintaining a package.
432 @node Collaborative Development
433 @section Collaborative Development
435 Gnulib is maintained collaboratively.  The mailing list is
436 @code{<bug-gnulib at gnu dot org>}.  Be warned that some people on the
437 list may be very active at some times and unresponsive at other times.
439 Every module has one or more maintainers.  While issues are discussed
440 collaboratively on the list, the maintainer of a module nevertheless has
441 a veto right regarding changes in his module.
443 All patches should be posted to the list, regardless whether they are
444 proposed patches or whether they are committed immediately by the
445 maintainer of the particular module.  The purpose is not only to inform
446 the other users of the module, but mainly to allow peer review.  It is not
447 uncommon that several people contribute comments or spot bugs after a
448 patch was proposed.
450 Conversely, if you are using Gnulib, and a patch is posted that affects
451 one of the modules that your package uses, you have an interest in
452 proofreading the patch.
454 @node Copyright
455 @section Copyright
457 Most modules are under the GPL@.  Some, mostly modules which can
458 reasonably be used in libraries, are under LGPL@.  The source files
459 always say "GPL", but the real license specification is in the module
460 description file.  If the module description file says "GPL", it means
461 "GPLv3+" (GPLv3 or newer, at the licensee's choice); if it says "LGPL",
462 it means "LGPLv3+" (LGPLv3 or newer, at the licensee's choice).
464 More precisely, the license specification in the module description
465 file applies to the files in @file{lib/} and @file{build-aux/}.  Different
466 licenses apply to files in special directories:
468 @table @file
469 @item modules/
470 Module description files are under this copyright:
472 @quotation
473 Copyright @copyright{} 20XX--20YY Free Software Foundation, Inc.@*
474 Copying and distribution of this file, with or without modification,
475 in any medium, are permitted without royalty provided the copyright
476 notice and this notice are preserved.
477 @end quotation
479 @item m4/
480 Autoconf macro files are under this copyright:
482 @quotation
483 Copyright @copyright{} 20XX--20YY Free Software Foundation, Inc.@*
484 This file is free software; the Free Software Foundation
485 gives unlimited permission to copy and/or distribute it,
486 with or without modifications, as long as this notice is preserved.
487 @end quotation
489 @item tests/
490 If a license statement is not present in a test module, the test files are
491 under GPL@.  Even if the corresponding source module is under LGPL, this is
492 not a problem, since compiled tests are not installed by ``make install''.
494 @item doc/
495 Documentation files are under this copyright:
497 @quotation
498 Copyright @copyright{} 2004--20YY Free Software Foundation, Inc.@*
499 Permission is granted to copy, distribute and/or modify this document
500 under the terms of the GNU Free Documentation License, Version 1.3 or
501 any later version published by the Free Software Foundation; with no
502 Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A
503 copy of the license is at @url{https://www.gnu.org/licenses/fdl-1.3.en.html}.
504 @end quotation
505 @end table
507 If you want to use some Gnulib modules under LGPL, you can do so by
508 passing the option @samp{--lgpl} to @code{gnulib-tool}.  This will
509 replace the GPL header with an LGPL header while copying the source
510 files to your package.  Similarly, if you want some Gnulib modules
511 under LGPLv2+ (Lesser GPL version 2.1 or newer), you can do so by
512 passing the option @samp{--lgpl=2} to @code{gnulib-tool}.
514 Keep in mind that when you submit patches to files in Gnulib, you should
515 license them under a compatible license.  This means that sometimes the
516 contribution will have to be LGPL, if the original file is available
517 under LGPL@.  You can find out about it by looking for a "License: LGPL"
518 information in the corresponding module description.
520 @node Steady Development
521 @section Steady Development
523 Gnulib modules are continually adapted, to match new practices, to be
524 consistent with newly added modules, or simply as a response to build
525 failure reports.
527 If you are willing to report an occasional regression, we recommend to
528 use the newest version from git always, except in periods of major
529 changes.  Most Gnulib users do this.
531 @node Openness
532 @section Openness
534 Gnulib is open in the sense that we gladly accept contributions if they
535 are generally useful, well engineered, and if the contributors have signed
536 the obligatory papers with the FSF.
538 The module system is open in the sense that a package using Gnulib can
539 @enumerate
540 @item
541 locally patch or override files in Gnulib,
542 @item
543 locally add modules that are treated like Gnulib modules by
544 @code{gnulib-tool}.
545 @end enumerate
547 This is achieved by the @samp{--local-dir} option of @code{gnulib-tool}
548 (@pxref{Extending Gnulib}).